天天看點

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

把傳統的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);
    }
           

文章結束。