新版Servlet3.0~5.0和旧版配置的区别
简介:讲解新版Servlet和旧版Servlet配置的区别
- 旧版Servlet,在xml⾥面配置类目和路路径,⽐较不方便
- 新版Servelt,也就是3.0之后,⽀支持注解的方式
配置项:
String name() default "";
作用:为 Servlet 指定一个名称。如果不指定,默认使用 Servlet 的完整类名作为名称。
意义:
- Servlet 名称可以在
ServletContext
的相关方法中引用(如getServletRegistration
)。- 可以通过名称明确标识不同的 Servlet
package com.gaze;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//不指定名称,以Servlet完整类名做路径
@WebServlet(urlPatterns = "/user")
public class UserServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Servlet init");
}
@Override
public void destroy() {
System.out.println("Servlet destroy");
}
//用于处理客户端发起的 GET 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
//设置 HTTP 响应的内容类型为 HTML,并指定字符编码为 UTF-8。
resp.setContentType("text/html;charset=utf-8");
//获取响应对象的输出流,用于向客户端发送文本数据。
resp.getWriter().write("<h1>你好</h1>");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
}
}
String[] urlPatterns() default {};
作用:指定 Servlet 的 URL 映射路径,可以配置多个路径。
使用说明:
- 路径必须以
/
开头。- 可以支持通配符,例如:
/user/*
匹配以/user/
开头的所有路径。*.do
匹配所有以.do
结尾的路径。
package com.gaze;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
如果访问/user1和/user2都映射该类,记住需要/开头
@WebServlet(urlPatterns = {"/user1","/user2"})
public class UserServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Servlet init");
}
@Override
public void destroy() {
System.out.println("Servlet destroy");
}
//用于处理客户端发起的 GET 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
//设置 HTTP 响应的内容类型为 HTML,并指定字符编码为 UTF-8。
resp.setContentType("text/html;charset=utf-8");
//获取响应对象的输出流,用于向客户端发送文本数据。
resp.getWriter().write("<h1>你好</h1>");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
}
}
String[] value() default {};
作用:指定 Servlet 的 URL 映射路径,和
urlPatterns
属性功能相同,但不能同时使用。注意:
- URL 路径必须以
/
开头。value
是urlPatterns
的别名,但两者不能同时配置,否则编译器报错。
package com.gaze;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = {"/user1","/user2"})
public class UserServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Servlet init");
}
@Override
public void destroy() {
System.out.println("Servlet destroy");
}
//用于处理客户端发起的 GET 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
//设置 HTTP 响应的内容类型为 HTML,并指定字符编码为 UTF-8。
resp.setContentType("text/html;charset=utf-8");
//获取响应对象的输出流,用于向客户端发送文本数据。
resp.getWriter().write("<h1>你好</h1>");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
}
}
int loadOnStartup() default -1;
作用:定义 Servlet 的加载顺序,决定 Servlet 是在应用启动时加载还是在第一次请求时加载。
值的意义:
- 负数(默认值):懒加载模式(Lazy Loading),在第一次请求到达时加载 Servlet。
- 0 或正数:
- 表示启动应用时立即加载。
- 数字越小,加载优先级越高。
package com.gaze;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = {"/user1","/user2"} ,loadOnStartup = 1)
public class UserServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Servlet init");
}
@Override
public void destroy() {
System.out.println("Servlet destroy");
}
//用于处理客户端发起的 GET 请求。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
//设置 HTTP 响应的内容类型为 HTML,并指定字符编码为 UTF-8。
resp.setContentType("text/html;charset=utf-8");
//获取响应对象的输出流,用于向客户端发送文本数据。
resp.getWriter().write("<h1>你好</h1>");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
}
}
WebInitParam[] initParams() default {};
作用:为 Servlet 配置初始参数,替代
web.xml
中的<init-param>
。使用场景:
- 初始化 Servlet 时设置一些固定的参数(如数据库连接信息)。
- 通过
ServletConfig
对象的getInitParameter
方法获取这些参数
@WebServlet(
name = "ConfigServlet",
urlPatterns = "/config",
initParams = {
@WebInitParam(name = "database", value = "MySQL"),
@WebInitParam(name = "dbUser", value = "root")
}
)
public class ConfigServlet extends HttpServlet {
@Override
public void init() throws ServletException {
String database = getServletConfig().getInitParameter("database");
String dbUser = getServletConfig().getInitParameter("dbUser");
System.out.println("Database: " + database + ", User: " + dbUser);
}
}
boolean asyncSupported() default false;
作用:指定 Servlet 是否支持异步操作模式。
使用场景:
- 异步操作允许 Servlet 在主线程释放后继续处理请求,特别适用于耗时操作(如文件上传、大量计算、外部服务调用)。
- 必须配合异步上下文(
AsyncContext
)使用。
@WebServlet(name = "AsyncServlet", urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
AsyncContext asyncContext = req.startAsync();
asyncContext.start(() -> {
try {
Thread.sleep(5000); // 模拟耗时操作
resp.getWriter().write("Async operation completed!");
} catch (Exception e) {
e.printStackTrace();
}
asyncContext.complete();
});
}
}