您的位置:首页 > 编程语言 > Java开发

SpringBoot(四)-- 整合Servlet、Filter、Listener

2017-11-01 22:33 721 查看
SpringBoot中有两种方式可以添加 Servlet、Filter、Listener。

1.代码注册

 通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。

新建WebConfig 类,用于bean的注入,内容如下:

package com.xsjt.config;

import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;
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;
import org.springframework.context.annotation.Configuration;
import com.xsjt.filter.XbqFilter;
import com.xsjt.listener.XbqListener;
import com.xsjt.servlet.XbqServlet;

/**
* ClassName:WebConfig
* 通过 @bean 注入 servlet、filter、listener
* Date:     2017年11月6日 下午6:10:30
* @author   Joe
* @version
* @since    JDK 1.8
*/
@Configuration
public class WebConfig {

/**
* servletRegistrationBean:(使用代码注册Servlet(不需要@ServletComponentScan注解)).
* @author Joe
* Date:2017年11月6日下午6:13:29
*
* @return
*/
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setServlet(new XbqServlet());
List<String> urlMappings = new ArrayList<String>();
// 访问,可以添加多个
urlMappings.add("/xbq/servlet");
registrationBean.setUrlMappings(urlMappings);
registrationBean.setLoadOnStartup(1);
return registrationBean;
}

/**
* getDemoFilter:(使用代码注册拦截器).
* @author Joe
* Date:2017年11月6日下午6:17:31
*
* @return
*/
@Bean
public FilterRegistrationBean getDemoFilter(){
XbqFilter demoFilter = new XbqFilter();
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
registrationBean.setFilter(demoFilter);
List<String> urlPatterns=new ArrayList<String>();
urlPatterns.add("/*");                            //拦截路径,可以添加多个
registrationBean.setUrlPatterns(urlPatterns);
registrationBean.setOrder(1);
return registrationBean;
}

/**
* getDemoListener:(使用代码 引用 监听器).
* @author Joe
* Date:2017年11月6日下午6:35:28
*
* @return
*/
@Bean
public ServletListenerRegistrationBean<EventListener> getDemoListener(){
ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<>();
registrationBean.setListener(new XbqListener());
registrationBean.setOrder(1);
return registrationBean;
}
}


其中,代码中 XbqServlet 、XbqFilter、XbqListener 代码如下:

package com.xsjt.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* ClassName:JoeListener
* Date:     2017年11月6日 下午6:28:29
* @author   Joe
* @version
* @since    JDK 1.8
*/
public class XbqListener implements ServletContextListener{

private static Logger logger = LoggerFactory.getLogger(XbqListener.class);

@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("--xbq-监听器-ServletContext 初始化");
logger.info(sce.getServletContext().getServerInfo());
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
logger.info("--xbq-监听器-ServletContext 销毁");
}
}


View Code

2.通过注解自动注册

在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet(urlPatterns = "/test/*")、@WebFilter、@WebListener 注解自动注册,这些注解都是JDK的,无需其他代码。

1) Servlet

package com.xsjt.servlet;

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;

/**
* ClassName:XbqServlet
* 通过  @WebServlet 注解 整合Servlet
* Date:     2017年11月6日 下午5:13:10
* @author   Joe
* @version
* @since    JDK 1.8
*/
@WebServlet(urlPatterns = "/joe/*")
public class JoeServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body><center>");
out.println("<h3>我是通过   @WebServlet 注解注册Servlet的</h3>");
out.println("</center></body>");
out.println("</html>");
}
}


2) Filter

package com.xsjt.filter;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;

/**
* ClassName:JoeFilter
* 自定义  Filter
*         @Order注解表示执行过滤顺序,值越小,越先执行
* Date:     2017年11月6日 下午6:01:33
* @author   Joe
* @version
* @since    JDK 1.8
*/
@Order(1)
@WebFilter(filterName = "joeFilter", urlPatterns = "/*")
public class JoeFilter implements Filter {

private static Logger logger = LoggerFactory.getLogger(JoeFilter.class);

@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("--joe--初始化JoeFilter!");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
logger.info(req.getRequestURL() + "---joe---> doFilter");
chain.doFilter(request, response);
}

@Override
public void destroy() {
logger.info("--joe--销毁JoeFilter!");
}
}


3) Listener

package com.xsjt.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* ClassName:JoeListener
* Date:     2017年11月6日 下午6:28:29
* @author   Joe
* @version
* @since    JDK 1.8
*/
@WebListener
public class JoeListener implements ServletContextListener{

private static Logger logger = LoggerFactory.getLogger(JoeListener.class);

@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("--Joe-监听器-ServletContext 初始化");
logger.info(sce.getServletContext().getServerInfo());
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
logger.info("--Joe-监听器-ServletContext 销毁");
}
}


3.源码下载

  https://gitee.com/xbq8023/spring-boot-learn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: