• JavaWeb三大组件之Servlet


     http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Servlet.html

    一、Servlet继承结构体系图

    结构图中可以看出,实现一个自定义的Servlet主要有3中方式:

    • 实现最顶层的Servlet接口,并重写接口中init、getServletConfig、service、getServletInfo、destory方法
    • 继承GenericServlet抽象类

      直接实现Servlet接口需要重写接口中全部的5个方法,这种方式实现自定义Servlet过于繁琐。GenericServlet抽象类实现了Servlet接口并重写了基接口中除Service方法外的其他所有方法。通过继承并重写GenericServlet抽象类中的Service抽象方法,即可完成自定义的Servlet开发。另外GenericServlet是不特定于任何协议的

    • 继承HttpServlet抽象类

      HttpServlet是派生自GenericServlet的特定于Http协议的抽象类,并重写了父类中的Service方法,在该方法中会将ServletRequest和ServletResponse对象分别强转为HttpServletRequest、HttpServletResponse对象。HttpServlet类中还重载了Service方法,参数分别为HttpServletRequest、HttpServletResponse。在该方法内部会根据不同的请求方式调用不同的doXX方法。因此,当通过继承HttpServlet来实现自定义的Servlet时,只需要重写相应的doXX方法即可(例如doGet、doPost等)。

    二、Servlet生命周期

       Servlet生命周期主要分为以下3个阶段

      1、初始化阶段(init):

      Servlet容器加载Servlet对象后,服务器将会立即调用其init()方法。该方法主要是在Servlet对象响应请求之前完成一些初始化工作。例如读取应用程序配置信息(如数据库连接配置,主要是通过ServletConfig对象完成)。init()方法在Servlet的整个生命周期中不管执行多个少请求,都只会被调用一次

      2、请求处理阶段(service):

      响应逻辑处理方法,该方法通过ServletRequest获取客户端请求相关信息,通过ServletResponse设置响应信息。客户端每一次请求服务器都会开启一个新的线程并执行Servlet的service()方法,因此Service方法运行在多线程环境下,需要考虑线程安全问题(尽量确保该方法中不会同时操作全局变量等)。在Servlet的整个生命周期中,service方法可能会被执行0次、1次或多次。

      3、销毁阶段(destory):

      Servlet对象被销毁(如Servlet容器被关闭或重启)时将执行其destory()方法,以释放其占用的资源。Servlet对象的destory()方法在其整个生命周期中只会被执行一次

    三、Servlet加载和实例化时机

      默认情况下,第一次请求的时候,Servlet对象将会被创建。当web.xml文件中Servlet配置了启动参数<load-on-startup>时,该Servlet将会在Servlet容器启动时创建

    四、配置Servlet的方式

    1、使用xml配置

      <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.demo.web.MyServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
      </servlet-mapping>
    View Code

    2、使用注解配置

    @WebServlet(name = "MyServlet",
            urlPatterns = "/MyServlet",
            loadOnStartup = 1,
            initParams = {@WebInitParam(name = "username", value = "root"), @WebInitParam(name = "userpwd", value = "123456")})
    View Code

    五、示例代码

    MyServlet.java

    package com.fengjr.demo01;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class MyServlet extends HttpServlet {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("doGet请求逻辑方法开始<br/>");
            String paraStr = req.getParameter("paraStr");
            String attrStr = (String) req.getAttribute("attrStr");
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write("doGet请求方法逻辑结束,请求参数paraStr = " + paraStr + ",attrStr = " + attrStr);
        }
    }
    View Code

    web.xml

        <servlet>
            <servlet-name>MyServlet</servlet-name>
            <servlet-class>com.fengjr.demo01.MyServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>MyServlet</servlet-name>
            <url-pattern>/MyServlet</url-pattern>
        </servlet-mapping>
    View Code
  • 相关阅读:
    【POJ1961 Period】【KMP】
    浅谈KMP算法
    【关于动态开点线段树】
    【POJ3349 Snowflake Snow Snowflakes】【Hash表】
    【NOI 2002 银河英雄传说】【带权并查集】
    路径问题
    group_concat函数详解
    MySQL中GROUP_CONCAT中排序
    怎么实现CSS限制字数,超出部份显示点点点.
    jsp去掉小数点
  • 原文地址:https://www.cnblogs.com/Jabben_Yi/p/9830373.html
Copyright © 2020-2023  润新知