struts2和servlet的共存问题
先看一下struts2的web.xml文件:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在请求应用时,struts2将会截获所有请求,对于servlet请求将不能够正常相应,是struts2把servlet当成action了,因为servlet和action都是没有后缀的
解决方法目前有四种:
方法1:统一在servlet后面加上.servlet(包括web.xml配置文件中和页面上使用servlet的地方)
方法2:继承StrutsPrepareAndExecuteFilter,实现以下两个方法。
public void init(FilterConfig filterConfig) throws
ServletException {
..............................
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws
IOException, ServletException {
...............................
if(url.contain("servlet")){
((HttpServletResponse) response).sendRedirect(redirectUrl);
}
super.doFilter(request, response, chain);
}
方法3:修改拦截页面配置
原:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>
/* </url-pattern>
</filter-mapping>
现:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
servlet的请求路径不必改变
方法4:在struts.xml文件中修改
-------------------------------------------------------
其实真正的解决方法在此:
struts2和servlet同时用(访问servlet时被struts2过滤器拦截问题的解决)
分类:Struts22012-11-1911:58400人阅读评论(0)收藏举报
在同一个项目中间,如果既用到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;
/**
* 该类是定义了一个过滤器,当既用到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>
* @author xsl
*
*/
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共存问题详解 ...通过上述分析可以看出,虽然Struts2与Servlet共存的问题看似棘手,但只要采取合理的策略,完全可以有效解决。希望本文能帮助你在实际开发过程中更好地应对这类挑战。
3. **Struts2与Servlet共存的问题及解决**: 当一个项目同时使用了Struts2框架和直接的Servlet时,可能会遇到问题,因为Struts2有自己的请求处理流程,可能会覆盖或干扰到Servlet的正常工作。为了解决这个问题,...
主要介绍了Struts和servlet不能共存问题解决方法,共有三种方法,需要的朋友可以参考下。
Struts2 + Pluto + portletV1.0 (JSR 168) CRUD Demo 是一个基于Java技术栈的Web应用程序示例,主要用于演示如何在...通过分析和运行这个项目,可以深入了解portlet的开发过程以及Struts2在portlet环境中的应用。
\n\n**步骤4:整合Struts2**\n\n虽然本讲的重点是Spring和Flex的集成,但我们也提到了如何与Struts2共存。在这种情况下,我们不配置`servlet-name`为`spring-mvc`,因为我们的目标是保留Struts2的MVC框架,而不是...
### JSF与Struts:竞争还是共存? 在IT领域,尤其是Web开发中,JavaServer Faces(JSF)和Struts作为两种流行的框架,经常被开发者拿来比较。本文旨在深入探讨这两个框架,分析它们的特点、实施技巧以及选择标准,...
### Tomcat不能启动的原因...对于开发者来说,最重要的是养成良好的开发习惯,如定期备份配置文件、保持软件更新等,以便于快速定位和解决问题。同时,在日常工作中不断积累经验,也是提高解决问题效率的有效途径之一。
8. **社区支持**:Apache Tomcat拥有活跃的社区,开发者可以在官方邮件列表、论坛或Stack Overflow等平台获取帮助,解决遇到的问题。 9. **升级与兼容性**:尽管Apache Tomcat 7.0.52是较早的版本,但它是Java EE 6...
从Java服务的演进历程来看,无论是从早期的JSP/SERVLET,到后来的SSH/i框架,还是最新的Dubbo服务框架,每一次技术变革都旨在解决实际问题,提高开发效率和服务质量。Dubbo作为一款优秀的分布式服务框架,不仅解决了...
2. **设置CATALINA_BASE和CATALINA_HOME**:如果多个Tomcat实例共存,需要为每个实例设置不同的CATALINA_BASE,指向各自的conf、webapps等目录。 3. **配置TOMCAT_USER**:在Tomcat的conf/tomcat-users.xml文件中...
abstract和final能否共存? 在Java中,`abstract`和`final`关键字不能同时用于修饰同一个类、方法或变量。`abstract`表示抽象的,意味着不能被实例化;而`final`表示最终的,意味着不能被修改或重写。这两者是相互...