• Serlvet的三种创建方式


    Java知识点总结:想看的可以从这里进入

    3、Servlet


    Servlet就是Sun公司推出的一款开发动态Web的一个开源技术。Servlet运行在服务器中,由服务器调用。他是运行在服务器中的Java程序,其作用是接收客户端的请求,并响应数据给客户端,是浏览器的请求和服务器上的数据库之间的中间层。

    它是 SUN 公司作为 CGI 技术的替代品而推出的技术,对开发动态网站需要使用的原生 Java API 进行了封装,形成了Servlet API,但是在编写HTML时很麻烦,所以Servlet通常配合JSP技术一起使用,JSP 对 Servlet 再次进行了封装,JSP 在经过编译后依然是 Servlet。

    Servlet 是 Java 语言中编写 Web 服务器扩展功能的重要技术,同时它也是 JSP 技术的底层运行基础。学习 Java Web 开发,首先就要掌握 Servlet 技术,它是一套WEB开发的标准,常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。

    Servlet、Filter过滤器、Listener监听器是JavaWeb的三大组件。

    • 客户端发送请求至服务器
    • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
    • 服务器将响应返回客户端

    Servlet项目命名规范:

    1、包名规范:com.***.servlet
    2、类名规范:****Servlet
    3、web.xml文件中的servlet-name等配置和类名保持一致
    
    • 1
    • 2
    • 3
    
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>javax.servlet-apiartifactId>
        <version>4.0.1version>
    dependency>
    
    <dependency>
        <groupId>javax.servlet.jspgroupId>
        <artifactId>javax.servlet.jsp-apiartifactId>
        <version>2.3.3version>
    dependency>
    
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>jstlartifactId>
        <version>1.2version>
    dependency>
    
    <dependency>
        <groupId>taglibsgroupId>
        <artifactId>standardartifactId>
        <version>1.1.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.1、三种实现方式

    在Servlet中一个网页对应着一个Servlet的类,通过web.xml将URL路径和类相关联,访问一个动态网页的过程,实际上是将对应的 Servlet 类加载、实例化并调用相关方法的过程。

    Servlet 最顶层是一个名为 javax.servlet.Servlet 的接口,所有的 Servlet 类都要直接或者间接地实现该接口。 Servlet 内置了两个 Servlet 的实现类(抽象类),分别为 GenericServlet 和 HttpServlet,因此,创建 Servlet 类有三种方式:

    1. 实现 javax.servlet.Servlet 接口,重写其全部方法。
    2. 继承 javax.servlet.GenericServlet 抽象类,重写 service() 方法。
    3. 继承 javax.servlet.http.HttpServlet 抽象类,重写 doGet() 或 doPost() 方法。
    3.1.1 Servlet接口

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

    内部共用五个方法,其中主要的是service方法,Tomcat服务器会调用此方法进行请求和响应。比较繁琐,很少使用该方法创建 Servlet。

    public class DemoServlet implements Servlet {
    	//servlet的初始化方法,实例被创建后,调用一次进行初始化
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            
        }
    	//返回 ServletConfig 对象,包含 Servlet 的初始化参数
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    	//Tomcat会找到service方法进行操作,主要进行请求和响应
        @Override
        public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
    		//设置编码
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //获取请求的数据
            
            //响应数据
            PrintWriter out = response.getWriter();		//获取输出的流
            out.print("");
        }
    
        //返回关于 Servlet 的信息,例如作者、版本、版权等
        @Override
        public String getServletInfo() {
            return null;
        }
    	//销毁方法
        @Override
        public void destroy() {
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    3.1.2 GenericServlet

    GenericServlet抽象类实现了Servlet接口的4个方法,所以继承了GenericServlet后只需要重写service方法就可以了。其他操作和直接实现serlvet接口类似。

    GenericServlet 是一个通用的 Servlet 类,并没有针对某种场景进行特殊处理,尤其是 HTTP 协议,我们必须手动分析和封装 HTTP 协议的请求信息和响应信息。

    package com.cy.demo.servlet
    
    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    
    public class Demo2Servlet extends GenericServlet {
        //其他四个方法抽象类GenericServlet已实现,只需要重写service即可
        @Override
        public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    3.1.3 HttpServlet

    正常使用的时候最多的数通过继承 javax.servlet.http.HttpServlet来实现Servlet程序,它用于开发基于 HTTP 协议的 Servlet 程序。

    在 HTTP/1.1 协议中共定义了 7 种请求方式,即 GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。HttpServlet 针对这 7 种请求方式分别定义了 7 种方法,即 doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()。我们使用的请求方式主要是 GET 和 POST,只需要重写 doGet 或者 doPost 方法。

    这种方式重写了Servlet的五个方法,并且添加了doGet和doPost方法,内部没有抽象方法。HttpServlet内部分析了Http的传输协议,提供了更多的使用方法。

    创建Servlet类:

    在这里插入图片描述

    在这里插入图片描述

    继承关系:创建的类继承→HttpServlet继承→GenericServlet实现→Servlet接口

    由Servlet的接口定义好访问的规范,GenericServlet实现Servlet接口,对其中的方法空实现,并对ServletConfig类做一些使用方法,HttpServlet继承了GenericServlet了,实现了service方法,并对请求进行分发处理增加了post和get方法。我们只需要跟需求重新doGet和doPost即可。

    //继承HttpServlet类
    public class Demo3Servlet extends HttpServlet {
        //重写doGet,doPost方法
       @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置编码
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf=8");
            //获得响应的流
             PrintWriter out = response.getWriter();
             out.print("Hello Servlet");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);  //調用doPost,可以不用區分post和get隨便使用兩個該方法
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

  • 相关阅读:
    信号包络及其提取方法(Matlab)
    MySQL最大建议行数2000w, 靠谱吗?
    Android app应用连接WiFi的方法(兼容Android10)
    传奇服务端常用文件功能说明
    Oracle-多表查询
    MySQL数据库的简介及select语句的执行流程
    Idea运行支付宝网站支付demo踩坑解决及其测试注意事项
    php正则笔记-匹配字母、数字、中文
    购买服务器,并安装宝塔
    Spring-Cloud GateWay+Vue 跨域方案汇总
  • 原文地址:https://blog.csdn.net/yuandfeng/article/details/126745847