zoukankan      html  css  js  c++  java
  • web三大组件

    一.Listener
    [1]监听器简介
    > Listener是JavaWeb中三大组件之一。Servlet、Filter、Listener
    > 三大组件都有的共同特点,都需要实现一个接口,并在web.xml文件配置。
    监听器:朝阳群众
    监听对象:明星
    监听的事件:干坏事
    调用方法:报警

    > JavaWeb中的监听器的监听对象是谁?
    ServletContext
    HttpSession
    ServletRequest

    [2]监听器分类
    > JavaWeb中的监听器共有三种,共8个监听器
    - 生命周期监听器,监听三个对象的创建和销毁的事件。(3个)

    - 属性监听器,监听三个对象中属性的变化。(3个)

    - session对象监听器,将它session中的属性,以及session的活化和钝化。(2个)

    [3]生命周期监听器
    ServletContextListener
    - ServletContext生命周期监听器
    - void contextDestroyed(ServletContextEvent sce)
    - 该方法在ServletContext对象销毁前调用

    - void contextInitialized(ServletContextEvent sce)
    - 该方法在ServletContext对象创建之后调用。

    - ServletContextEvent 对象可以获取到ServletContext对象
    ServletContextEvent.getServletContext();

    HttpSessionListener
    - HttpSession生命周期监听器
    - void sessionCreated(HttpSessionEvent se)
    - 该方法在Session创建时调用

    - void sessionDestroyed(HttpSessionEvent se)
    - 在session销毁时调用

    - HttpSessionEvent
    - 可以获取HttpSession对象

    ServletRequestListener
    - void requestDestroyed(ServletRequestEvent sre)
    - 在request请求响应时调用

    - void requestInitialized(ServletRequestEvent sre)
    - 在request请求开始时调用

    - ServletRequestEvent
    可以获取ServletContext对象和ServletRequest

    编写一个监听器的步骤:
    1.创建一个类并实现一个接口。
    2.在web.xml文件中注册监听器。

    [4]属性监听器
    > 属性监听器,监听三个域中的属性的变化:添加一个属性,替换一个属性,移除一个属性
    > ServletContextAttributeListener
    - 监听ServletContext中的属性的变化

    void attributeAdded(ServletContextAttributeEvent scab)
    - 当向ServletContext中添加属性时调用

    attributeRemoved(ServletContextAttributeEvent scab)
    - 移除属性时调用

    attributeReplaced(ServletContextAttributeEvent scab)
    - 替换一个属性时调用

    > HttpSessionAttributeListener
    void attributeAdded(HttpSessionBindingEvent se)
    void attributeRemoved(HttpSessionBindingEvent se)
    void attributeReplaced(HttpSessionBindingEvent se)

    - HttpSessionBindingEvent
    1.可以获取到属性名 getName()
    2.可以获取属性的旧值 getValue()
    3.可以获取到HttpSession对象 getSession();

    > ServletRequestAttributeListener
    void attributeAdded(ServletRequestAttributeEvent srae)
    void attributeRemoved(ServletRequestAttributeEvent srae)
    void attributeReplaced(ServletRequestAttributeEvent srae)

    > 以下两个监听器监听session域中的属性的。
    [5]HttpSessionBindingListener
    > 监听session域中某一个类的实例的添加和移除。
    > 该接口由JavaBean来实现,不需要再web.xml文件配置
    valueBound(HttpSessionBindingEvent event)
    - 当该类的实例,作为属性设置进session域中时调用
    valueUnbound(HttpSessionBindingEvent event)
    - 当该类的实例,从session域中被移除时调用

    [6]HttpSessionActivationListener
    > 监听session域中的某类属性,和session一起活化和钝化的事件。
    > 该接口由JavaBean来实现,同样不需要再web.xml中配置,但是该JavaBean需要实现Serializable接口!
    void sessionDidActivate(HttpSessionEvent se)
    - 当前对象和session一起被活化到内存时调用

    void sessionWillPassivate(HttpSessionEvent se)
    - 当前对象和session一起钝化到硬盘时调用

    2.Filter
    [1] Filter简介
    > Filter翻译为中文是过滤器的意思。

    > Filter是JavaWeb的三大web组件之一:Servlet、Filter、Listener

    > Filter的作用是在请求到达WEB资源(HTML、CSS、Servlet、JSP)之前进行拦截。

    > Filter需要交给Tomcat访问器来管理


    二. Filter的作用:
    1.Filter可以在请求到达目标资源之前进行拦截
    2.Filter也可以放行请求
    3.Filter可以在响应到达浏览器之前做一个预处理

    [2] Filter的HelloWorld
    > 步骤:
    1.创建一个类实现Filter接口
    2.在web.xml文件中对Filter进行配置
    <filter>
    <filter-name>Filter的别名</filter-name>
    <filter-class>Filter的全类名</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>别名</filter-name>
    <url-pattern>需要Filter拦截的资源地址</url-pattern>
    </filter-mapping>

    [3] Filter的生命周期
    > 一个请求的发送,到响应返回是一个线程。

    > Filter的生命周期,指的是Filter对象由被创建到被销毁的过程。

    > Filter的生命周期方法:
    - 构造器:Filter的构造器在服务器启动时调用。 构造器只会调用一次,说明Filter也是单例多线程的。
    - init():在构造器被调用后,紧接着被调用。作用:用来初始化Filter。
    - doFilter():每一次拦截请求时都会调用。
    参数
    ServletRequest request
    > 请求报文
    ServletResponse response
    > 响应报文
    FilterChain chain
    > 该对象的作用就是放行请求:
    可以通过 chain.doFilter(request,response) 放行请求。
    当调用chain.doFilter()就相当于调用目标的资源的service方法。
    - destroy方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。

    > url-pattern的设置规则:

    1.精确匹配:只有当目标资源的地址和url-pattern的地址一模一样时,Filter才会拦截资源
    例子:/2.jsp , 只有当浏览器访问项目根目录下的2.jsp时,才会调用Filter

    2.路径匹配:当访问的资源在url-pattern配置的路径下时,Filter就会拦截资源。
    例子1:/hello/* , 只要访问项目根目录下hello下的资源,就会调用Filter。
    例子2:/* , 会拦截项目根目录下所有资源

    3.后缀匹配:只要访问的资源地址和url-pattern的后缀一样就会调用Filter
    例子:*.jsp 只要是以jsp结尾的请求都会拦截

    - 以上规则适用于Servlet的url-pattern配置

    - 当使用Filter拦截一个Servlet时,可以将Filter的url-pattern和Servlet的url-pattern一样
    这样Filter就会拦截发送到Servlet的请求。

    - 也可以通过在filter-mapping中添加一个servlet-name标签来设置要拦截的Servlet的name

    [4] Filter的执行顺序
    > 我们可以为一个资源设置多个过滤器,
    当我们为一个资源设置了多个过滤器时,这些过滤器就组成一个Filter链的结构。
    当我们去掉用chain.doFilter(),如果该过滤器后边还有其他的过滤,
    相当于调用了下一个过滤器doFilter()方法
    如果过滤器后没有其他的过滤器,我们调用chain.doFilter()
    相当于调用了目标资源的service()方法。

    > 多个Filter的执行顺序,有filter-mapping标签的配置顺序决定,
    filter-mappint靠前,则filter先执行,靠后则后执行。

    > 我们可以通过修改filter-mapping的顺序来修改Filter的执行顺序,

    [5] dispatcher
    > Filter默认只会拦截直接向目标资源发送的请求,而像转发之类的请求不会拦截
    > 可以在在filter-mapping的dispatcher标签中来指定过滤器要拦截的请求类型:
    <dispatcher>REQUEST</dispatcher>
    代表拦截发送到目标资源的直接请求,如果不指定dispatcher默认值就是request
    如果在filter-mapping设置了dispatcher则按照设置的内容来

    <dispatcher>FORWARD</dispatcher>
    FORWARD代表会拦截通过转发访问目标资源的请求。

    <dispatcher>INCLUDE</dispatcher>
    INCLUDE会拦截动态包含的请求。

    <dispatcher>ERROR</dispatcher>
    ERROR是拦截在web.xml中声明的错误页面的
    - 我们可以在web.xml文件进行一个错误页面的映射,通过如下标签:
    <error-page>
    <error-code>404</error-code>
    <location>/4.jsp</location>
    </error-page>
    error-code指的是发生错误的代码
    location 发生错误以后去到的页面

    三.servlet的配置
    <!-- 向服务器注册servlet -->
    <servlet>
    <!-- servlet-name是给我们使用的,我们使用这个servlet-name对servlet进行配置! -->
    <servlet-name>AServlet</servlet-name>
    <!-- servlet-class指定全类名,给服务器使用,服务器使用这个全类名创建一个servlet实例【对象】 -->
    <servlet-class>com.neuedu.servlet.AServlet</servlet-class>
    </servlet>

    <!-- servlet-mapping做请求映射 -->
    <servlet-mapping>
    <servlet-name>AServlet</servlet-name>
    <!-- 请求映射是通过这个url-pattern来实现的! -->
    <url-pattern>/BServlet</url-pattern>
    </servlet-mapping>

    注意点:
    1.<url-pattern>标签中指定的映射路径不必和<servlet-name>标签指定的内容保持一致!
    2.只有你浏览器地址栏中请求的url和我们这里<url-pattern>标签中的映射一致的时候,我们自定义的servlet类才会处理这个请求!

    5.生命周期

    servlet是由tomcat服务器来管理的!

    servlet生命周期:是指servlet对象由产生到销毁的过程!

    servlet生命周期涉及的几个方法:
    1.构造器方法:只会在第一次访问这个servlet的时候调用一次,调用一次就说明servlet是单例的,但是servlet是多线程的,
    非线程安全的,也就是说在servlet中我们尽量不要在service方法中操作全局变量!

    2.init方法:init方法只会在第一次访问servlet的时候调用一次,对servlet对象进行初始化操作!

    3.service:service方法会在每次访问这个servlet的时候都调用一次,而且我们的业务逻辑也是写在这个service方法!

    4.destroy方法::destroy方法只会在我们的项目卸载的时候调用一次,也就是说在服务器关闭的时候会在服务器关闭的时候调用一次!

    6.servletConfig

    ServletConfig:是一个接口,一个ServletConfig对象只代表当前的servlet类的配置信息。
    1) represent:
    * <servlet>
    <!-- servlet-name是给我们使用的,我们使用这个servlet-name对servlet进行配置! -->
    <servlet-name>AServlet</servlet-name>
    <!-- servlet-class指定全类名,给服务器使用,服务器使用这个全类名创建一个servlet实例【对象】 -->
    <servlet-class>com.neuedu.servlet.AServlet</servlet-class>
    </servlet>

    2).如何获取:
    由服务器创建,通过init方法的参数直接传递给我们,我们直接在init方法使用就可以了!

    3)功能:
    getServletName():获取当前servlet-name值,也就是获取servletname
    getInitParameter("password"):获取servlet的初始化参数!
    getServletContext():获取当前web应用!

    7.ServletContext
    1) 代表:代表的是当前web应用,也就是指的web.xml文件中的信息!

    2)获取:通过ServletConfig对象的getServletContext()获取!

    3) 功能:
    1)getInitParameter:获取整个web应用的初始化参数,也就是如下:
    <context-param>
    <param-name>user</param-name>
    <param-value>lisi</param-value>
    </context-param>
    2)获取资源的真实路径:getRealPath()
    虚拟路径:http://localhost:8080/servlet-demo1/index.html
    真实路径:E:LHF teachermarsworkspaceservlet-demo1WebContentindex.html

    8.MyGenericServlet
    1.定义一个抽象类实现servlet接口,保留service方法不去实现,其余方法都实现了!
    2.自定义抽象类子类,在web.xml文件中注册一下这个子类!

    9.HttpServlet
    public class AServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    }

    10.HttpServletRequest
    1)代表:代表浏览器向服务器发送的请求报文
    2) 获取:由tomcat服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
    3) 功能:
    getParameter()获取请求参数
    getContextPath():获取当前项目名
    setAttribute/getAttribute:本身就是一个域对象!
    request.getRequestDispatcher("1.html").forward(request, response);可以实现转发功能!

    11.HttpServletResponse
    1)代表:服务器响应给浏览器的响应报文
    2)获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
    3)功能:
    response.getWriter().println("<h3>hello world!</h3>");可以返回给浏览器一个页面或者一个页面片段!
    response.sendRedirect("/servlet1/1.html"); :可以做请求的重定向

    12.转发和重定向

    转发:当浏览器向服务器发送请求的时候,服务器自己不处理,而是调用其它的web资源进行处理!


    重定向:当浏览器向服务器发送请求的时候,服务器返回给浏览器一个特殊的响应,这个特殊的响应告诉浏览器再向另一个地址发送一个请求!

    转发和重定向的区别:
    发生在浏览器端还是服务器 浏览器的请求次数 浏览器地址栏是否发生变化 浏览器是否能够感知到
    转发[request] 发生在服务器端 1 不发生变化 感知不到
    重定向[response] 发生在浏览器端 2 发生变化 能感知到!








  • 相关阅读:
    linux内核中听过就能记住的概念
    专治不会看源码的毛病--spring源码解析AOP篇
    接口性能优化方案及其理论依据
    Redis各种数据结构性能数据对比和性能优化实践
    iOS 防止UIButton重复点击
    iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
    Git简单使用
    软考和软件设计师
    libstdc++适配Xcode10与iOS12
    Objective-C Block与函数指针比较
  • 原文地址:https://www.cnblogs.com/a1a1-3/p/7402234.html
Copyright © 2011-2022 走看看