Servlet,过滤器和监听器的配置和使用
一、什么是Servlet
Servlet使用Java语言实现的程序,运行于支持Java语言的Web服务器或者应用服务器中。Servlet先于JSP出现,提供和客户端动态交互的功能。Servlet可以处理来自客户端的HTTP请求,并生成响应返回给客户端。
Servlet的基本流程如下: 客户端通过HTTP提出请求。Web服务器接受改请求并将其发给servlet。如果这个servlet尚未被加载,Web服务器将把它加载到Java虚拟机并且执行它。Servlet将接收该HTTP请求执行某种处理。Servlet将向Web服务器返回应答。Web服务器将从servlet收到的应答发送给客户端。
优点:
1.可以移植性:由于Servlet是用Java语言编写的,因此它可以在不同的操作系统和服务器上移植。
2.安全:Servlet也具有类型检查特征,并利用Java的垃圾收集和没有指针的设计,使得Servlet避免了内存管理等问题。
3.高效:Servlet加载执行后会常驻服务器内存中,当再次受到客户端的请求时,服务器会产生新的线程而不是进程为客户端服务,这样就提高了响应速度。
二、Servlet生命周期
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁
package action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LifeServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("service");
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("service");
} @Override
public void destroy() {
System.out.println("servlet销毁");
} @Override
public void init() throws ServletException {
System.out.println("servlet初始化");
}
}
<servlet>
<servlet-name>lifeServlet</servlet-name>
<servlet-class>action.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>lifeServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
View Xml
三、servlet的两种配置方式
1、第一种注解式配置 Servlet3.0及以后 :
@WebServlet(value="/hello",loadOnStartup=1)
2、第二种web.xml配置 Servlet所有版本都支持:
<servlet>
<!--名称 -->
<servlet-name>hello2</servlet-name>
<!--Servlet的全称类名 -->
<servlet-class>com.abc.web.servlet.HelloServlet</servlet-class>
<!--启动的优先级,数字越小越先起动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--映射配置 -->
<servlet-mapping>
<!--名称 -->
<servlet-name>hello2</servlet-name>
<!--资源的匹配规则:精确匹配 -->
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
四、Servlet基本使用
1、Servlet的第一种创建方式:继承HttpServlet(最优)
重写doGet(HttpServletRequest request, HttpServletResponse response)方法
重写 doPost(HttpServletRequest request, HttpServletResponse response)方法
2、Servlet创建的第二种方式:实现接口Servlet
重写getServletConfig()方法
重写 getServletInfo() 方法
重写init(ServletConfig arg0)方法
重写service(ServletRequest request, ServletResponse response)方法
重写destroy()方法
3、Servlet的第三种创建方式:继承GenericServlet类
重写service(ServletRequest request, ServletResponse response)方法
五、转发和重定向
转发:requeset can get the value,URL doesn't change.
重定向:request can’t get the value,URL change.
这一部分可以了解一下九大内置对象,四大作用域。
六、Servlet过滤
1、过滤过程
在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
2、Filter建立步骤
(1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。
(2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息 (包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参 数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
(3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参 数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP 页面被激活。
(4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
(5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。
过滤器需要在web.xml文件中进行配置。
<!-- 配置Filter -->
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.mucfc.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<!-- 表示处理根目录下的所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
或者直接用注解
@WebFilter(filterName="log",urlPatterns={"/*"})
public class LogFilter implements Filter {
.................................
}
3、映射的配置
(1) 映射到一个或多个jsp
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/path/FileName.jsp</url-pattern>
</filter-mapping>
(2) 映射到一个或多个servlet
<filter-mapping>
<filter-name>FilterName</filter-name>
<servlet-name>ServletName1</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>FilterName</filter-name>
<servlet-name>ServletName2</servlet-name>
</filter-mapping>
(3) 映射到任意的URL
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
【注】设置编码字符
//编码过滤
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.setCharacterEncoding("utf-8");
4、四种过滤器比较
(1)request过滤器
<filter>
<filter-name>myFilter</filter-name>
<filter-class>packagename.MyFilterName</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> 目标资源1</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> 目标资源2</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理。
(2)forward过滤器
<filter>
<filter-name>myFilter</filter-name>
<filter-class>packagename.MyFilterName</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> 目标资源1</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> 目标资源2</servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
我们看对目标资源二过滤的配置方式,这时过滤方式为forward,也就是说对转发到目标资源二的请求过滤,如果直接访问目标资源二,过滤器将不起作用。
(3)include过滤器
<filter>
<filter-name>myFilter</filter-name>
<filter-class>packagename.MyFilterName</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> 目标资源1</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> 目标资源2</servlet-name>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
此表示对包含了目标资源二的请求过滤,如果直接访问目标资源二,则此过滤器将不起作用。
在JSP页面中的动作:指令包含,这时此过滤器不工作。
(4)error过滤器
<filter>
<filter-name>myFilter</filter-name>
<filter-class>packagename.MyFilterName</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter>
<servlet-name> /error.jsp</servlet-name>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
当我们访问一个web目标资源时,如果服务器没有找到该目标资源,那么服务器就会给出一个404错误代码。如果我们给404错误代码定义一个页面,发生404时,配置了过滤器对错误页面进行过滤,所以过滤器先接受到请求,然后再转发给error.jsp。如果我们访问一个已经存在的页面,会不会调用error.jsp呢?如果这个页面中有response.sendError(404,"出错了!");那么该错误页面仍然会被调用,过滤器也会工作。
六、Servlet监听
1、监听器的作用
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
监听对象:
(1)ServletContext:application,整个应用只存在一个
(2)HttpSession:session,针对每一个对话
(3)ServletRequest:request,针对每一个客户请求
监听内容:创建、销毁、属性改变事件。
监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。
2、监听器的基本使用
步骤:创建一个实现监听器接口的类;配置web.xml文件,注册监听器
<listener>
<listener-class>完整类名</listener-class>
</listener>
监听器的启动顺序:按照web.xml的配置顺序来启动
加载顺序:监听器>过滤器>Servlet
在新servlet3.0中使用注解 @WebListener 即可,无法去定义监听器的顺序
@WebListener("This is a listener")
public class FirstListener impliements ServletRequestListener{}
使用条件:1、使用servlet3.0新标准的jar包;2、JDK在1.6以上版本;3、编译器的编译级别为6.0;4、在web.xml文件中,使用3.0规范;5、使用支持servlet3.0特性的web容器,比如tomcat7;
3、监听器的分类
1、按照监听的对象划分
(1)用于监听应用程序环境对象(ServletContext)的事件监听器,实现ServletContextListener、ServletContextAttributeListener接口
(2)用于监听用户会话对象(HttpSeesion)的事件监听器,实现HttpSessionListener、HttpSessionAttributeListener接口
(3)用于监听请求消息对象(ServletRequest)的事件监听器,实现ServletRequestListener、ServletRequestAttributeListener接口
2、按照监听事件划分
(1)监听域对象自身的创建和销毁的事件监听器
根据监听对象不同分别实现ServletContextListener、HttpSessionListener、ServletRequestListener接口。
①ServletContext的创建和销毁:contextInitialized方法和contextDestroyed方法
主要用途:作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等。
在web.xml中可以配置项目初始化信息,在contextInitialized方法中进行启动
<context-param>
<param-name>属性名</param-name>
<param-value>属性值</param-value>
</context-param>
自定义监听器
public class MyFirstListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
//获取web.xml中配置的属性
String value=sce.getServletContext().getInitParameter("属性名");
System.out.println(value);
}
public void contextDestroyed(ServletContextEvent sce){
//关闭时操作
}
}
②HttpSession的创建和销毁:sessionCreated和sessionDestroyed方法
主要用途:统计在线人数、记录访问日志等。
【注】web.xml配置session超时参数,单位:分,session超时的时间并不是精确的
<session-config>
<session-timeout>10</session-timeout>
</session-config>
③ServletRequest的创建和销毁:requestInitialized和requestDestroyed方法
主要用途:读取request参数,记录访问历史。
public class MySRequestListener implements SevletRequestListener{
public void requestInitialized(ServletRequestEvent sre){
String value=sre.getServletRequest().getParameter("key");//获取request中的参数
System.out.println(value);
}
public void requestDestroyed(ServletRequestEvent sre){
System.out.println("request destroyed");
}
}
(2)监听域对象中的属性的增加和删除的事件监听器
根据监听对象不同分别实现ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。
实现方法:attributeAdded、attributeRemoved、attributeReplaced
(3)监听绑定到HttpSeesion域中的某个对象的状态的事件监听器(创建普通JavaBean)
HttpSession中的对象状态:绑定→解除绑定;钝化→活化
实现接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)
【注1】①要实现钝化和活化必须实现Serializable接口
②不需要在web.xml中注册
【注2】
绑定: 通过setAttribute保存到session对象当中
解除绑定: 通过removeAttribue去除
钝化(序列化): 将session对象持久化到存储设备上
活化(反序列化): 将session对象从存储设备上进行恢复
session钝化机制:①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反序列化到内存中,整个过程由服务器自动完成;
②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和接触需要实现HttpSessionBindingListener接口
Servlet,过滤器和监听器的配置和使用的更多相关文章
- Servlet过滤器和监听器知识总结(转)
Servlet过滤器和监听器知识总结(转) Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤.判断用户的登录状态.过滤器使得Servlet开发者能 ...
- Servlet过滤器和监听器配置范例
1,Servlet过滤器 <filter> <filter-name>charset</filter-name> <filter-class>org.g ...
- Servlet过滤器和监听器知识总结
Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤.判断用户的登录状态.过滤器使得Servlet开发者能够在客户端请求到达 Servlet资源之前被截 ...
- Servlet过滤器和监听器
1,Servlet过滤器 <filter> <filter-name>charset</filter-name> <filter-class>org.g ...
- ssh整合web.xml过滤器和监听器的配置 .
延迟加载过滤器 Hibernate 允许对关联对象.属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行.如果 Service 层返回一个启用了延迟 ...
- Servlet,过滤器,监听器,拦截器的区别
1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml ...
- TODO java-web相关 servlet过滤器+监听器
servlet过滤器 定义: 过滤器是小型的web组件,它负责拦截请求和响应,以便查看.提供或以某种方式操作正在客户机和服务器之间交换的数据. 与过滤器相关的servlet共包含3个简单接口:Filt ...
- Servlet过滤器Filter和监听器
一.Servlet过滤器的概念: *********************************************************************************** ...
- 6.Servlet、Filter过滤器以及监听器
Servlet 是运行在Web服务器端的Java程序,它使用Java语言编写,与Java程序的区别是Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持,在Jav ...
随机推荐
- Linu基础之权限管理
二十二.权限管理 22.1)什么是权限 针对某些文件或者进程,对用户进行限制,权限可以理解为用于约束用户能对系统所做的操作. 22.2)权限和用户的关系 [root@centos7 ~]# ll ...
- java中对事务的理解
一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取. 二.事务的原则(ACID) 原子性:事务要么全部都被执行,要么就全都不被执行,如果有子事务提交失败,那么 ...
- IT技术管理者的自我修养
1. 前言 本来写<IT技术管理者的自我修养>与<IT技术人员的自我修养>是一开始就有的想法.但发表<IT技术人员的自我修养>后,收到了不少良好的反馈,博客园的编辑 ...
- Intent 常用方法总结
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本文主要是总结Intent 常用的方法,并封装成Utils类中 主要涉及以下内容 ...
- 如何让传统ASP.NET网站在Docker中运行
本文主要描述如何让传统ASP.NET网站在Docker中运行,侧重Docker image 搭建. 使用条件: Docker for windows 用户切换到Windows 容器模式 Windows ...
- JavaWeb——使用会话维持状态2
在这次的例子里面,将完成一类似购物车的功能,在客户访问网站的时候,会选中自己将要购买的商品,而购物车将始终维持着商品的状态,会话将联系起选择第一个商品(第一个请求),选择其他商品(其他请求)以及付款等 ...
- mybatis的一对多双向映射
连表查询 select id resultType resultMap resultType和resultMap不能同时使用 association 属性 映射到多对一中的“一”方的“复杂类型”属性, ...
- RabbitMQ的基本介绍及与Spring整合
一,场景回顾 最近做电商购物项目,在分布式中搜索服务,商品详情服务都是独立的模块.那么有一个问题就是: 商品的原始数据保存在数据库中,增删改查都在数据库中完成. 搜索服务数据来源是索引库,如果数据 ...
- Java初学心得(一)
Java中基本组成单元是类,在类中又包含属性和方法. 每个应用程序都包含一个main()方法,main方法里的称为主类. 一,基本变化 ①全局变量:在类中的属性 局部变量:在方法中的属性 ②基本数据类 ...
- 十分钟搭建微服务框架(SpringBoot +Dubbo+Docker+Jenkins源码)
本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程 ...