杰神之Servlet简介

Servlet简介

  Servlet是sun公司提供的一门用于开发动态web资源的技术。
  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
  1、编写一个Java类,实现servlet接口。
  2、把开发好的Java类部署到web服务器中。
  按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

Servlet接口实现类

  Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。

  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
  HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

运行过程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
  ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
  ②装载并创建该Servlet的一个实例对象。
  ③调用Servlet实例对象的init()方法。
  ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

创建 servlet的多种方式

方式一

public class Demo01 implements Servlet{
    // 生命周期方法以下4个
    // 实例化方法(无参构造方法)
    public Demo01() {
        System.out.println("实例化方法");
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("初始化方法 init");
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // servlet 只创建了一个多次访问实际上就是多次调用服务的方法 service
        System.out.println("服务方法 service");
    }

    @Override
    public void destroy() {
        // 1.删除该应用程序调用
        // 2.停止服务器
        System.out.println("销毁方法 destroy");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }
}

方式二(适配器模式创建):

使用哪个方法就重写哪个方法,用不上的方法,可以不重写
@SuppressWarnings("serial")
public class Demo02 extends GenericServlet{
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

    }
}

方式三(模板设计模式)

@SuppressWarnings("serial")
public class Demo03 extends HttpServlet{
    // 声明一个 ServletConfig 对象,当做成员变量
    private ServletConfig config;
    // 初始化方法(通过该方法的参数,获取到 ServletConfig 对象)
    // ServletConfig 对象保存的是 servlet 中的配置信息
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.config = config;
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 调用父类 doGet 方法,无论如何都会报错,不是400就是405
        // 重写完 doGet 方法,注意:不要调用父类的 doGet 方法!
//      super.doGet(req, resp);
//      System.out.println("Demo03");

        // 获取 servlet 的配置信息
        // 参数是配置时的 name (相当于 key)
        // 用 key 获取对应 value
        String value = this.config.getInitParameter("encoding");
        System.out.println(value);
    }
    // 接收 post 请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//      super.doPost(req, resp);

        // 调用 doGet 方法的操作
        doGet(req, resp);
    }
}
//获取 ServletConfig 方式二
@SuppressWarnings("serial")
public class Demo04 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过父类中的方法,获取 ServletConfig 对象
        ServletConfig config = this.getServletConfig();
        String parameter = config.getInitParameter("encoding");
        System.out.println(parameter);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 下面是 xml 文件的头文件,限制了该 xml 文件所能书写的内容 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <!-- 工程的名字 -->
  <display-name>Demo</display-name>
  <!-- 设置欢迎页面 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 创建一个 servlet 对象 -->
  <servlet>
    <!-- 设置 servlet 名字 -->
    <servlet-name>demo01</servlet-name>
    <!-- 设置该 servlet 使用的类,全限定类名 -->
    <servlet-class>com.Demo</servlet-class>
  </servlet>
  <!-- 给该 servlet 配置一个访问地址(映射地址) -->
  <servlet-mapping>
    <!-- 配置哪个 servlet 的映射地址 -->
    <servlet-name>demo01</servlet-name>
    <!-- 配置映射地址 -->
    <!-- 注意:这里的斜杠代表工程名后面的斜杠,必须加上! -->
    <url-pattern>/demo01</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>demo02</servlet-name>
    <servlet-class>com.Demo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo02</servlet-name>
    <!-- 配置访问路径通配符 -->
    <!-- *.action 只要是以.action 结尾的访问路径,都可以访问到 demo02 这个 servlet -->
    <!-- /* 项目目录下无论输入什么网址都可以访问到 demo02 -->
    <!-- 注意:上面两种方式不能连用 -->
    <url-pattern>/demo02</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>demo03</servlet-name>
    <servlet-class>com.Demo</servlet-class>
    <!-- 添加 servlet 的配置信息 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo03</servlet-name>
    <url-pattern>/demo03</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>demo04</servlet-name>
    <servlet-class>com.Demo</servlet-class>
    <!-- 添加 servlet 的配置信息 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo04</servlet-name>
    <url-pattern>/demo04</url-pattern>
  </servlet-mapping>
</web-app>
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyj243719866/article/details/79704398
文章标签: Servlet
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭