启动的顺序为:Listener -> Filter -> Servlet;
执行的顺序不会因为三个标签在配置文件中的先后顺序而改变。
监听器类型:
Servlet2.4规范定义,按监听的对象划分:
用于监听应用程序环境对象(ServletContext)的事件监听器
用于监听用户会话对象(HttpSession)的事件监听器
用于监听请求消息对象(ServletRequest)的事件监听器
按监听的事件类型划分:
用于监听域对象自身的创建和销毁的事件监听器;
用于监听域对象中的属性的增加和删除的事件监听器;
用于监听绑定到HttpSession域中的某个对象的状态的事件监听器;
在一个Web应用程序的整个运行周期内, Web容器会创建和销毁三个重要的对象,ServletContext,HttpSession,ServletRequest。
在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
Web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter()方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。
在doFilter()方法中,开发人员如果调用FilterChain对象的doFilter ()方法,web服务器会检查FilterChain对象中是否还有filter,如果有,则调用下一个filter,如果没有,则调用目标资源。
Filter接口中有一个doFilter()方法,Web服务器每次在调用Web资源的service()方法之前,都会先调用filter的doFilter()方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,执行一段代码;
判断是否调用目标资源;
调用目标资源之后,执行一段代码;
Web服务器在调用doFilter()方法时,会传递一个filterChain对象,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter()方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则服务器就会调用目标的service()方法,即Web资源就会被访问,否则Web资源不会被访问。
Session与Session域中的对象一起从内存中被序列化到硬盘上的过程我们称为钝化,服务器关闭时会发生钝化。
Session与Session域中的对象一起从硬盘上反序列化到内存中的过程我们称为活化,服务器再次开启时会发生活化。
保证Session域中的对象能和Session一起被钝化和活化,必须保证对象对应的类实现Serializable接口。
在服务器端创建Session对象,该对象有一个全球唯一的ID。
在创建Session对象的同时创建一个特殊的Cookie对象,该Cookie对象的名字是JSESSIONID,该Cookie 对象的value值是Session对象的那个全球唯一的ID,并且会将这个特殊的Cookie对象携带发送给浏览器,以后浏览器再发送请求就会携带这个特殊的Cookie对象,服务器根据这个特殊的Cookie对象的value 值在服务器中寻找对应的Session对象,以此来区分不同的用户。
Cookie是明文的,不安全;
Cookie对象的数量和大小有限制(不同的浏览器不同);
Cookie对象携带过多费流量;
Cookie对象中的Value值只能是字符串,不能放对象。
原因:服务器端默认使用ISO-8859-1字符集,而中文浏览器默认使用GBK字符集。
解决方案:方法1,设置响应头,对应代码:response.setHeader("Content-Type","text/html;charset=utf-8");
方法2,设置响应的内容类型,对应代码:response.setContentType("text/html;charset=utf-8");
通过以上两种方式可以在响应头中告诉浏览器响应体的字符集是UTF-8;但需要注意的是,两种方法一定要在response.getWriter()方法之前设置。
原因:因为服务器收到数据后,默认以ISO-8859-1字符集进行转换,与请求传递数据的字符集不一致。
解决方案:在获取请求参数之前调用request.setCharacterEncoding("utf-8"); 通知服务器端使用UTF8字符集进行转换。
原因:请求携带的数据字符集与服务器端的默认字符集ISO-8859-1不一致。
解决方案:
第一种方式:
使用URLEncoder和URLDecoder两个类来实现编解码,实现iso-8895-1转换到UTF-8字符集;
第二种方式,使用String类的方法实现字符集转换:
String str = new String (target.getBytes(“iso-8859-1”), ”utf-8” );
第三种方式,更改Tomcat的server.xml 配置文件实现字符集转换:
GET请求是URL地址栏中传递请求参数的,它会被Tomcat服务器自动转换字符集,而Tomcat服务器默认的字符集是ISO-8859-1,所以我们需要修改Tomcat服务器的字符集为UTF-8。
容器启动时,读取在/webapps/WEB-INF/目录下的web.xml文件,对其进行解析,并读取Servlet注册信息。
然后,将每个应用中注册的Servlet类都进行加载,并通过反射的方式实例化。
Servlet注册时配置