Servlet注解

jakarta.servlet.annotation.WebServlet

@WebServlet 在Servlet类上使用

WebServlet注解中存在的属性:

  • name属性:用来指定Servlet的名字。等同于:<servlet-name>
  • urlPatterns属性:用来指定Servlet的映射路径。可以指定多个字符串。等同于:<url-pattern>
  • loadOnStartUp属性:用来指定在服务器启动阶段是否加载该Servlet。等同于:<load-on-startup>
  • value属性:当注解的属性名是value的时候,使用注解的时候,value属性名是可以省略的。
  • 注意:不是必须将所有属性都写上,只需要提供需要的。如果属性是一个数组,且数组中只有一个元素,使用该注解的时候,属性值的大括号可以省略。

注解对象的使用格式:

  • @注解名称(属性名=属性值, 属性名=属性值, …)

注解的使用:

@WebServlet(name = "hello", urlPatterns = {"/hello1","/hello2"}, //loadOnStartup = 1,
        initParams = {@WebInitParam(name = "username", value = "root"), @WebInitParam(name="password", value = "123")})
public class HelloServlet extends HttpServlet {
    // 无参构造
    public HelloServlet() {
        System.out.println("无参构造执行。。。");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        // 打印Servlet Name
        out.print("servlet name = " + getServletName() + "<br>");

        // 打印Servlet Path
        out.print("servlet path = " + request.getServletPath() + "<br>");

        // 获取初始化参数
        Enumeration<String> names = getInitParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String value = getInitParameter(name);
            out.print(name + " = " + value + "<br>");
        }
    }
}
//@WebServlet(urlPatterns = {"/welcome1","/welcome2"})
// 这个value属性和urlPatterns属性一致,都是用来指定Servlet的映射路径的
//@WebServlet(value = {"/welcome1","/welcome2"})
// 属性只有一个的写法
//@WebServlet(value = "/welcome") // 写法一
@WebServlet("/welcome") // 写法二
public class WelcomeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        out.print("doGet...");
    }
}

通过放射机制解析@WebServlet注解

public class ReflectAnnotation {
    public static void main(String[] args) throws ClassNotFoundException {

        // 使用放射机制解析@WebServlet注解
        // 获取类Class对象
        Class<?> welcomeServletClass = Class.forName("cn.lwx.javaweb.AServlet.WelcomeServlet");

        // 获取类上的注解对象,先判断存不存在
        /*boolean annotationPresent = welcomeServletClass.isAnnotationPresent(WebServlet.class);
        System.out.println(annotationPresent);*/
        if (welcomeServletClass.isAnnotationPresent(WebServlet.class)) {
            // 获取注解对象
            WebServlet webServletAnnotation = welcomeServletClass.getAnnotation(WebServlet.class);
            String[] value = webServletAnnotation.value();
            for (int i = 0; i < value.length; i++) {
                System.out.println(value[i]); //welcome
            }
        }
    }
}

使用模板方法设计模式解决写的Servlet类很多的问题

// 模板类
@WebServlet({"/dept/list","/dept/save",...})
//@WebServlet("/dept/*")
public class DeptServlet extends HttpServlet {
    // 模板方法
    // 重写service方法
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取servlet path
        String servletPath = request.getServletPath();
        switch (servletPath) {
            case "/dept/list":
                doList(request,response);
                break;
            case "/dept/save":
                doSave(request,response);
                break;
            ...
            default:
                break;
        }
    }

    private void doList(HttpServletRequest request, HttpServletResponse response) {
    }

    private void doSave(HttpServletRequest request, HttpServletResponse response) {
    }
    ...
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐