javaWeb知识点、⽂件上传和下载
⼀、tomcat
下⾯对l配置⽂件⾥⾯的端⼝号进⾏些说明:
<!-- tomcat服务器关闭端⼝,也就是shutdown.bat那个程序调⽤的接⼝ -->
<Server port="8007"shutdown="SHUTDOWN">
<!-- http通讯协议端⼝,默认是8080(就是最常⽤的端⼝,⼀般都是改这个) -->
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/><!-- 8443是当请求为https协议时重定向的接⼝ -->
<!-- ajp通讯协议端⼝,这个很少⽤到 -->
<Connector port="8011"protocol="AJP/1.3"redirectPort="8443"/>
<!-- tomcat域名 -->
<Host name="localhost"appBase="webapps"
unpackWARs="true"autoDeploy="true">
</Server>
此路径C:\Windows\System32\drivers\etc下有个hosts⽂件,在这⾥可以配置⼀些域名解析。在浏览器访问⽹站时,会优先从此hosts ⽂件下查看是否有该⽹站域名对应的ip , 有的话浏览器会⽴即打开此ip对应的⽹页,若没有则会从DNS服务器(全世界只有⼀个)上进⾏域名解析。
tomcat部署war包⽅法:将项⽬war包放到tomcat的webapp⽂件夹⽬录下,运⾏tomcat即可
⼆、Servlet
servlet全称是Java Servlet,它是由java编写的⼀个运⾏在服务器端的程序。它可以⽤来接收⽹页请求(request),并对⽹页请求作出相应(response)。Servlet所处的位置如下图所⽰:
SpringMVC框架中的前端控制器DispatcherServlet其实本质上就是个servlet,在这个DispatcherServlet中对服务器过来请求做统⼀处理。
Servlet在java中是⼀个接⼝,它的实现类有HttpServlet、GenericServlet。⼀般来说我们在web项⽬中去实现servlet的功能都是定义⼀个类去继承HttpServlet类。然后重写doGet/doPost⽅法。
System.out.println("进⼊HelloServlet的doGet⽅法");
// 设置响应头
resp.setContentType("text/html");// ("image/jpg") 响应成⼀张图⽚,验证码常⽤
// 解决乱码
resp.setCharacterEncoding("utf-8");
PrintWriter printWriter = Writer();// 获取页⾯输出对象
printWriter.print("名称:"+username);// 向页⾯输出相应的内容(不只字符串,html js 什么的都可以输出)
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
System.out.println("进⼊HelloServlet的doPost⽅法");
// 转发到/helloServlet
// 重定向到/getCon
resp.sendRedirect("/getCon");
}
}
此Servlet要想⽣效需在l中注册:
<!--注册⾃⼰写的servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hhl.servlet.HelloServlet</servlet-class>
</servlet>
<!--指定该servlet的映射路径(映射路径可以配置多个)-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
转发和重定向:
1. 转发使⽤RequestDispatcher(url).forward(request,response)⽅法,重定向使⽤response.sendRedirect(url)⽅
法。(⼀个是request,⼀个是response)
2. 转发浏览器地址栏不变,重定向浏览器地址栏发⽣改变
3. 转发是服务器内部的⾏为,所以request传输的信息不会丢失;重定向是客户端浏览器⾏为,它其实就相当于访问了⾄少两次不同的路
径,所以传输的信息会丢失。
三、cookie(饼⼲) & Session(会话)
cookie与session最⼤的区别是:cookie存在于客户端(也就是浏览器),session存在于服务器端。
cookie在java中如何应⽤:
创建:new Cookie(String name, String value) ,cookie只能存储字符串类型的数据
发送cookie: response.addCookie(Cookie cookie) , 向客户端发送⼀个cookie
获取cookie: Cookie[] cookiearr = Cookies() , 获取cookie数组(只能获取数组,不能获取单个cookie)
// 解决乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = Writer();
// 获取浏览器cookie,因为cookie是多个,所以只能获取数组
Cookie[] cookies = Cookies();
if(cookies!=null){
for(Cookie cookie : cookies){// 遍历cookie获取所要操作的指定cookie
Name().equals("lastLoginTime")){
// write和print类似,write仅⽀持字符类型,字符串数组等,print⽀持Object类型及各种类型
out.write("上次登录时间:"+ URLDecoder.Value(),"UTF-8"));
}
}
}else{
out.write("这是你第⼀次登录");
}
/
/ 转码:de ,解码:URLEncoder.decode
Cookie cookie =new Cookie("lastLoginTime", de(System.currentTimeMillis()+"勒布朗詹姆斯","UTF-8"));
// cookie的共享范围,/就表⽰在当前服务器下的所有项⽬中共享
cookie.setPath("/");
// 这个也是设置cookie的共享范围,但这个是设置跨服务器的,就是多个服务器之间共享
cookie.setDomain(".baidu");
// 设置过期时间(可以通过设置时间为0达到删除此cookie的效果)
cookie.setMaxAge(1000);
resp.addCookie(cookie);// response⾥添加cookie
}
}
tips: 浏览器对单个cookie的最⼤限制是4kb,以及对同⼀个域名下的总cookie数量最⼤限制是20个
session(重点):
session是服务器端的⼀种会话技术,session的实现原理其实是依赖于cookie的。
因为当访问某个域名时,浏览器会⾃动⽣成⼀个JSESSIONID,这个存在于cookie中,⽽这个JSESSIONID就对应服务器端的⼀个session,通过JSESSIONID的value值来去服务器端查对应的session,来判断当前session中是否有⽤户的登录信息从⽽实现保持登录状态。
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// 通过request获取session
HttpSession session = Session();
// session的⼀些操作
session.setAttribute("customer",new CustMap("詹姆斯",35));// session可以存任意类型的数据
// 获取当前session的id(就是cookie中的JSESSIONID的value值)
String sessionId = Id();
}
}
当客户端(也就是浏览器)关闭后,服务器不关闭,再次打开浏览器两次获取的session是否为同⼀个?
1. 默认情况下不是,所以有的⽹站会出现关闭浏览器再打开时登录状态被清空了。
2. 可以设置成是同⼀个,将cookie中的JESSIONID的最⼤存活时间设置久⼀点(代码如下),这样也就可以实现客户端(浏览器)关闭
后再打开,同样保持登录状态了!
Cookie c =new Cookie("JSESSIONID",Id());
c.setMaxAge(60*60);
response.addCookie(c);
客户端不关闭,服务器关闭后重启,两次获取的session是同⼀个吗?
1. 不是同⼀个,但为什么我们的登录状态还能保持呢?这是因为tomcat⾃动帮我们做了以下事情: a. session钝化,tomcat服务器关
闭之前会将session对象序列化到硬盘上 b. session活化,tomcat服务器启动后再将硬盘中的session⽂件转化到内存session对象中
2. 所以我们客户端的JSESSIONID还是能到服务中对应的session信息,从⽽保持登录状态
session何时销毁?
1. 服务器关闭
2. session对象调⽤invalidate()
3. 设置session的过期时间
session与cookie的区别总结:
1. cookie存在于客户端(浏览器),session存在于服务器端
2. cookie数据有⼤⼩限制单个最⼤4kb,session没有
3. cookie只能存储字符串类型数据,session可以存储任意类型的数据
4. 两者相对来说,cookie不安全,session安全
四、MVC设计模式 & 三层架构
之前有时候总是把这两个东西搞混淆,MVC与三层架构它们之前存在联系,但并不是⼀个结构,它们两者的⽬的都是为了解耦。
MVC设计模式:
1. Model: 数据模型,承载数据,对数据进⾏运算的模块,指的是service,dao,pojo实体类这些,操作数据的模块。
2. View: 视图,就是提供的页⾯(jsp…)
3. Controller: 控制器,接受⽤户的请求并调⽤业务层处理返回数据,再将数据model响应给⽤户
三层架构:
1. 表⽰层View: 处理⽤户请求并返回页⾯对页⾯进⾏交互处理
2. 业务层Service: 编写业务逻辑的地⽅
3. 数据操作层dao:操作数据库代码的地⽅
MVC与三层架构的关系图:
五、Filter(重点) & Interceptor & Listener
Filter: java中的过滤器是基于servlet实现的,它的⽬的就是对⼀些请求进⾏资源过滤,⽐如⼀些编码过滤,是否登录的判断等,可以在filter中实现。
具体实现⽅法就是:
1. 创建⼀个类实现Filter接⼝(javax.servlet包下的),重写⾥⾯的doFilter⽅法
public class LoginFilter implements Filter{
@Override
public void init(FilterConfig filterConfig)throws ServletException {
System.out.println("==========服务开启===========");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
System.out.println("LoginFilter过滤器⽅法执⾏");
request.setCharacterEncoding("utf-8");servlet和tomcat的关系
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 放⾏此请求,执⾏⽬标资源(在执⾏完doFilter⽅法后⼀定要放⾏,不然会卡到这⾥)
chain.doFilter(request,response);
}
@Override
public void destroy(){
System.out.println("==========服务关闭===========");
}
}
2. 注册此过滤器
传统web项⽬在l中注册
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论