在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...");
}
}
2. 扫描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容器