6. Servlet入门 - Servlet概述

2022-01-14 17:40:48 浏览数 (1)

6. Servlet入门 - Servlet概述

Servlet概述

1. 什么是Servlet

Servlet 运行在服务端(tomcat) 的Java小程序,是sun公司提供一套规范. 就是动态资源

1、Servlet 是 JavaEE 规范之一。规范就是接口

2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。

3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

2. Servlet作用

用来接收、处理客户端请求、响应给浏览器的动态资源。

但servlet的实质就是java代码,通过java的API动态的向客户端输出内容

3. servlet与普通的java程序的区别

  1. 必须实现servlet接口
  2. 必须在servlet容器(服务器 tomcat)中运行
  3. servlet程序可以接收用户请求参数以及向浏览器输出数据

4. 手动实现 Servlet 程序

1、编写一个类去实现 Servlet 接口

2、实现 service 方法,处理请求,并响应数据

3、到 web.xml 中去配置 servlet 程序的访问地址

image-20201110233106547

代码实现
1.创建演示的代码模块

image-20201110233307404

image-20201110233330706

image-20201110233401114

2.创建一个测试代码

image-20201110233514670

3.实现 Servlet 接口方法

image-20201110233637425

image-20201110233700884

4.实现 service 方法,专门用来处理请求和响应

image-20201110233842956

5.到 web.xml 中去配置 servlet 程序的访问地址

image-20201110234607157

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- servlet标签给Tomcat配置Servlet程序 -->
    <servlet>
        <!--servlet-name标签 Servlet程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class是Servlet程序的全类名-->
        <servlet-class>com.test01.HelloServlet</servlet-class>
    </servlet>

    <!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--
            url-pattern标签配置访问地址
               / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
               /hello 表示地址为:http://ip:port/工程路径/hello
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>
6.配置tomcat 以及设置工程路径

image-20201110234706768

启动 tomcat 服务如下:

image-20201110234738522

7.访问 HelloServlet

访问 http://localhost:8080/06_servlet/hello

image-20201110234831870

常见的错误
常见的错误 1:url-pattern 中配置的路径没有以斜杠打头。

image-20201110235124894

常见错误 2:servlet-name 配置的值不存在:

image-20201110235240101

常见错误 3:servlet-class 标签的全类名配置错误:

image-20201110235420491

5. url 地址到 Servlet 程序的访问

image-20201110064007165

6. Servlet 的生命周期

1、执行 Servlet 构造器方法

2、执行 init 初始化方法

第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。

3、执行 service 方法

第三步,每次访问都会调用。

4、执行 destroy 销毁方法

第四步,在 web 工程停止的时候调用。

代码演示
1.创建Servlet的构造方法

image-20201111000553289

2.在 init 初始化方法,设置打印信息

image-20201111000652460

3.在 service 方法,设置打印信息

image-20201111000725599

4.在destory 销毁方法,设置打印信息

image-20201111000810614

6.启动 tomcat 服务,访问 servlet

访问 localhost:8080/06_servlet/hello

image-20201111000945419

image-20201111001026343

7.停止 tomcat 服务,触发 destory 方法

image-20201111001056479

7. GET POST 请求的分发处理

问题

在上面的说明中,我们已经理解了 Servlet 的基本操作。但是可以知道,我们上面进行Servlet请求的时候,都是执行 service 方法。

那么一般我们请求都会分为多种方式,例如: GET POST PUT DELETE 请求。这些请求都全部会请求到 Servlet 中,那么该怎么区分处理呢?

下面我们来演示一下这个问题。

1.编写一个执行 form 表单请求的 a.html

image-20201111001714606

代码语言:javascript复制
<!--form表单请求-->
<form action="http://localhost:8080/06_servlet/hello" method="get">
    <input type="submit">
</form>
2.启动 tomcat 服务,执行 get 请求

访问 http://localhost:8080/06_servlet/a.html

image-20201111002052868

image-20201111002105544

此时可以看到,通过 get 请求可以访问到 service 方法。

3.将 form 表单改为 post 请求,再次执行:

image-20201111002200468

image-20201111002236018

从结果来看,也就是不管是 get 请求 还是 post 请求,都会触发 service 方法。

GET POST请求分发的处理

如果需要将请求进行方法,那么首先就需要获取到底请求过来的是什么方法。

4.通过 ServletRequest 的子类 获取请求的方法

image-20201111002647206

代码语言:javascript复制
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("3. service 方法:hello servlet被访问了!");
    // 类型转换(因为它有getMethod()方法)
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    // 获取请求的方式
    String method = httpServletRequest.getMethod();
    System.out.println("请求的方法:"   method);
}
5.再次使用 post 表单进行请求,查看方法如下:

image-20201111080419393

可以看到,我们已经获取到请求的方法了,下面再来看看 GET 请求。

6.修改表单,执行 GET 请求 测试

image-20201111080933086

可以看到也能够检测出请求是 GET 方法。

7.根据方法的不同,定义不同的函数方法进行分支处理

image-20201111081629224

代码语言:javascript复制
package com.test01;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author Aron.li
 * @date 2020/11/10 23:34
 */
public class HelloServlet implements Servlet {

    public HelloServlet() {
        System.out.println("1. HelloServlet构造方法");
    }

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

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

    /**
     * 实现 service 方法,专门用来处理请求和响应
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3. service 方法:hello servlet被访问了!");
        // 类型转换(因为它有getMethod()方法)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        // 获取请求的方式
        String method = httpServletRequest.getMethod();
        System.out.println("请求的方法:"   method);
        // 根据method分发执行不同的方法
        if ("GET".equals(method)){
            this.doGET();
        }else if ("POST".equals(method)){
            this.doPOST();
        }
    }
    /**
     * 处理GET方法
     */
    public void doGET(){
        System.out.println("处理GET方法");
    }
    /**
     * 处理POST方法
     */
    public void doPOST(){
        System.out.println("处理POST方法");
    }

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

    @Override
    public void destroy() {
        System.out.println("4. destroy 销毁方法!");
    }
}

8. 通过继承 HttpServlet 实现 Servlet 程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

1、编写一个类去继承 HttpServlet 类

2、根据业务需要重写 doGet 或 doPost 方法

3、到 web.xml 中的配置 Servlet 程序的访问地址

代码演示
1、编写一个类去继承 HttpServlet 类

image-20201111083139991

代码语言:javascript复制
public class HelloServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
2.根据业务需要重写 doGet 或 doPost 方法

image-20201111083331572

3、到 web.xml 中的配置 Servlet 程序的访问地址

image-20201111083433147

代码语言:javascript复制
<!-- 配置HelloServlet2   -->
<servlet>
    <servlet-name>HelloServlet2</servlet-name>
    <servlet-class>com.test01.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet2</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>
4、修改 a.html 的表单请求地址,启动 tomcat 服务,进行测试

image-20201111083628873

可以从上面的操作来看,使用 HttpServlet 来实现 Servlet 比较简单。

10. 使用 IDEA 创建 Servlet 程序

上面我们通过手写 HttpServlet 也是能够很快速开发 Servlet 程序,但是还有更加快的。其实这是 IDEA 提供的快捷方法,下面我们来试试。

1. 菜单:new ->Servlet 程序

image-20201111084329256

2. 配置 Servlet 的信息:

image-20201111084525874

3. 点击 OK 之后,就会自动创建 Servelet 如下:

image-20201111084650634

4.手动配置 servlet-mapping 如下:

image-20201111084801321

代码语言:javascript复制
<!-- 配置HelloServlet3  -->
<servlet>
    <servlet-name>HelloServlet3</servlet-name>
    <servlet-class>com.test01.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet3</servlet-name>
    <url-pattern>/hello3</url-pattern>
</servlet-mapping>
5.编写 GET 和 POST 方法

image-20201111084902907

6.执行测试

image-20201111085019930

11.小结

  1. Servlet是运行在服务器端java小程序, 动态资源
  2. Servlet的作用: 接收请求,做出响应

0 人点赞