servlet
关于监听器
首先,监听器要具备三者:
1.监视者
2.目标
3.事件
监听器类型:
范围最大:
ServletContentListenner :监听web的启动和关闭
范围中等:
HttpSession:监听会话的,也就是打开一次浏览器,就是一个会话。
范围最小的:
ServletRequeest:监视请求范围内的属性的添加和删除移除替换
关于配置:
1.第一种注解的配置:就跟@WebServlet("路径")一样,但是他这个是@Listenner()
2.第二种就是xml文件配置:<listenner> <listenner>,包括maping,class,url-pattern都是一样的
<listener>
<listener-class>com.example.MyListener</listener-class>
</listener>
关于三层框架的详细包名介绍

关于重定向和转发
1关于重定向,首先 使用sendredrict(填一个路径)
respnse.sendRedirect("/dept/list");
想当于给浏览器发送了一次新的请求。重新打开了一个页面
(重定向)不能访问WEB-INF下的文件,
2.转发,相当于在tomcat服务器里面,进行转发的,浏览器不知道。
request.getRequestDispatcher("/list").forword(request,response);
总结:
-
需要在同一次请求中共享数据。
-
需要跳转到 WEB-INF 目录下受保护的资源。
关于get请求和post请求乱码问题
在HttpServlet中 有一个方法,叫request.setCharacterEncoding("UTF-8");在请求体里面的数据
在tomcat服务器中,会默认实现,但并不代表所有的都会实现utf-8.
所有这行代码,可以执行
request.setCharacterEncoding("UTF-8");只对请求体里面的数据,不对请求行的。
在tomcat服务器里面,默认实现的是请求行url后的数据,默认是utf-8.
建议乱码问题,写一个过滤器。
@WebFilter("/*")
public class MyFilter1 implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request,response);
}
关于http和https
特点:首先是无状态的,默认不保留之前的请求。可以通过cookie和Session实现状态管理
HTTP/1.0:短连接,每次发送一个请求都会建立一个新连接。
HTTP/1.1:持久连接,每个域名可以并行6 个连接,剩下的要等其他加载完成,才能继续加载。
http的报文
GET /index.html HTTP/1.1 # 请求行(方法 + URI + 协议版本)
Host: www.example.com # 请求头部(键值对)
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Accept-Language: en-US
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Cookie: sessionId=abc123; userId=admin
# 空行(分隔头部和体)
name=John&age=30 # 请求体(GET通常无体,POST/PUT等有)
请求行 + 请求头 + 空白行 + 请求体
(get)无请求体
host:域名
user-agent:浏览器类型
Content-Type:请求的数据类型(application/x-www-form-urlencoded表示普通表单提交,application/json表示以 JSON 格式提交数据)
cookie:客户端携带的会话信息。
状态码
200:ok
404:表示找不到资源。
405:请求是方式与浏览器处理的方式不一样,比如请求是post 结果浏览器处理是get请求。
500:表示服务器错误,比如java后端指针异常等。
在java中的API
● 编码:java.net.URLEncoder.encode(String s, String enc)
● 解码:java.net.URLDecoder.decode(String s, String enc)
// 编码示例
String original = "搜索 关键词&特殊字符";
String encoded = URLEncoder.encode(original, "UTF-8");
// 结果为 "搜索+关键词%26特殊字符"
// 解码示例
String decoded = URLDecoder.decode(encoded, "UTF-8");
关于session对象的工作原理以及超时
1.创建一个session对象,第一次访问,要创建session。会生成jsessionID,然后将session对象和ID存储到web容器中的session列表中,并生成一个cookie,cookie中存储jsessionid,然后cookie响应给浏览器,浏览器并将保存在缓存中,直到浏览器关闭,cookie失效。
当用户第二次发现送请求的时候,会自动提交cookie给服务器,服务器收到cookie,通过cookie获取jsessiondID,通过列表去查找对应的session对象,并返回。
//获取当前session,获取不到会创建一个新的
HttpSession session = request.getSession();
//获取session,获取不到,会返回null
HttpSession session = request.getSession(false);
2.一次会话:session对象从创建到死亡,就是一次会话
3.domain属性,是设置子域名可以访问。
关于Thymeleaf模板引擎
用途:主要用于处理 HTML、XML、JavaScript 等文件,支持自然模板(允许静态原型直接作为模板使用)
SEO优化,可以用thymeleaf 单网页项目
优点:
-
Thymeleaf 模板是合法的 HTML,可直接用浏览器打开预览。
-
Thymeleaf 默认对所有表达式输出进行 HTML 转义,有效防御 XSS。
-
Thymeleaf 不依赖 Servlet 容器,可以在非 Web 环境(如邮件模板)中使用。
-
Thymeleaf 无 Java 代码嵌入 :所有逻辑通过属性(如
**th:text**、**th:if**)实现。<!-- 模板文件 index.html --> <html> <body> <p th:text="'Hello, ' + ${name}">Hello, Guest</p> </body> </html>
必须掌握的语法
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <!-- 启用Thymeleaf命名空间 -->
<head>
<title th:text="${pageTitle}">默认标题</title> <!-- 静态默认值会被动态替换 -->
</head>
<body>
<!-- 所有Thymeleaf属性以 th: 开头 -->
</body>
</html>
必须要有命名空间,xmlns:th="http://www.thymeleaf.org",这一行必须要有。固定的
第四行:th:text表达式,内容会被覆盖掉
标签都可以用,th:开头
变量表达式(text 和utext)后者不会转义,存在xss攻击,text建议使用。
<div th:text="${user.name}">用户名默认值</div> <!-- 即使是一段HTML代码,也只是当做普通文本处理,转义,防止XSS攻击 -->
<div th:utext="${htmlContent}">HTML内容</div> <!-- 对HTML代码解释执行,不转义,存在XSS攻击风险,谨慎使用 -->
关于tomcat的目录介绍
bin:存放脚本,启动和停止的脚本
conf:存放全局的配置文件,比如server.xml,web.xml
lib:存放运行tomcat的全局java库,jar包。
logs:存放日志文件。
temp:存放临时文件。
webapps:存放我们的项目,里面有5个默认的自带的项目。
work:存放的运行生成的临时文件。主要就是jsp编译后的servlet文件和session的文件。
老杜文档内容:
4.5.1. bin(Binary)
-
作用:存放 Tomcat 的可执行脚本和启动/停止相关的文件。
-
关键内容:
-
启动/停止脚本 :如
startup.sh(Linux/macOS)和startup.bat(Windows)用于启动 Tomcat;shutdown.sh/shutdown.bat用于停止。 -
其他工具:如
catalina.sh(核心脚本)、version.sh(版本检查)等。
4.5.2. conf(Configuration)
-
作用:存放 Tomcat 的全局配置文件。
-
关键文件:
-
server.xml:主配置文件,定义服务器端口(默认 8080)、虚拟主机(Host)、连接器(Connector)等。 -
web.xml:所有 Web 应用的默认部署描述符(如默认 Servlet、MIME 类型)。
4.5.3. lib(Libraries)
-
作用:存放 Tomcat 运行所需的全局 Java 库(JAR 文件)。
-
关键内容 :Tomcat 核心库:如
servlet-api.jar、jsp-api.jar、catalina.jar等。
4.5.4. logs
-
作用:存放 Tomcat 运行日志和应用日志。
-
关键文件:
-
catalina.out/catalina.log:核心引擎日志(启动/停止错误等)。 -
localhost.log:应用部署相关的日志(如 Context 加载失败)。 -
注意 :日志是排查问题的首要位置,可通过
conf/logging.properties配置格式和级别。
4.5.5. temp
- 作用:存放临时文件(如上传的文件、Session 持久化数据等)。
4.5.6. webapps
- **作用:**默认的 Web 应用部署目录。我们开发的 webapp 默认都放到这个目录下。
4.5.7. work
-
作用:存放运行时生成的临时文件(主要是 JSP 编译后的 Servlet 类文件和 Session 数据)。
-
JSP 编译结果 :如
org/apache/jsp/index_jsp.java和.class文件。
关于url:
https://www.example.com:8080/path/to/page
\___/ \_____________/ \__/ \_________/
| | | |
协议 主机名(域名) 端口 路径
web:80
Tomcat:8080
mysql:3306
DNS:将域名解析为ip地址
TCP:三次握手,避免资源浪费。如果是https会多加一次握手,交换证书,增加安全性。
日志记录的步揍
1.引入jar,日志的jia包
2.设置xml文件,logback.xml 在乱码设置日志的等级啊,时间啊,等等配置。
3.在自己代码里面编写,获取日志记录器,通过类名,
filter过滤器的使用以及生命周期跟Servlet一样
过滤器 :首先可以过滤请求那边过来的 ,然后也可以过滤响应过来的,过滤器可以多个,可以链式调用
比如:第一个,第二个,第三个,第四个。 可以从第一个开始,但是web.xml的配置,必须按照顺序。
前面,写对request的过滤
chain.doFilter(request, response);必须执行这一行,过滤器才能连接上
后面写,对响应的过滤
看起来就像栈一样,后进先出
<filter>
<filter-name>commonCodeFilter</filter-name>
<filter-class>com.jkweilai.filter.CommonCodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>commonCodeFilter</filter-name>
<url-pattern>/filter/*</url-pattern>
</filter-mapping>
但是init这个方法,会在创建的时候就会创建对象。但是servlet不会,两个就这个区别
过滤路径的四种 写法
1.精确匹配:/a/b/c
2.前缀匹配:/a/*
3.扩展名匹配:*.a (以a为扩展的文件)
4.默认匹配:/ ()
servlet的生命周期
1.在servlet的接口中,有五个方法,需要实现,
第一个:service ()
第二个 :init()
第三个:destroy()
第四个:getServletConfig()
第五个:getServletInfo()
当加载tomcat服务器的时候,会首先加载 无参构造器,然后 init ,然后在是service方法
当加载的时候,无参构造 和 init 方法只执行一次,执行之后就不会在执行了。
service方法,当访问一次浏览器 就会执行一次。可以多次执行
package com.jkweilai.servlet;
import jakarta.servlet.*;
import java.io.IOException;
public class LifecycleServlet implements Servlet {
public LifecycleServlet() {
System.out.println("LifecycleServlet's default constructor called");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("LifecycleServlet's init called");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LifecycleServlet's service called");
}
@Override
public void destroy() {
System.out.println("LifecycleServlet's destroy called");
}
@Override
public String getServletInfo() {
return "";
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
看一下:init里面的参数(ServletConfig servletConfig)
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("LifecycleServlet's init called");
}
说明会在执行init方法之前,tomcat服务器,会自己创建对象,创建一个ServletConfig对象。
看一下:service中也有两个对象参数,说明执行这个方法之前,也要自动创建两个对象。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LifecycleServlet's service called");
}
关于xml配置
<servlet>
<servlet-name>lifeServlet</servlet-name>
<servlet-class>com.jkweilai.servlet.LifecycleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>lifeServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
关于servlet的name 以及 class 以及 url-pattern
<servlet-name> |
Servlet 的内部唯一标识名(仅在 web.xml 内部使用) |
|---|---|
<servlet-class> |
实际处理请求的 Java 类(必须在 classpath 中) |
<url-pattern> |
对外暴露的访问路径,用户通过它触发 Servlet |
class 要填 类,通过反射,获取类clazz,通过clazz获取对象,通过对象,调用方法init()。
这是第一次:要通过,这个方式调用,第二次就直接调用service方法了。
因为init方法 和 无参构造方法 只执行一次。
session和cookie的区别
| 特性 | cookie | session |
|---|---|---|
| 存储位置 | 客户端 | 服务器端 |
| 安全性 | 较低 | 较高 |
| 存储大小 | 有限(约4KB) | 较大(取决于服务器) |
| 生命周期 | 可设置长期有效 | 通常较短(会话期间) |
| 性能影响 | 每次请求都会携带 | 只在服务器端查找 |
cookie可以实现记住我 功能
thymeleaf的基础语法
1.都是以th:开始
th:text
<title th:text="${pageTitle}">默认标题</title>
th:if th:unless
<div th:if="${user.isAdmin}">管理员可见</div>
<div th:unless="${user.isGuest}">非访客可见</div>
th:each="item : ${集合}" 语法
<a th:href="@{/user/details(id=${userId})}">用户详情</a>
-
@{}自动生成上下文路径(避免硬编码) -
支持参数:
@{/path(param1=${val1}, param2=${val2})}
<form th:action="@{/save}" th:object="${user}" method="post">
<input type="text" id="username" name="username" th:value="*{username}" placeholder="用户名">
<input type="submit" value="保存">
</form>
-
th:object绑定表单对象 -
th:value="*{属性名}"
<!-- 定义片段 -->
<div th:fragment="header">
<h1>公共头部</h1>
</div>
<!-- 引用片段 -->
<div th:replace="~{::header}"></div> <!-- header片段的定义如果在当前文件中的话,使用这种语法。 -->
<div th:replace="~{commons :: header}"></div> <!-- 这种语法表示引入commons.html中定义的header片段。 -->
-
th:fragment定义可复用块 -
th:replace直接替换当前标签