X Tutup
--- aliases: [] tags: - java - javaweb - javaee - jakartaee - servlet - jsp - http created: 2023-01-31 11:31:14 modified: 2025-07-30 21:45:19 --- # Java Servlet 笔记 --- ## 目录 * [HTTP及Web请求](#servlet_http_wrequest) * [Servlet](#Servlet) --- ## HTTP 及 Web 请求 --- ## Servlet Tomcat 与 Servlet 版本对应关系:[Apache Tomcat® - Which Version Do I Want?](https://tomcat.apache.org/whichversion.html) ### 版本 Servelt 各版本发布时间:[Jakarta Servlet \| projects.eclipse.org](https://projects.eclipse.org/projects/ee4j.servlet) ### HttpServlet 通常开发人员编写的 [Servlet](#Servlet) 其实是 `HttpServlet` 的子类。 示例: ```java package servlets; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // xxxx super.doGet(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // xxxx super.doPost(request, response); } } ``` 瞄下源码,看下 `HttpServlet` 的「身世」: * `HttpServlet` 是一个抽象类,它继承自另一个抽象类 `GenericServlet`: `public abstract class HttpServlet extends GenericServlet` * `GenericServlet` 是实现了 `Servlet` 接口的抽象类:`public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable` 可以看到示例中,`import` 引入了 Servlet API 各包,所以要编译 Servlet 类,就必须在 `ClassPath` 中包括相关的类。而如果使用 [Tomcat](Tomcat/Tomcat_Note.md),这些类则是封装在 Tomcat 目录中的 [lib 子目录](Tomcat/Tomcat_Note.md#lib%20目录) 中的 `servlet-api.jar` 中,而在项目中,得引入这个包。 如果使用 [Maven](Maven/Maven_Note.md) 来构建项目,则在依赖中添加类似依赖: ```xml jakarta.servlet jakarta.servlet-api 6.1.0 provided ``` --- ## JSP JSP 本质还是 [Servlet](#Servlet)。JSP 页面会被 [Web 容器](JAVA_EE_Note.md#Web%20容器) 转译为 Servlet 的 `.java` 源文件,并编译为 `.class` 文件,然后加载进容器,所以最后提供服务的还是 Servlet 实例。 ### JSP 标签 JSP 标签分两类: * [指令标签](#指令标签) * [动作标签](#动作标签) #### 指令标签 JSP 指令标签是由 JSP 服务器解释并处理的用于设置 JSP 页面的相关属性或执行动作的一种标签,在一下指令标签中可以设置多个属性。这些属性的作用域范围是整个页面。 语法:`<%@指令名称 属性1="属性值" 属性2="属性值"... %>` #### 动作标签 --- ## Filter --- ## 乱码 1. [Html](../Frontend/Html_Note.md) 部分设置字符编码: ```html ``` 2. JSP 页面顶部加入以下代码: ```jsp <%@ page pageEncoding="UTF-8"%> ``` 3. 使用 [Filter](#Filter) 来设置请求和响应的字符编码 过滤器相关代码: ```java package tools; import java.io.IOException; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; public class CharacterEncoding implements Filter { String encoding = null; @Override public void init(FilterConfig filterConfig) throws ServletException { encoding = filterConfig.getInitParameter("encoding"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (encoding != null) { servletRequest.setCharacterEncoding(encoding); servletResponse.setCharacterEncoding(encoding); } filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { encoding = null; } } ``` 过滤器 `web.xml` 中的设置: ```xml setCharacterEncoding tools.CharacterEncoding encoding UTF-8 setCharacterEncoding /* ``` --- ## 相关笔记 * [JAVA EE 笔记](JAVA_EE_Note.md) * [JDBC 笔记](Java_JDBC_Note.md) * [Spring 笔记 1](./Spring/Spring_Note_1.md) * [Java 资料清单](Java_Material.md) * [Java 笔记](Java_Note.md)
X Tutup