• java web servlet


      一、什么是Servlet

        Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,他是运行在Servlet容器当中,例如Tomcat就是一种流行的Servlet容器。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

      二、Servlet类

        在eclipse里面新建一个Servlet类,在代码区域可以看出它是继承HttpServlet类,继续通过F3键追踪HttpServlet类,发现HttpServlet继承GenericServlet类,继续深入发现GenericServlet是继承实现接口Servlet、ServletConfig、Serializable接口,看下面类图:

      

      附类定义如下:

    public abstract class HttpServlet extends GenericServlet
    
    public abstract class GenericServlet 
        implements Servlet, ServletConfig, java.io.Serializable

      三、Servlet容器响应客户请求的过程

        具体的请求过程如下,不过这里需要注意的是如果Servlet实例已经创建那么会直接从D步骤开始执行,否则从B步骤开始执行请求流程。

        A、Servlet引擎检查是否已经装载并创建了该Servlet的实例对象

        B、装载并创建该Servlet的一个实例对象;调用该Servlet的构造器

        C、调用Servlet实例对象的init方法

        D、创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的Service方法并将请求和响应对象作为参数传递进去

        E、Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destory方法

        其核心步骤无非就是接口Servlet里面的init(ServletConfig config),void service(ServletRequest req, ServletResponse res),destroy()三个方法。

      

      四、Servlet的注册与运行以及映射

         Servlet程序必须在web.xml文件中进行注册和映射其访问路径,只有这样才可以被Servlet引擎加载和被外界访问。一个<Servlet>元素用于注册一个Servlet,主要包含两个子元素,分别是<servlet-name>和<servlet-class>,表示是

    Servlet的名称与全类名。一个<servlet-mapping>元素用于映射一个已经注册的Servlet对外访问的路径,包含两个子元素,<servlet-name>和<url-pattern>,表示Servlet的名称与web访问的相对路径。具体的模板如下:

    <!-- 配置和映射 Servlet -->
        <servlet>
            <!-- Servlet 注册的名字 -->
            <servlet-name>servletname</servlet-name>
            <!-- Servlet 的全类名 -->
            <servlet-class>com.wucj.defaultpkg.servlet</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
            <servlet-name>servlet</servlet-name>
            <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. -->
            <url-pattern>/demo.html</url-pattern>
        </servlet-mapping>

      这里需要注意的是同一个Servlet可以被映射到多个url上面,就是多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名字。在这里不得不提通配符,只有两种固定格式;A、 *.扩展名;B、/* ,如下:

    <servlet-mapping>
        <servlet-name>servletname</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>servletname</servlet-name>
        <url-pattern>/action/*</url-pattern>
    </servlet-mapping>

      五、ServletConfig 接口

         Servlet引擎将代表Servlet容器的对象ServletContext和servlet的配置参数封装到ServletContext对象中,在初始化Servlet实例对象时传递给该Servlet。接口具体定义如下:

    public interface ServletConfig {
        
        public String getServletName();
    
        public ServletContext getServletContext();
    
        public String getInitParameter(String name);
    
        public Enumeration<String> getInitParameterNames();
    
    }

      具体的作用就是在Servlet程序中可以调用这些方法获取相关信息。Servlet引擎调用Servlet的实例对象init(ServletConfig config)方法会将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。

      六、ServletContext接口

         Servlet引擎为每个web应用程序都创建一个对应的ServletContext对象,ServletContext对象包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。同一个web应用程序中所有的Servlet都共享同一个ServletContext对象。  

    ServletContext servletContext = servletConfig.getServletContext();

      七、HttpServletRequest 与 HttpServletResponse

        在这里不得不说HttpServlet对象,它是一个 Servlet, 继承自 GenericServle, 针对于 HTTP 协议所定制。ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现。在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。并调用了重载的 service(HttpServletRequest, HttpServletResponse),源代码是:

     @Override
     public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException {
    
        HttpServletRequest  request;
        HttpServletResponse response;
        
        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response);
    }
    
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1. 获取请求方式.
        String method = request.getMethod();
        
        //2. 根据请求方式再调用对应的处理方法
        if("GET".equalsIgnoreCase(method)){
            doGet(request, response);
        }else if("POST".equalsIgnoreCase(method)){
            doPost(request, response);
        }
    }

      在对象HttpServletRequest中可以获取丰富的请求信息,例如:

      getMethod:返回HTTP请求消息中的请求方式。

      getQueryString :返回请求行中的参数部分。

        getServletPath方法:Servlet的名称或Servlet所映射的路径。  

          getRemoteAddr方法返回发出请求的客户机的IP地址。

          getRemoteHost方法返回发出请求的客户机的完整主机名。

        getRequestURL方法返回客户端发出请求时的完整URL。   

      getHeaders方法 。

      以及获取请求参数的方法:getParameter方法、getParameterValues方法、getParameterNames方法、getParameterMap方法 。

      
      在对象HttpServletResponse中主要有:RequestDispatcher接口、
    用forward方法实现请求转发、
    请求转发的运行流程、
    用sendRedirect方法实现请求重定向、
    请求重定向的运行流程 。
     
       RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源(例如,Servlet、HTML文件、JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。RequestDispatcher接口中定义了两个方法:forward方法和include方法。
    forward和include方法接收的两个参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象,或者是对它们进行了包装的ServletRequestWrapper 或ServletResponseWrapper对象。
      sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,它还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 如果传递给sendRedirect 方法的相对URL以“/”开头,则是相对于整个WEB站点的根目录,而不是相对于当前WEB应用程序的根目录。
      RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
      如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
      调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
      HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
      RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。 
      
       八、那么该怎样用一句话来形容Servlet了?
        待续...
      
  • 相关阅读:
    (转)nginx的root和alias指令的区别
    (转)Bash 快捷键 完整版
    (转)curl 命令使用
    Ansible 部署
    (转)把Sublime Text 2 加入右键菜单(带图标),Edit with Sublime Text
    配置IP地址及HOSTNAME脚本
    Linux Shell : Test命令参数解析
    计算阶乘 n! = 1 * 2 * 3 * ... * n
    .编写一个函数,输入n为偶数时,调用函数求1/2+】1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
    简单的ATM机的取款过程
  • 原文地址:https://www.cnblogs.com/wucj/p/5136846.html
Copyright © 2020-2023  润新知