• 9.14JavaWeb之Servlet三种创建方式


    9.14JavaWeb之Servlet三种创建方式

    访问一个动态网页

    概念:

    • 每一个用户看到的界面都是不一样的

    本质:

    • 一个动态网页对应一个Servlet类。

    • 通过web.xml配置文件--->使用URL路径将动态网页和Servlet类对应起来--->达到网页是动态的过程

    过程:

    • 浏览器--->URL路径--->Servlet类加载--->Servlet类实例化--->调用相关方法(通过Servlet类中的某些方法向浏览器输出Html语句)

    创建动态网页的第一步--->创建Servlet类

    拆分看Servlet规范:

    • 最顶层是一个名为 javax.servlet.Servlet 的接口,所有的 Servlet 类都要直接或者间接地实现该接口

    • 由于直接实现Servlet接口不太方便,所以Servlet接口内置两个Servlet接口实现类(抽象类)

      • GenericServlet

      • HttpServlet

    由上诉可知创建Servlet类的三种方式:

    1. 实现 javax.servlet.Servlet 接口,重写其全部方法。

    2. 继承 javax.servlet.GenericServlet 抽象类,重写 service() 方法。

    3. 继承 javax.servlet.http.HttpServlet 抽象类,重写 doGet() 或 doPost() 方法。

    自定义的Servlet类和上述三者之间的关系--->MyServlet是自定义的Servlet类

    概括:

    • GenericServlet 是实现了 Servlet 接口的抽象类。

    • HttpServlet 是 GenericServlet 的子类,具有 GenericServlet 的一切特性。--->并不是分别实现Servlet接口的类

    • Servlet 程序(MyServlet 类)是一个实现了 Servlet 接口的 Java 类。

    Servlet接口

    概念:

    javax.servlet.Servlet 是 Servlet API 的核心接口,所有的 Servlet 类都直接或间接地实现了这一接口。

    Servlet接口中定义的五个方法

    返回值方法备注
    void init(ServletConfig config) Servlet 实例化之后,由 Servlet 容器调用,用来初始化 Servlet 对象。该方法只能被调用一次。 参数 config 用来向 Servlet 传递配置信息。
    void service(ServletRequest req,ServletResponse res) Servlet 容器调用该方法处理客户端请求。
    void destroy() 服务器关闭、重启或者 Servlet 对象被移除时,由 Servlet 容器调用,负责释放 Servlet 对象占用的资源。
    ServletConfig getServletConfig() 该方法用来获取 ServletConfig 对象,该对象中包含了 Servlet 的初始化参数。
    String getServletInfo() 该方法用于获取 Servlet 的信息,例如作者、版本、版权等。

    示例代码:

    package ServletPractice;

    import javax.servlet.*;
    import java.io.IOException;
    import java.io.PrintWriter;

    /**
    * 自定义的Servlet类,直接实现Servlet接口当中的方法
    * @since JDK 1.8
    * @date 2021/09/14
    * @author Lucifer
    */
    public class MyServlet implements Servlet{
       //初始化Servlet实例的方法--->init()。只能被调用一次
       @Override
       public void init(ServletConfig servletConfig) throws ServletException{

      }

       //返回Servlet对象,该对象包括了Servlet初始化的参数
       @Override
       public ServletConfig getServletConfig(){
           return null;
      }

       //每次请求调用一次service()方法
       @Override
       public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException{
           //设置响应字符集
           servletResponse.setContentType("text/html;charset=UTF-8");
           //使用PrintWriter.write()方法向前台页面输出内容
           /*创建PrintWriter对象引用*/
           PrintWriter writer = servletResponse.getWriter();
           //向控制台输出的内容
           writer.write("HelloWorld");
           writer.close();
      }

       //返回关于 Servlet 的信息,例如作者、版本、版权等
       @Override
       public String getServletInfo(){
           return null;
      }

       //Servlet被销毁时调用
       public void destroy(){

      }
    }

    GenericServlet 抽象类

    该类特点:

    • javax.servlet.GenericServlet 实现了 Servlet 接口

    • 提供了除 service() 方法以外的其他四个方法的简单实现。

    • 继承 GenericServlet 类创建 Servlet ,只需要重写 service() 方法即可

    GenericServlet抽象类新增的以下的方法:

    返回值方法备注
    String getInitParameter(String name) 返回名字为 name 的初始化参数的值,初始化参数在 web.xml 中进行配置。如果参数不存在,则返回 null。
    Enumeration<String> getInitParameterNames() 返回 Servlet 所有初始化参数的名字的枚举集合,若 Servlet 没有初始化参数,返回一个空的枚举集合。
    ServletContext getServletContext() 返回 Servlet 上下文对象的引用。
    String getServletName() 返回此 Servlet 实例的名称。

    示例代码:

    package ServletPractice;

    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;

    /**
    * 通过继承GenericServlet抽象类来实现Servlet接口
    * @since JDK 1.8
    * @date 2021/09/14
    * @author Lucfier
    */
    public class MyServletDemoNo2 extends GenericServlet {
       //只需要重写service方法即可
       @Override
       public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException {
           //设置响应字符集
           servletResponse.setContentType("text/html;charset=UTF-8");
           //使用PrintWrite方法向前台页面输出内容
           PrintWriter writer = servletResponse.getWriter();
           writer.write("HelleWorld");
           writer.close();
      }
    }

    对比:

    • 对比继承抽象类实现Servlet接口和直接实现Serlet接口代码量少了一半

    HttpServlet 抽象类

    该类特点:

    • javax.servlet.http.HttpServlet 继承了 GenericServlet 抽象类,用于开发基于 HTTP 协议的 Servlet 程序。

    • Servlet 主要用来处理 HTTP 的请求和响应,通常情况下,编写的 Servlet 类都继承自 HttpServlet。

    Http/1.1当中的请求方式:

    • 一共有七种:GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。

    HttpServlet针对七种请求分别定义了七种方法:

    • doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()

    HttpServlet 重写了 service() 方法,该方法会先获取客户端的请求方式,然后根据请求方式调用对应 doXxx 方法。

    示例代码:--->展示调用doGet和doPost方法

    package ServletPractice;

    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.PrintWriter;

    /**
    * 继承HttpServlet抽象类,实现service方法调用doGet和doPost方法示例
    * @since JDK 1.8
    * @date 2021/09/14
    * @author Lucifer
    */
    public class MyServletDemoNo3 extends HttpServlet {
       //doGet方法
       public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //直接调用PrintWriter里面的方法向前端界面打印内容
           response.setContentType("text/html;charset=UTF-8");
           PrintWriter writer = response.getWriter();
           writer.write("HelloGet");
           writer.close();
      }

       //doPost方法--->传入请求和响应
       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //无需设置响应内容直接向前端界面打印
           PrintWriter writer = response.getWriter();
           writer.write("HelloPost");
           writer.close();
           doGet(request, response); //最终还是通过doGet方法进行打印
      }
    }

    在互联网上,都是通过 HTTP 协议来访问动态网页,使用最频繁的就是 GET 方式和 POST 方式,因此,通常基于 HttpServlet 来创建 Servlet 类,省去了处理 HTTP 请求的过程。

    It's a lonely road!!!
  • 相关阅读:
    [TimLinux] myblog 创建第一个app
    [TimLinux] MySQL InnoDB的外键约束不支持set default引用选项
    [TimLinux] 养成一个习惯
    [TimLinux] myblog 页面Axure设计
    [TimLinux] MySQL 中的CASE/WHEN语法
    [TimLinux] Python Django myblog启动
    [TimLinux] Python 模块
    [TimLinux] JavaScript 获取元素节点的5种方法
    堆和栈的一点知识
    OpenCV2基础操作----直线、矩形、圆、椭圆函数的使用
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15269276.html
Copyright © 2020-2023  润新知