Java Web Servlet (Part A)- Servlet & HttpServlet

2022-09-26 14:08:44 浏览数 (1)


“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、Servlet

什么是Servlet?

  • Servlet是JavaEE的规范之一,也就是接口
  • Servlet是JavaWeb的三大组件之一,三大组件分别为是Servlet程序、Filter过滤器、Listener监听器
  • Servlet试运行在服务器上的Java程序,可以接收客户端传来的请求,并返回数据给客户端

Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来,容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。

自定义Servlet

创建maven项目servlet,添加servlet-api依赖

代码语言:javascript复制
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

添加Web Framework并配置Tomcat容器

自定义Servlet程序步骤
  1. 自定义一个类实现Servlet接口
  2. 实现service方法,处理请求并响应数据
  3. web.xml中配置自定义的Servlet类的访问地址

创建servlet包并新增HelloServlet 类实现Servlet接口,在service方法中向控制台打印访问信息

代码语言:javascript复制
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println(this.getClass()   "被访问了!");
    }

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

    @Override
    public void destroy() {

    }
}

service方法就是专门用来处理请求和响应的

配置WEB-INF下的web.xml文件

代码语言:javascript复制
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.lilith.servlet.HelloServlet</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
</servlet>

<!--给servlet程序配置访问地址-->
<servlet-mapping>
    <!--指定当前配置的地址给哪个servlet程序使用-->
    <servlet-name>HelloServlet</servlet-name>
    <!--servlet程序访问地址-->
    <!--/表示在服务器解析时表示的地址为ip:port/工程路径-->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

标签的作用:

  • servlet标签是给Tomcat配置Servlet程序
  • servlet-name标签是给Servlet程序起一个别名,配置访问路径时会用到
  • servlet-class标签表示的是Servlet程序的全类名

启动配置的Tomcat,浏览器输入地址 http://localhost:8080/hello

自定义Servlet程序的常见错误
web.xml中配置的访问地址既url-pattern不是以/开头
别名配置错误
全类名配置错误

servlet URL地址如何定位到Servlet程序去访问的?

客户端浏览器中的地址包含了以下信息

  • http://:表示使用http协议与服务端通信
  • localhost:服务端IP地址
  • 8080:与服务端通信的端口号
  • /:工程路径
  • hello:资源或者Servlet访问路径

根据web.xml中配置的Servlet访问路径,客户端的请求地址与服务端设置的地址一致就可以实现客户端和服务端的通信,否则会报错404。

二、Servlet生命周期

Servlet的生命周期主要包括

  1. 执行Servlet构造器方法
  2. 执行init初始化方法
  3. 执行service方法
  4. 执行destroy方法

修改HelloServlet类

代码语言:javascript复制
public class HelloServlet implements Servlet {

    public HelloServlet(){
        System.out.println("生命周期1-空参构造器方法");
    }

    @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方法");
    }
    
    public void doGet(){}

    public void doPost(){}

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

    @Override
    public void destroy() {
        System.out.println("生命周期4-destroy销毁方法");
    }
}

重启Tomcat,浏览器输入地址 http://localhost:8080/hello

根据控制台输出的日志可以确定,Servlet声明周期中的1和2是在第一次访问Servlet程序时会调用,每次访问service方法都会触发生命周期3,当停止Web工程的时候会调用destroy方法

GET和POST请求的分发处理

在index.jsp页面的body标签中增加form表单

代码语言:javascript复制
<form action="/hello" method="get">
  <input type="submit">
</form>

重新启动tomcat,浏览器访问 http://localhost:8080/hello, 点击页面的提交按钮,会访问HelloServlet的service方法,此时提交的请求时GET请求

修改form表单为post请求

HelloServlet类的service方法同样也被调用。此时请求方式为POST请求

可以确定service方法既可以处理GET请求也可以处理POST请求。

为了区分GET请求和POST请求,可以通过判断request中的请求方式,根据请求方式调用不同的方式处理。

代码语言:javascript复制
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("生命周期3-service方法");
    System.out.println(this.getClass()   "被访问了!");
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    // 获取请求的方式
    String method = request.getMethod();
    System.out.println(method);
    if ("GET".equals(method)){
        doGet();
    }else if ("POST".equals(method)){
        doPost();
    }
}


public void doGet(){

    System.out.println("GET请求处理逻辑");
}

public void doPost(){

    System.out.println("POST请求处理逻辑");
}

重启Tomcat,进入首页点击提交POST请求

调用了专门处理POST请求的方法

将form表单请求方式改为get,重新启动Tomcat,进入首页再次点击提交GET请求

根据页面的输出可以确定调用专门处理GET请求的方法,通过这种方式可以有效的区分GET请求和POST请求。

HttpServlet

自定义Servlet陈旭除了直接实现Servlet接口外,还可以通过继承HttpServlet类;HttpServlet类实现了Servlet接口的方法,自定义Servlet程序继承HttpServlet可以选择重写HttpServlet中的方法

在controller包下新增HiServlet并继承HttpServlet,重写doGet和doPost方法

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

    /**
     * get请求时调用该方法
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(this.getClass()   "的GET请求的处理方法被调用");
    }

    /**
     * post请求时调用该方法
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(this.getClass()   "的POST请求的处理方法被调用");
    }
}

在web.xml中配置HiServlet的访问路径

代码语言:javascript复制
<servlet>
    <servlet-name>HiServlet</servlet-name>
    <servlet-class>com.lilith.servlet.HiServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HiServlet</servlet-name>
    <url-pattern>/hi</url-pattern>
</servlet-mapping>

修改index.jsp页面的表单提交的地址为HiServlet的访问路径

代码语言:javascript复制
<form action="/hi" method="get">
  <input type="submit">
</form>

重启tomcat,浏览器进入index.jsp页面

修改请求方式为post

Servlet类继承体系

0 人点赞