• JavaWeb—Servlet


    1.什么是Servlet

    • 用来扩展web服务器功能的组件——早期的web服务器只能处理静态资源的请求,即需要事先将html文件准备好,并存放到web服务器上面。不能够处理动态资源的请求(需要计算,动态生成html),而Servlet可以根据客户端不同请求给予相应的响应服务(处理动态请求)。
    • Servlet是一个直接或间接实现javax.servlet.Servlet接口的Java类(通常可以继承HttpServlet类
    • Servlet必须部署在web服务器端,用来处理客户端的请求,通常我们把能够运行Servlet的服务器称作Servlet容器,如Tomcat

    2.Servlet的创建

      创建Servlet实例有两个时机:

    • 客户端第一次请求某个Servlet时,容器创建该Servlet实例(大部分Servlet都是以这种方式创建)。
    • Web应用启动时立即创建Servlet实例,即load-on-startup Servlet。

      关于load-on-startup参数:

    • load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
    • 它的值必须是一个整数,表示servlet应该被载入的顺序
    • 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
    • 当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
    • 正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
    • 当值相同时,容器就会自己选择顺序来加载。

    3.Servlet的生命周期

    javax.servlet.Servlet源码: 

    public interface Servlet {
        void init(ServletConfig var1) throws ServletException;
    
        ServletConfig getServletConfig();
    
        void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
        String getServletInfo();
    
        void destroy();
    }

     所有的servlet都是javax.servlet.Servlet的子类,就像Java里面所有的类都是Object的子类一样。Servlet类规定了每个servlet应该实现的方法,这个是遵循Servlet规范的。但是自定义的servlet一般不用直接实现Servlet,而是继承javax.servlet.GenericServlet或者javax.servlet.http.HttpServlet就行了。这是因为HttpServlet间接实现了Servlet,提供了通用的功能。所以我们在自定义的TestServlet里面只需要专注实现业务逻辑就行了。

    Servlet里面有三个比较重要的方法:init、service、destroy。它们被称作是servlet生命周期的方法,它们都是由servlet容器调用。另外两个方法用于获取servlet相关信息的,需要根据业务逻辑进行实现和调用。

    Servlet生命周期: 

    • 实例化:容器创建Servlet对象
    • 初始化:调用Servlet的init()方法
    • 服务:调用Servlet实例的service()方法来处理请求
    • 销毁:容器删除Servlet实例(调用Servlet实例的destroy()方法)

    4.HttpServlet运行过程

    HttpServlet是一个针对HTTP协议的通用实现,它实现了HTTP协议中的基本方法get、post等,通过重写service方法实现方法的分派。

    1. Web Client依据ip,port向Servlet容器(Tomcat)发出Http请求
    2. 容器接收Web Client的请求
    3. 容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
    4. 容器创建一个HttpResponse对象
    5. 容器创建Servlet对象,然后调用该对象的service方法,把HttpRequest与HttpResponse作为参数传给 Servlet 对象。
    6. Servlet 对象调用HttpRequest的有关方法,获取Http请求信息。(Servlet的service方法中)
    7. Servlet 对象调用HttpResponse的有关方法,生成响应数据。(Servlet的service方法中)
    8. 容器把HttpResponse的响应结果传给Web Client。

      如果想要分别响应客户端的GET和POST请求,需要重写HttpServlet对象的doGet和doPost方法,如果所有请求的响应都是一样的,则只需要重写service方法即可。

    5.Servlet与JSP

      JSP的本质就是Servlet,我们将编写好的JSP文件部署在web容器中之后,web容器会将JSP编译成对应的Servlet。

      如果Servlet要生成表现层页面时,所有的HTML标签都需要使用Servlet的输出流来输出,繁琐且不利于美工人员修改。

      在标准的MVC模式中,Servlet仅作为控制器使用,而JSP仅作为表现层技术使用:

    • M:Model,即模型,对应JavaBean。
    • V:View,即视图,对应JSP。
    • C:Controller,即控制器,对应Servlet。 

    6.Java创建Servlet实例

    6.1 首先创建一个JavaWeb工程,然后创建一个类继承HttpServlet

    package com.xzh;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Created by xiangzh on 2017/8/29.
     */
    public class ServletDemo extends HttpServlet{
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");
            out.println("<HTML>");
            out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println("  <BODY>");
            out.print("    This is ");
            out.print(this.getClass());
            out.println(", using the GET method");
            out.println("  </BODY>");
            out.println("</HTML>");
            out.flush();
            out.close();
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");
            out.println("<HTML>");
            out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println("  <BODY>");
            out.print("    This is ");
            out.print(this.getClass());
            out.println(", using the POST method");
            out.println("  </BODY>");
            out.println("</HTML>");
            out.flush();
            out.close();
        }
    }

    6.2 在web.xml文件中配置上面的Servlet

        <servlet>
            <servlet-name>ServletDemo</servlet-name>
            <servlet-class>com.xzh.ServletDemo</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>ServletDemo</servlet-name>
            <url-pattern>/ServletDemo</url-pattern>
        </servlet-mapping>

    6.3 将项目打包放到Tomcat中,启动Tomcat,测试结果如下:

    注意:一个Web应用对应一个ServletContext,一个Servlet对应一个ServletConfig。每个Servlet都是单例的,所以需要自己处理好并发的场景。

    参考:

    JavaWeb——Servlet

    http://www.cnblogs.com/xdp-gacl/p/3760336.html

    http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html

    http://www.cnblogs.com/goody9807/archive/2007/06/13/782519.html

    http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html

     

  • 相关阅读:
    Vue响应式原理
    vue 与 react
    vuex
    受控组件( controlled component )与不受控制的组件( uncontrolled component )区别
    redux学习语录
    Flux
    MVC和MVVM 架构模式/设计思想
    immutable
    JS中一些兼容性问题
    @芥末的糖 ---------- node连接数据库两种方式mysql和moogoDB
  • 原文地址:https://www.cnblogs.com/Jason-Xiang/p/5498996.html
Copyright © 2020-2023  润新知