今日开放项目,遇到老程序员用Servlet开发,新程序员用Struts2开发的情况。
开发完成后,需要进行功能集成,但,尝试多次都无法搞定。因为,两者的url-pattern,总是有相互包含的部分,所以,无法正确传递HTTP请求。
最后,突发奇想,也许自己写一个Filter放在最前面,对所有请求进行拦截,如果是Servlet的请求,则内部跳转至Servlet;其他的请求让Struts2来处理。
Filter的代码如下:
package houlei.web.support.context;
import java.io.IOException;
import java.util.HashSet;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 解决 Struts2 和 自定义 Servlet 的请求冲突
*/
public class CustomSevletFilter implements Filter {
public static final String PARAM_INCLUDE_SERVLETs = "includeServlets";
private static final HashSet<String> ServletPatterns = new HashSet<String>();
public void destroy() {
ServletPatterns.clear();
}
public void init(FilterConfig config) throws ServletException {
String param = config.getInitParameter(PARAM_INCLUDE_SERVLETs);
if (param!=null && param.trim().length()>0) {
String patterns[] = param.split("\\s|\\r|\\n|\\,");
for (String p : patterns) {
if (p.length() > 0) {
ServletPatterns.add(p);
}
}
}
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
String target = request.getServletPath();
if(ServletPatterns.contains(target)){
RequestDispatcher rdsp = request.getRequestDispatcher(target);
rdsp.forward(servletRequest, servletResponse);// 转发我们的请求,跳出FilterChain
}else{
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
编写完自定义的Filter之后,将之集成到项目中。
web.xml文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>CustomSevletFilter</filter-name>
<filter-class>houlei.web.support.context.CustomSevletFilter</filter-class>
<init-param>
<param-name>includeServlets</param-name>
<param-value>/cAppRequest,/cAppReport</param-value>
</init-param>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../config/struts2.cfg.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CustomSevletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<description>app request to server</description>
<display-name>app request</display-name>
<servlet-name>cAppRequest</servlet-name>
<servlet-class>xxx.xxx.CAppRequest</servlet-class>
</servlet>
<servlet>
<servlet-name>cAppReport</servlet-name>
<servlet-class>xxx.xxx.CAppReport</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cAppRequest</servlet-name>
<url-pattern>/cAppRequest</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>cAppReport</servlet-name>
<url-pattern>/cAppReport</url-pattern>
</servlet-mapping>
</web-app>
当然,配置文件仅仅是个样例。朋友们可以根据实际情况进行配置即可。