springboot中使用原生servlet有二種方式,
第一種方式
定義一個UserServlet繼承HttpServlet,可以自己實現(xiàn)get,post方法
package com.zhihao.miao;
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;
@WebServlet("/user/servlet")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("user servlet");
}
}
定義一個LogFilter實現(xiàn)Filter,監(jiān)聽/user/servlet請求
package com.zhihao.miao;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/user/servlet")
public class LogFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("income log filter " + request.getRemoteHost());
chain.doFilter(request, response);
}
public void destroy() {
}
}
定義一個監(jiān)聽器實現(xiàn)ServletContextListener
package com.zhihao.miao;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.time.LocalDateTime;
@WebListener
public class MyContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("app startup at " + LocalDateTime.now().toString());
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
啟動類啟動:
@ServletComponentScan
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
啟動服務(wù),監(jiān)聽器執(zhí)行了

訪問http://localhost:8080/user/servlet

過濾器執(zhí)行

總結(jié):
- 編寫servlet,然后加上相應(yīng)的注解@WebServlet("/user/servlet"),@WebFilter("/user/servlet"),@WebListener
- 需要啟用@ServletComponentScan注解
- 這種方法適合于servlet3.0版本
方法二
定義BookServlet繼承HttpServlet,編寫自己的doget,dopost方法
package com.zhihao.miao.demo2;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hi Springboot Servlet!!!!");
}
}
定義EchoFilter實現(xiàn)Filter接口,過濾相應(yīng)的請求
package com.zhihao.miao.demo2;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class EchoFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req =(HttpServletRequest)request;
System.out.println("spring boot web filter " + req.getRequestURI());
chain.doFilter(request, response);
}
public void destroy() {
}
}
定義StartupListener實現(xiàn)ServletContextListener
package com.zhihao.miao.demo2;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class StartupListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
System.out.println("=================");
System.out.println("application is started");
}
public void contextDestroyed(ServletContextEvent event) {
}
}
寫一個配置類注冊Servlet,F(xiàn)ilter,Listener到spring容器中
package com.zhihao.miao.demo2;
import java.util.Arrays;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
@SpringBootConfiguration
public class ServletConfiguration {
//注冊setvlet
@Bean
public ServletRegistrationBean createBookServlet(){
ServletRegistrationBean servlet = new ServletRegistrationBean(new BookServlet(),"/book.do");
return servlet;
}
//過濾哪些url
@Bean
public FilterRegistrationBean createFilterRegistrationBean(){
FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new EchoFilter());
filter.setUrlPatterns(Arrays.asList("/book.do"));
return filter;
}
//配置監(jiān)聽器
@Bean
public ServletListenerRegistrationBean<StartupListener> createServletListenerRegistrationBean(){
ServletListenerRegistrationBean<StartupListener> listener =new ServletListenerRegistrationBean<>(new StartupListener());
return listener;
}
}
啟動類測試:
package com.zhihao.miao.demo2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
監(jiān)聽器執(zhí)行

訪問servlet

過濾器執(zhí)行

總結(jié):
- 編寫Servlet,F(xiàn)ilter,Listener
- 裝配相應(yīng)的bean到spring容器中
servlet->ServletRegistrationBean
filter ->FilterRegistrationBean
listener -> ServletListenerRegistrationBean- 這種方法適合servlet3.0,2.5及其以下版本