把传统的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);
}
文章结束。