`
Kingson_Wu
  • 浏览: 119688 次
文章分类
社区版块
存档分类
最新评论

struts2和servlet的共存问题以及解决

 
阅读更多

struts2servlet的共存问题


先看一下struts2web.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请求将不能够正常相应,struts2servlet当成action了,因为servletaction都是没有后缀的

解决方法目前有四种:

方法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共存问题详解 ...通过上述分析可以看出,虽然Struts2与Servlet共存的问题看似棘手,但只要采取合理的策略,完全可以有效解决。希望本文能帮助你在实际开发过程中更好地应对这类挑战。

    Struts2中Servlet的配置

    3. **Struts2与Servlet共存的问题及解决**: 当一个项目同时使用了Struts2框架和直接的Servlet时,可能会遇到问题,因为Struts2有自己的请求处理流程,可能会覆盖或干扰到Servlet的正常工作。为了解决这个问题,...

    Struts和servlet不能共存问题解决方法

    主要介绍了Struts和servlet不能共存问题解决方法,共有三种方法,需要的朋友可以参考下。

    Struts2 + Pluto + portletV1.0(JSR 168) CRUD Demo

    Struts2 + Pluto + portletV1.0 (JSR 168) CRUD Demo 是一个基于Java技术栈的Web应用程序示例,主要用于演示如何在...通过分析和运行这个项目,可以深入了解portlet的开发过程以及Struts2在portlet环境中的应用。

    WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6集成方式二

    \n\n**步骤4:整合Struts2**\n\n虽然本讲的重点是Spring和Flex的集成,但我们也提到了如何与Struts2共存。在这种情况下,我们不配置`servlet-name`为`spring-mvc`,因为我们的目标是保留Struts2的MVC框架,而不是...

    JSF学习

    ### JSF与Struts:竞争还是共存? 在IT领域,尤其是Web开发中,JavaServer Faces(JSF)和Struts作为两种流行的框架,经常被开发者拿来比较。本文旨在深入探讨这两个框架,分析它们的特点、实施技巧以及选择标准,...

    tomcat不能启动的原因总结

    ### Tomcat不能启动的原因...对于开发者来说,最重要的是养成良好的开发习惯,如定期备份配置文件、保持软件更新等,以便于快速定位和解决问题。同时,在日常工作中不断积累经验,也是提高解决问题效率的有效途径之一。

    apache-tomcat-7.0.52下载

    8. **社区支持**:Apache Tomcat拥有活跃的社区,开发者可以在官方邮件列表、论坛或Stack Overflow等平台获取帮助,解决遇到的问题。 9. **升级与兼容性**:尽管Apache Tomcat 7.0.52是较早的版本,但它是Java EE 6...

    深入浅出java服务

    从Java服务的演进历程来看,无论是从早期的JSP/SERVLET,到后来的SSH/i框架,还是最新的Dubbo服务框架,每一次技术变革都旨在解决实际问题,提高开发效率和服务质量。Dubbo作为一款优秀的分布式服务框架,不仅解决了...

    jsp.rar_jsp 安装

    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`表示最终的,意味着不能被修改或重写。这两者是相互...

Global site tag (gtag.js) - Google Analytics