在同一個項目中間,如果既用到servlet有用了struts2的框架,運行項目時可能無法正常使用servlet,原因是在配置struts2的核心控制器時<url-pattern>/*</url-pattern>所致,需要定義一個過濾器,將servlet過濾,使struts2的核心控制器對servlet不起作用。注意:在xml文件中定義的servlet過濾器要寫在struts2核心控制器前面,否則還是不能使用。舉例來說,定義的過濾器文件是ReDispatcherFilter.java,只需按照該文件中注釋內容做以下配置,即可。
package filters; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; 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; public class ReDispatcherFilter implements Filter { public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; String target = request.getRequestURI(); target = target.lastIndexOf("?")>0 ?target.substring(target.lastIndexOf("/")+1,target.lastIndexOf("?")-target.lastIndexOf("/")) :target.substring(target.lastIndexOf("/")+1); System.out.println(target); if(this.includes.contains(target)) { RequestDispatcher rdsp = request.getRequestDispatcher(target); System.out.println("go..............."+rdsp); rdsp.forward(req, resp); } else chain.doFilter(req, resp); } private ArrayList<String> includes = new ArrayList<String>(); public void init(FilterConfig config) throws ServletException { this.includes.addAll( Arrays.asList(config.getInitParameter("includeServlets").split(","))); } }
/*該類是定義了一個過濾器,當既用到struts2有用到servlet時, * 必須用該過濾器對所有的servlet做一次過濾,否則servlet將無法正常運行。 * 同時在web.xml中,在定義struts的核心控制器前面添加該過濾器,添加代碼如下: */
<filter> <filter-name>redisp</filter-name> <filter-class>filters.ReDispatcherFilter(該過濾器的類名)</filter-class> <init-param> <param-name>includeServlets</param-name> <param-value>所有配置的servlet名字</param-value> </init-param> </filter> <filter-mapping> <filter-name>redisp</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>