• Java_servlet


    1.public interface Servlet
       Servlet接口的基本目标是提供Servlet生命周期有关的方法:
    init()
    destroy()
    service(ServletResquest req,ServletResponse resp):当用户对于Servlet发出请求的时候容器会调用该方法处理用户的请求,ServletResquest 提供用户访问请求数据的方法,ServletResponse提供构造Servlet响应的方法
    getServletConfig()
    源码如下:

    public interface Servlet {
        //容器在启动的被调用,仅调用一次
        void init(ServletConfig var1) throws ServletException;
        //获取Servlet配置
        ServletConfig getServletConfig();
        //处理具体请求
        void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
        //获取Servlet的相关信息
        String getServletInfo();
        //Servlet销毁后释放资源
        void destroy();
    }



    2.public abstruct class GenericServlet extends Object implements Servlet,ServletConfig、Serilalizable
    GenericServlet是一个抽象类,是Servlet接口的直接实现
    init()
    init()
    service()
    destory()
    getServletConfig()
    getServletContext()
    getServletInfo()
    GenericServlet源码:

    package javax.servlet;
    import java.io.IOException;
    import java.io.Serializable;
    import java.util.Enumeration;
    import java.util.ResourceBundle;
    public abstract class GenericServlet
      implements Servlet, ServletConfig, Serializable
    {
      private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
      private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
      private transient ServletConfig config;
      public void destroy()
      {
      }
      public String getInitParameter(String name)
      {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
          throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }
        return sc.getInitParameter(name);
      }
      public Enumeration getInitParameterNames()
      {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
          throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }
        return sc.getInitParameterNames();
      }
      public ServletConfig getServletConfig()
      {
        return this.config;
      }
      public ServletContext getServletContext()
      {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
          throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }
        return sc.getServletContext();
      }
      public String getServletInfo()
      {
        return "";
      }
      public void init(ServletConfig config)
        throws ServletException
      {
        this.config = config;
        init();
      }
      public void init()
        throws ServletException
      {
      }
      public void log(String msg)
      {
        getServletContext().log(getServletName() + ": " + msg);
      }
      public void log(String message, Throwable t)
      {
        getServletContext().log(getServletName() + ": " + message, t);
      }
      public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse)
        throws ServletException, IOException;
      public String getServletName()
      {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
          throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }
        return sc.getServletName();
      }
    }
    


    3.public abstract class HttpServlet extends GenericServlet implements Serilalizable

    HttpServlet类的主要方法:
    1.service(HttpServletResquest req,HttpServletResponse resp)
    HttpServlet重写了Servlet接口中的service方法,该方法用于判断用户的请求方式,如果是Get请求就调用相应的doGet方法,如果是Post方法,就调用相应的doPost方法。因此开放人员在编写Servlet的时候,只需要重写doGet、doPost方法即可,而不要去重写service方法,如果Servlet收到一个Http请求而并没有调用相应的do方法,它就返回一个说明此方法对于本资源不可用的报告,在HttpServlet的源码中有所体现
    2.doGet:用来处理Get请求
    3.doPost:用来处理Post请求
    需要注意的是:HttpServlet方法是可以处理Http请求的Servlet,在Servlet原有的基础上边添加了对Http协议的处理,因此开发人员在编写Servlet的时候多数是继承与HttpServlet,而不是直接去实现Servlet接口(毫无意义)。

    4.Servlet生命周期:从创建到相应客户请求直至销毁的过程
     1.加载和实例化:服务器运行中、Servlet被更改
     2.初始化:调用Init()方法,可以读取一些固定数据、初始化JDBC的连接以及建立与其他资源的连接等操作
     3.处理请求:服务器接收到客户端的请求时,会为该请求创建一个请求对象和相应对象并调用Service(),service()方法确定了请求方式,调用相应的do方法,如果有多个客户端同时访问Servlet时,服务器就会为每一个请求创建一个线程,这样就可以并行处理多个请求。
     4.销毁

    5.Servlet的两种声明方式:两种方式任一种都可以,个人觉得注解式在现在更为简单
     1.基于web.xml的配置
      <servlet>
        <description>this is dispacther</description> //简单的叙述,无关紧要
        <servlet-name>Servlet`s name</servlet-name>  //Servlet的名字,不可以和其他的Servlet的名字出现重复的情况
        <servlet-class>Servlet`s class</servlet-class>
       //指定实现Servlet的java类
      <init-param>
         <param-name>ConfigLocation</param-value>
         <param-value>classpath/classpath*</param-value>
           //之后会涉及到Spring的配置方式
      </init-param>
      <load-up-startup>a number</load-up-startup>
      //指定Servlet的加载顺序,默认为当Servlet第一次被请求时踩开始加载,当值为0或者大于0的时候
      //表示容器在启动时便开始加载Servlet
      <async-supported>Boolean值</async-supported>
      </servlet>
      <servlet-mapping>
        <servlet-name>Servlet`s name</servlet-name> 与上边的name务必相同
        <url-pattern>/register</url-pattern>   匹配路径,包括精确匹配、目录匹配、扩展名匹配
      </servlet-mapping>


     2.基于注解的配置
    @WebServlet(
    name="wtf", //Servlet`s name
    urlPatterns="/"  匹配路径,包括精确匹配、目录匹配、扩展名匹配
    displayName="",
    initParams="@WebInitparam(name="",value="")",类似于web.xml的init-param
    loadOnStartup="0/1",  指定Servlet的加载顺序
    asyncSupported="true/false" 是否支持异步处理
    )  

    6.数据处理:HttpServletResponse接口对请求的数据进行处理
    两种数据形式:表单与超链接
    当用户的请求到达Servlet容器时,请求被包装成了ServletResquest对象,如果是Http请求的话,请求继续
    被包装成HttpServletResquest,处理信息的方法:
    1.public String getParameter(String name) 返回name所指定的参数值(value)
    2.public String[] getPatarameterValues(String name) 返回name所指定的一组参数值
    3.public Enumeration getParameterNames()  返回一个集合,包含着所有用户请求参数名

    7.重定向和请求转发
     1.重定向:重定向是指的由原请求地址重新定位到某个新地址,原有的请求失效,客户端看到的是新的请求返回的请求结果,客户端浏览器的地址栏变为新的URL;
     语法:(HttpServletResponse)Resp.sendRirdect(new Url);
     example:(HttpServletResponse)Resp.sendRirdect(项目名/index.jsp):重新定位到项目名下的WEB-CONTENT目录下的index.jsp文件
     具体步骤为:
     1.客户端在ServletA发起重定向到ServletB的请求A
     2.A传递到服务器,之后又传递到客户端
     3.客户端对服务器端的ServletB发起请求B
     4.请求A失效
     5.完成请求B,返回客户端
     

    重定向不仅可以定向在当前应用的所有的资源,还可以定向其他站点的资源
     2.请求转发:是将请求转发到其他地址,但是在转发过程中使用的是一个请求,也可以理解为一个Servlet
    在一个应用内部请求另一个Servlet,也就说请求转发是基于同一个应用内部的,而不能把请求转发到其他应用。
    语法:
    使用ResquestDispatcher接口中的forward()方法,该方法可以把请求转发给另外一个资源

    (HttpServletResquest)req.getResquestDispatcher(new URL).forward((HttpServletResquest)req,(HttpServletResponse)resq);
    注意new URL是同一应用的下的资源
    具体步骤:
      1.客户端在ServletA中发起请求转发到ServletB的请求A
      2.在服务器内部,对ServletB进行查找,完成请求A
      3.完成ServletB,返回客户端


















  • 相关阅读:
    精准医疗
    生物信息学的研究过程
    蛋白质结构预测
    CP
    基因组大小控制因素
    RNA组研究困难
    输入input文本框的 U+202D和U+202C是什么
    ruby-get-url-query-params
    golang send post request
    nginx location配置
  • 原文地址:https://www.cnblogs.com/laiso/p/9004232.html
Copyright © 2020-2023  润新知