欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet接口及方法应用

程序员文章站 2022-07-14 09:01:48
...

1.Servlet生命周期
答:Servlet 的生命周期分为四个阶段,分别是加载实例化阶段、初始化阶段、运行阶段(处理请求)和销毁阶段。Servlet接口及方法应用
1.1. 加载实例化阶段
当Servlet容器启动以后,会加载项目的web.xml配置文件,并解析得到所有配置好的servlet-class中配置的包名+类名,通过反射机制就实例化好了包名+类名对应的Servlet类对象。
1.2. 初始化阶段
当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会解析请求,检查内存中是否已经有该 Servlet 对象,如果有,则直接使用该 Servlet 对象,如果没有,则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作。需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次。
1.3.运行阶段(处理请求)
这是 Servlet 生命周期中最重要的阶段,在这个阶段中,Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 响应的 ServletResponse 对象,然后将它们作为参数传递给 Servlet 的 service() 方法。
service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。
在 Servlet 的整个生命周期内,对于 Servlet 的每一次访问请求,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象,也就是说,service() 方法在 Servlet 的整个生命周期中会被调用多次。
1.4.销毁阶段
当服务器关闭或 Web 应用被移除出容器时,Servlet 随着 Web 应用的关闭而销毁。在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源。在 Servlet 的整个生命周期中,destroy() 方法也只能被调用一次。
需要注意的是,Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁。
测试代码:

package com.qing;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post方法执行");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("初始化方法执行!!!");
    }
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service方法执行!");
    }
    @Override
    public void destroy() {
        System.out.println("销毁方法执行!!");
    }
}

web.xml 配置

<servlet>
    <servlet-name>testservlet</servlet-name>
    <servlet-class>com.qing.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>testservlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

Servlet接口及方法应用
2.servlet处理用户请求的完整流程
答:针对 Servlet 的每次请求,Web 服务器在调用 service() 方法之前,都会创建 HttpServletRequest 和 HttpServletResponse 对象。其中,HttpServletRequest 对象用于封装 HTTP 请求消息,简称 request 对象。HttpServletResponse 对象用于封装 HTTP 响应消息,简称 response 对象。浏览器访问 Servlet 的交互过程如下图所示。
Servlet接口及方法应用
在图中,首先浏览器向 Web 服务器发送了一个 HTTP 请求,Web 服务器根据收到的请求,会先创建一个 HttpServletRequest 和 HttpServletResponse 对象,然后再调用相应的 Servlet 程序。在 Servlet 程序运行时,它首先会从 HttpServletRequest 对象中读取数据信息,然后通过 service() 方法处理请求消息,并将处理后的响应数据写入到 HttpServletResponse 对象中。最后,Web 服务器会从 HttpServletResponse 对象中读取到响应数据,并发送给浏览器。
需要注意的是,在 Web 服务器运行阶段,每个 Servlet 都只会创建一个实例对象,针对每次 HTTP 请求,Web 服务器都会调用所请求 Servlet 实例的 service(HttpServletRequest request,HttpServletResponse response)方法,并重新创建一个 request 对象和一个 response 对象。
3.Servlet中常用的接口、类、方法
答:
Servlet接口及方法应用
针对 Servlet 的接口,Sun 公司提供了两个默认的接口实现类:GenericServlet 和 HttpServlet。其中,GenericServlet 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理。
public abstract class GenericServlet implements javax.servlet.Servlet, javax.servlet.ServletConfig, java.io.Serializable {
HttpServlet 是 GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型提供了具体的操作方法。通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象。
public abstract class HttpServlet extends GenericServlet {
HttpServlet 类中包含两个常用方法
Servlet接口及方法应用
4.ServletConfig接口
答:在运行 Servlet 程序时,可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等,这些信息可以在 web.xml 文件中使用一个或多个 元素进行配置。当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。
ServletConfig就是封装Servlet运行时的辅助信息的接口。
ServletConfig 接口中定义了一系列获取配置信息的方法。
Servlet接口及方法应用
例如:通过ServletConfig接口对象得到web.xml文件中配置的初始化参数值,和配置的servlet-name的值。
web.xml 配置

 <servlet>
    <servlet-name>testservlet</servlet-name>
    <servlet-class>com.qing.TestServlet</servlet-class>
    
    <init-param>
      <param-name>name</param-name>
      <param-value>张三</param-value>
    </init-param>
    <init-param>
      <param-name>age</param-name>
      <param-value>23</param-value>
    </init-param>
    <init-param>
      <param-name>sex</param-name>
      <param-value>true</param-value>
    </init-param>
    
    <servlet-mapping>
    <servlet-name>testservlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

具体代码:

package com.qing;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post方法执行");
        //得到ServletConfig接口对象
        ServletConfig config=this.getServletConfig();
        //通过ServletConfig接口对象得到web.xml文件中配置的初始化参数值
        //String getInitParameter(String name)	根据初始化参数名返回对应的初始化参数值
        String name=config.getInitParameter("name");
        String age=config.getInitParameter("age");
        String sex=config.getInitParameter("sex");
        System.out.println("初始化参数值 name=="+name+" age=="+age+" sex=="+sex);
        //得到web.xml 中 <servlet-name>元素的值
        //String getServletName()	返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值
        String servletName=config.getServletName();
        System.out.println(" web.xml 中 <servlet-name>元素的值=== "+servletName);
    }
}

Servlet接口及方法应用
5.ServletContext接口
答:当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的Servlet版本,初始化信息、读取资源文件等。
Servlet接口及方法应用
web.xml 配置

<context-param>
    <param-name>name</param-name>
    <param-value>李四</param-value>
  </context-param>
  <context-param>
    <param-name>sex</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>age</param-name>
    <param-value>124</param-value>
  </context-param>

  <servlet>
    <servlet-name>testservlet</servlet-name>
    <servlet-class>com.qing.TestServlet3</servlet-class>
    </servlet>

具体代码:

package com.qing;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class TestServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post方法执行");
//得到ServletContext接口对象
        ServletContext context=this.getServletContext();
        //得到Servlet版本号
        int majorVersion=context.getMajorVersion();
        int minorVersion=context.getMinorVersion();
        System.out.println("Servlet版本号=="+majorVersion+"."+minorVersion);
        //得到初始化信息
        //String  getInitParameter(String)	得到指定的初始化信息<context-param>
        String name=context.getInitParameter("name");
        String sex=context.getInitParameter("sex");
        String age=context.getInitParameter("age");
        System.out.println("初始化信息name=="+name+" sex=="+sex+" age=="+age);
        // 得到包含所有初始化信息名的Enumeration对象
        Enumeration<String> paramNames = context.getInitParameterNames();
        // 遍历所有的初始化参数名,得到相应的参数值并打印
        while (paramNames.hasMoreElements()) {
            String paramname = paramNames.nextElement();
            String value = context.getInitParameter(paramname);
            System.out.println("初始化信息==" + paramname + "=" + value);
        }
    }
}

Servlet接口及方法应用
6.读取 Web 应用下的资源文件
答:在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,在 ServletContext 接口中定义了一些读取 Web 资源的方法,这些方法是依靠 Servlet 容器实现的。Servlet 容器根据资源文件相对于 Web 应用的路径,返回关联资源文件的 I/O 流或资源文件在系统的绝对路径等。
ServletContext 接口中用于获取资源路径的相关方法。
Servlet接口及方法应用
6.1完善项目结构,创建resources资源文件,编写mytest.properties文件
Servlet接口及方法应用

name=张三丰
sex=true
age=123
address=武当山

6.2具体业务代码

package com.qing;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class TestServlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post方法执行");
        //得到ServletContext接口对象
        ServletContext context=this.getServletContext();
        //System.out.println("========"+context);
        //读取资源文件
        //InputStream getResourceAsStream(String path)	返回映射到某个资源文件的 InputStream 输入流对象。
        //InputStream in=context.getResourceAsStream("mytest.properties");
        InputStream in=this.getClass().getClassLoader().getResourceAsStream("mytest.properties");
        System.out.println("in===="+in);
        Properties pros = new Properties();
        pros.load(in);
        String name=pros.getProperty("name");
        String sex=pros.getProperty("sex");
        String age=pros.getProperty("age");
        String address=pros.getProperty("address");
        System.out.println("name===="+name);
        System.out.println("sex==="+sex);
        System.out.println("age===="+age);
        System.out.println("address===="+address);
    }
  }

6.3配置web.xml

<servlet>
    <servlet-name>testservlet</servlet-name>
    <servlet-class>com.qing.TestServlet4</servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>testservlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

6.4测试
Servlet接口及方法应用