Servlet规范
十五、Servlet规范扩展—监听器接口
1、介绍:
-
一组来自于Servlet规范下接口,存在Tomcat存在servlet-api.jar包
-
监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
-
监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
2、作用域对象:
- 在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】
- Servlet规范下作用域对象:
ServletContext: 全局作用域对象
HttpSession : 会话作用域对象
HttpServletRequest: 请求作用域对象
注意:cookie存在于客户端中,不属于作用域对象
3、监听器接口实现类开发规范:三步
-
根据监听的实际情况,选择对应监听器接口进行实现
-
重写监听器接口声明【监听事件处理方法】
-
在web.xml文件将监听器接口实现类注册到Http服务器
4、ServletContextListener接口:
-
作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
-
监听事件处理方法:
public void contextInitlized();//在全局作用域对象被Http服务器初始化被调用
public void contextDestory();//在全局作用域对象被Http服务器销毁时候触发调用
- 应用实战 OneListener.java
public class OneListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("全局作用域对象已创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("全局作用域对象已销毁");
}
}
在web.xml中注册监听器接口
<!--将监听器接口实现类注册到Tomcat-->
<listener>
<listener-class>com.abc.listener.OneListener</listener-class>
</listener>
5、ServletContextAttributeListener接口:
-
作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
-
监听事件处理方法:
public void contextAdd();//在全局作用域对象添加共享数据
public void contextReplaced();//在全局作用域对象更新共享数据
public void contextRemove();//在全局作用域对象删除共享数据
- 全局作用域对象共享数据变化时刻
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext application = request.getServletContext();
application.setAttribute("key",100); //新增共享数据
application.setAttribute("key",200); //更新共享数据
application.removeAttribute("key"); //删除共享数据
}
}
public class OneListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("新增共享数据");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("删除共享数据");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("更新共享数据");
}
}
在web.xml中注册监听器,并调用监听器
<!--注册监听器接口实现类-->
<listener>
<listener-class>com.abc.listener.OneListener</listener-class>
</listener>
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.abc.controller.OneServlet</servlet-class></servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
十六、Servlet规范扩展—Filter(过滤器接口)
1、介绍:
-
来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包
-
Filter接口实现类由开发人员负责提供,Http服务器不负责提供
-
Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
2、具体作用:
-
拦截Http服务器,帮助Http服务器检测当前请求合法性
-
拦截Http服务器,对当前请求进行增强操作
-
Filter接口实现类开发三步骤:
创建一个Java类实现Filter接口
重写Filter接口中doFilter方法
web.xml将过滤器接口实现类注册到Http服务器
3、 Filter拦截地址格式
- 命令格式:
<filter-mapping>
<filter-name>oneFilter</filter-name>
<url-pattern>拦截地址</url-pattern>
</filter-mapping>
-
命令作用:
拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截 -
要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>/img/mm.jpg</url-pattern>
- 要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
<url-pattern>/img/*</url-pattern>
- 要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>
- 要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
<url-pattern>/*</url-pattern>
4、代码实现:
案例一:通过过滤器截取请求参数,保证当前请求行为的合法性
public class OneFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//1.通过拦截请求对象得到请求包参数信息,从而得到来访用户的真实年龄
String age= servletRequest.getParameter("age");
//2.根据年龄,帮助Http服务器判断本次请求合法性
if(Integer.valueOf(age) >18){ //合法请求
//将拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件
filterChain.doFilter(servletRequest, servletResponse);//允许下一步继续访问
return;
}else{
//过滤器代替Http服务器拒绝本次请求
servletResponse.setContentType("text/html;charset=utf-8");
PrintWriter out = servletResponse.getWriter();
out.print("<center><font style='color:red;font-size:40px'>未成年人禁止消费</font></center>");
return;
}
}
}
案例二:对当前请求做增强操作:通过拦截的请求对象,使用UTF-8字符集对当前请求体信息进行一次重新编辑,由此一来避免了在Servlet添加编码设置操作,起到简化开发的功能
public class OneFilter implements Filter
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");//增强操作
filterChain.doFilter(servletRequest, servletResponse);
}
}
Keep on going and never give up.
勇往直前,决不放弃。