servlet

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);

总结:

  1. 需要在同一次请求中共享数据。

  2. 需要跳转到 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 单网页项目

优点:

  1. Thymeleaf 模板是合法的 HTML,可直接用浏览器打开预览。

  2. Thymeleaf 默认对所有表达式输出进行 HTML 转义,有效防御 XSS。

  3. Thymeleaf 不依赖 Servlet 容器,可以在非 Web 环境(如邮件模板)中使用。

  4. 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.jarjsp-api.jarcatalina.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 直接替换当前标签

相关推荐
二哈喇子!18 小时前
JavaSE 与 JavaEE 知识点整合
java·servlet·tomcat
游戏23人生3 天前
正则表达式介绍
servlet·正则表达式·unix
一次旅行3 天前
Jenkins实现CI/CD流水线
运维·servlet·ci/cd·jenkins·测试总结
七夜zippoe6 天前
Spring WebFlux核心原理-对比Servlet与响应式模型
java·spring·servlet·长连接·webflux·短连接
小钟不想敲代码10 天前
Python(三)
java·python·servlet
heartbeat..10 天前
Servlet 全面解析(JavaWeb 核心)
java·网络·后端·servlet
Edward1111111111 天前
tomcat_servlet
java·servlet·tomcat
thulium_12 天前
SpringBoot3 配置嵌入Servlet容器
spring boot·servlet
不吃洋葱.13 天前
写servlet详细教程
servlet