• Servlet系列:基于 XML 和 注解的方式配置 Servlet 以及封装 BaseServlet


    一、使用web.xml的方式配置(Servlet2.5之前使用)

    在早期版本的Java EE中,可以使用XML配置文件来定义Servlet。在web.xml文件中,可以定义Servlet的名称、类名、初始化参数等。然后,在Java代码中实现Servlet接口,并覆盖其中的doGet()或doPost()方法来处理请求。

    web.xml

    
    <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/javaee
            http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
      <display-name>java-servlet-demo02display-name>
      
      <servlet>
        
        <servlet-name>WebXmlServletservlet-name>
        
        <servlet-class>com.mcode.servlet.controller.WebXmlServletservlet-class>
        
        <load-on-startup>1load-on-startup>
      servlet>
      
      <servlet-mapping>
        
        <servlet-name>WebXmlServletservlet-name>
        
        <url-pattern>/webxmlurl-pattern>
      servlet-mapping>
    web-app>
    

    WebXmlServlet

    package com.mcode.servlet.controller;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * ClassName: WebXmlServlet
     * Package: com.mcode.servlet.controller
     * Description:
     *
     * @Author robin
     * @Version 1.0
     */
    public class WebXmlServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置编码方式
            resp.setCharacterEncoding("UTF-8");
            //指定客户端解码方式
            resp.setHeader("content-type", "text/html;charset=UTF-8");
            //输出
            resp.getWriter().write("基于webxml方式配置的servlet");
        }
    }
    

    效果图

    image

    url-pattern匹配规则

    匹配规则 取值说明
    精确匹配 /具体的名称 只有url路径是具体的名称的时候才会触发 Servlet
    后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet
    通配符匹配 /* 匹配所有请求,包含服务器的所有资源
    通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp

    load-on-startup说明

    1. 元素标记容器是否应该在web应用程序启动的时候就加载这个 servlet

    2. 它的值必须是一个整数,表示 servlet被加载的先后顺序

    3. 如果该元素的值为负数或者没有设置,则容器会当serv1et被请求时再加载

    4. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个 servlet,值越小, servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载

    二、使用注解的方式配置(Servlet3.0后支持,推荐)

    从Java EE 5开始,可以使用注解来创建Servlet。通过在Java类上添加@WebServlet注解,可以将该类作为Servlet来处理。在注解中,可以指定Servlet的名称、URL映射等。

    AnnotationServlet

    package com.mcode.servlet.controller;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * ClassName: AnnotationServlet
     * Package: com.mcode.servlet.controller
     * Description:
     *
     * @Author robin
     * @Version 1.0
     */
    @WebServlet("/annotation")
    public class AnnotationServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置编码方式
            response.setCharacterEncoding("UTF-8");
            //指定客户端解码方式
            response.setHeader("content-type", "text/html;charset=UTF-8");
            //输出
            response.getWriter().write("基于注解方式配置的servlet");
        }
    }
    

    注意:response中的set的一些方法必须写在response.getWriter()之前

    It does not set the response's characterencoding if it is called after getWriterhas been called or after the response has been committed.

    效果图

    image

    @WebServlet注解

    属性:下面是一些常用属性,value和url一般是必须的,但是二者不能共存,若同时指定,一般自动忽略value。

    属性名 类名 属性描述
    name String 指定servlet的name属性,等价于,若没有指定,则默认是类的全限定名
    value String[] 等价于urlPatterns,两者不能共存
    urlPatterns String[] 指定一组servlet的url的匹配模式,等价于
    loadOnStartup int 指定servlet的加载顺序,等价于
    initParams WebinitParams[] 指定一组初始化参数,等价于
    asyncSupported boolean 申明servlet是否支持异步操作模式,等价于
    displayName String servlet的显示名,等价于
    description String servlet的描述信息,等价于

    @WebServlet 属于类级别的注解,标注在继承了 HttpServlet 的类之上。常用的写法是将 Servlet 的相对请求路径(即 value)直接写在注解内,
    @WebServlet(urlPatterns = “/MyServlet”)。
    @WebServlet(“/MyServlet”) 省略了 urlPatterns 属性名
    如果 @WebServlet 中需要设置多个属性,则属性之间必须使用逗号隔开.
    通过实现 Serlvet 接口或继承 GenericServlet 创建的 Servlet 类无法使用 @WebServlet 注解。
    使用 @WebServlet 注解配置的 Servlet 类,不要在 web.xml 文件中再次配置该 Servlet 相关属性。若同时使用 web.xml 与 @WebServlet 配置同一 Servlet 类,则 web.xml 中 的值与注解中 name 取值不能相同,否则容器会忽略注解中的配置。

    三、封装BaseServlet

    package com.mcode;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.lang.reflect.Method;
    
    /**
     * ClassName: BaseServlet
     * Package: com.mcode
     * Description:
     *
     * @Author: robin
     * @Version: v1.0
     */
    public abstract class BaseServlet extends HttpServlet {
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) {
            try {
              
                request.setCharacterEncoding("UTF-8");
              
                response.setCharacterEncoding("UTF-8");
              
                response.setContentType("text/html;charset=utf-8");
              
                String methodName = request.getParameter("method");
              
                if (methodName == null || methodName.trim().isEmpty()) {
                    throw new RuntimeException("您没有传递 method 参数! 无法确定您想调用的方法");
                }
              
                Classextends BaseServlet> classz = this.getClass();
              
                Method method = classz.getMethod(methodName, HttpServletRequest.class,
                        HttpServletResponse.class);
              
                method.setAccessible(true);//开启暴力反射
    
                method.invoke(this, request, response);
              
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    四、测试

    UserServlet

    package com.mcode;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    /**
     * ClassName: UserServlet
     * Package: com.mcode
     * Description:
     *
     * @Author: robin
     * @Version: v1.0
     */
    @WebServlet("/user")
    public class UserServlet extends BaseServlet{
        public void getList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String method = request.getParameter("method");
            HttpSession session = request.getSession();
            session.setAttribute("method",method);
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }
    }
    

    index.jsp

    引入jsp-api依赖

        <dependency>
          <groupId>jakarta.servlet.jspgroupId>
          <artifactId>jakarta.servlet.jsp-apiartifactId>
          <version>3.1.1version>
        dependency>
    
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
    
      "/user?method=getList">user
      <%=session.getAttribute("method") %>
    <%
       out.println(session.getAttribute("method"));
    %>
    
    
    

    image

  • 相关阅读:
    QT社团管理系统
    yum vi/vim -- Linux
    美国政府首席信息安全官详细介绍零信任战略竞赛
    Python图形处理
    CSS基础
    【Kafka源码分析】三、消费者Consumer
    tushare美股行情怎么获取?
    CUDA out of memory.(已解决)+Windows和Linux查看占用显存的程序
    SVN版本控制软件
    字符集编码(二):字符编码模型
  • 原文地址:https://www.cnblogs.com/vic-tory/p/17971103