Servlet开发和常见方法
tomcat开发目录结构
- 下面为普通java项目,maven项目将src中的替换即可
/MyWebApp/src/com/exampleHelloServlet.java/web/WEB-INFweb.xmlindex.html
Servlet开发流程
-
创建项目,为当前项目导入tomcat的依赖(回导入servlet等相关依赖)
-
编写servlet类,继承HttpServlet
- HttpServlet实现了servlet接口,并默认实现了servlet接口中的方法
- 重写HttpServlet中的方法如service、doGet、doPost等方法
- 定义业务处理代码
-
使用重写方法中的HttpServletRequest 对象接收请求参数,使用HttpServletResponse对象设置返回参数
-
package com.example;import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应内容类型response.setContentType("text/html; charset=UTF-8");// 获取 PrintWriter 对象PrintWriter out = response.getWriter();// 写入响应内容out.println("<html>");out.println("<head><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h1>Hello, World!</h1>");out.println("<p>This is my first Servlet.</p>");out.println("</body>");out.println("</html>");} }
-
-
配置 web.xml
-
在
web/WEB-INF/web.xml
中配置 Servlet 的映射关系。 -
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!-- 定义 Servlet --><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.example.HelloServlet</servlet-class></servlet><!-- 映射 Servlet 到 URL --><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>
-
-
使用前端代码访问该Servlet即可
Servlet的路径映射
- 除了扩展名匹配外必须在路径最前面添加
/
XML配置
-
在
web.xml
文件中,通过<servlet>
和<servlet-mapping>
标签配置 Servlet 的路径映射。 -
使用
<servlet>
标签定义 Servlet,指定 Servlet 的名称和类名。-
<servlet><servlet-name>HelloServlet</servlet-name> <!-- Servlet 的名称 --><servlet-class>com.example.HelloServlet</servlet-class> <!-- Servlet 的完整类名 --> </servlet>
-
-
使用
<servlet-mapping>
标签将 Servlet 映射到指定的 URL 模式。-
一个
<servlet-name>
可以对应多个<url-pattern>
-
一个
<servlet>
标签可以对应多个<servlet-mapping>
-
不可以有相同的
<url-pattern>
报启动子级时出错<servlet-mapping><servlet-name>HelloServlet</servlet-name> <!-- Servlet 的名称 --><url-pattern>/hello</url-pattern> <!-- 映射的 URL 模式 --><url-pattern>/hello1</url-pattern> <!-- 映射的 URL 模式 --> </servlet-mapping>
-
匹配规则
-
精确匹配
- 完全匹配指定的路径。
- 示例:
/hello
只会匹配/hello
。
-
路径匹配
- 以
/
开头,以/*
结尾,匹配指定路径下的所有请求。 - 示例:
/app/*
会匹配/app/foo
、/app/bar
等。
3. 扩展名匹配
- 以
*.
开头,匹配指定扩展名的请求。 - 示例:
*.do
会匹配/foo.do
、/bar.do
等。
4. 默认匹配
/
表示默认 Servlet,匹配所有未被其他 Servlet 处理的请求。除jsp以外所有资源/*
,包括jsp所有资源
- 以
当多个 Servlet 的 URL 模式匹配同一个请求时,优先级规则如下:
- 精确匹配 > 路径匹配 > 扩展名匹配 > 默认匹配。
- 如果多个 Servlet 的 URL 模式优先级相同,则按照配置顺序选择第一个匹配的 Servlet。
注解配置
-
在 Servlet 类上使用
@WebServlet
注解,直接指定 URL 映射。-
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet;@WebServlet("/hello") // 指定 URL 映射 public class HelloServlet extends HttpServlet {// Servlet 逻辑 }
-
-
可以通过
urlPatterns
属性指定多个 URL 映射。-
@WebServlet(urlPatterns = {"/hello", "/greet"}) public class HelloServlet extends HttpServlet {// Servlet 逻辑 }
-
注解的其他属性:
属性名 | 说明 |
---|---|
name |
Servlet 的名称,默认为类的全限定名。 |
value |
URL 映射,与 urlPatterns 等价。 |
urlPatterns |
URL 映射,支持多个值。 |
loadOnStartup |
Servlet 的加载顺序,值越小优先级越高。 |
initParams |
Servlet 的初始化参数,使用 @WebInitParam 注解指定。 |
asyncSupported |
是否支持异步处理,默认为 false 。 |
Servlet中重写的方法
一般自定义servlet都继承自HttpServlet ,HttpServlet 的处理请求核心方法为:
-
service(HttpServletRequest request, HttpServletResponse response)
-
作用:处理所有类型的 HTTP 请求。
-
调用时机:每次客户端请求时,Servlet 容器会调用此方法。
-
默认实现:根据请求方法(GET、POST 等)调用相应的
doGet()
、doPost()
等方法。 -
重写场景:通常不需要重写此方法,除非需要自定义请求分发逻辑。
-
@Override protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String method = request.getMethod(); // 获取请求方法if ("GET".equals(method)) {doGet(request, response);} else if ("POST".equals(method)) {doPost(request, response);} else {// 处理其他方法super.service(request, response);} }
-
-
doGet(HttpServletRequest request, HttpServletResponse response)
-
作用:处理 HTTP GET 请求。
-
调用时机:当客户端发送 GET 请求时,Servlet 容器会调用此方法。
-
常见用途:
-
获取资源(如 HTML 页面、JSON 数据)。
-
处理查询参数(URL 中的参数)。
-
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String name = request.getParameter("name"); // 获取查询参数response.setContentType("text/html; charset=UTF-8");PrintWriter out = response.getWriter();out.println("<h1>Hello, " + name + "!</h1>"); }
-
-
-
doPost(HttpServletRequest request, HttpServletResponse response)
-
作用:处理 HTTP POST 请求。
-
调用时机:当客户端发送 POST 请求时,Servlet 容器会调用此方法。
-
常见用途:
-
提交表单数据。
-
上传文件。
-
处理敏感数据(如登录信息)。
-
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username"); // 获取表单数据String password = request.getParameter("password");response.setContentType("text/html; charset=UTF-8");PrintWriter out = response.getWriter();out.println("<h1>Welcome, " + username + "!</h1>"); }
-
-
其他重要方法:
-
init(ServletConfig config)
-
作用:Servlet 初始化时调用,用于加载配置或初始化资源。
-
调用时机:Servlet 第一次被请求时,或服务器启动时(如果配置了
loadOnStartup
)。 -
常见用途:
- 加载配置文件。
- 初始化数据库连接。
-
@Override public void init(ServletConfig config) throws ServletException {super.init(config);String username = config.getInitParameter("username"); // 获取初始化参数System.out.println("Servlet initialized with username: " + username); }
-
-
destroy()
- 作用:Servlet 销毁时调用,用于释放资源。
- 调用时机:Servlet 被卸载或服务器关闭时。
- 常见用途:
- 关闭数据库连接。
- 清理内存。
HttpServletRequest
获取请求参数
-
请求参数通常来自 URL 查询字符串(GET 请求)或表单数据(POST 请求)。
-
String getParameter(String name)
-
作用:获取指定名称的请求参数值。
-
返回值:参数值(字符串),如果参数不存在则返回
null
。 -
String username = request.getParameter("username");
-
-
String[] getParameterValues(String name)
-
作用:获取指定名称的请求参数的所有值(适用于多值参数,如复选框)。
-
返回值:参数值的数组,如果参数不存在则返回
null
。 -
String[] hobbies = request.getParameterValues("hobby");
-
-
Enumeration<String> getParameterNames()
-
作用:获取所有请求参数的名称。
-
返回值:参数名称的枚举。
-
Enumeration<String> parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()) {String name = parameterNames.nextElement();String value = request.getParameter(name);System.out.println(name + ": " + value); }
-
-
Map<String, String[]> getParameterMap()
-
作用:获取所有请求参数的键值对。
-
返回值:参数名称和值的映射(值为字符串数组)。
-
Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {String name = entry.getKey();String[] values = entry.getValue();System.out.println(name + ": " + String.join(", ", values)); }
-
获取请求头
-
请求头信息包含客户端发送的元数据,如浏览器类型、内容类型等。
-
String getHeader(String name)
-
作用:获取指定名称的请求头值。
-
返回值:请求头值(字符串),如果头信息不存在则返回
null
。 -
String userAgent = request.getHeader("User-Agent");
-
-
Enumeration<String> getHeaders(String name)
-
作用:获取指定名称的请求头的所有值(适用于多值头信息)。
-
返回值:请求头值的枚举。
-
Enumeration<String> acceptHeaders = request.getHeaders("Accept"); while (acceptHeaders.hasMoreElements()) {String headerValue = acceptHeaders.nextElement();System.out.println(headerValue); }
-
-
Enumeration<String> getHeaderNames()
-
作用:获取所有请求头的名称。
-
返回值:请求头名称的枚举。
-
Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) {String name = headerNames.nextElement();String value = request.getHeader(name);System.out.println(name + ": " + value); }
-
获取客户端信息
-
客户端信息包括客户端的 IP 地址、主机名、端口号等。
-
String getRemoteAddr()
-
作用:获取客户端的 IP 地址。
-
返回值:客户端的 IP 地址(字符串)。
-
String clientIP = request.getRemoteAddr();
-
-
String getRemoteHost()
-
作用:获取客户端的主机名。
-
返回值:客户端的主机名(字符串),如果无法解析则返回 IP 地址。
-
String clientHost = request.getRemoteHost();
-
-
int getRemotePort()
-
作用:获取客户端的端口号。
-
返回值:客户端的端口号(整数)。
-
int clientPort = request.getRemotePort();
-
获取请求路径信息
-
String getRequestURI()
-
作用:获取请求的 URI(不包括协议、主机和端口)。
-
返回值:请求的 URI(字符串)。
-
String requestURI = request.getRequestURI();
-
-
StringBuffer getRequestURL()
-
作用:获取请求的完整 URL(包括协议、主机和端口)。
-
返回值:请求的完整 URL(
StringBuffer
)。 -
StringBuffer requestURL = request.getRequestURL();
-
-
String getContextPath()
-
作用:获取请求的上下文路径(Web 应用的根路径)。
-
返回值:上下文路径(字符串)。
-
String contextPath = request.getContextPath();
-
获取会话信息
-
会话信息用于跟踪用户的状态。
-
HttpSession getSession()
-
作用:获取与当前请求关联的会话对象。如果会话不存在,则创建一个新的会话。
-
返回值:
HttpSession
对象。 -
HttpSession session = request.getSession();
-
-
HttpSession getSession(boolean create)
-
作用:获取与当前请求关联的会话对象。如果
create
为false
且会话不存在,则返回null
。 -
返回值:
HttpSession
对象或null
。 -
HttpSession session = request.getSession(false); if (session != null) {// 会话存在 } else {// 会话不存在 }
-
其他常用方法
-
String getMethod()
-
作用:获取请求的 HTTP 方法(如 GET、POST)。
-
返回值:HTTP 方法(字符串)。
-
String method = request.getMethod();
-
-
String getQueryString()
-
作用:获取请求的查询字符串(URL 中
?
后面的部分)。 -
返回值:查询字符串(字符串),如果不存在则返回
null
。 -
String queryString = request.getQueryString();
-
-
String getProtocol()
-
作用:获取请求的协议和版本(如 HTTP/1.1)。
-
返回值:协议和版本(字符串)。
-
String protocol = request.getProtocol();
-
HttpServletResponse
设置响应状态码
-
void setStatus(int status)
-
作用:设置响应的状态码。
-
参数:
-
status
:HTTP 状态码(如200
、404
)。 -
response.setStatus(HttpServletResponse.SC_OK); // 200
-
-
-
void sendError(int status)
-
作用:发送错误状态码,并清空响应缓冲区。
-
参数:
-
status
:HTTP 错误状态码(如404
、500
)。 -
response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404
-
-
-
void sendError(int status, String message)
-
作用:发送错误状态码和错误信息,并清空响应缓冲区。
-
参数:
-
status
:HTTP 错误状态码。 -
message
:错误信息。 -
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server Error"); // 500
-
-
设置响应头
-
响应头信息包含服务器返回的元数据,如内容类型、缓存控制等。
-
void setHeader(String name, String value)
-
作用:设置指定名称的响应头。
-
参数:
-
name
:响应头名称。 -
value
:响应头值。 -
response.setHeader("Content-Type", "text/html; charset=UTF-8");
-
-
-
void addHeader(String name, String value)
-
作用:添加指定名称的响应头(允许多个值)。
-
参数:
-
name
:响应头名称。 -
value
:响应头值。 -
response.addHeader("Set-Cookie", "username=John"); response.addHeader("Set-Cookie", "language=en");
-
-
-
void setIntHeader(String name, int value)
-
作用:设置指定名称的响应头,值为整数。
-
参数:
-
name
:响应头名称。 -
value
:响应头值(整数)。 -
response.setIntHeader("Content-Length", 123);
-
-
-
void addIntHeader(String name, int value)
-
void setDateHeader(String name, long date)
-
void addDateHeader(String name, long date)
设置响应内容
-
响应内容是服务器返回给客户端的主体数据。
-
void setContentType(String type)
-
作用:设置响应内容的 MIME 类型。
-
如果不设置tomcat会在conf/web.xml配置文件中寻找配置好的对应文件类型的相应头,如果找不到默认按照HTML格式进行处理
-
参数:
-
type
:MIME 类型(如text/html
、application/json
)。 -
response.setContentType("text/html; charset=UTF-8");
-
-
-
void setCharacterEncoding(String encoding)
-
作用:设置响应内容的字符编码。
-
参数:
-
encoding
:字符编码(如UTF-8
)。 -
response.setCharacterEncoding("UTF-8");
-
-
-
PrintWriter getWriter()
-
作用:返回一个
PrintWriter
对象,用于向客户端发送文本数据。 -
返回值:
PrintWriter
对象。 -
PrintWriter out = response.getWriter(); out.println("<h1>Hello, World!</h1>");
-
-
ServletOutputStream getOutputStream()
-
作用:返回一个
ServletOutputStream
对象,用于向客户端发送二进制数据。 -
返回值:
ServletOutputStream
对象。 -
ServletOutputStream out = response.getOutputStream(); out.write(fileBytes); // fileBytes 是文件的字节数组
-
-
void setContentLength(int length)
-
作用:设置响应内容的长度。
-
参数:
-
length
:内容长度(字节数)。 -
response.setContentLength(123);
-
-
重定向
-
void sendRedirect(String location)
-
作用:将客户端重定向到指定的 URL。
-
参数:
-
location
:重定向的目标 URL。 -
response.sendRedirect("/new-location");
-
-
其他常用方法
-
void addCookie(Cookie cookie)
-
作用:向客户端添加一个 Cookie。
-
参数:
-
cookie
:Cookie
对象。 -
Cookie cookie = new Cookie("username", "John"); response.addCookie(cookie);
-
-
void setBufferSize(int size)
设置响应缓冲区的大小(字节数) -
void flushBuffer()
强制将缓冲区的内容发送到客户端 -
void reset()
清空响应缓冲区和头信息 -
void resetBuffer()
清空响应缓冲区,但保留头信息