SpringBoot中使用Servlet与更改DispatcherServlet默认Url

    |     2017年6月17日   |   springboot   |     0 条评论   |    7111

Spring Boot 做 Web 时,主 Servlet 是 DispatcherServlet,默认 url-pattern 为 /。项目里还经常要自己的 Filter、Listener,以及额外的 Servlet。注册方式只有两条:代码注册 和 注解自动注册。

代码侧用 ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean;也可以实现 ServletContextInitializer 直接注册。注解侧则是 @ServletComponentScan 配 @WebServlet / @WebFilter / @WebListener。

一、代码注册 Servlet,并改 DispatcherServlet 的 URL

1. MyServlet.java

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(">>>>>>>>>>doGet()<<<<<<<<<<<");
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(">>>>>>>>>>doPost()<<<<<<<<<<<");
    }
}

2. 启动类里注入两个 RegistrationBean

第一个 Bean 清空 DispatcherServlet 默认映射,改成只吃 *.do 和 *.json;第二个把 MyServlet 挂到 /xs/*。ServletName 默认是类名首字母小写,即 myServlet。这种方式不需要 @ServletComponentScan。

@SpringBootApplication
public class SpringBootSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSampleApplication.class, args);
    }

    /**
     * 修改 DispatcherServlet 默认配置
     */
    @Bean
    public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
        registration.getUrlMappings().clear();
        registration.addUrlMappings("*.do");
        registration.addUrlMappings("*.json");
        return registration;
    }

    /**
     * 使用代码注册 Servlet(不需要 @ServletComponentScan 注解)
     */
    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        return new ServletRegistrationBean(new MyServlet(), "/xs/*");
    }
}
注册方式 典型 API 要不要 @ServletComponentScan
代码注册 ServletRegistrationBean 等 不要
注解注册 @WebServlet / @WebFilter 要,打在启动类上

二、@ServletComponentScan + @WebFilter

在 @SpringBootApplication 上加 @ServletComponentScan 后,Servlet、Filter、Listener 可以直接用 @WebServlet、@WebFilter、@WebListener 自动注册,不必再写 RegistrationBean。

1. LoginFilter.java

@WebFilter(value = "/*")
public class LoginFilter implements Filter {

    public LoginFilter() {
        System.out.println("过滤器初始化");
    }

    public void destroy() {
        System.out.println("过滤器销毁");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("执行过滤操作>>>>>");
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }
}

2. 启动类打开组件扫描

@SpringBootApplication
@ServletComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

一句话总结:额外 Servlet / Filter 要么 RegistrationBean 代码挂载,要么 @ServletComponentScan 配 @WebXxx;要改 SpringMVC 入口路径,对 DispatcherServlet 清掉默认 / 再 addUrlMappings。

转载请注明来源:SpringBoot中使用Servlet与更改DispatcherServlet默认Url
本文链接地址:https://ai.zhousir.top/?p=2022
回复 取消