Java技术中的经典之作:Servlet的实践运用

在久远而悠久的历史长河中,各式各样的技术层出不穷,然而,当我们回顾过去,不难发现,曾经的主流框架尚未问世之际,我们所习惯使用的开发工具就是servlet及与之搭配的tomcat。如今,随着现代科技的飞速发展,这些陈旧的技术已逐渐淡出人们的视野。然而,身为一名Java程序员,我们有必要洞悉这项技术的本质及其脉络,以便在未来编写代码时能够心领神会,游刃有余。

Servlet作为Java Web开发规程中的核心技术之一,实际上就是运行在服务器端的纯Java程序,主要负责处理来自众多客户端的请求以及生成相应的响应结果。每个 Servlet都具有自己独特的生命周期,这个周期由三个子阶段组成,分别为初始化(init),服务(service)以及销毁(destroy)。值得注意的是,在初始阶段(即init方法)中,一旦该Servlet被加载至内存,这个方法就会立刻得到执行;同时,当收到每个请求时,都会依次调用服务方法;而在即将卸载Servlet之前,将会再次执行销毁方法。

此外,Servlet其实也是Java Enterprise Edition(即Java EE)标准中的一员大将,凭借其基础作用和价值贡献,为实现动态Web应用程序的研发奠定了坚实基础。许多广受欢迎的Java Web开发框架,比如Spring MVC、Struts等,无一不是基于这种强大的Servlet技术框架搭建而成,这次我们来学习一下Servlet的入门。

安装tomcat

第一步,下载

进入他们的官网。下载最新的tomcat。

tomcat.apache.org/download-11...

第二步,解压压缩包

将下载下来的压缩包解压到固定的目录下面,这样的话我们的Tomcat就完成了安装。记住tomcat安装的路径,我们待会会使用到它。

搭建项目环境

第一步,新建一个maven项目

我们新建的maven项目其实里面是空的。所以我们需要给他变成一个servlet项目。

第二步,添加web模块

新建一个空项目之后,我们给他增加一个Web模块。注意这里实际大家看到的不是上一个图中的项目,这点大家可以忽略。大家按照步骤操作就好了

idea搭建tomcat环境

第一步,安装插件

在ideal的插件市场中搜索smart tomcat插件并且进行安装

第二步,配置tomcat

在项目设置中添加以下配置(如下)

配置这样就好了:

到了这里,我们所有的环境已经准备好了。我们现在就可以开始编写我们的servlet的一个项目。

编写servlet项目

第一步,引入jar包

java 复制代码
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

第二步,编写自己的servlet类

java 复制代码
package com.masiyi.servlet;

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;

/**
 * @Author masiyi
 * @Date 2023/11/28
 * @PackageName:com.masiyi.servlet
 * @ClassName: MyServlet
 * @Description: TODO
 * @Version 1.0
 */
public class MyServlet extends HttpServlet {
    public MyServlet() {
        super();
    }

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @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 {
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String pwd = req.getParameter("pwd");
        System.out.println("用户名:" + username + ":密码:" + pwd);

        PrintWriter writer = resp.getWriter();
        writer.print("用户名:" + username);
        writer.print("密码:" + pwd);
        writer.close();

        super.doPost(req, resp);
    }

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

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

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

    @Override
    public void destroy() {
        super.destroy();
    }
}
  1. init(): 这个方法在Servlet初始化时被调用

  2. doGet(): 这个方法用于处理HTTP GET请求

  3. doPost(): 这个方法用于处理HTTP POST请求

  4. doPut(): 这个方法用于处理HTTP PUT请求

  5. doDelete(): 这个方法用于处理HTTP DELETE请求

  6. service(): 这个方法根据HTTP请求的方法类型,调用对应的doXXX()方法。

  7. destroy(): 这个方法在Servlet被销毁前被调用

我们的servlet类里面只重写了这七个方法,其实它的父类还有很多的方法。我们并没有重写,我们可以根据需要进行重写就行了。然后这个里面最主要的是有四个方法,就是我上面加粗的方法。

第三步,配置自定义servlet类的访问路径

java 复制代码
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.masiyi.servlet.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>

我们在web.xml中添加如上的代码。

这段XML配置代码用于将Servlet类com.masiyi.servlet.MyServlet映射到URL模式/myServlet上。

  1. 标签用于配置一个Servlet,其中:
  • 指定了Servlet的名称为myServlet。
  • 指定了Servlet类的完整路径为com.masiyi.servlet.MyServlet。
  1. 标签用于将Servlet映射到URL模式,其中:
  • 指定了要映射的Servlet的名称为myServlet,与上面配置的相对应。
  • 指定了URL模式为/myServlet,即当请求的URL匹配该模式时,将由myServlet来处理。

通过这样的配置,当用户请求的URL匹配/myServlet时,容器将会调用com.masiyi.servlet.MyServlet来处理该请求。

第四步,编写一个页面(非必须)

java 复制代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>向Servlet发送请求</title>
</head>
<body>
<%--注意:
    action的值 是 :web.xml 文件中的 url-pattern 的值。
--%>
<form action="/myServlet" method="post">
    用户名: <input type="text" name="username"> <br>
    密码: <input type="password" name="pwd"> <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

我们把这个jsp文件放在web目录下面。这样的话,tomcat就可以自动找到了这一个页面,因为我们在Idea搭建环境中已经配置了页面的根目录。

第五步,启动tomcat

启动成功后,我们可以看到控制台上已经打印出了一个地址。

如果大家在启动项目的过程中控制才报以下的错误,那么我们只需要把tomcat降低为10的版本就行,因为17的JAVA版本对应的tomcat最兼容的版本是该版本:

csharp 复制代码
错误: 加载主类 org.apache.catalina.startup.Bootstrap 时出现 LinkageError
java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0

第六步,访问本地地址

java 复制代码
http://localhost:8080/

如果输入密码和用户名之后点提交出现这样的情况:

java 复制代码
jakarta.servlet.ServletException: 类[com.masiyi.servlet.MyServlet]不是Servlet

是因为在Tomcat10之后,需导入servlet-api和tomcat-api包,我们不能用javax.servlet下面的包,而是应该用jakarta.servlet下面的包

所以我们的MyServlet类需要改一下:

同时引入下面两个包,主要tomcat版本要对应的上你安装的版本

java 复制代码
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-api -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-api</artifactId>
            <version>10.1.16</version>
        </dependency>
    </dependencies>

之后我们提交用户名和密码的时候就可以看到它成功的进入到我们的dopost的方法。

在这个方法中,首先设置了响应和请求的字符编码为 UTF-8,然后从请求中获取了用户名和密码参数,并将它们打印到控制台和作为响应写回给客户端。

super.doPost(req, resp) 是用来调用父类的 doPost 方法的。如果不调用 super.doPost(req, resp),那么父类中的 doPost 方法将不会被执行,这可能会导致一些与 POST 请求相关的默认行为不会发生,比如表单数据的处理等。所以我们需要在重写的方法中调用 super.doPost(req, resp) 以确保父类的逻辑也会被执行。

Java Servlet 乃 Java 平台中的一项古老且经久不衰的技术,为构建稳定、可拓展的 Web 应用程序提供了强有力的支柱。通过深入研究 Servlet,我们不仅能够洞察 Web 应用程序的基本运作机制,还能掌握 Java 在 Web 开发领域的关键技术。无论对于新手还是具备丰富经验的开发者,熟练掌握 Servlet 都将为我们在 Java Web 开发领域奠定坚实的基石。

完整的代码可以到我的代码仓库里面去查看,我的代码仓库的地址是 gitee.com/WangFuGui-M...

相关推荐
monkey_meng11 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
草莓base23 分钟前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
Estar.Lee26 分钟前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
drebander1 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天2491 小时前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn1 小时前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟1 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy1 小时前
高级编程之结构化代码
java·spring boot·spring cloud
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
弗锐土豆1 小时前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部