榆林市网站建设_网站建设公司_过渡效果_seo优化
2025/12/25 9:47:39 网站建设 项目流程

认识Servlet

本质:

  • 运行在web服务器(如Tomact)上的Java类;
  • 专门用于接受客户端的HTTP请求,处理业务逻辑(如查询数据库,验证登录),生成动态HTTP响应(如返回HTML页面,JSON数据)。

定位:

  • Javaweb开发的"核心组件",是连接客户端(浏览器/APP)与后端服务(数据库/业务逻辑)的"桥梁",所以Javaweb框架(如SpringMVC)的底层都依赖Servlet。

版本关联:

  • Servlet6.0是JakartaEE 10 规范的一部分,包名从传统的javax。servlet改为jakarta.servlet(这是新版与旧版的核心区别,适配Tomact10)。

快速创建JavaWeb项目

项目基本结构:

项目名/ # 项目根目录 ├─ src/ # 源代码目录(核心) │ ├─ main/ # 主程序目录 │ │ ├─ java/ # Java源代码(核心业务逻辑) │ │ │ └─ com/yourcompany/ # 包路径(如Servlet类、工具类) │ │ │ ├─ servlet/ # 存放Servlet类(如LoginServlet.java) │ │ │ └─ service/ # 存放业务逻辑类(如UserService.java) │ │ └─ webapp/ # Web资源目录(前端+配置) │ │ ├─ index.jsp # 默认首页(访问项目根路径时显示) │ │ ├─ static/ # 静态资源(CSS/JS/图片) │ │ │ ├─ css/ │ │ │ ├─ js/ │ │ │ └─ img/ │ │ └─ WEB-INF/ # 受保护目录(客户端无法直接访问) │ │ ├─ web.xml # Web应用配置文件(Servlet映射、过滤器等) │ │ └─ classes/ # 编译后的class文件(Maven自动生成,无需手动放) │ └─ test/ # 测试代码目录(可选) │ └─ java/ # 测试类(如Servlet的单元测试) ├─ pom.xml # Maven核心配置文件(依赖管理、打包方式等) └─ target/ # 构建输出目录(Maven自动生成) └─ 项目名/ # 打包后的Web应用目录(与Tomcat部署结构一致) └─ WEB-INF/ # 对应src/main/webapp/WEB-INF

访问地址:http://localhost:8080

出现以上页面,表示项目初始化成功。

编写第一个Servlet程序

Servlet3.0之前写法:

import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; import java.io.PrintWriter; // 继承HttpServlet类 public class FirstServlet extends HttpServlet { // 处理GET请求 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); // 获取输出流 PrintWriter out = response.getWriter(); // 输出HTML内容 out.println("<html>"); out.println("<head>"); out.println("<title>第一个Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello, Servlet!</h1>"); out.println("<p>这是通过XML配置映射的第一个Servlet程序</p>"); out.println("</body>"); out.println("</html>"); } // 处理POST请求(简单转发到GET处理) @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

web.xml

<?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 --> <servlet> <!-- Servlet的名称,自定义,需唯一 --> <servlet-name>FirstServlet</servlet-name> <!-- Servlet的完整类名(包名+类名) --> <servlet-class>com.example.servlet.FirstServlet</servlet-class> </servlet> <!-- 配置Servlet映射路径 --> <servlet-mapping> <!-- 与上面的servlet-name保持一致 --> <servlet-name>FirstServlet</servlet-name> <!-- 访问路径,在浏览器中通过此路径访问 --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

3.0之后的写法,(使用注解代替xml)

import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; // 最简配置:仅指定访问路径(value等同于urlPatterns) @WebServlet("/simple") public class SimpleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<h1>最简Servlet:访问路径 /simple</h1>"); } }

掌握Servlet生命周期

阶段

触发时机

核心方法

作用与特点

1. 实例化

Tomcat 启动时(配置loadOnStartup

)或首次接收请求时

无参构造方法

容器创建 Servlet 实例(单实例:一个 Servlet 类仅创建一个对象,供所有请求共享)

2. 初始化

实例化后立即执行(仅 1 次)

init()

初始化资源(如数据库连接池、配置参数),可通过@WebInitParam

获取初始化参数

3. 服务

每次收到匹配的 HTTP 请求时

service()

doGet()

/doPost()

自动根据请求方法(GET/POST)调用对应doXxx()方法,处理业务逻辑并返回响应

4. 销毁

Tomcat 正常关闭时

destroy()

释放资源(如关闭连接池),避免内存泄漏

测试代码:

/** * servlet的生命周期 */ @WebServlet(urlPatterns = "/live",loadOnStartup = 1) public class LiveServlet extends HttpServlet { //1.实例化阶段:容器调用无参构造 public LiveServlet(){ System.out.println("Instantiation"); } //2.初始化阶段:容器调用init方法 @Override public void init() { System.out.println("init"); } //3.服务阶段:容器调用service方法,处理GET请求 @Override protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws ServletException, IOException { System.out.println("service"); } //4.销毁阶段:容器调用destroy方法 @Override public void destroy() { System.out.println("destroy"); } }

测试结果:

Connected to server [2025-12-24 10:08:30,538] Artifact JavaWebDemo:war exploded: Artifact is being deployed, please wait... Instantiation init [2025-12-24 10:08:30,771] Artifact JavaWebDemo:war exploded: Artifact is deployed successfully [2025-12-24 10:08:30,771] Artifact JavaWebDemo:war exploded: Deploy took 233 milliseconds service 24-Dec-2025 10:08:40.235 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-10.1.50\webapps\manager] 24-Dec-2025 10:08:40.269 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-10.1.50\webapps\manager]的部署已在[34]毫秒内完成

什么是HttpServletRequest?

其是用来封装客户端请求的数据;

常见方法如下:

方法

作用

示例

getParameter(String name)

获取单个请求参数(GET/POST)

request.getParameter("username")

getParameterValues(String name)

获取多个请求参数(如复选框)

request.getParameterValues("hobby")

getRequestURI()

获取请求 URI 路径

/servlet-demo/hello

getMethod()

获取请求方法(GET/POST/PUT/DELETE)

request.getMethod()

→ "GET"

getSession()

获取当前会话(Session)

request.getSession().getAttribute("user")

实例代码:

//3.服务阶段:容器调用service方法,处理GET请求 @Override protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); int age = Integer.parseInt(request.getParameter("age")); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h1>Hello, " + name + " " + age + "</h1>"); System.out.println("service"); }

什么是HttpServletResponse方法?

其是封装服务端响应的数据;

常用方法:

方法

作用

示例

setContentType(String type)

设置响应类型与编码

response.setContentType("text/html;charset=UTF-8")

setStatus(int sc)

设置响应状态码

response.setStatus(404)

(未找到)

sendRedirect(String path)

重定向(客户端跳转,URL 变化)

response.sendRedirect("/servlet-demo/login")

getWriter()

获取字符输出流(返回文本 / HTML/JSON)

response.getWriter().write("success")

测试代码:

//3.服务阶段:容器调用service方法,处理GET请求 @Override protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json;charset=UTF-8"); String json = "{\"code\":200,\"msg\":\"success\",\"data\":{\"name\":\"张三\",\"age\":20}}"; response.getWriter().write(json); System.out.println("service"); }

什么是Json?

Json:

  • 是一种轻量级的数据交换格式;
  • 它基于ECMAScript(JS规范)的子集,但独立于编程语言;
  • 几乎所以主流编程语言都支持JSON的解析和生成;
  • JSON的设计目标是简洁,易读,易解析;
  • 常用于前后端数据传输(列如:浏览器于服务器之间API通信);
  • 配置文件存储等场景。

核心特点:

特点

说明

文本格式

以纯文本形式存储,任何文本编辑器都可查看 / 编辑

跨语言

与编程语言无关,Java、Python、JavaScript 等均支持

轻量性

相比 XML,语法更简洁(无冗余标签),传输效率更高

结构化

数据以键值对和有序列表(数组)组织,结构清晰


JSON数据类型:

类型

说明

示例

字符串

用双引号""

包裹的文本(不可用单引号)

"name": "张三"

数字

整数或浮点数(无引号)

"age": 20"score": 95.5

布尔值

只能是truefalse(无引号)

"isStudent": true

数组

有序集合,用[]包裹,元素用逗号分隔

"hobbies": ["篮球", "编程"]

对象

无序键值对集合,用{}包裹,键必须是字符串(双引号)

{"name": "张三", "age": 20}

null

表示空值(无引号)

"address": null

合规JSON示例

{ "id": 1001, "name": "张三", "age": 22, "isMale": true, "hobbies": ["足球", "游戏"], "address": { "city": "北京", "street": "中关村大街" }, "score": null }

序列化和反序列化

序列化:

  • 将内存中的对象转换为可传输/存储的JSON字符串的过程;

反序列化:

  • 将JSON字符串转换为内存中的对象的过程;

操作

输入

输出

核心目的

序列化

内存对象(如 Java Bean)

JSON 字符串

便于数据传输(如网络传输)或持久化(如写入文件)

反序列化

JSON 字符串

内存对象(如 Java Bean)

便于程序对数据进行逻辑处理(如调用对象的方法)

常见工具

  • FastJSON(阿里巴巴,轻量、快速)
  • Jackson(Spring 框架默认集成)
  • Gson(Google)



总结:

  • JSON 核心:轻量级数据交换格式,基于键值对和数组,跨语言支持。
  • 序列化JSON.toJSONString(对象)(FastJSON)→ 将对象转 JSON。
  • 反序列化JSON.parseObject(JSON字符串, 类名.class)→ 将 JSON 转对象。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询