JavaWeb(Servlet封装&Filter过滤器&Listener监听器)

本文介绍了JavaWeb中的Servlet、Filter和Listener三大核心组件。Servlet用于接收和响应用户请求,Filter实现请求拦截和响应过滤,Listener监听Web应用程序的各种事件。详细讲解了它们的实现方式、生命周期、配置方法及应用场景,包括编码设置、获取ServletContext路径、监听器实现在线人数统计等关键知识点。

servlet基本使用

servlet概述

就是一个java类,是javweb的规范之一,也是三大组件之一(serlvet,listener,filter)

作用:负责接收用户的请求以及做出响应。(之前是由doXxx.jsp)

快速入门:

  1. 实现servlet接口 不常用

  2. 继承HttpServlet抽象类 doGet doPost

完成servlet文件的编写后必须要实现配置

例如客户端发出登录请求,或者输出注册请求,这些请求都应该有servlet来完成处理!servlet需要我们自己来编写,每个servlet必须实现javax.servlet.Servlet接口。

web.xml中进行配置

只要修改了web.xml最好重新发布并启动tomcat;

代码展示:

<servlet>    
    <servlet-name>xxx</servlet-name>    
    <servlet-class>com.zking.AServlet</servlet-class></servlet>
<servlet-mapping>    
    <servlet-name>xxx</servlet-name>   
    <url-pattern>/xxx.do</url-pattern>
</servlet-mapping>

如何获取name?

<servlet> <servlet-name>DemoServlet</servlet-name>

<!-- 全路径类名 com.zking.servlet.DemoServlet-->

<servlet-class>com.zking.servlet.DemoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DemoServlet</servlet-name> <url-pattern>/dologin.do</url-pattern> </servlet-mapping>

servlet的作用是处理请求步骤:

  1. 接收请求数据

  2. 处理请求

  3. 完成响应

实现servlet的方式:

通常会继承HttpServlet类来完成我们的Servlet。

代码展示:

public interface Servlet{
    public void init(servletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse resp) throws ServletException,IOException;
    public String getServletInfo();
    public void destory();
​
}
  • Servlet执行原理:
  • (1)当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  • (2)查找web.xml文件,是否有对应的<url-pattern>标签体内容。
  • (3)如果有,则在找到对应的<servlet-class>全类名
  • (4)tomcat会将字节码文件加载进内存,并且创建其对象
  • (5)调用其方法

内置对象与servlet的对应关系:

  • JSP九大内置对象 Servlet

  • pageContext :null

  • request :HttpServletRequest(常用)

  • session :HttpSession(通过request.getSession())(常用)

  • application :ServletContext(this.getServletContext())

  • response :HttpServletResponse

  • out :PrintWriter(resp.getWriter())(常用)

  • page :this

  • config :ServletConfig(获取Servlet初始化参数的值)

  • exception :Exception

1、如何获取Servlet内置对象?

servlet中2个重要对象

ServletConfig配置对象

ServletContext全局对象

如何在serlvet中获取到当前项目的绝对路径?

这里的绝对路径指的是基于项目的根目录而不是基于磁盘。

String path = this.getServletConfig().getServletContext().getContextPath();
​
/项目名称
path+"/index.jsp"

2、如何设置编码的问题?

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

ServletConfig

1、简介

当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init()方法传入一个ServletConfig对象,即传入一些配置信息给Servlet。

2、生命周期

应用一加载则创建,应用停止则被销毁;

3、常用方法

返回值方法名说明
StringgetInitParameter(String name)根据参数名称获取参数的值
Enumeratin<String>getInitParameterNames()根据所有参数名称的枚举
StringgetSevletName()获取servlet的名称
ServletContextgetServletContext()获取servletContext对象

4、ServletConfig的配置方式

在<servlet>标签种,通过<init-param>标签来配置。有两个子标签:

<param-name>:代表初始化参数的key。

<param-value>: 代表初始化参数的value。

ServletContext

1、概述:ServletContext对象是一个应用上下文对象,也是一个域对象。表示Servlet应用程序,每个web应用程序都只有一个ServletContext对象。

2、常用方法

返回值方法名说明
voidsetAttribute(String name,Object value)向域对象中存储数据
ObjectgetAttribute(String name)通过名称获取域对象中的数据
voidremoveAttribute(String name)通过名称移除域对象中的数据
Enumeration<String>getAttributeNames()获取域对象中所有数据的名称
StringgetSevletContextName()获取servletContext的名称
StringgetContextPath()获取当前应用的访问虚拟目录
StringgetServletInfo()获取服务器名称和版本信息
StringgetInitParameter(String name)根据名称获取全局配置的值
Enumeration<String>getInitParameters()获取全局配置的所有名称
StringgetRealPath(String path)根据虚拟目录获取应用部署额磁盘绝对路径

3、ServletContext配置方式

  • ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;

  • 在<web-APP>标签中,通过<context-param>标签来配置,有两个子标签: <param-name>: 代表全局初始化参数的key。 <param-value>: 代表全局初始化参数的value。

注意事项:在Servlet规范中,一共有4个域对象。其他三个是:request请求域PageContext页面域session会话域。ServletContext就是其中的一个。是web应用中最大的作用域,也叫application应用域,可以实现整个应用之间的数据共享!(全局的初始化参数)

Filter过滤器

Filter过滤器的使用

1.什么是过滤器? Filter过滤器它是JavaWEB三大组件之一(Servlet应用程序、Listener监听器、Filter过滤器) Filter过滤器它是JavaEE的规范,也就是接口。 Filter过滤器它的作用:拦截请求,过滤响应 它会在一组资源(jsp,servlet,.css,.html等)的前面执行

2.过滤器使用场景

自动登录 统一设置编码格式 访问权限控制 敏感字符过滤等

3.如何编写过滤器? a.自定义类实现Filter接口,重写接口中的抽象方法(3个) b.在web.xml中进行配置

<filter>
    <filter-name>DemoFilter</filter-name>
    <filter-class>com.zking.filter.DemoFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>DemoFilter</filter-name>
    <url-pattern>/as.do</url-pattern>
    </filter-mapping>

4、如何拦截的内容?

<url-pattern>/a.jsp</url-pattern>://拦截a.jsp页面
<url-pattern>/*.jsp</url-pattern>//拦截jsp页面
<url-pattern>/*.do</url-pattern>//拦截全部do页面
<url-pattern>/*</url-pattern>//针对所有加载页面

注意事项:

4.1、常用配置项:

urlPatterns 以指定资源匹配。

例如"/index.jsp" 以目录匹配。例如"/servlet/" 以后缀名匹配,例如".jsp" 通配符,拦截所有web资源。"/"

4.2、URL通配符:

① 所有界面

.后缀 [*.do] 匹配所有后缀为do的界面

4.3、多个过滤器的执行顺序 过滤器的执行顺序和url-pattern标签匹配的精确程度无关,只和他们的filter-mapping标签在web.xml文件中的顺序有关,靠上的配置的先执行。

5、Filter生命周期

  1. 构造器:Filter的构造器在服务器启动时调用。 构造器只会调用一次,说明Filter也是单例多线程的。
  2. init():在构造器被调用后,紧接着被调用。作用:用来初始化Filter。
  3. doFilter():每一次拦截请求时都会调用。
  4. destroy方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。

代码展示:

该类要称为过滤器类       实现Filter接口   继承HttpFilter
public class FilterDemo implements Filter{
​
    @Override
    public void destroy() {
        System.out.println("过滤器被销毁了~~~~~~");
    }
​
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        //小日本  所设的关卡   
        System.out.println("来了老弟~~~放我过去!!!!!!!!!!");
        System.out.println("放行  start");
        //没有什么要求  我直接放你过去
        arg2.doFilter(arg0, arg1);
        System.out.println("放行  end");
    }
​
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("过滤器被初始化了~~~");
    }


Listener监听器

1、第三种Servlet程序: 监听Servlet Listener

2、主要功能是负责监听Web的各种操作,当相关的事件触发后将产生事件,并对事件进行处理。

监听器分为3种:

  • application监听器
  • session监听器
  • request监听器

application监听器 servlet---ServletContext

实现:ServletContextListener (常用)

public class ListenerDemo1 implements ServletContextListener{
​
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("监听器被销毁");
    }
​
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("监听器开始监听.....");
        //获取上下文对象 ServletContext
        ServletContext application = arg0.getServletContext();
        application.setAttribute("count",new Integer(1));
    }
​
}

3、HttpSessionBindingEvent事件方法: .getSession() //取得session .getName() //取得属性的名称 .getValue() //取得属性的内容

4、ServletContextEvent事件方法: .getServletContext() //取得ServletContext对象,即上下文

.getServletRequest() //取得ServletRequest对象

ServletContext配置方式:

ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;

在<web-APP>标签中,通过<context-param>标签来配置,有两个子标签: <param-name>: 代表全局初始化参数的key。 <param-value>: 代表全局初始化参数的value。

案例:监听在线人数

public class AppListrener implements ServletContextListener,HttpSessionListener {

	ServletContext app=null;

	//容器销毁时调用
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("容器销毁了");

	}
	//容器初始化时调用
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("容器初始化了");
		app=sce.getServletContext();
		Integer count=0;
		app.setAttribute("cut", count);
		System.out.println(count+"___");
	}

	//session创建时调用
	public void sessionCreated(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("session创建时调用");
		Integer count=(Integer)app.getAttribute("cut");

		if(count==null){
			count=0;
		}
		count++;
		System.out.println("创建时:"+count);
		app.setAttribute("cut", count);
	}

	//session销毁时调用
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("session销毁时调用");
		Integer count=(Integer)app.getAttribute("cut");

		if(count==null){
			count=0;
		}
		count--;
		System.out.println("注销时:"+count);
		app.setAttribute("cut", count);
	}

web.xml配置

<listener>
	<listener-class>com.servlet.AppListrener</listener-class>
</listener>

实现思路:创建一个会话就+1,销毁了会话则-1(在会话被创建时,往全局变量中+1;会话被关闭时,全局变量-1)服务器停止则移除 count;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值