Java Web Servlet (Part A)- Servlet & HttpServlet

简介: Java Web Servlet (Part A)- Servlet & HttpServlet

一、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依赖

<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方法中向控制台打印访问信息

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文件

<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

c6ec2e7535b041688956855546f73710_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

自定义Servlet程序的常见错误

web.xml中配置的访问地址既url-pattern不是以/开头

baea4d021f464b5b939a116844b69d6f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

别名配置错误

7ea0d29cc9604990b3e9308d27ba51c1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

全类名配置错误

bbec194068a5444f910861166622ff08_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

647979653bbe4a03bdf3d3cb9687f304_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


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类

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

17a924e0da584ef8b58b0c82a428440c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

GET和POST请求的分发处理

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

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

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

image.png

修改form表单为post请求

image.png

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

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

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

@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请求的方法

image.png

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

image.png

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

HttpServlet

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

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

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的访问路径

<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的访问路径

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

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

image.png

修改请求方式为post

image.png

Servlet类继承体系

image.png


相关文章
|
12天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
15天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
40 4
|
14天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
32 0
WK
|
20天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
35 0
|
1月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
25 1
|
1月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
26 0
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
34 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
34 1
|
2月前
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
54 0