`
lgh1992314
  • 浏览: 315964 次
文章分类
社区版块
存档分类
最新评论

JSP&Servlet学习笔记----第5章

 
阅读更多

Servlet进阶API

每个Servlet都必须由web容器读取Servlet设置信息(标注或者web.xml)、初始化。
对于每个Servlet的设置信息,web容器会为其生成一个ServletConfig作为代表对象,从中可以取得Servlet初始化参数,以及代表整个web应用
程序的ServletContext对象。
Web容器启动后,会读取Servlet设置信息,将Servlet类加载并实例化,并为每个Servlet设置信息产生一个ServletConfig对象,而后调用Servlet接口的
init()方法,并将产生的ServletConfig对象当做参数传入。
这个过程只会在创建Servlet实例后发生一次。
GenericServlet:
@Override
public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}
public void init() throws ServletException {
    // NOOP by default
}
ServletConfig相当于Servlet的设置信息代表对象。
可以使用标注设置Servlet初始参数
 */
@WebServlet(name = "FiveServlet",
        urlPatterns = {"/five.do"},
        initParams = {
            @WebInitParam(name = "name", value = "xiya"),
            @WebInitParam(name = "age", value = "24")
        })
private String name;
private String age;
@Override
public void init() throws ServletException {
    name = getInitParameter("name");
    age = getInitParameter("age");
}
或者web.xml
<servlet>
    <servlet-name>FiveServlet</servlet-name>
    <servlet-class>FiveServlet</servlet-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>xiya</param-value>
    </init-param>
    <init-param>
        <param-name>age</param-name>
        <param-value>25</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>FiveServlet</servlet-name>
    <url-pattern>/five.do</url-pattern>
</servlet-mapping>
web.xml中的设置会覆盖标注的设置。(标注的name属性需要和web.xml的<servlet-name>匹配)。

ServletContext:作为整个Web应用程序的代表。

应用程序事件、监听器

Web容器管理Servlet/JSP相关的对象生命周期,我们可以使用监听器处理对HttpServletRequest对象、HttpSession对象,ServletContext对象的生成、销毁事件,实际上就是我们编写回调函数,然后由Web容器来调用。

HttpServletRequest事件、监听器

ServletRequestListener:是生命周期监听器。
ServletRequestAttributeListener是属性改变监听器。
public interface ServletRequestListener extends EventListener {

    /**
     * The request is about to go out of scope of the web application.
     * The default implementation is a NO-OP.
     * @param sre Information about the request
     */
    public default void requestDestroyed (ServletRequestEvent sre) {
    }

    /**
     * The request is about to come into scope of the web application.
     * The default implementation is a NO-OP.
     * @param sre Information about the request
     */
    public default void requestInitialized (ServletRequestEvent sre) {
    }
}
测试代码:
import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by N3verL4nd on 2017/3/1.
 */
@WebListener
@WebServlet(name = "ListenerServlet", urlPatterns = {"/listener.do"})
public class ListenerServlet extends HttpServlet implements ServletRequestListener, ServletRequestAttributeListener{

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");
        request.setAttribute("name", "xiya");
        request.setAttribute("name", "xiya1");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("requestDestroyed");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("requestInitialized");
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        System.out.println("attributeAdded");
        System.out.println("attributeAdded: " + srae.getName() + " " + srae.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        System.out.println("attributeRemoved");
        System.out.println("attributeRemoved: " + srae.getName() + " " + srae.getValue());
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        System.out.println("attributeReplaced");
        System.out.println("attributeReplaced:" + srae.getName() + " " + srae.getValue());
    }
}
访问:http://localhost:8080/jspRun/listener.do
输出:
requestInitialized
attributeReplaced
attributeReplaced:org.apache.catalina.ASYNC_SUPPORTED true
doGet
attributeAdded
attributeAdded: name xiya
attributeReplaced
attributeReplaced:name xiya
requestDestroyed

HttpSession事件、监听器

public interface HttpSessionListener extends EventListener {

    /**
     * Notification that a session was created.
     * The default implementation is a NO-OP.
     *
     * @param se
     *            the notification event
     */
    public default void sessionCreated(HttpSessionEvent se) {
    }

    /**
     * Notification that a session is about to be invalidated.
     * The default implementation is a NO-OP.
     *
     * @param se
     *            the notification event
     */
    public default void sessionDestroyed(HttpSessionEvent se) {
    }
}

在HttpSession对象初始化或结束前,分别调用sessionCreated()与sessionDestroyd()方法。

ServletContext事件、监听器

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebListener;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by N3verL4nd on 2017/3/1.
 */
@WebListener
@WebServlet(name = "ContextListenerServlet", urlPatterns = {"/contextListener.do"})
public class ContextListenerServlet extends HttpServlet implements ServletContextListener{
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");
    }
}
[2017-03-01 04:02:31,096] Artifact jspRun:war exploded: Artifact is being deployed, please wait...
[2017-03-01 04:02:31,097] Artifact WeiBo:war exploded: Artifact is being deployed, please wait...
contextInitialized
[2017-03-01 04:02:31,448] Artifact jspRun:war exploded: Artifact is deployed successfully
[2017-03-01 04:02:31,450] Artifact jspRun:war exploded: Deploy took 354 milliseconds
由此可见,当整个Web应用程序加载Web容器之后,容器会生成一个ServletContext对象。
重新部署后的日子信息:
[2017-03-01 04:03:53,921] Artifact jspRun:war exploded: Artifact is being deployed, please wait...
[2017-03-01 04:03:53,922] Artifact WeiBo:war exploded: Artifact is being deployed, please wait...
contextDestroyed
contextInitialized

[2017-03-01 04:03:54,580] Artifact jspRun:war exploded: Artifact is deployed successfully
[2017-03-01 04:03:54,580] Artifact jspRun:war exploded: Deploy took 659 milliseconds
[2017-03-01 04:03:55,270] Artifact WeiBo:war exploded: Artifact is deployed successfully
[2017-03-01 04:03:55,270] Artifact WeiBo:war exploded: Deploy took 1,348 milliseconds

注:
生命周期监听器与属性改变监听器都必须使用@WebListener或在web.xml中设置,容器才会知道要加载、读取监听器的相关设置。

过滤器

它是介于Servlet与浏览器之间,可以拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。
在Servlet/JSP中要实现过滤器,必须实现Filter接口。并且需要使用@WebFilter标注或在web.xml中定义过滤器。
public interface Filter {
    public default void init(FilterConfig filterConfig) throws ServletException {}
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;
    public default void destroy() {}
}
Filter接口的doFilter()方法类似于Servlet接口的service()方法。当请求来到容器,而容器发现调用Servlet的service()方法前,可以应用某过滤器,就会
调用该过滤器的doFilter()方法。
如果调用FilterChain的doFilter()方法,就会运行下一个过滤器,如果没有下一个过滤器,就会调用Servlet的service()方法。
如果没有调用FilterChain的doFilter(),则请求就不会继续交给接下来的过滤器或目标Servlet,这就是所谓的拦截请求。


分享到:
评论

相关推荐

    吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案

    吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案 本资源为吉林大学珠海学院JSP&Servlet学习笔记(第二版)的课后答案,涵盖了JSP和Servlet相关的知识点。本笔记共分为九章,每章节都包含了相关的问题答案,...

    JSP &amp; Servlet学习笔记(第2版)

    书 名:JSP & Servlet学习笔记(第2版) 作 者:(台湾)林信良 著 出 版 社:清华大学出版社 出版时间:2012-5-1 ISBN:9787302283669 纸书页数:456页 定 价:¥ 58.00 内容简介: 本书是作者多年来...

    JSP&Servlet学习笔记(第2版)_打印版

    根据提供的文件信息,标题为“JSP&Servlet学习笔记(第2版)_打印版”,描述指出文档经过空白边裁剪处理以便于打印。虽然提供的部分内文无法直接转化为明确的知识点,但我们可以根据标题和描述推测该文档的主要内容,...

    Servlet&JSP课后习题解答

    Servlet&JSP课后习题解答 Servlet是Java EE规范中的一部分,用于开发基于Web的应用程序。它可以处理HTTP请求,生成动态网页,并与数据库进行交互。JSP(Java Server Pages)是Servlet的扩展,允许开发者使用HTML和...

    day04-Tomcat&Servlet入门-讲义.zip

    【描述】"day04-Tomcat&Servlet入门-讲义.zip"暗示这是一份教学材料,可能包含第四天课程的学习笔记或讲义,专注于初学者如何开始使用Tomcat和Servlet进行Web开发。学习者将通过这份资料了解到如何配置和管理Tomcat...

    JSP-Servlet学习笔记第2版.pdf

    由于直接学习笔记的内容没有给出具体的实例代码和详细解释,所以这里只提供了理论层面的知识点。如果需要学习具体实现,可以寻找相关的教程和项目实践来加深理解。同时需要注意的是,由于JSP/Servlet技术相对老旧,...

    JSP动态网站开发实践教程(第2版)源代码

    《JSP动态网站开发实践教程(第2版)源代码》是学习JSP技术的宝贵资源,它提供了丰富的实例和实战经验,旨在帮助开发者深入理解JSP在构建动态网站中的应用。通过分析和实践这些源代码,我们可以掌握JSP的核心概念、...

    良葛格JspServlet学习笔记.pdf

    ### 良葛格JspServlet学习笔记 #### 一、引言 在现代Web开发领域,特别是Java EE平台中,JSP (JavaServer Pages) 和 Servlet 技术扮演着非常重要的角色。这两种技术共同构成了Java Web应用的基础,分别侧重于用户...

    Servlet学习笔记

    ### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...

    JSP网络编程学习笔记源代码 part2

    第五篇为“标签语言和表达式语言”,主要讲述JSP的标签技术,JSP提供的标准标签库JSTL的用法及用户如何自定义自己的标签库;第六篇为“Web应用高级专题”,主要讲述Servlet过滤器、JSP异常处理、JSP日志、认证和安全...

    servlet和jsp学习笔记

    这篇学习笔记将深入探讨这两个概念,以及它们在实际开发中的应用。 Servlet是Java编程语言的一个接口,由Sun Microsystems(现为Oracle)定义,它允许Java代码与HTTP服务器交互。Servlet主要负责处理客户端的请求并...

    JSP_Servlet

    **JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。** ### JSP简介 JSP是Java平台上的一个服务器端技术,它允许开发者将HTML代码与Java代码混合...

    servlet学习笔记

    ### Servlet 学习笔记 #### 一、Servlet 创建与生命周期 **Servlet** 是 Java Web 开发中的一个核心组件,主要用于处理客户端发送到服务器的 HTTP 请求,并返回相应的响应。Servlet 的创建与生命周期是学习 Java ...

    jsp第七章学习笔记

    ### jsp第七章学习笔记 #### 一、Servlet概述与生命周期 Servlet是一种运行在服务器端的Java程序,主要用于处理客户端的HTTP请求,并做出相应的响应。Servlet技术是Java Web开发的基础,它提供了一种通用、可扩展...

    java学习笔记-----给java初学者

    Java学习笔记是专门为Java初学者设计的一套详尽的学习资源,旨在帮助新手快速掌握这门广泛使用的编程语言。这份笔记涵盖了从基础概念到高级特性的全面内容,是学习和复习Java知识的理想工具。 1. **Java简介** ...

    coreJava、jsp、servlet笔记

    核心Java、JSP(JavaServer Pages)和Servlet是Java Web开发中的基础技术,这三者在Web应用程序的构建中扮演着重要角色。这份压缩包包含了关于这三个主题的详细笔记,对于学习和理解这些技术有着极大的帮助。 首先...

    韩顺平 2011细说Servlet笔记

    韩顺平老师的“2011细说Servlet笔记”是针对这一主题的深入讲解,旨在提供全面且实用的学习资料。在本篇中,我们将深入探讨Servlet的相关知识点,包括其原理、配置、生命周期以及与HTTP协议的交互。 1. **Servlet...

    jsp自制详细笔记

    3. "第五章、第六章JSP":这部分可能涵盖了JSP的详细内容,如JSP页面生命周期、JSP指令(page、include、taglib)、脚本元素(scriptlet、expression、declaration)、动作标签(jsp:include、jsp:forward、jsp:...

    jsp实用教程笔记

    【JSP实用教程笔记】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发工具,它允许开发者在HTML页面中嵌入Java代码,实现服务器端的动态网页生成。本笔记将围绕“jsp实用教程”这本书的核心内容进行展开...

Global site tag (gtag.js) - Google Analytics