Servlet,过滤器,监听器入门案例

简介:梳理一下基础知识点的入门案例,具体的详解可以看相应链接中的文章。

目录

  1. web项目基本结构
  2. Servlet入门案例
  3. 过滤器
  4. 监听器

1.web项目基本结构

web项目新建后,有一个src目录,是专门用来存Java文件的。
此外还要一个web目录(或webapp或WebContent),里面有一个MATA-INF文件夹,该文件夹用来存放一些项目相关的元数据(用来描述数据的数据)。除此之外,还有一个WEB-INF文件夹,这个是web项目特有的,该文件夹客户端是无法访问的。所以我们的页面文件一定不能放在这里,否则还需要额外的web.xml配置才能访问。一般会放一些jar包和web.xml。
在这里插入图片描述
在下面的项目中,还创建了一个pages文件夹,专门来放其它的页面。

2.Servlet入门案例

Servlet就是实现了Servlet接口的Java类,由于页面的拼接比较繁琐,我们这里的demo就把处理的数据数据输出到控制台上。index页面中的代码为一个简单的表单:

  <form action="showname" method="post">
    <input type="text" name="userName" value="Tom">
    <input type="submit" value="showName">
  </form>

可以看到,我们这个表单,所要请求的,就是一个URL,而这个地址对应的资源,就是一个Servlet(写映射的路径名就行,不用打斜杠)。当我们点击提交时,请求的地址即为项目路径下的/showname。可我们的Java程序,又不是在这个路径下的,所以还得让该地址和对应的Java程序,形成一个映射关系,让服务器知道,如果访问这个路径,那么就调用哪个Servlet程序。该映射是写在web.xml文件中的。
首先我们需要一个servlet标签和一个servlet-mapping标签

<servlet>
	<servlet-name>sayhi</servlet-name>
	<servlet-class >com.sayhello.ShowName</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>sayhi</servlet-name>
	<url-pattern>/showname</url-pattern>
</servlet-mapping>

servlet标签里面写上我们Servlet程序的所在位置(从类路径开始写就可以了,注意包之间用点隔开),随后再取一个有意义的名字。
servlet-mapping中,要填写一个URL路径,这个路径就是我们action中填的路径,只不过要打上斜杠,访问这个路径后,就去学寻找该标签中另一个子标签servlet-name里的那个Servlet,所以如果我们想要映射能够对应上,名字一定要写对了(想把请求交给哪个Servlet,就写哪个Servlet的名字,而Servlet的名字,可以通过servlet标签中的servlet-name进行配置)。
Servlet代码如下:

public class ShowName extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req.getParameter("userName"));
    }
}

ShowName类继承了HttpServlet ,并重写了doGet和doPost方法,用来处理相应的请求方式。
上面的方式是最快捷的写法,下面则是来更加系统得理一下Servlet接口的相关知识。
还未更新。。。

3.过滤器实例

过滤器也只是一个普通的Java类,实现了Filter接口,该接口只有3个方法,并且是由系统自动创建对象和调用的:
在这里插入图片描述
这三个方法就是他的生命周期方法。

  • init方法在创建对象时就会执行且执行一次,而该对象在服务启动时(不需要有请求),就会被创建。
  • doFilter方法在过滤时被调用。
  • destroy方法在服务器关闭时调用且执行一次。

过滤器的主要功能是,当客服端发起请求后,该程序可以对该请求进行数据处理,并把处理后的数据提交给服务器,甚至可以驳回客户端的请求。当然,对于服务器返回给客户端的响应数据,过滤器也可以进行数据处理,然后把处理后的数据,交给客户端。
在这里插入图片描述
下图为一个过滤器实例:

public class Filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("开始过滤");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if ("Tom".equals(servletRequest.getParameter("userName"))) {
            System.out.println("是Tom");
        } else {
            System.out.println("不是Tom");
        }
        filterChain.doFilter(servletRequest,servletResponse);//放行请求或执行下一个过滤器
        //对响应数据进行相应的处理了
        System.out.println(servletResponse.getCharacterEncoding());
    }

    @Override
    public void destroy() {
        System.out.println("销毁过滤");
    }
}

和Servlet一样,过滤器的使用也需要配置到web.xml中:

    <filter>
        <filter-name>f01</filter-name>
        <filter-class>com.sayhello.Filter01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f01</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

整体的结构和xml是相似的,只不过url-pattern中,填入的是想要拦截的请求,使用上图方式,代表拦截所有的请求。

过滤器链

过滤器是可以有多个的,当一个请求申请访问时,可以被多个过滤器拦截,只要有任意一个拦截了请求,那么请求就不能达到服务器。多个过滤器的执行顺序则取决于在web.xml文件中配置的先后顺序。

过滤的四种拦截方式
	<filter-mapping>
        <filter-name>f01</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

这里的dispatcher标签,写一个,就表示会拦截此类的访问方式,如果什么都不写,就默认为一个dispatcher>REQUEST</dispatcher>,但一旦显示指明,那么写了哪些,就有哪些。

4.监听器实例

监听器也是一个普通的Java类,不过根据监听对象的不同,也会实现不同的接口。当前,监听器可以对request对象,session对象和application对象进行监听。
监听器也需要配置到web.xml文件中,不过由于是针对对象进行操作和url-pattern无关,所以无需配置mapping,只需:

	<listener>
        <listener-class>com.sayhello.Listener01</listener-class>
    </listener>

对于3大域的对象,都有着对应的两类接口——"生命周期监听“和”属性监听"。顾名思义,一个是在用来监听对象的创建与销毁,一个是用来监听对象中属性的修改(增删改)。
基本的格式如下:

生命周期监听接口通用格式:对象的数据类型Listener,如:

  • request对象:ServletRequestListener
  • session对象:HttpSessionListener
  • applocation对象:ServletContextListener

属性监听接口通用格式:对象的数据类型AttributeListener,如:

  • request对象:ServletRequestAttributeListener
  • session对象:HttpSessionAttributeListener
  • applocation对象:ServletContextAttributeListener

下面以request对象为例,来演示一下实际的代码
使用的前端页面如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
	  <title>index</title>
  </head>
  <body>
	  <form action="showname" method="post">
	  	<input type="text" name="userName" value="Tom">
	    <input type="submit" value="showName">
	  </form>
  </body>
</html>

生命周期监听器

request对象生命周期的监听:

public class ReqListener implements ServletRequestListener {
    
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("开始");
    }
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("销毁");
    }
    
}

3大域的生命周期接口,都只有两个方法:
监听的对象被创建时调用:requestInitialized(相应的事件)
监听的对象被销毁时调用:requestDestroyed(相应的事件)
当然,其它两个对象的写法有些区别:
在这里插入图片描述
从图中可以看出,这些方法都带着一个参数,这个参数就代表了事件对象(即触发了该时间的对象)。比如监听器1号对所有的request对象进行监听,当request1号被创建的时候,就会调用监听器1号的requestInitializedServletRequestEvent sre方法,而该方法的传参,则正是基于request1号而转化的event对象
所以可以说,事件源是数据类型,事件对象则是具体的实例

对于不同的事件源(域类型),他们触发的时机如下:

事件源创建时机销毁时机补充
ServletRequest请求发出时创建(不能是请求静态资源)一次访问结束(产生响应)时销毁
HttpSession首次访问服务器,且调用了request.getSession()方法时创建(jsp会自带创建session的代码)。session超时,调用invalidate()方法等具体生命周期可参考HttpSession生命周期
ServletContext服务器启动时创建服务器关闭时销毁一个项目只有一个ServletContext对象,即application

属性监听器

属性监听器和生命周期类似,每种事件源都分别实现各自的接口,而各接口中,也都只有三个方法:属性创建删除替换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面写一个application属性监听器的实例:
jsp代码如下:

<%
    application.setAttribute("k1","v1");
    application.setAttribute("k1","v11");
    application.removeAttribute("k1");
 %>

监听器代码如下:

public class ScaListener implements ServletContextAttributeListener {

    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("添加了" + scae.getName() + "--" + scae.getValue());
    }
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("删除了" + scae.getName() + "--" + scae.getValue());
    }
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("修改前" + scae.getName() + "--" + scae.getValue());
        System.out.println("修改后" + scae.getName() + "--" +
        	scae.getServletContext().getAttribute(scae.getName()));

    }
}

控制台输出的结果:
在这里插入图片描述
我们平常说的监听器,一共有八种,除了上述的6种,还有2种属于感知监听,都与session相关,且不需要注册到web.xml中,具体的写在了这篇文章中:对象感知监听器

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值