Java Web入门
💡 根据 遗忘曲线:如果没有记录和回顾,6天后便会忘记75%的内容
读书笔记正是帮助你记录和回顾的工具,不必拘泥于形式,其核心是:记录、翻看、思考
Servlet学习笔记
一、Tomcat的安装和配置
1.Windows安装和配置Tomcat
2.IDEA集成Tomcat
点击 Edit Configurations

选择如下图所示

绑定项目

然后就可以启动了。
二、创建Servlet的三种方式
1.通过继承HttpServlet类
@WebServlet("/servlet01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("通过继承 HttpServlet 类");
}
}
2.通过继承GenericServlet抽象类
@WebServlet("/servlet03")
public class Servlet03 extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("通过继承 GenericServlet 类");
}
}
3.通过实现Servlet接口
@WebServlet("/servlet02")
public class Servlet02 implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("通过实现 Servlet 接口");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
三、Servlet生命周期

黑马视频教程
四、Servlet体系结构

urlPatterns配置


xml配置servlet

五、Rquest
Request继承体系
Request获取请求数据


POST请求获取请求参数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/servlet_demo_test_war/demo3" method="post">
<input name="username" type="text" placeholder="请输入用户名" />
<input name="password" type="password" placeholder="请输入密码" />
<input type="submit" value="登录" />
</form>
</body>
</html>
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.setHeader("content-type", "text/html;charset=utf-8");
resp.getWriter().write("<h1>" + name + ",hello world</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedReader br = req.getReader();
String line = br.readLine();
System.out.println("line:" + line);
}
}
Request通用方式获取请求参数

请求参数中文乱码 POST解决方案
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 最重要的是下面这行代码 ⬇⬇⬇
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
System.out.println("username:" + username);
}
请求参数中文乱码 GET解决方案
注意:Tomcat8之后已经不存在GET请求方式乱码问题。

原因:编解码字符集不一致

解决方案:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ...
String username = req.getParameter("username");
username = new String(username.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
System.out.println("username GET:" + username);
}
Request请求转发

示例代码片段
访问 /demo4时,会设置一个共享变量 msg,这个变量也可以通过前端传递,交由 /demo5处理。
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ...
req.setAttribute("msg", "hello world");
req.getRequestDispatcher("/demo5").forward(req, resp);
}
}
@WebServlet("/demo5")
public class ServletDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = (String)req.getAttribute("msg");
System.out.println(msg);
}
}
六、Response响应对象
重定向

@WebServlet("/respDemo1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resp demo1");
resp.setStatus(302);
resp.sendRedirect("/servlet_demo_test_war/respDemo2");
}
}
@WebServlet("/respDemo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resp demo2");
}
}

资源路径问题

响应字节流
导入commons-io包
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.17.0</version>
</dependency>
@WebServlet("/respDemo3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 字节输出流
FileInputStream fileInputStream = new FileInputStream("D://20241028155119.png");
// 获取响应字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
IOUtils.copy(fileInputStream, outputStream);
fileInputStream.close();
}
}
响应字符流
@WebServlet("/respDemo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("Hello World");
}
}
七、JSP
JSP快速入门

JSP脚本

jsp缺点

jsp这里感觉看看就行,毕竟工作肯定用不到。如果有面试题的话,再专门来复习一下。
EL表达式

JSTL

八、会话跟踪
cookie的基本使用
设置 cookie
Cookie cookie = new Cookie("Authorization", "F192783F-5CDD-4A22-87A3-9DF880933BBF");
resp.addCookie(cookie);
读取和遍历 cookie
Cookie[] cookies = req.getCookies();
// 1.遍历 cookies
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name + ": " + value);
}
cookie的原理
cookie是基于HTTP实现的
cookie的使用细节

session基本使用
服务端会话跟踪技术

session原理
session的实现是基于cookie的
seesion的使用细节
小结
