把傳統的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);
}
文章結束。