Spring mvc基于注解自定义servlet

534 阅读2分钟

在spring mvc中,有一个servlet实现:DispatcherServlet,也是spring mvc的核心部分,拦截所有请求(/*),并分发给不同的处理器,进行处理。

需求

在一个spring boot工程中想要自定义一个servlet并注册进去,对于指定路径下的请求(比如路径/custom/*)作自定义处理,而不是映射到DispatcherServlet处理。

因为是spring boot工程无web.xml配置,需要自定义注解扫描注册。

方案

自定义一个servlet指定映射/custom/*的请求作自定义处理。

在servlet3.0及其以上版本中有一个注解:

javax.servlet.annotation.WebServlet

这个注解的作用是使用注解的方式声明一个servlet配置。

下面是它的源码,对其中常用的几个字段作了注释:

package javax.servlet.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {

    //servlet名称,未设置默认为servlet类的全路径
    String name() default "";

    // url匹配(设置该属性不用设置urlPatterns)
    String[] value() default {};

    // url匹配(与value不共存,两个只设置一个)
    String[] urlPatterns() default {};

    //加载启动命令提示
    int loadOnStartup() default -1;

    //servlet的初始化参数
    WebInitParam[] initParams() default {};

    //servlet是否支持异常操作,默认不支持
    boolean asyncSupported() default false;


    String smallIcon() default "";
    String largeIcon() default "";

    //servlet的描述
    String description() default "";

    //如果存在显示此servlet的名称
    String displayName() default "";
}

对自定义的类添加上该注解,然后在spring的java配置类上使用注解ServletComponentScan扫描该类。

示例

  1. 自定义servlet类,继承FrameworkServlet复用spring mvc的一些能力
package com.xuxd.main.servlet.custom;

import org.springframework.web.servlet.FrameworkServlet;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "customDispatcherServlet", urlPatterns = {"/custom/*"})
public class CustmoDispatcherServlet extends FrameworkServlet {
    @Override
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //TODO:自定义处理,参考DispatcherServlet处理流程进行隔离处理,同时可以复用spring mvc的核心组件能力
        System.out.println("request enter...");
    }
}
  1. 扫描servlet
package com.xuxd.main.servlet.custom;

import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ServletComponentScan(basePackageClasses = {CustmoDispatcherServlet.class})
public class CustomConfig {
}

将该配置bean注册到spring容器