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

SpringBoot 之Servlet、 Filter、Listener应用开发

2018-07-06 10:50 302 查看

    Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet、 Filter、Listener等等。在传统SSH开发中,,web.xml就是非常重要的一个配置,无论是servlet、filter、listener都需要在web.xml里面配置下,随项目启动而把他们加载进去。但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。

    现在介绍一下在spring boot中的三种实现方式实现servlet、filter、listener。

方法一:通过注册ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制

public class DemoServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)    	throws ServletException, IOException {
System.out.println("get method!");
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)    	throws ServletException, IOException {
System.out.println("post method");
response.getWriter().write("hello springBoot");
}

}

public class DemoFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init filter");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)    	throws IOException, ServletException {
System.out.println("do filter");
chain.doFilter(request, response);
}
@Override  public void destroy() {
System.out.println("destroy filter");
}

}

public class DemoListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed");
}

}

@SpringBootApplication
public class SpringBootApplication {

@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new DemoServlet(), "/*");
}

@Bean
public FilterRegistrationBean filterRegistrationBean() {
return new FilterRegistrationBean(new DemoFilter(), servletRegistrationBean());
}

@Bean
public ServletListenerRegistrationBean<CustomListener> servletListenerRegistrationBean() {
return new ServletListenerRegistrationBean<DemoListener>(new DemoListener());
}

public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
方法二:通过实现 ServletContextInitializer 接口直接注册
@SpringBootApplication
public class SpringBootApplication implements ServletContextInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addServlet("demoServlet", new DemoServlet()).addMapping("/*");
servletContext.addFilter("demoFilter", new DemoFilter())
.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*");
servletContext.addListener(new DemoListener());
servletContext.setInitParameter("Param", "1");
}

public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
PS:这里主要说说servletContext注册Filter的addMappingForUrlPatterns(
            EnumSet<DispatcherType> dispatcherTypes,
            boolean isMatchAfter, String... urlPatterns)方法
            参数一:dispatcherTypes
            Filter是有作用范围的,我们平常都是使用Filter作用于Request,这也是Filter中dispatcherTypes属性的默认值,这个属性的意思是由该过滤器管理的资源是通过什么样的方式访问到的,可以是请求、转发、声明式错误、包含等,但是我们还可以配置使Filter作用于其他范围,这是由dispatcherTypes属性决定的,它有如下几个值:
DispatcherType.REQUEST
DispatcherType.FORWARD
DispatcherType.INCLUDE
DispatcherType.ERROR
DispatcherType.ASYNC
            参数二:isMatchAfter
            这里定义过滤器在mapping之前执行,还是之后执行。
            参数三:urlPatterns
            这个参数定义匹配规则。

    如果想配置一些初始化参数,可以使用servletContext.setInitParameter(String st1,String st2)这个方法,不过Filter "init(FilterConfig filterConfig)",要利用filterConfig获取到ServletContext对象后,才能通过ServletContext获取初始化参数值,以前我们使用web.xml配置初始化参数,直接利用filterConfig.getInitParameter(String str)就可以获取初始化参数了。现在这里有点区别。

方法三:在 SpringBootApplication 上使用@ServletComponentScan 注解后,直接通过@WebServlet、 @WebFilter、@WebListener 注解自动注册

    到此,就把Servlet、 Filter、Listener在Springboot如何开发,说到这里,谢谢!!!!!!



阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: