`
angelbill3
  • 浏览: 255636 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Struts1与Struts2一起使用时遇到的问题解决方案

阅读更多
本篇记录工作中遇到的问题。

项目用的是Struts1,但因为要用到一个ActiveX插件,(当时用的是Struts2开发,因为涉及到一些文件上传,插件开发者不是本人,所以没办法改成Struts1),因为在项目中额外加入了Sruts2的配置。
只要Struts1和Struts2处理类和请求不一样,还是可以兼容的。

但是遇到了一个问题,就是用Struts1做的功能里,所有的文件上传都报空指针,但用FireBug分析了下上传请求,发现POST里都是有该文件的,但后台就是接收不到。

于是想到,是不是Struts2先拦截了该文件呢?(具体的处理流程当时我并不是很清楚)。
首先检查了下配置:

1、web.xml项目用的是Struts1的配置,如下:
<!-- 配置ActionServlet,加载Struts配置文件 -->
<servlet>
	<servlet-name>action</servlet-name>
	<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
	<init-param>
		<param-name>config</param-name>
		<param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-permng.xml</param-value>
	</init-param>	
	<init-param>
		<param-name>config/demo</param-name>
		<param-value>/WEB-INF/struts-config-demo.xml</param-value>
	</init-param>	
	<init-param>
		<param-name>debug</param-name>
		<param-value>2</param-value>
	</init-param>
	<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>*.ered</url-pattern>
</servlet-mapping>


2、web.xml ---- Struts2的配置如下:
<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/struts.xml</param-value>
	</init-param>
</filter>
	
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>


初步一看,就是最普通的配置,但看了下Struts2的配置,其中url-pattern的属性配了/*,也就是过滤器对所有的Url都有效,初步判断这里过滤了Struts1的文件。

解决办法,
将Struts2的filter-mapping中的url-pattern属性改成*.action,这样只会拦截.action的url,本来也是可以解决的。

但是,如同我上面说的,在Struts2的URL里有放置ActiveX插件,只要将Struts2的配置url-pattern改成*.action的时候,插件里的请求就无效了,直接报错。这说明插件里的URL不是以.action结尾的,但我用FireBug分析了下URL请求,并没有找到插件中的那个请求,(插件的请求方式是在JS中定义了一个Object,并写上属性ID,通过此ID调用插件中的方法)。

-----------------------------
此刻,想到了两个解决办法。
1、是不是将web.xml中的Struts1的配置放到Struts2上面,就可以先执行Struts1的部分(因为Struts1的配置并没有过滤所有,是拦截以*.ered结尾的URL。而此时,我将下面的Struts2配置重新改成/*,这样Struts1部分的文件上传和Struts2部分的插件,是否可以同时被各自的拦截器处理呢?
2、自定义个Filter,将所有的URL都拦截下来,分析下插件中未知的那个请求是什么,再改进Struts2的配置。

于是我先试验了下办法一,发现就算把Struts1的配置放上面,也还是会先运行Struts2的拦截器,后来去网上查了下原因,
是因为Struts1的配置用的是Servlet,而Struts2的配置用的是Filter,
而两者的运行顺序是:
 Filter-> Servlet 

所以把Struts1的配置放前面,也是没有用的。

于是开始试验办法二,自定义Filter,拦截所有URL,web.xml的配置如下:
<!-- 请求拦截过滤器 -->
<filter>
	<filter-name>requestFilter</filter-name>
	<filter-class>util.RequestFilter</filter-class>
	<init-param>
		<param-name>enabled</param-name>
		<param-value>true</param-value>
	</init-param>
	</filter>
<filter-mapping>
	<filter-name>requestFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>


类里的具体方法如下:
/**
	 * 过滤处理
	 */
	public void doFilter(ServletRequest pRequest, ServletResponse pResponse, FilterChain fc) throws IOException,
			ServletException {
	HttpServletRequest request = (HttpServletRequest) pRequest;
	HttpServletResponse response = (HttpServletResponse) pResponse;
	String ctxPath = request.getContextPath();
	String requestUri = request.getRequestURI();
	String uri = requestUri.substring(ctxPath.length());
	System.out.println(url);
}


运行其结果,发现Url如下:(结构如下)
/rpt/demourl

于是终于知道,该URL是没有后缀的,所以Sturts2在配置的时候,若配置了*.action的话就会使该插件无效了。
但是发现插件的所有URL都是在
项目目录/rpt/
下的,所以找到解决办法是:
更改filter-mapping中的url-pattern属性,将/* 改为/rpt/*

问题解决。

总结:虽然可能对于高手来说不是很困难的问题,但却被我折腾了挺久,究其原因,可能是因为没好好的理解Struts1和Struts2的一些机制,平时应多看看此方面的相关书籍,慢慢积累。

参考资料:
http://www.iteye.com/problems/41978
http://blog.csdn.net/flyrainsky/article/details/7094481
分享到:
评论

相关推荐

    struts2开发遇到的问题

    在使用 Struts2 进行开发时,开发者可能会遇到各种问题,这里我们将详细探讨一些典型的问题及其解决方法。 1. **警告:Settings: Could not parse struts.locale setting, substituting default VMlocale** 这个...

    第一个Struts2程序中遇到的若干问题及解决方法

    在初学者尝试创建第一个Struts2程序时,可能会遇到一些常见问题。这篇博客将探讨这些问题并提供解决方案。 首先,配置问题是新手经常遇到的挑战。在搭建Struts2环境时,确保正确地在`web.xml`文件中配置了Struts2的...

    Struts2升级到2.5.30,问题解决及过程记录

    在本文中,我们将探讨将Struts2从旧版本升级到2.5.30的过程中可能遇到的问题及其解决方案。 升级Struts2到2.5.30的主要目标是利用新版本提供的增强功能和安全补丁。Struts2的每个新版本通常会包含对前一版本的兼容...

    struts2中警告消息问题的解决方法

    在使用Struts2开发过程中,有时会遇到“警告: Could not find property [xxx]”这样的错误消息,这通常是由于配置问题或者依赖库不匹配导致的。本文将深入探讨这些警告的成因及解决方法。 1. **问题成因**: - **...

    struts2+spring集成bug——使用AOP时可能遇到的问题分析

    通过运行测试,观察控制台输出,或者使用断点调试,我们可以逐步缩小问题范围,最终找到解决方案。 在进行集成开发时,了解这两个框架的内部工作原理、正确配置以及如何解决常见问题,对于提升开发效率和维护质量至...

    解决使用struts2 时 访问web工程首页问题

    ### 解决使用Struts2时访问Web工程首页问题 在使用Struts2框架进行Web开发的过程中,有时会遇到访问Web应用首页时出现拦截并报错的情况。错误信息通常为:“There is no Action mapped for namespace / and action ...

    Struts2没有提示解决方案

    在MyEclipse这样的集成开发环境中使用Struts2时,可能会遇到一些问题,比如在编写Struts2配置文件(如Struts.xml)时无法获得代码提示。这通常是由于IDE没有正确配置Struts2的DTD(Document Type Definition)导致的...

    Struts2 动态方法调用(十三)

    9. **异常处理**:当动态方法调用遇到不存在的方法或类时,Struts2会有相应的异常处理机制。理解这些异常可以帮助快速定位和解决问题。 10. **性能影响**:动态方法调用可能比静态配置的调用稍微慢一些,因为它涉及...

    struts2 跳转至404 页面的解决方案

    针对"Struts2 跳转至404 页面的解决方案"这个主题,我们将深入探讨可能的原因和解决方法。 首先,我们来看`struts.xml`文件,这是Struts2的核心配置文件,负责定义Action、结果类型、拦截器等关键组件。当Struts2...

    ueditor struts2图片上传问题解决办法

    在使用富文本编辑器ueditor与Struts2框架结合进行图片上传时,常常会遇到一些问题,这些问题可能涉及文件过滤、文件类型限制、文件大小控制、上传路径设置等多个方面。以下是一些解决这些问题的关键知识点: 1. **...

    Struts2.5.2的配置及问题解决

    本文将详细介绍Struts2.5.2的配置过程以及可能遇到的问题和解决方案。 首先,配置Struts2.5.2需要从官方站点下载所需的jar包。在http://struts.apache.org/download.cgi#struts252上,你可以找到两个选项:1是指...

    struts中文乱码问题解决详细步骤

    解决这个问题通常涉及到编码设置的调整,下面将详细介绍两种方法来解决Struts中的中文乱码问题。 **方法一:配置Filter** 1. **添加过滤器**:首先,我们需要在Web应用的`web.xml`文件中添加一个`...

    Struts2乱码终极解决办法

    本文将详细介绍如何彻底解决Struts2中的乱码问题,并提供实际可行的解决方案。 #### 二、乱码产生的原因 在Struts2框架中,中文乱码主要由以下几个方面的原因造成: 1. **请求编码问题**:客户端发送请求时未指定...

    关于Struts2与Validation框架使用中的问题

    总之,Struts2与Validation的结合使用,能够帮助开发者构建更加健壮的Web应用,通过严谨的数据验证避免无效或错误的用户输入,提升用户体验。同时,理解它们的集成原理和常见问题,是Java Web开发中的重要技能之一。

    struts2与dwr整合实例

    Struts2和DWR(Direct Web ...综上所述,Struts2和DWR的整合能够提供一个强大的前后端交互解决方案,使得Web应用具有更好的用户体验。在实践中,开发者需要对这两个框架有深入的理解,并灵活应对可能出现的技术挑战。

    struts2和servlet的共存问题

    但在某些场景下,开发者可能需要同时使用Struts2和其他Servlet技术(如自定义Servlet或第三方Servlet),这时就会遇到Struts2与Servlet的共存问题。 #### 二、问题描述 当Struts2作为Web应用程序的前端控制器时,...

    struts2.5.16升级过程中遇到问题详述

    本文主要针对从旧版本Struts2框架升级至2.5.16版本时可能遇到的各种问题进行详细介绍,并给出相应的解决方案。这包括了jar包的替换与引入、配置文件的调整、代码层面的改动等内容。 #### 二、Jar包替换与引入 ####...

    struts2下载地址

    1. **依赖冲突**:在使用Struts2的过程中可能会遇到与其他框架的依赖冲突问题,解决方法通常是调整依赖版本或者排除不必要的依赖。 2. **配置错误**:配置文件的错误是常见的问题之一,可以通过仔细检查配置文件以及...

    WebSphere Application Server下Struts2.0无法使用解决方案

    在使用WebSphere Application Server(WAS)部署基于Struts2.0的应用时,可能会遇到一些问题导致Struts2无法正常工作。这个问题通常表现为在尝试访问Struts2控制的页面时,返回HTTP 500错误,并且日志中显示"Filter ...

    struts2 使用action属性接收中文参数(post提交)

    - Struts2支持使用注解在Action类的方法参数上,比如`@RequestParam`,配合`@InitBinder`,可以在控制器层处理编码问题。 4. **JSP页面**: - JSP页面的`;charset=UTF-8" language="java" %&gt;`指令应设置正确的...

Global site tag (gtag.js) - Google Analytics