今天在做一个项目的时候遇到了一个很奇怪的问题,这个项目的一部分是之前用servlet写的,但是后边打算用struts写,再加入struts框架配置后发现原先的那部分不能正常访问了,之前没这么做过所以很纳闷,struts2配置自认为写的很熟了,应该没什么问题啊,struts.xml文件改了又改还是找不到错误,后来在看到web.xml时突然眼前一亮。。
原来是所有的请求都被struts2拦截了,struts2把servlet当成action了,因为servlet和action都是没有后缀的。很是悲剧,要想使servlet和struts各司其职只能是限制struts的拦截范围了,
这里在struts.xml的配置里边加一个这个就可以限制struts只拦截action类型的请求了,当然在发起请求时也是要写清楚http://XXX/XX.action了这个action就不能向之前那样省掉了。下面给出网上的几种方法:方式一:修改servlet的相关配置,统一在servlet后面加上“.servlet” 1.修改web.xml配置文件形如:
jqueryAjaxServlet com.clzhang.sample.struts2.servlet.jQueryAjaxServlet jqueryAjaxServlet /servlet/jqueryAjax.servlet 2.修改调用servlet的地方,形如:
<% String path = request.getContextPath(); %> ...... $.ajax({ url:'<%=path%>/servlet/jqueryAjax.servlet',这样就可以正常处理servlet的请求了。此种情况适合于小范围使用servlet的情况。
方式二:修改拦截页面配置,就是将struts的相关拦截配置一下
修改web.xml文件如下内容:
struts2 *.action struts2 *.do struts2 *. jsp struts2 /user/*
方式三:自定义Filter实现过滤
1.创建实现类,代码参考如下:
package com.clzhang.sample.struts2; 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; /** * 这是一个过滤servlet的filter;就是拦截servlet的处理请求,自行转向处理,而不是由struts处理。 * 有二种过滤方式,一种是判断uri中是否包含“/servlet/”; * 另一种是所有servlet在初始化参数中指定。 * 需要在web.xml中配置:redisp com.clzhang.sample.struts2.FilterServlet 并且此过滤器必须在struts2的过滤器上面。 * @author Administrator * */ public class FilterServlet implements Filter { public void destroy() { } 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); if (request.getRequestURI().indexOf("/servlet/") > 0) { // request.getRequestURI()格式应该形如:/st/servlet/jqueryAjax, // 其中st是项目名,servlet是所有servlet都增加的前缀,用于能够判断出是servlet。 // if只判断请求uri是否包含/servlet/,如果包含则处理; RequestDispatcher rdsp = request.getRequestDispatcher(target); rdsp.forward(req, resp); } else { chain.doFilter(req, resp); } // 第二种方式 (二选 一) /** if (this.includes.contains(target)) { // target取出的值则直接是jqueryAjax,在web.xml中配置即可。 // if判断请求uri最后的那部分是否包含在配置文件中,如果包含,则处理 RequestDispatcher rdsp = request.getRequestDispatcher(target); rdsp.forward(req, resp); } else { chain.doFilter(req, resp); } */ } private ArrayList redisp /* includes = new ArrayList (); public void init(FilterConfig config) throws ServletException { // 如果使用第二种方式过滤,则需要以下代码 // this.includes.addAll(Arrays.asList(config.getInitParameter( // "includeServlets").split(","))); } } 2.修改web.xml,类似如下格式:
redisp com.clzhang.sample.struts2.FilterServlet redis