servlet、filter、listener继承的基类和获得作用域的方式
一、servlet:
1、servlet属于j2ee的组件,构建servlet的web project不需要导入项目框架jar包
2、servlet的体系结构:
在j2ee API中,提供给servlet的支持接口和基类都位于javax.servlet.*和javax.servlet.http.*(提供所有与http请求有关的API)两个包中
servlet包中常使用的接口
Interface ServletConfig
Interface ServletContext
Interface ServletRequest
Interface ServletResponse
Interface Servlet:此接口中提供的方法有init,getServletConfig,getServletInfo,destroy,service
jqavax.servlet.Genericservlet(实现了servlet接口,实现了基本servlet功能,提供有service()方法)
javax.servlet.http.HttpServlet(继承了Genericservlet类,可以处理http请求,提供的doGet()+doPost()和service()方法作用相同
3、实现servlet控制器的功能类需要继承HttpServlet类,并重写HttpServlet类中的方法
public class TestServlet extends HttpServlet{
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String username=req.getParameter("username");//可以随意调用Request和Response方法
String name="admin";
String password="admin";
System.out.println(name+"\t"+password);
}
public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
this.doPost(req, resp);
System.out.println("这是get提交方式");
}
通过上面的这种重写方式,可以避免因处理doGet或者doPost不同的提交方式而导致代码重复的问题
或者采用重写service()方法,实际上,重写doGet()和doPost()方法,也是程序自动调用service()方法进行解析get或者post的提交方式:
public void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
String username=req.getParameter("username");//可以随意调用Request和Response方法
String name="admin";
String password="admin";
System.out.println(name+"\t"+password);
}
servlet的生命周期:通过重写下面的两个方法(过滤器中的)可以了解servlet的生命周期:
public void init(ServletConfig config)throws ServletException{
//第一条请求到来时加载,可以将当前servlet的初始化配置以ServletConfig config类型传出来
System.out.println("servlet初始化");
}
public void destroy(){------------------------------------->>//服务器停止时加载,是最后调用的方法
System.out.println("servlet的销毁方法");
}
4、servlet中获得请求对象:
application----ServletContext ServletContext application=config.getServletContext();这是通过config获得的,也可以通过session获得
session----HttpSession HttpSession session=request.getSession();通过session获得
request---HttpServletRequest,继承ServletRequest------------>>servlet,filter listener等的所有请求都是这个类型的
response---HttpServletResponse,继承ServletResponse---------->>servlet,filter listener等的所有响应都是这个类型的
config---ServletConfig ------------------>>获得初始化参数值
out----PrintWriter:PrintWriter out = response.getWriter();
exception----Exception
pageContext----javax.servlet.jsp.PageContext
page----javax.servlet.jsp.JspPage
5、servlet在web.xml中的配置:
<!-- 配置servlet -->
<servlet>
<servlet-name>LoginServlet</servlet-name>--------->>为此servlet定义的名称
<servlet-class>net.cstp.servlet.LoginServlet</servlet-class>-------->>让容器tomcat加载相应的servlet类
<1-- 可以设置初始化参数,在servlet初始化方法中通过ServletConfig config对象获得该初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>---------->>为了找到匹配加载类(servlet控制器),与servlet节点中的name相同
<url-pattern>/login</url-pattern>------------------>>servlet入口,与地址栏的url或者表单中action的url相对应,以/开头
</servlet-mapping>
<!-- 配置session的生命周期:单位分钟 -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
二、filter:过滤器,j2ee组件
1、filter的体系结构:位于javax.servlet.*包中
FilterConfig:提供获得application对象的方法getServletContext() 以及初始化请求参数的方法getInitParameter(String name)
FilterChain:提供向下传递请求的方法doFilter(ServletRequest request, ServletResponse response)
Filter:提供三个方法,filter初始化init()、销毁destroy() 、处理请求doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
2、实现filter接口功能的方式:实现Filter接口,并重写Filter接口的三个方法
public class Myfilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("过滤器初始化成功");
}
public void destroy() {
System.out.println("过滤器销毁的方法");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//获得能处理http请求的请求request和响应response对象
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
String username=(String)request.getSession().getAttribute("username");
if(username!=null){
//调用FilterChain接口声明的变量chain作用:1.让请求沿着过滤器向下传递;2.起分割的作用:上处理请求,下处理响应
System.out.println("处理的相关请求");
chain.doFilter(request, response);
System.out.println("处理的相关响应");
}else{
response.sendRedirect("../index.jsp");
}
}
}
3、filter在web.xml中的配置:
<!-- 全部过滤 -->
<filter>
<filter-name>YourFilter</filter-name>
<filter-class>net.cstp.filter.YourFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>YourFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 选择性过滤 -->
<filter-mapping>
<filter-name>YourFilter</filter-name>
<url-pattern>/update</url-pattern>
</filter-mapping>
三、Listener:监听器,j2ee组件
1、Listener的体系结构,位于javax.servlet.*和javax.servlet.http.*:针对不同的作用域对象,提供相对应的实现接口,并且依据作用不同,区分不同功能的实现接口
request对象:
Interface ServletRequestListener:提供创建和销毁的方法
Interface ServletRequestAttributeListener:对作用域中属性值添加、删除、替换的监测
session对象:
Interface HttpSessionListener,可以用于统计网站当前的在线人数
Interface HttpSessionAttributeListener:绑定值 解除绑定
Interface HttpSessionBindingListener
application对象:
Interface ServletContextListener:监听tomcat的启动或者或者销毁,也可以说当web项目被加载或者被销毁的时候,可以用于统计网站历史访问量
Interface ServletContextAttributeListener
2、自定义监听器:
1)、实现ServletRequestListener接口:
public class ValidateRequestListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent event) {
System.out.println("监听器已经销毁");
}
public void requestInitialized(ServletRequestEvent event) {
System.out.println("监听器已经启动");
ServletRequest req=event.getServletRequest();
HttpServletRequest request=(HttpServletRequest)req;
....
}
}
2)、实现ServletRequestAttributeListener接口:
public class ValidateServletArributeRequest implements ServletRequestAttributeListener {
//当把值添加到作用域中时,能够监测得到
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("向request作用域添加一个属性名"+arg0.getName()+"的值为:"+arg0.getValue());
}
//当把值从作用域中删除时,能够监测得到
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("把值从作用域中删除了"+arg0.getName()+"的值为:"+arg0.getValue());
}
//当把作用域中的值替换时,能过监测得到
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("获得被替换值为:"+arg0.getName()+"的值为:"+arg0.getValue());
ServletRequest req=arg0.getServletRequest();
HttpServletRequest request=(HttpServletRequest)req;
String name=(String)request.getAttribute("name");
System.out.println("获得替换后的值为:"+name);
}
}
3、listener在web.xml中的配置:用到哪个,添加哪个
<listener>
<listener-class>net.cstp.listener.ValidateRequestListener</listener-class>
</listener>
<listener>
<listener-class>net.cstp.listener.ValidateSessionListener</listener-class>
</listener>
<!--
<listener>
<listener-class>net.cstp.listener.ValidateApplicationListener</listener-class>
</listener>
四、servlet、filter、listener的配置顺序与加载顺序:
加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加 载 filter。但是配置顺序尽量与加载顺序一致,也方便管理
web.xml 的加载顺序是:context- param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据 对应的 mapping 的顺序进行调用的。
servlet、filter、listener继承的基类和获得作用域的方式的更多相关文章
- ServletContextInitializer添加 servlet filter listener
ServletContextInitializer添加 servlet filter listener https://www.cnblogs.com/pomer-huang/p/9639322.ht ...
- SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式
在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- SpringBoot---注册Servlet,Filter,Listener
1.概述 1.1.当使用 内嵌的Servlet容器(Tomcat.Jetty等)时,将Servlet,Filter,Listener 注册到Servlet容器的方法: 1.1.1.直接注册Bean ...
- servlet filter listener interceptor 知识点
这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下: 概念 生命周期 使命 servlet ...
- C++ | 继承(基类,父类,超类),(派生类,子类)
转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...
- C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决
1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...
- servlet/filter/listener/interceptor区别与联系
转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...
随机推荐
- rac_grid自检提示缺少pdksh-5.2包
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- Codeforces Round #316 (Div. 2) B. Simple Game
思路:把n分成[1,n/2],[n/2+1,n],假设m在左区间.a=m+1,假设m在右区间,a=m-1.可是我居然忘了处理1,1这个特殊数据.被人hack了. 总结:下次一定要注意了,提交前一定要看 ...
- Cisco交换机解决网络蠕虫病毒入侵问题
Cisco交换机解决网络蠕虫病毒入侵问题 今年来网络蠕虫泛滥给ISP和企业都造成了巨大损失,截至目前已发现近百万种病毒及木马.受感染的网络基础设施遭到破坏,以Sql Slammer为 ...
- Container详解
Container是一个拥有绘制.定位.调整大小的widget. padding和margin padding和margin分别设置Container的内边距和外边距.可取值包括下面四个: EdgeI ...
- Cisco交换机IOS配置介绍
一.模式• 用户模式(>):• 特权模式(#):• 全局配置模式(config#):• 接口配置模式(config-if#):• 线路模式(#config-line): 二.基本IOS命令结构• ...
- ES6学习基础
1.let和const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升 { let a = 20; } console.log(a); ...
- VS Code在本地进行调试和打开本地服务器
进行本地调试 1.在扩展中搜索插件 Debugger for Chrome 进行安装.我已经进行了安装,就没有出现安装字样. 2.配置launch.json文件,根据步骤来.file就是你在浏览器中需 ...
- 动态规划 LCS,LIS
1.最大连续子序列 dp[i]=max(dp[i-1]+a[i],a[i]) 以i为结尾 2.最大不连续子序列 dp[i]=max(dp[j]+a[i],dp[j]) 3.最大连续递增子序列 if a ...
- .Net中常用的几种ActionResult
1.ViewResult 表示一个视图结果,它根据视图模板产生应答内容.对应得Controller方法为View. 2.PartialViewResult 表示一个部分视图结果,与ViewResult ...
- 漫漫人生路,学点Jakarta基础-Java8函数式编程
接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...