| aliases | ||||||||
|---|---|---|---|---|---|---|---|---|
| tags |
|
|||||||
| created | 2023-01-31 03:31:14 -0800 | |||||||
| modified | 2025-07-30 14:45:19 -0700 |
Tomcat 与 Servlet 版本对应关系:Apache Tomcat® - Which Version Do I Want?
Servelt 各版本发布时间:Jakarta Servlet | projects.eclipse.org
通常开发人员编写的 Servlet 其实是 HttpServlet 的子类。
示例:
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 GenericServletGenericServlet是实现了Servlet接口的抽象类:public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
可以看到示例中,import 引入了 Servlet API 各包,所以要编译 Servlet 类,就必须在 ClassPath 中包括相关的类。而如果使用 Tomcat,这些类则是封装在 Tomcat 目录中的 lib 子目录 中的 servlet-api.jar 中,而在项目中,得引入这个包。
如果使用 Maven 来构建项目,则在依赖中添加类似依赖:
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0</version>
<scope>provided</scope>
</dependency>JSP 本质还是 Servlet。JSP 页面会被 Web 容器 转译为 Servlet 的 .java 源文件,并编译为 .class 文件,然后加载进容器,所以最后提供服务的还是 Servlet 实例。
JSP 标签分两类:
JSP 指令标签是由 JSP 服务器解释并处理的用于设置 JSP 页面的相关属性或执行动作的一种标签,在一下指令标签中可以设置多个属性。这些属性的作用域范围是整个页面。
语法:<%@指令名称 属性1="属性值" 属性2="属性值"... %>
- Html 部分设置字符编码:
<head>
<meta charset="UTF-8">
</head>- JSP 页面顶部加入以下代码:
<%@ page pageEncoding="UTF-8"%>- 使用 Filter 来设置请求和响应的字符编码
过滤器相关代码:
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 中的设置:
<filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>tools.CharacterEncoding</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>