一、servlet生命周期
服务器加载Servlet的过程
- 服务器启动的时候,首先会读取web.xml文件
- 将web.xml文件中的servlet信息会以键值对的形式进行存储
- 当客户端第一次请求servlet的时候,服务器会从键值对中查找对应的servlet-name,找到之后,服务器会再次识别其中的servlet-class,然后通过反射机制进行相应的实例化,并且同时执行init初始化方法
- 当客户端每次请求servlet时,servlet都会执行service方法,根据请求方式的不同会执行对应的doGet方法
- 当服务器被正常关闭或者项目从服务器被移除的时候,servlet会执行销毁动作。
二、初始化参数
配置初始化参数
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>cn.kgc.demo.HelloServlet</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
然后可以在HelloServlet中读取,也就是说在web.xml中配置的初始化参数可以直接在servlet中使用
@Override
public void init(ServletConfig config) throws ServletException {
String value = config.getInitParameter('charset');
System.out.println("初始化参数"+value)
}
我们又知道 Servlet直接继承自ServletConfig,因此HelloServlet可以直接使用getInitParameter
request.setCharacterEncoding(this.getInitParameter('charset'));
全局配置
对所有的servlet都生效
<context-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</context-param>
如何获取全局配置的参数
通过Application对象获取
ServletContext application = this.getServletContext();
application.getInitParameter('charset')
二、过滤器
针对于一些在每个Servlet中都要实现的代码,可以通过过滤器实现代码简化。比如说每个Servlet都要有中文乱码的代码,那么就可以使用过滤器。
过滤器用途:
- 日志记录功能
- 解决中文乱码
- 必须先登录在进行接下来的操作
提供了java.servlet.Filter接口,实现接口,重写方法
<filter>
<filter-name>myFilter</filter-name>
<filter-class>cn.kgc.demo.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<!-- 配置过滤规则-->
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤规则配置:
1、完全路径匹配 /user
2、目录匹配 /user/*
3、扩展名匹配 *.do *.action 等
过滤完之后,需要进行放行
chain.doFilter(request,response)
在这句代码之前进行请求的过滤操作,然后对其放行,在这句代码之后进行响应的过滤。
1、使用过滤器解决中文乱码
public class CharacterEncodingFilter implements Filter {
private String encoding = "UTF-8";
public CharacterEncodingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
String encoding = fConfig.getInitParameter("encoding");
if(encoding != null) {
this.encoding = encoding;
}
}
}
web.xml
<filter>
<display-name>CharacterEncodingFilter</display-name>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.smbms.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- <url-pattern>/*</url-pattern> -->
<url-pattern>*.do</url-pattern>
</filter-mapping>
2、使用过滤器解决权限问题
public class PermissionFilter implements Filter {
public PermissionFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//只有http协议有session,所以需要将servlet Request专程HttpServlet Request
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response;
HttpSession session = httpRequest.getSession();
if(session.getAttribute("USER_SESSION") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath()+"/401.jsp");
return;
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
<filter>
<display-name>PermissionFilter</display-name>
<filter-name>PermissionFilter</filter-name>
<filter-class>com.smbms.filter.PermissionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PermissionFilter</filter-name>
<url-pattern>/auth/*</url-pattern>
</filter-mapping>
三、监听器
分类:
- 生命周期有关的监听器
- 属性绑定和解绑有关的监听器
- 感知型监听器
web.xml配置
<listener>
<listener-class>cn.kgc.demo4.SessionAttributeListener</listener-class>
</listener>