JavaWeb基础上

一. Java Web技术架构的演变

Java Web,是用 Java 技术来解决相关 WEB 互联网领域的技术栈。

WEB 包括:WEB 服务端和 WEB 客户端两部分。Java 在客户端的应用有 Java Applet,不过使用得很少。

Java在服务器端的应用非常的丰富,比如 Servlet,JSP、SpringBoot 等等。

JavaWeb 架构演变过程大致分为以下几个阶段:

二. Servlet (服务器端组件)

1.1 什么是Servlet?

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。(实现网站的具体某个小功能的后端代码,用于处理客户端请求并生成响应)

比如,我们打开一个网站有个注册功能,在填写完信息后,点击提交,所填写的信息传输到后端,根据所指向的路径,来匹配对应的servlet,专门用于处理注册流程。

当然,我们还可以有登录Servlet,个人信息Servlet等等。从代码上来说,Servlets 是 Java 类,服务于 HTTP 请求并实现了 javax.servlet.Servlet 接口

1.2 Servlet 生命周期

Servlet 生命周期就是从创建到毁灭的过程。

大致是四个阶段。

  1. init():初始化阶段,只被调用一次,也就是在第一次创建 Servlet 时被调用。
  2. service():服务阶段,主要处理来自客户端的请求,并可以根据 HTTP 请求类型来调用对应的方法,比如 doGet(),doPost(),doPut() 等等。
  3. doGet(),doPost():处理阶段,将主要代码逻辑写在此处。根据不同 HTTP 请求对应不同方法。
  4. destroy():销毁阶段,该方法只会被调用一次,即在 Servlet 生命期结束时被调用。一般都是在关闭系统时执行。

1.3 实验:

1.创建项目,稍等片刻,自行会自行加载相关依赖,如果有报错请尝试退出重进,注意Archetype的内容要一直

2.在 pom.xml 中引入 servlet 依赖,写在 标签内,然后可以点击右上角 加载文件改动的按钮(也就是重新加载安装依赖)

1
2
3
4
5
6
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>

  1. 配置tomcat服务器

如果没有工件:自行百度

1.4 编写 Servlet 并运行:

  1. 鼠标右键点击 main 目录,选择 New - Directory ,创建名为 java 的主目录,后面我们的代码都写在此处。
  2. 鼠标右键点击 java 目录,选择 New - Java Class ,创建名为 FirstServlet 的class文件,在这

里面编写我们的代码,最终如下图所示

想要真正运行起来 Servlet 程序,我们需要继承 HttpServlet ,重写部分方法。

1
2
3
4
5
6
import javax.servlet.http.HttpServlet;
import java.util.logging.Handler;

public class FirstServlet extends HttpServlet {
}

编写代码,响应 Get 和 Post 请求内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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;

/**
* 这是一个简单的Servlet类,用于处理HTTP请求
* @author powerful
*/
public class FirstServlet extends HttpServlet {

// 重写doGet方法,处理GET请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应内容类型为HTML
resp.setContentType("text/html");
// 获取用于输出的PrintWriter对象
PrintWriter out = resp.getWriter();
// 向客户端输出HTML格式的内容
out.print("<h1>hello, first blood</h1>");
}

// 重写doPost方法,处理POST请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 这里简单地调用doGet方法来处理POST请求,实际应用中可按需定制
doGet(req, resp);
}
}

在 servlet 中,需要根据 URL 路径匹配映射到对应的 servlet。即在 web.xml 中注册 servlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
<web-app>
<display-name>Archetype Created Web Application</display-name>

<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

</web-app>

映射匹配流程: /FirstServlet 路径绑定的 Servlet-name为FirstServlet ,而 FirstServlet绑定的class是FirstServlet ,最终访问 /FirstServlet ,调用的类也就是 FirstServlet.class 。

servlet 注册有两种方式:一是通过上述 web.xml 进行注册,二是在 servlet3 以后可以通过@WebServlet() 注解方式进行注册。

重启tomcat服务

浏览器访问 127.0.0.1:8080/FirstServlet

三. 过滤器、监听器和拦截器

**过滤器 (Filter):**在 servlet 中,过滤器也就是 Filter ,它主要用于过滤字符编码,做一些统一的业务等等。是使用 javax.servlet.Filter 接口进行实现的。在代码安全中,他常被用于防止 XSS,防 SQL注入,防任意文件上传等。再配置了Filter之后,它可以统一过滤危险字符,省时省力。

监听器(Listener):在servlet中,监听器也就是 Listener ,它主要用于做一些初始化的内容**。是使用javax.servlet.ServletContextListener 接口进行实现的。如果同时有监听器和过滤器,监听器是在过滤器之前启动。

拦截器(Interceptor)**:**依赖 WEB 框架,在 SrpingMvc 中就依赖 SpringMVC 框架。是属于面向切面变成的一种运用。

过滤器和拦截器的区别,分为以下五种:

  1. 拦截器是基于 Java 的反射机制的,而过滤器是基于函数回调
  2. 过滤器依赖与 servlet 容器,而拦截器不依赖与 servlet 容器
  3. 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用
  4. 拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能
  5. 在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

四. JSP基础 (动态网页技术)

JSP 全称 Java Server Page,基于 Java 语言,是一种 动态网页技术。

它使用 JSP 标签在 HTML 网页中插入 Java 代码。标签通常以 <% code %> 显示。

JSP 本质是简化版的 Servlet,JSP 在编译后就变成了 Servlet。JVM 只能识别 Java 的类,是无法识别 JSP 代码的。所以 WEB 服务器会将 JSP 编译成 JVM 能识别的 Java类。

JSP 跟 Servlet 区别在于,JSP 常用于动态页面显示,Servlet 常用于逻辑控制。在代码中常使用 JSP 做前端动态页面,在接收到用户输入后交给对应的 Servlet 进行处理。当然 JSP 也可以当做后端代码进行逻辑控制。

Jsp文件后缀 *.jsp

1
2
3
4
5
6
7
8
方式一(常用):
<%
out.println("hellpo JSP!");
%>
方式二:
<jsp:scriptlet>
  代码片段
</jsp:scriptlet>
JSP 生命周期:

编译阶段 -> 初始化阶段 -> 执行阶段 -> 销毁阶段 ,对比 Servlet 此处多了一个编译阶段,是将JSP 编译成 Servlet 的阶段。

而这个阶段也是有三个步骤的: 解析 JSP 文件 -> 将 JSP 文件转为 Servlet -> 编译 Servlet 。

JSP 指令:

是用来设置 JSP 整个页面属性的。格式为: <%@ directive attribute=”value” %> 。JSP 中的三种指令标签:

指令 描述
<%@ page …%> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %> 包含其他文件
<%@ taglib … %> 引入标签库的定义

JSP的九大内置对象(隐式对象),这九个对象,可以不用声明直接使用。

名称 类型 描述
out javax.Servlet.jsp.JspWriter 页面输出
request javax.Servlet.http.HttpServletRequest 获得用户请求
response javax.Servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.Servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.Servlet.http.HttpSession 保存用户的信息
application javax.Servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
pageContext javax.Servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

实验:

在原来的基础上加上两个界面:

login.jsp代码如下所示:(红色波浪不用管)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>User to Register Page!</title>
</head>
<body>
<hr><br>登录页面<br>
<form action="do_login.jsp" method="get">
<br>
<h1>Please input your message:</h1><br>
Name:<input type="text" name="username"><br>
Pswd:<input type="password" name="password"><br>
<br><br><br>
<input type="submit">&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset"><br>
</body>
</html>

do_login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Server to do the register page!</title>
</head>
<body>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
%>
<%
//模拟登录成功与否
if(username.equals("admin") && password.equals("password")){
response.getWriter().write("Success!");
}else {
response.getWriter().write("Error!");
}
%>
</body>
</html>

重启tomcat即可:


JavaWeb基础上
http://example.com/2025/06/02/JavaWeb基础上/
作者
XCDH
发布于
2025年6月2日
许可协议