自学内容网 自学内容网

新版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 路径必须以 / 开头。
    • valueurlPatterns 的别名,但两者不能同时配置,否则编译器报错。
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();
        });
    }
}


原文地址:https://blog.csdn.net/weixin_67996964/article/details/143822714

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!