如何把web.xml中的context-param、Servlet、Listener和Filter定义添加到SpringBoot中

9 篇文章 1 订阅
6 篇文章 0 订阅

把传统的web项目迁移到SpringBoot中,少不了web.xml中的context-param、Servlet、Filter和Listener等定义的迁移。
    
 对于Servlet、Filter和Listener相关定义转换相对来说比较明确:

Servlet定义的迁移

一般servlet的迁移

示例如下:

@WebServlet("/jsonIndexSearchServlet")
public class JsonIndexSearchServlet extends HttpServlet {
...
}

FacesServlet的迁移

 

@Bean
    public ServletRegistrationBean servletRegistrationBean() {
        FacesServlet servlet = new FacesServlet();
        //, "*.jsf"
        ServletRegistrationBean bean = new ServletRegistrationBean(servlet);
        bean.setOrder(40);
        bean.setName("FacesServlet");
        List<String> urlPattern = new ArrayList<>();
        urlPattern.add("*.jsf");
        bean.setUrlMappings(urlPattern);
        return bean;
    }

不过,对于jsf项目来说,这样还不够,仍然需要web.xml的定义,具体原因暂时不明,后续有空再研究。(Bean注入和web.xml定义,两边都不能少,否则均报异常,具体我在后续的博客中会详细提及。)

web.xml定义:

<servlet>
		<servlet-name>FacesServlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>FacesServlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>

Filter定义的迁移

示例如下:

    @Bean
    public FilterRegistrationBean rewriteFilter() {
        FilterRegistrationBean rwFilter = new FilterRegistrationBean(new RewriteFilter());
        rwFilter.setDispatcherTypes(EnumSet.of(DispatcherType.FORWARD, DispatcherType.REQUEST,
                DispatcherType.ASYNC, DispatcherType.ERROR));
        rwFilter.addUrlPatterns("/*");
        rwFilter.setOrder(30);
        return rwFilter;
    }

 

Listener定义的迁移

示例如下:

    @Bean
    public ServletListenerRegistrationBean<ServletContextListener> setStartupServletContextListener(){
    	ServletListenerRegistrationBean<ServletContextListener> result = new ServletListenerRegistrationBean<>();
    	result.setListener(new StartupServletContextListener());
    	result.setOrder(20);
    	return result;
    }

 

context-param定义的迁移

    对于content-param定义的转换,网上的例子就很少了。
    有人建议使用以下方法来实现,但我尝试失败了:

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    	return builder.sources(Application.class);
    }
    
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
    	//web.xml context-param
    	servletContext.setInitParameter("org.apache.myfaces.AUTO_SCROLL", "true");
    	super.onStartup(servletContext);
    }

 我在debug时发现,这两个方法的断点根本就没进来,也就是说这两个方法未被调用。
    
  后来还是在万能的stackoverflow网站上找到方法——使用InitParameterConfiguringServletContextInitializer。

示例如下:

    @Bean
    public InitParameterConfiguringServletContextInitializer initParamsInitializer() {
        Map<String, String> contextParams = new HashMap<>();
        contextParams.put("org.apache.myfaces.AUTO_SCROLL", "true");
        return new InitParameterConfiguringServletContextInitializer(contextParams);
    }

文章结束。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值