Spring boot
集成
servlet
Web 开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet、Filter、Listener、
Interceptor 等等。
当使用 Spring-Boot 时,嵌入式 Servlet 容器通过扫描注解的方式注册 Servlet、Filter 和 Servlet 规范的所有监听
器(如 HttpSessionListener 监听器)。
Spring boot 的主 Servlet 为 DispatcherServlet,其默认的 url-pattern 为“/”。也许我们在应用中还需要定义更多
的 Servlet,该如何使用 SpringBoot 来完成呢?
在 spring boot 中添加自己的 Servlet 有两种方法,代码注册 Servlet 和注解自动注册(Filter 和 Listener 也是如 此)。
在 spring boot 中添加自己的 Servlet 有两种方法,代码注册 Servlet 和注解自动注册(Filter 和 Listener 也是如 此)。
一、代码注册通过 ServletRegistrationBean、
FilterRegistrationBean 和 ServletListenerRegistrationBean 获得
控制。
也可以通过实现 ServletContextInitializer 接口直接注册。
二、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通
过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
通过代码注册 Servlet 示例代码:
com.hpit.sb.servlet.MyServlet1
import
java.io.IOException;
import
java.io.PrintWriter;
import
javax.servlet.ServletException;
import
javax.servlet.annotation.WebServlet;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
/**
*
TODO
开发一个普通的servlet
*
*
*/
@WebServlet
(urlPatterns =
"/myServlet/*"
, name =
"servlet1"
, description =
"this is my first servlet in spring
boot"
)
public class
MyServlet1
extends
HttpServlet {
private static final long
serialVersionUID
= 6613439809483079873L;
@Override
protected void
doGet(HttpServletRequest
req
, HttpServletResponse
resp
)
throws
ServletException,
IOException {
resp
.setContentType(
"text/html;charset=utf-8"
);
resp
.setCharacterEncoding(
"utf-8"
);
PrintWriter
out
=
resp
.getWriter();
out
.println(
"<html>"
);
out
.println(
"<head>"
);
out
.println(
"<title>Hello World</title>"
);
out
.println(
"</head>"
);
out
.println(
"<body>"
);
out
.println(
"<h1>这是:MyServlet1</h1>"
);
out
.println(
"</body>"
);
out
.println(
"</html>"
);
}
}
程序入口配置:
com.hpit.sb. App
import
org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
import
org.springframework.context.annotation.Bean;
import
com.hpit.sb.servlet.MyServlet1;
/**
*
*
* 大家也许会看到有些demo使用了3个注解:
@Configuration
;
*
*
@EnableAutoConfiguration
*
@ComponentScan
其实:@SpringBootApplication申明让spring boot自动给程序进行必要的配置,
* 等价于以默认属性使用@Configuration,
*
@EnableAutoConfiguration和
@ComponentScan 所以大家不要被一些文档误导了,让自己很迷茫了,希望本
文章对您有所启发;
*/
@SpringBootApplication
public class
App {
/**
* 注册Servlet.不需要添加注解:@ServletComponentScan
* 这种方式已经在springboot中废弃
*
@return
*/
@Bean
public
ServletRegistrationBean regMyServlet1() {
return new
ServletRegistrationBean(
new
MyServlet1(),
"/myServlet/*"
);
}
public static void
main(String[]
args
)
throws
Exception {
SpringApplication.
run
(App.
class
,
args
);
}
}
第二种方式:使用注解注册 Servlet 示例代码
com.hpit.sb.servlet. MyServlet2
import
javax.servlet.ServletException;
import
javax.servlet.annotation.WebServlet;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
/**
*
TODO
使用注解开发第二个servlet,该servlet将使用注解注册
*
*
*/
@WebServlet
(urlPatterns =
"/myServlet/*"
, name =
"serlvet2"
, description =
"this is the second spring boot
servlet"
)
public class
MyServlet2
extends
HttpServlet {
private static final long
serialVersionUID
= -7877622076081913248L;
@Override
protected void
doGet(HttpServletRequest
req
, HttpServletResponse
resp
)
throws
ServletException,
IOException {
resp
.setContentType(
"text/html;charset=utf-8"
);
resp
.setCharacterEncoding(
"utf-8"
);
PrintWriter
out
=
resp
.getWriter();
out
.println(
"<html>"
);
out
.println(
"<head>"
);
out
.println(
"<title>Hello World</title>"
);
out
.println(
"</head>"
);
out
.println(
"<body>"
);
out
.println(
"<h1>这是:MyServlet1</h1>"
);
out
.println(
"</body>"
);
out
.println(
"</html>"
);
}
}
主程序配置:
com.hpit.sb.App
import
org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
import
org.springframework.boot.web.servlet.ServletComponentScan;
import
org.springframework.context.annotation.Bean;
import
com.hpit.sb.servlet.MyServlet1;
/**
*
*
* 大家也许会看到有些demo使用了3个注解:
@Configuration
;
*
*
@EnableAutoConfiguration
*
@ComponentScan
其实:@SpringBootApplication申明让spring boot自动给程序进行必要的配置,
* 等价于以默认属性使用@Configuration,
*
@EnableAutoConfiguration和
@ComponentScan 所以大家不要被一些文档误导了,让自己很迷茫了,希望本
文章对您有所启发;
*
*/
@SpringBootApplication
@ServletComponentScan
// 方式二:
添加servlet 注册扫描,将自动注册添加了@WebServlet的类为serlvet
public class
App {
/**
* 方式一:注册Servlet.不需要添加注解:@ServletComponentScan 这种方式已经在springboot中废弃
*
*
@return
*/
/*
* @Bean public ServletRegistrationBean regMyServlet1() { return new
* ServletRegistrationBean(new MyServlet1(), "/myServlet/*"); }
*/
public static void
main(String[]
args
)
throws
Exception {
SpringApplication.
run
(App.
class
,
args
);
}
}
启动日志
![](https://i-blog.csdnimg.cn/blog_migrate/600554ce087e53885ee26339fb1ffdbf.png)