使用struts2注解(struts2-convention-plugin-2.1.8.1)无配置开发的web项目,在tomcat里面运行没有问题,移植到jboss后出现:no result defined for action异常,无法访问action,上google查询资料,找到相应解决方案。 Jboss使用了vfs,于是于是URL的protocol都变成了vfsfile, vfszip等等。 查看xword的源码,在类com.opensymphony.xwork2.util.finder.ClassFinder的 122行左右,里面是写死的,"jar".equals(location.getProtocol(), "file".equals(location.getProtocol()。 解决方法:由于不能影响到非jboss server,如tomcat,所以不好改写ClassFinder。采用改写struts2 convention插件的方案,替换org.apache.struts2.convention.ActionConfigBuilder 如下:
<bean type="org.apache.struts2.convention.ActionConfigBuilder" name="convention" class="com.sunyard.ices.web.actions.jxc.MyActionConfigBuilder"/>
MyActionConfigBuilder类的内容如下:
package com.sunyard.ices.web.actions.jxc; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.convention.PackageBasedActionConfigBuilder; import com.opensymphony.xwork2.ObjectFactory; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.finder.ClassFinder; import com.opensymphony.xwork2.util.finder.Test; public class MyActionConfigBuilder extends PackageBasedActionConfigBuilder { private static Log log = LogFactory.getLog(MyActionConfigBuilder.class); private static final String BASE_FILE = "struts.xml"; private String[] actionPackages; private String[] packageLocators; public static String classPath = ""; /** * * @param configuration * @param container * @param objectFactory * @param redirectToSlash * @param defaultParentPackage */ @Inject public MyActionConfigBuilder(Configuration configuration, Container container, ObjectFactory objectFactory, @Inject("struts.convention.redirect.to.slash") String redirectToSlash, @Inject("struts.convention.default.parent.package") String defaultParentPackage) { super(configuration, container, objectFactory, redirectToSlash, defaultParentPackage); } /** * * @param actionPackages * (Optional) An optional list of action packages that this * should create * * configuration for. * */ @Inject(value = "struts.convention.action.packages", required = false) public void setActionPackages(String actionPackages) { super.setActionPackages(actionPackages); if (!"".equals(actionPackages.trim())) { this.actionPackages = actionPackages.split("\\s*[,]\\s*"); } } /** * * @param packageLocators * (Optional) A list of names used to find action packages. * */ @Inject(value = "struts.convention.package.locators", required = false) public void setPackageLocators(String packageLocators) { super.setPackageLocators(packageLocators); this.packageLocators = packageLocators.split("\\s*[,]\\s*"); } @Override @SuppressWarnings("unchecked") protected Set<Class> findActions() { Set<Class> classes = new HashSet<Class>(); try { // ClassFinder finder = new ClassFinder(getClassLoaderForFinder(), buildUrls(), true); ClassFinder finder = new ClassFinder(getClassLoaderInterface(), buildUrls(), true); if (actionPackages != null) { for (String packageName : actionPackages) { Test<ClassFinder.ClassInfo> test = getPackageFinderTest(packageName); classes.addAll(finder.findClasses(test)); } } // package locators if (packageLocators != null) { for (String packageLocator : packageLocators) { Test<ClassFinder.ClassInfo> test = getPackageLocatorTest(packageLocator); classes.addAll(finder.findClasses(test)); } } } catch (Exception ex) { if (log.isErrorEnabled()) { log.error("Unable to scan named packages", ex); } } return classes; } private List<URL> buildUrls() throws MalformedURLException { List<URL> urls = new ArrayList<URL>(); URL classesUrl = getClassLoader().getResource(BASE_FILE); if (classesUrl == null) { throw new IllegalStateException("File " + BASE_FILE + " was not found. The folder WEB-INF/classes discovery base on file classes/" + BASE_FILE + "."); } String baseFilePath = classesUrl.getFile(); URL url = new URL("file", "", baseFilePath.substring(0, baseFilePath.indexOf(BASE_FILE))); System.out.println(url); if (log.isInfoEnabled()) { classPath = url.getFile(); log.info("Struts2 ActionConfigBuilder, classes directory: " + classPath); } System.out.println("classPath = " + classPath); System.out.println(url.toExternalForm()); urls.add(url); return urls; } /*private ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); }*/ }
,
上述解决了struts2注解开发方式无法访问action的问题
但是jboss对spring的支持也有问题,解决方案
需引入jboss-spring-int-vfs.jar
在web.xml 加入配置:
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.jboss.spring.vfs.context.VFSXmlWebApplicationContext
</param-value>
</context-param>
这样就不会有问题,如果要在tomcat运行需要去掉web的配置
相关推荐
JBoss是基于Java的开源应用服务器,支持EJB3和Spring等框架,用于部署和运行Web应用程序。在这个项目中,它作为运行环境,承载着EJB组件和Struts2应用。 在压缩包的文件名称列表中,"www.pudn.com.txt"可能是一个...
EJB3、Struts和Spring是Java企业级开发中的三个重要框架,它们分别在不同的层次上解决了应用程序的设计和管理问题。EJB3是Java企业版(Java EE)的一部分,提供了面向服务的组件模型,用于构建可扩展且可靠的分布式...
在IT行业中,Spring、Struts和EJB是三个非常重要的框架,它们分别专注于不同领域的应用开发。Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的企业级服务。...
8. **部署与运行**:项目部署通常涉及到Web服务器(如Tomcat)和应用服务器(如JBoss)的配置,包括web.xml文件的设置,以确保Spring和Struts的正确加载和初始化。 9. **测试**:在集成环境中,单元测试和集成测试...
### Struts2.1.8 + Spring2.5.6 + Hibernate3.3.2整合实践 #### 一、概述 在Java Web开发领域,Struts2、...通过以上步骤,可以实现Struts2、Spring和Hibernate的整合,为开发复杂的Java Web应用提供强大的技术支持。
在Java EE项目中,Eclipse能够方便地创建、配置和运行Web项目,支持多种服务器插件如Tomcat、Jboss等,为开发带来便利。 Spring框架是Java EE应用中的核心组件,它提供了一种轻量级的容器,用于管理对象的生命周期...
### J2EE考试复习知识点详解 #### Struts2框架概览 - **起源与组成**:Struts2框架源于WebWork框架与XWork...以上知识点涵盖了Struts2、Spring、Hibernate及EJB的主要概念和技术细节,有助于深入理解和掌握这些技术。
2. **集成第三方框架**:可轻松集成Spring、Struts等流行框架,扩展应用功能。 总之,JBoss 4.2.2.GA作为一个成熟的Java EE应用服务器,为企业级应用开发提供了强大的支持。通过深入理解其核心特性、部署配置、安全...
标题中的“SSH 配置实例: Spring 3.1 + Hibernate 4.2 + Struts 2.3”指的是一个集成开发环境的配置教程,它将三个流行的技术框架——Spring、Hibernate和Struts2——结合在一起,用于构建企业级Java应用。...
为了解决这些问题,**Struts2**进一步发展并改进了Struts1的设计理念。Struts2采用了拦截器(Interceptor)模型,允许Action类直接继承自JavaBean,从而提供了更好的灵活性和可扩展性。Struts2的核心特性包括: - *...
9. **与其他框架的整合**:Spring 2.5增强了与Struts、JSF等其他Web框架的集成,以及与Quartz、JBoss等任务调度、EJB等企业服务的整合。 10. **性能优化**:Spring 2.5在性能方面也有提升,包括更快的启动时间,更...
我们将讨论SSH(Spring、Struts2、Hibernate)项目的配置以及客户端和服务器端之间的交互。 首先,SSH是一个广泛使用的Java Web开发框架组合,它由Spring框架负责控制层,Struts2处理视图层,而Hibernate则用于持久...
SSH分别代表Struts、Spring和Hibernate,而SSI则通常指Spring和iBatis。这篇文章将详细解析这两个集成过程以及相关缓存技术。 首先,SSH集成涉及Struts、Spring和Hibernate的整合。Struts作为MVC框架负责前端展示...
SSH(Struts、Spring、Hibernate)是Java Web开发中常用的一种框架组合,用于构建高效、可维护性高的企业级应用程序。这些框架各自负责不同的职责:Struts处理MVC(Model-View-Controller)架构,Spring提供依赖注入...
整合SSH的过程中,需要注意版本兼容性问题,不同版本的SSH框架可能存在不兼容的情况,因此选择匹配的版本组合非常重要。此外,良好的模块化设计和代码组织结构也是保证整合成功的关键因素。 通过SSH整合,开发者...
6. **集成与配置**:SSH框架的集成涉及到各个组件的配置,如Struts的配置文件、Spring的ApplicationContext配置文件、Hibernate的实体映射文件(hbm.xml或注解)。这些配置文件定义了各层间的协作方式,以及如何将...
SSH框架,全称为Spring、Struts和Hibernate的组合,是Java Web开发中广泛使用的三大开源框架。它们分别负责不同层面的应用:Spring提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,用于简化应用程序的开发和...
Struts、Hibernate、Spring 这三个框架是Java开发中非常重要的组成部分,它们分别负责Web应用程序的展示层、持久层和业务层。以下是对这三个框架基础知识的深入解释。 **Struts框架**是MVC(Model-View-Controller...
SSH框架是Java开发中常用的三大框架——Spring、Struts和Hibernate的组合,它们协同工作以构建高效、可维护的企业级应用程序。本压缩包提供了一个经过调试的SSH整合包,可以直接用于项目开发,大大节省了配置和调试...