回顾Java知识点,面试题汇总Day12:tomcat、 Java Web(持续更新)
JavaWeb开发技术指南,主要包含以下内容:1)Tomcat服务器安装与运行机制解析;2)手写简易版Tomcat服务器实现HTTP请求响应流程;3)JavaWeb项目创建及Servlet基础使用;4)前后端交互实现,包括表单处理、参数传递和页面跳转;5)详细讲解HttpServletRequest/Response核心API,重点分析转发与重定向的区别及应用场景;6)通过登录功能完整案例演示se
一、Java Web
Java语言开发的web应用,Java最主流的研发方向
Servlet 、JSP
Tomcat:Web应用服务器,专门用来运行web程序
二、Tomcat介绍
2.1 安装Tomcat
Tomcat9是主流
尽量用解压版的方式安装tomcat
参考文档:Windows环境下安装Tomcat,并配置环境变量-CSDN博客

bin:启动/关闭Tomcat服务的命令
conf:配置文件
lib:jar包
logs:日志
temp:临时文件
webapps:存放程序
work:JSP文件转换之后的Servlet文件
2.2 Tomcat运行机制
启动一个服务,端口是8080,浏览器通过url可以访问服务,返回该服务中的资源
2.3 手写简易版Tomcat
Socket
Request
Response
响应:根据浏览器所请求的uri去找对应的资源,如果有资源则返回,没有就返回4040错误。
注意:WebContent/tets.html放在根目录下,跟src同级。否则找不到路径

package tomcat;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class MyHttpServer {
private int port = 8080;
//获取当前工程的路径
static String WebContent =System.getProperty("user.dir") + File.separator + "WebContent";
public void receiving(){
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port,1, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) {
e.printStackTrace();
}
//接收请求
while (true) {
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
socket = serverSocket.accept();
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
//解析请求
MyHttpRequest request = new MyHttpRequest(inputStream);
request.parse();
// System.out.println(request.getUri());
//做出响应
MyHttpResponse myHttpResponse = new MyHttpResponse(outputStream);
myHttpResponse.response(request);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package tomcat;
import java.io.IOException;
import java.io.InputStream;
public class MyHttpRequest {
private InputStream inputStream;
private String uri;
public MyHttpRequest(InputStream inputStream) {
this.inputStream = inputStream;
}
public void parse(){
StringBuffer stringBuffer = new StringBuffer();
int i = 0;
byte[] buff = new byte[1024];
try {
i = inputStream.read(buff);
} catch (IOException e) {
e.printStackTrace();
}
for (int j = 0; j < i; j++) {
stringBuffer.append(((char) buff[j]));
}
System.out.println(stringBuffer.toString());
uri = ParseUri(stringBuffer.toString());
}
public String ParseUri(String stringBuffer){
int index1,index2;
index1 = stringBuffer.indexOf(' ');
index2 = stringBuffer.indexOf(' ',index1+1);
return stringBuffer.substring(index1+1,index2);
}
public String getUri() {
return uri;
}
}
package tomcat;
import java.io.File;
public class Test {
public static void main(String[] args) {
System.out.println("服务器已启动....");
MyHttpServer myHttpServer = new MyHttpServer();
myHttpServer.receiving();
}
}
package tomcat;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
public class MyHttpResponse {
private OutputStream outputStream;
public MyHttpResponse(OutputStream outputStream) {
this.outputStream = outputStream;
}
public void response(MyHttpRequest request) throws Exception {
byte[] buff = new byte[1024];
FileInputStream fileInputStream = null;
String filePath = request.getUri();
if(filePath.equals("/")){
filePath = "/index.html";
}
String result = null;
File file = new File(MyHttpServer.WebContent,filePath);
byte[] fileByte = new byte[(int)file.length()];
if(file.exists()){
fileInputStream = new FileInputStream(file);
fileInputStream.read(fileByte);
fileInputStream.close();
result = new String(fileByte);
result = createMsg("200",result);
outputStream.write(result.getBytes());
}else {
String msg = "404 File Not Found";
String msg1 = createMsg("404", msg);
outputStream.write(msg1.getBytes());
}
}
public String createMsg(String code,String message){
return "HTTP/1.1 " + code + "\r\n" + "Content-Length: " + message.length() + "\r\n" + "\r\n" + message; //结果是HTTP/1.1 200 OK\r\nContent-Length: xxx\r\n\r\n内容
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>


三、创建Java Web项目
idea的版本不同,创建方式可能不同,以idea2025.2版本为例。
3.1 创建Java Web项目
进行搜索"Add Framework",回车,弹框中选择“Web应用程序”

添加项目需要的jar包(jsp、servlet)

步骤:



3.2 添加Tomcat




启动访问 localhost:8080或者localhost:8080/index.jsp

四、Servlet的使用
4.1 前端HTML
HTML+JS+CSS
HTML:组成网页的基础标签
CSS:对网页进行美化
JS:动态操作数据,JS封装库:jQuery
4.1.1 编写网页最基础的标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/index.css">
<script src="js/jquery3.3.1.min.js"></script>
<script src="js/index.js"></script>
</head>
<body>
<div>test</div>
</body>
</html>
div{
width:300px;
height:300px;
border:10px solid blue;
}
$(function(){
$("div").click(function(){
alert("点击了div")
})
})
完整的index.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/index.css">
<script src="js/jquery3.3.1.min.js"></script>
<script src="js/index.js"></script>
</head>
<body>
<div id="mian">
<form action="/register" method="post">
<table id="tab">
<tr>
<td class="title">用户名:</td>
<td>
<input type="text"/>
</td>
</tr>
<tr>
<td class="title">密码:</td>
<td>
<input type="password" />
</td>
</tr>
<tr>
<td class="title">确认密码:</td>
<td>
<input type="password"/>
</td>
</tr>
<tr>
<td class="title">性别:</td>
<td>
<input type="radio" name="sex" checked="checked"/>男
<input type="radio" name="sex" />女
</td>
</tr>
<tr>
<td class="title">科目:</td>
<td>
<select>
<option>Java</option>
<option>Ruby</option>
<option>C++</option>
<option>Python</option>
</select>
</td>
</tr>
<tr>
<td class="title">爱好:</td>
<td>
<input type="checkbox" name="hobby"/>编程
<input type="checkbox" name="hobby"/>画画
<input type="checkbox" name="hobby"/>唱歌
<input type="checkbox" name="hobby"/>阅读
</td>
</tr>
</table>
<input id="btn" type="submit" value="提交"></input>
</form>
</div>
</body>
</html>
前端UI组件、Element UI 、Echarts 、BaiDuMap
4.2 后端
Java Web提供的后端组件是Servlet
Servlet是一个接口,让Java可以接收网络请求,并且做出响应的功能
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/test")
public class ServerTest 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 {
String StrId = servletRequest.getParameter("id");
System.out.println("接收到了客户端请求:" + StrId);
servletResponse.getWriter().write("Hello world");
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void destroy() {
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletTest extends HttpServlet {
//接口实现中有5个方法,但是只使用service方法,用service的分支代替
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用了Get方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用了Post方法");
}
}
4.3 前后端整合
4.3.1 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/css/index.css">
<!-- <script src="js/jquery3.3.1.min.js"></script>-->
<!-- <script src="js/index.js"></script>-->
</head>
<body>
<div id="main">
<form action="/servlet" method="post">
<table id="tab">
<tr>
<td class="title">用户名:</td>
<td>
<input name="username" type="text"/>
</td>
</tr>
<tr>
<td class="title">密码:</td>
<td>
<input name="password" type="password" />
</td>
</tr>
<tr>
<td class="title">确认密码:</td>
<td>
<input name="repassword" type="password"/>
</td>
</tr>
<tr>
<td class="title">性别:</td>
<td>
<input type="radio" name="sex" value="男" checked="checked"/>男
<input type="radio" name="sex" value="女"/>女
</td>
</tr>
<tr>
<td class="title">科目:</td>
<td>
<select name="type">
<option>Java</option>
<option>Ruby</option>
<option>C++</option>
<option>Python</option>
</select>
</td>
</tr>
<tr>
<td class="title">爱好:</td>
<td>
<input type="checkbox" name="hobby" value="编程"/>编程
<input type="checkbox" name="hobby" value="画画"/>画画
<input type="checkbox" name="hobby" value="唱歌"/>唱歌
<input type="checkbox" name="hobby" value="阅读"/>阅读
</td>
</tr>
</table>
<input id="btn" type="submit" value="提交"></input>
</form>
</div>
</body>
</html>
4.3.2 后端
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servlet")
public class ServletTest extends HttpServlet {
//接口实现中有5个方法,但是只使用service方法,用service的分支代替
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用了Get方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("调用了Post方法");
String username = req.getParameter("username");
String password = req.getParameter("password");
String repassword = req.getParameter("repassword");
String sex = req.getParameter("sex");
String type = req.getParameter("type");
String hobby = req.getParameter("hobby");
System.out.println("结果:" + "用户名是:" + username + "密码:" + password + "确认密码:" + repassword + "性别" + sex + "科目:" + type + "爱好:" + hobby);
}
}
五、HttpServletRequest
Servlet是Java进行Web开发的基础
Spring MVC基于Servlet
Web接受请求+做出响应。
HttpServlet中,Get请求进入doGet方法,POST方法进入doPost请求
HttpServletRequest表示请求
接收客户端的参数getParameter
设置编码 setCharaterEncoding
url完整的请求路径 http://localhost:8080/test.html
uri具体的资源 test.html
获取Session getSession
session和request一样,都是Java Web提供的对象
session用来存储登陆用户信息
JSP:Java Server Page HTML代码和Java代码的混合体
JSP内置对象,JSP引擎预先为开发者创建好的Java对象,可以直接使用
url中的参数只能通过getParameter方法取出
getAttribute适用于两个资源之间的数据传输,必须先有setAttribute才能通过getAttribute才能取值
资源之间的跳转有两种形式:
转发:getRequestDispatcher
重定向:sendRedirect
5.1 转发和重定向的区别
- 转发操作request,重定向操作response
- 转发浏览器地址栏不会改变,重定向浏览器地址栏会改变
- 转发前后操作的是同一个request对象,重定向前后是两个request对象
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servlet")
public class ServletTest extends HttpServlet {
//接口实现中有5个方法,但是只使用service方法,用service的分支代替
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("调用了Get方法");
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("调用了Post方法");
String username = req.getParameter("username");
System.out.println("请求进入了ServletTest");
// 跳转到index页面,并获取username值
req.setAttribute("username",username);
//转发跳转
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
<%--
Created by IntelliJ IDEA.
User: 31982
Date: 2026/6/1
Time: 12:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<%
Object username = request.getAttribute("username");
%>
</head>
<body>
<h1><%= username %></h1>
</body>
</html>
如果通过request进行数据的传递,则必须使用转发,如果使用重定向进行传递,会造成数据丢失。
如果使用重定向的方式进行资源跳转,同时需要数据共享,则需要使用session进行数据存储。
session作用域大于request
业务数据查询,后台查出数据,转发到页面进行展示,使用request存储数据。
登录用户,多个页面多个场景中使用,session存储数据。
5.2 登录演示
5.2.1 login.jsp
<%--
Created by IntelliJ IDEA.
User: 31982
Date: 2026/6/5
Time: 19:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<table>
<tr>
<td>用户名:</td>
<td>
<input type="text" name="username"/>
<%-- <%--%>
<%-- String msg = (String)request.getAttribute("msg");--%>
<%-- if(msg != null){--%>
<%-- %>--%>
<%-- <font style = "color:red"><%=msg%> <font>--%>
<%-- <%--%>
<%-- }--%>
<%-- %>--%>
<%-- 使用EL表达式:简化代码--%>
<font style="color: red">${msg}</font>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input type="text" name="password"/>
<font style="color: red">${msg1}</font>
</td>
</tr>
<tr>
<td>
<input type="submit" value="登录">
</td>
</tr>
</table>
</form>
</body>
</html>
5.2.2 DBUtils.java
模拟数据库
public class DBUtils {
public static final String USERNAME = "admin";
public static final String PASSWORD = "123456";
}
5.2.3 ResponseEbum.java
public enum ResponseEnum {
//枚举常量必须放在最前面,用逗号分隔,最后加分号
USERNAME_ERROR("用户名错误"),
PASSWORD_ERROR("密码错误");
private String msg;
// 构造方法(必须是 private)
private ResponseEnum(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
5.2.4 LoginServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if(!username.equals(DBUtils.USERNAME)){
//给页面提示用户名错误
// req.setAttribute("msg","用户名错误");
req.setAttribute("msg",ResponseEnum.USERNAME_ERROR.getMsg());
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
if(!password.equals(DBUtils.PASSWORD)){
//给页面提示用户名错误
// req.setAttribute("msg1","密码错误");
req.setAttribute("msg",ResponseEnum.PASSWORD_ERROR.getMsg());
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
//登陆成功,跳转到home页面(先set再转发)
req.setAttribute("username",username);
req.getRequestDispatcher("home.jsp").forward(req,resp);
}
}
5.2.5 home.jsp
<%--
Created by IntelliJ IDEA.
User: 31982
Date: 2026/6/5
Time: 20:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
欢迎,${username}<a href="logout">退出</a>
<h1>首页</h1>
</body>
</html>
5.2.6 LogoutServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();//销毁
resp.sendRedirect("login.jsp");
}
}
六、HttpServletResponse
表示响应
向客户端返回资源数据getWriter().write();
6.1 Servlet和JSP的关系
JSP本质就是一个Servlet,为了方便编写HTML代码,如果用Servlet返回HTML代码,需要拼写多次字符串,如果再添加新的,很容易出错。所以创造了JSP机制。JSP是一个模板,在此模板上可以用开发HTML代码形式写程序,JSP自动转换成一个Servlet,以response的形式将数据返回给客户端。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)