• jQueryrocket


    一、什么是Servlet
      Servlet使用Java语言实现的程序,运行于支持Java语言的Web服务器或者应用服务器中。Servlet先于JSP出现,提供和客户端动态交互的功能。Servlet可以处理来自客户端的HTTP请求,并生成响应返回给客户端。
      Servlet的基本流程如下: 客户端通过HTTP提出请求。Web服务器接受改请求并将其发给servlet。如果这个servlet尚未被加载,Web服务器将把它加载到Java虚拟机并且执行它。Servlet将接收该HTTP请求执行某种处理。Servlet将向Web服务器返回应答。Web服务器将从servlet收到的应答发送给客户端。
      优点:
          1.可以移植性:由于Servlet是用Java语言编写的,因此它可以在不同的操作系统和服务器上移植。

          2.安全:Servlet也具有类型检查特征,并利用Java的垃圾收集和没有指针的设计,使得Servlet避免了内存管理等问题。

          3.高效:Servlet加载执行后会常驻服务器内存中,当再次受到客户端的请求时,服务器会产生新的线程而不是进程为客户端服务,这样就提高了响应速度。

    二、Servlet生命周期

    加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁

     1 package action;
     2 import java.io.IOException;
     3 import javax.servlet.ServletException;
     4 import javax.servlet.http.HttpServlet;
     5 import javax.servlet.http.HttpServletRequest;
     6 import javax.servlet.http.HttpServletResponse;
     7 
     8 public class LifeServlet extends HttpServlet{
     9 
    10     private static final long serialVersionUID = 1L;
    11 
    12     @Override
    13     protected void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         System.out.println("service");
    16     }
    17 
    18     @Override
    19     protected void doPost(HttpServletRequest request, HttpServletResponse response)
    20             throws ServletException, IOException {
    21         System.out.println("service");
    22     }
    23 
    24     @Override
    25     public void destroy() {
    26         System.out.println("servlet销毁");
    27     }
    28 
    29     @Override
    30     public void init() throws ServletException {
    31         System.out.println("servlet初始化");
    32     }
    33 }
    View Code
    1  <servlet>
    2             <servlet-name>lifeServlet</servlet-name>
    3             <servlet-class>action.LifeServlet</servlet-class>
    4   </servlet>
    5   <servlet-mapping>
    6             <servlet-name>lifeServlet</servlet-name>
    7             <url-pattern>/life</url-pattern>
    8   </servlet-mapping>
    View Xml

    三、servlet的两种配置方式

    1、第一种注解式配置 Servlet3.0及以后 :

    1 @WebServlet(value="/hello",loadOnStartup=1)
    View Code

    2、第二种web.xml配置 Servlet所有版本都支持:

     1  <servlet>
     2   <!--名称  -->
     3      <servlet-name>hello2</servlet-name>
     4     <!--Servlet的全称类名  -->
     5      <servlet-class>com.abc.web.servlet.HelloServlet</servlet-class>
     6     <!--启动的优先级,数字越小越先起动  -->
     7     <load-on-startup>1</load-on-startup>
     8   </servlet>
     9   <!--映射配置  -->
    10   <servlet-mapping>
    11   <!--名称  -->
    12     <servlet-name>hello2</servlet-name>
    13     <!--资源的匹配规则:精确匹配  -->
    14     <url-pattern>/hello2</url-pattern>
    15   </servlet-mapping>    
    View Code

    四、Servlet基本使用

    1、Servlet的第一种创建方式:继承HttpServlet(最优)

      重写doGet(HttpServletRequest request, HttpServletResponse response)方法

      重写 doPost(HttpServletRequest request, HttpServletResponse response)方法

    2、Servlet创建的第二种方式:实现接口Servlet

      重写getServletConfig()方法

      重写 getServletInfo() 方法

      重写init(ServletConfig arg0)方法

      重写service(ServletRequest request, ServletResponse response)方法

      重写destroy()方法

    3、Servlet的第三种创建方式:继承GenericServlet类

      重写service(ServletRequest request, ServletResponse response)方法

    五、转发和重定向

    转发:requeset can get the value,URL doesn't change.
    重定向:request can’t get the value,URL change.
    这一部分可以了解一下九大内置对象,四大作用域。

    六、Servlet过滤

    1、过滤过程

      在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。 

      在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

    2、Filter建立步骤

    (1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。
    (2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息 (包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参 数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
    (3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参 数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP 页面被激活。
    (4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
    (5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。
    过滤器需要在web.xml文件中进行配置。

     1        <!-- 配置Filter -->  
     2     <filter>    
     3         <filter-name>LogFilter</filter-name>    
     4         <filter-class>com.mucfc.LogFilter</filter-class>    
     5     </filter>    
     6     <filter-mapping>    
     7         <filter-name>LogFilter</filter-name>
     8      <!-- 表示处理根目录下的所有请求 -->      
     9         <url-pattern>/*</url-pattern>
    10     </filter-mapping>  
    View Code

    或者直接用注解

    1 @WebFilter(filterName="log",urlPatterns={"/*"})  
    2 public class LogFilter implements Filter {  
    3 .................................  
    4 }  
    View Code

    3、映射的配置

    (1) 映射到一个或多个jsp

    1 <filter-mapping>  
    2     <filter-name>FilterName</filter-name>  
    3     <url-pattern>/path/FileName.jsp</url-pattern>  
    4 </filter-mapping>      
    View Code

    (2) 映射到一个或多个servlet

    1 <filter-mapping>  
    2     <filter-name>FilterName</filter-name>  
    3     <servlet-name>ServletName1</servlet-name>  
    4 </filter-mapping>  
    5 <filter-mapping>  
    6     <filter-name>FilterName</filter-name>  
    7     <servlet-name>ServletName2</servlet-name>  
    8 </filter-mapping>  
    View Code

    (3) 映射到任意的URL

    1 <filter-mapping>  
    2     <filter-name>FilterName</filter-name>  
    3     <url-pattern>/*</url-pattern>  
    4 </filter-mapping>
    View Code

    【注】设置编码字符

    1 //编码过滤
    2 servletRequest.setCharacterEncoding("utf-8");
    3 servletResponse.setContentType("text/html;charset=utf-8");
    4 servletResponse.setCharacterEncoding("utf-8");
    View Code

    4、四种过滤器比较

    (1)request过滤器

     1 <filter>  
     2      <filter-name>myFilter</filter-name>  
     3     <filter-class>packagename.MyFilterName</filter-class>  
     4 </filter>  
     5  <filter-mapping>  
     6     <filter-name>myFilter</filter>  
     7     <servlet-name> 目标资源1</servlet-name>  
     8     <dispatcher>REQUEST</dispatcher>  
     9 </filter-mapping>  
    10 <filter-mapping>  
    11     <filter-name>myFilter</filter>  
    12     <servlet-name> 目标资源2</servlet-name>  
    13     <dispatcher>REQUEST</dispatcher>  
    14 </filter-mapping>  
    View Code

    这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理。
    (2)forward过滤器

     1 <filter>  
     2   <filter-name>myFilter</filter-name>  
     3    <filter-class>packagename.MyFilterName</filter-class>  
     4 </filter>  
     5 <filter-mapping>  
     6    <filter-name>myFilter</filter>  
     7    <servlet-name> 目标资源1</servlet-name>  
     8    <dispatcher>REQUEST</dispatcher>  
     9 </filter-mapping>  
    10 <filter-mapping>  
    11    <filter-name>myFilter</filter>  
    12    <servlet-name> 目标资源2</servlet-name>  
    13    <dispatcher>FORWARD</dispatcher>  
    14 </filter-mapping>  
    View Code

    我们看对目标资源二过滤的配置方式,这时过滤方式为forward,也就是说对转发到目标资源二的请求过滤,如果直接访问目标资源二,过滤器将不起作用。
    (3)include过滤器

     1 <filter>  
     2     <filter-name>myFilter</filter-name>  
     3     <filter-class>packagename.MyFilterName</filter-class>  
     4 </filter>  
     5 <filter-mapping>  
     6    <filter-name>myFilter</filter>  
     7    <servlet-name> 目标资源1</servlet-name>  
     8    <dispatcher>REQUEST</dispatcher>  
     9 </filter-mapping>  
    10 <filter-mapping>  
    11    <filter-name>myFilter</filter>  
    12    <servlet-name> 目标资源2</servlet-name>  
    13    <dispatcher>INCLUDE</dispatcher>  
    14 </filter-mapping> 
    View Code

    此表示对包含了目标资源二的请求过滤,如果直接访问目标资源二,则此过滤器将不起作用。

    在JSP页面中的动作:指令包含,这时此过滤器不工作。

    (4)error过滤器

     1 <filter>  
     2    <filter-name>myFilter</filter-name>  
     3    <filter-class>packagename.MyFilterName</filter-class>  
     4 </filter>  
     5 <filter-mapping>  
     6 <filter-name>myFilter</filter>  
     7    <servlet-name> /error.jsp</servlet-name>  
     8    <dispatcher>ERROR</dispatcher>  
     9 </filter-mapping>  
    10 <error-page>  
    11    <error-code>404</error-code>  
    12    <location>/error.jsp</location>  
    13 </error-page>  
    View Code

    当我们访问一个web目标资源时,如果服务器没有找到该目标资源,那么服务器就会给出一个404错误代码。如果我们给404错误代码定义一个页面,发生404时,配置了过滤器对错误页面进行过滤,所以过滤器先接受到请求,然后再转发给error.jsp。如果我们访问一个已经存在的页面,会不会调用error.jsp呢?如果这个页面中有response.sendError(404,"出错了!");那么该错误页面仍然会被调用,过滤器也会工作。

    六、Servlet监听

    1、监听器的作用

      Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
    监听对象:
        (1)ServletContext:application,整个应用只存在一个
        (2)HttpSession:session,针对每一个对话
        (3)ServletRequest:request,针对每一个客户请求
    监听内容:创建、销毁、属性改变事件。
    监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。

    2、监听器的基本使用

    步骤:创建一个实现监听器接口的类;配置web.xml文件,注册监听器

    1 <listener>
    2     <listener-class>完整类名</listener-class>
    3 </listener>
    View Code

    监听器的启动顺序:按照web.xml的配置顺序来启动

    加载顺序:监听器>过滤器>Servlet

    在新servlet3.0中使用注解 @WebListener 即可,无法去定义监听器的顺序

    1 @WebListener("This is a listener")
    2 public class FirstListener impliements ServletRequestListener{}

    使用条件:1、使用servlet3.0新标准的jar包;2、JDK在1.6以上版本;3、编译器的编译级别为6.0;4、在web.xml文件中,使用3.0规范;5、使用支持servlet3.0特性的web容器,比如tomcat7;

    3、监听器的分类

    1、按照监听的对象划分

    (1)用于监听应用程序环境对象(ServletContext)的事件监听器,实现ServletContextListener、ServletContextAttributeListener接口

    (2)用于监听用户会话对象(HttpSeesion)的事件监听器,实现HttpSessionListener、HttpSessionAttributeListener接口

    (3)用于监听请求消息对象(ServletRequest)的事件监听器,实现ServletRequestListener、ServletRequestAttributeListener接口

    2、按照监听事件划分

    (1)监听域对象自身的创建和销毁的事件监听器

    根据监听对象不同分别实现ServletContextListener、HttpSessionListener、ServletRequestListener接口。

    ①ServletContext的创建和销毁:contextInitialized方法和contextDestroyed方法
    主要用途:作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等。
    在web.xml中可以配置项目初始化信息,在contextInitialized方法中进行启动

    1 <context-param>
    2     <param-name>属性名</param-name>
    3     <param-value>属性值</param-value>
    4 </context-param>

    自定义监听器

     1 public class MyFirstListener implements ServletContextListener{
     2     public void contextInitialized(ServletContextEvent sce){
     3         //获取web.xml中配置的属性
     4         String value=sce.getServletContext().getInitParameter("属性名");
     5         System.out.println(value);
     6   }
     7     public void contextDestroyed(ServletContextEvent sce){
     8         //关闭时操作
     9   }
    10 }
    View Code

    ②HttpSession的创建和销毁:sessionCreated和sessionDestroyed方法
    主要用途:统计在线人数、记录访问日志等。
    【注】web.xml配置session超时参数,单位:分,session超时的时间并不是精确的

    1 <session-config>
    2     <session-timeout>10</session-timeout>
    3 </session-config>

    ③ServletRequest的创建和销毁:requestInitialized和requestDestroyed方法
    主要用途:读取request参数,记录访问历史。

    1 public class MySRequestListener implements SevletRequestListener{
    2     public void requestInitialized(ServletRequestEvent sre){
    3         String value=sre.getServletRequest().getParameter("key");//获取request中的参数
    4         System.out.println(value);
    5     }
    6     public void requestDestroyed(ServletRequestEvent sre){  
    7         System.out.println("request destroyed");
    8     }
    9 }   
    View Code

    (2)监听域对象中的属性的增加和删除的事件监听器
    根据监听对象不同分别实现ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。

      实现方法:attributeAdded、attributeRemoved、attributeReplaced
    (3)监听绑定到HttpSeesion域中的某个对象的状态的事件监听器(创建普通JavaBean)

      HttpSession中的对象状态:绑定→解除绑定;钝化→活化

      实现接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)
    【注1】①要实现钝化和活化必须实现Serializable接口

         ②不需要在web.xml中注册

    【注2】

         绑定:    通过setAttribute保存到session对象当中

      解除绑定:  通过removeAttribue去除

      钝化(序列化):    将session对象持久化到存储设备上

      活化(反序列化):    将session对象从存储设备上进行恢复

      session钝化机制:①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反序列化到内存中,整个过程由服务器自动完成;

               ②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和接触需要实现HttpSessionBindingListener接口

  • 相关阅读:
    [Flux] Component / Views
    [Flux] Stores
    [WebStrom] Change default cmd to Cygwin
    [AngularJS] ng-if vs ng-show
    [ES6] Array.find()
    [ES6] Array.findIndex()
    [Javascript] Object.assign()
    [Javascript] Intro to the Web Audio API
    [Falcor] Indroduce to Model
    [Farcol] Introduce
  • 原文地址:https://www.cnblogs.com/kaspar/p/11353085.html
Copyright © 2020-2023  润新知