- 浏览: 386981 次
- 性别:
- 来自: 印度
文章分类
最新评论
-
天天来注册:
...
多线程的死锁 -
memoryisking:
可以看看这篇文章,这个是struts教程网上一个简单的例子,构 ...
Java5中的线程池实例讲解 -
a123159521:
菜鸟不再菜 写道楼主很明显没有说明守护线程到底是怎么服务Use ...
守护线程总结 -
jjruanlili:
要搞个executor和nio的结合,差不多
Java5中的线程池实例讲解 -
josico:
纠正楼主一个问题‘如果四个队员都在忙时,再有新的任务,这个小组 ...
线程池ThreadPoolExecutor使用简介
目前在做JBoss下布署String2.5 & Struts2集成的工程,在工程中用Spring2.5 的component scan, Struts2 的convention 和 rest plugins。在JBoss下部署都有问题:
Spring 2.5 component scan所有annotation标注的component都无法找到。原因是JBoss用了VFS,所以在Spring中找不到。
解决方法:使用jboss的 spring-int-vfs 中提供的 org.jboss.spring.vfs.context.VFSClassPathXmlApplicationContext。这个包可以在http://sourceforge.net/projects/jboss/files/JBoss-Spring%20Integration/
下载到,在页面中部,可以找到JBoss-Spring Integration。下面是我的一段代码:
ApplicationContext appContext = null;
switch(serverType) {
case tomcat:
appContext = new ClassPathXmlApplicationContext(configFiles);
break;
case jboss:
appContext = new VFSClassPathXmlApplicationContext(configFiles);
break;
}
Struts2 convention, 原因也是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如下:
File: src\plugins\convention\src\main\resources\struts-plugin.xml
<bean type="org.apache.struts2.convention.ActionConfigBuilder" class="com.playphone.struts.convention.MyActionConfigBuilder"/>
MyActionConfigBuilder类的内容如下,这里只是简单的解析WEB-INF/classes下的类,因为我没用到jar包需要被认为action的情况,所以简化。
package com.playphone.struts.convention;
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.ActionNameBuilder;
import org.apache.struts2.convention.InterceptorMapBuilder;
import org.apache.struts2.convention.PackageBasedActionConfigBuilder;
import org.apache.struts2.convention.ResultMapBuilder;
import org.apache.struts2.convention.StringTools;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.finder.ClassFinder;
import com.opensymphony.xwork2.util.finder.Test;
import com.playphone.spring.EnvVariable;
import com.playphone.spring.ServerType;
/**
* Solve the problem that could not found action under JBoss.
*
* @author <a href="mailto:sunyi4j@gmail.com">Roy</a> on Jul 6, 2009
*/
public class MyActionConfigBuilder extends PackageBasedActionConfigBuilder {
private static Log log = LogFactory.getLog(MyActionConfigBuilder.class);
private static final String BASE_FILE = "appContext.xml";
private String[] actionPackages;
private String[] packageLocators;
/**
* Constructs actions based on a list of packages.
*
* @param configuration The XWork configuration that the new package configs and action configs
* are added to.
* @param actionNameBuilder The action name builder used to convert action class names to action
* names.
* @param resultMapBuilder The result map builder used to create ResultConfig mappings for each
* action.
* @param interceptorMapBuilder The interceptor map builder used to create InterceptorConfig mappings for each
* action.
* @param objectFactory The ObjectFactory used to create the actions and such.
* @param redirectToSlash A boolean parameter that controls whether or not this will create an
* action for indexes. If this is set to true, index actions are not created because
* the unknown handler will redirect from /foo to /foo/. The only action that is created
* is to the empty action in the namespace (e.g. the namespace /foo and the action "").
* @param defaultParentPackage The default parent package for all the configuration.
*/
@Inject
public MyActionConfigBuilder(
Configuration configuration,
ActionNameBuilder actionNameBuilder,
ResultMapBuilder resultMapBuilder,
InterceptorMapBuilder interceptorMapBuilder,
ObjectFactory objectFactory,
@Inject("struts.convention.redirect.to.slash") String redirectToSlash,
@Inject("struts.convention.default.parent.package") String defaultParentPackage) {
super(
configuration,
actionNameBuilder,
resultMapBuilder,
interceptorMapBuilder,
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 (!StringTools.isTrimmedEmpty(actionPackages)) {
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() {
if(EnvVariable.getServerType() == ServerType.tomcat) {
return super.findActions();
} else {
Set<Class> classes = new HashSet<Class>();
try {
ClassFinder finder = new ClassFinder(getClassLoaderForFinder(), buildUrls(), true);
// named packages
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 appContext.xml was not found. The folder WEB-INF/classes discovery base on file classes/appContext.xml.");
}
String baseFilePath = classesUrl.getFile();
URL url = new URL("file", "", baseFilePath.substring(0, baseFilePath.indexOf(BASE_FILE)));
if (log.isInfoEnabled()) {
log.info("Struts2 ActionConfigBuilder, classes directory: " + url.getFile());
}
urls.add(url);
return urls;
}
private ClassLoader getClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
}
为了调试方便,可以打开org.apache.struts2.convention log level为debug,然后你就可以清晰地看到哪些action被认出来了。
Spring 2.5 component scan所有annotation标注的component都无法找到。原因是JBoss用了VFS,所以在Spring中找不到。
解决方法:使用jboss的 spring-int-vfs 中提供的 org.jboss.spring.vfs.context.VFSClassPathXmlApplicationContext。这个包可以在http://sourceforge.net/projects/jboss/files/JBoss-Spring%20Integration/
下载到,在页面中部,可以找到JBoss-Spring Integration。下面是我的一段代码:
ApplicationContext appContext = null;
switch(serverType) {
case tomcat:
appContext = new ClassPathXmlApplicationContext(configFiles);
break;
case jboss:
appContext = new VFSClassPathXmlApplicationContext(configFiles);
break;
}
Struts2 convention, 原因也是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如下:
File: src\plugins\convention\src\main\resources\struts-plugin.xml
<bean type="org.apache.struts2.convention.ActionConfigBuilder" class="com.playphone.struts.convention.MyActionConfigBuilder"/>
MyActionConfigBuilder类的内容如下,这里只是简单的解析WEB-INF/classes下的类,因为我没用到jar包需要被认为action的情况,所以简化。
package com.playphone.struts.convention;
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.ActionNameBuilder;
import org.apache.struts2.convention.InterceptorMapBuilder;
import org.apache.struts2.convention.PackageBasedActionConfigBuilder;
import org.apache.struts2.convention.ResultMapBuilder;
import org.apache.struts2.convention.StringTools;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.finder.ClassFinder;
import com.opensymphony.xwork2.util.finder.Test;
import com.playphone.spring.EnvVariable;
import com.playphone.spring.ServerType;
/**
* Solve the problem that could not found action under JBoss.
*
* @author <a href="mailto:sunyi4j@gmail.com">Roy</a> on Jul 6, 2009
*/
public class MyActionConfigBuilder extends PackageBasedActionConfigBuilder {
private static Log log = LogFactory.getLog(MyActionConfigBuilder.class);
private static final String BASE_FILE = "appContext.xml";
private String[] actionPackages;
private String[] packageLocators;
/**
* Constructs actions based on a list of packages.
*
* @param configuration The XWork configuration that the new package configs and action configs
* are added to.
* @param actionNameBuilder The action name builder used to convert action class names to action
* names.
* @param resultMapBuilder The result map builder used to create ResultConfig mappings for each
* action.
* @param interceptorMapBuilder The interceptor map builder used to create InterceptorConfig mappings for each
* action.
* @param objectFactory The ObjectFactory used to create the actions and such.
* @param redirectToSlash A boolean parameter that controls whether or not this will create an
* action for indexes. If this is set to true, index actions are not created because
* the unknown handler will redirect from /foo to /foo/. The only action that is created
* is to the empty action in the namespace (e.g. the namespace /foo and the action "").
* @param defaultParentPackage The default parent package for all the configuration.
*/
@Inject
public MyActionConfigBuilder(
Configuration configuration,
ActionNameBuilder actionNameBuilder,
ResultMapBuilder resultMapBuilder,
InterceptorMapBuilder interceptorMapBuilder,
ObjectFactory objectFactory,
@Inject("struts.convention.redirect.to.slash") String redirectToSlash,
@Inject("struts.convention.default.parent.package") String defaultParentPackage) {
super(
configuration,
actionNameBuilder,
resultMapBuilder,
interceptorMapBuilder,
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 (!StringTools.isTrimmedEmpty(actionPackages)) {
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() {
if(EnvVariable.getServerType() == ServerType.tomcat) {
return super.findActions();
} else {
Set<Class> classes = new HashSet<Class>();
try {
ClassFinder finder = new ClassFinder(getClassLoaderForFinder(), buildUrls(), true);
// named packages
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 appContext.xml was not found. The folder WEB-INF/classes discovery base on file classes/appContext.xml.");
}
String baseFilePath = classesUrl.getFile();
URL url = new URL("file", "", baseFilePath.substring(0, baseFilePath.indexOf(BASE_FILE)));
if (log.isInfoEnabled()) {
log.info("Struts2 ActionConfigBuilder, classes directory: " + url.getFile());
}
urls.add(url);
return urls;
}
private ClassLoader getClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
}
为了调试方便,可以打开org.apache.struts2.convention log level为debug,然后你就可以清晰地看到哪些action被认出来了。
发表评论
-
mysql-5.1.47二进制版本的安装
2011-09-12 00:11 1564二进制版本的mysql是已经编译好的,无需 configure ... -
Ubuntu10.10下安装mysql 5.5.10二进制包
2011-09-11 21:52 3306下载最新的mysql-5.5.10-linux2.6-i686 ... -
jboss部署架构
2010-06-30 16:20 1588JBoss Application Server的部署架构 J ... -
jboss移除组件
2010-06-30 16:19 1290Service ... -
jboss修改默认端口
2010-06-30 16:01 2469如果在一台机器上部署了多个jboss server或者jbos ... -
jboss日志重定向
2010-06-30 16:00 1625Jboss 日志重定向到/opt/log,并只生成WARN级别 ... -
无法停止jboss
2010-06-30 15:59 3242无法停止JBoss 报错Failed to connect t ... -
jboss用户验证
2010-06-30 15:58 1838当我们配置好Jboss后,任何人都可以访问http://loc ... -
jboss启动多个实例
2010-06-30 15:57 15671.cp -rp $jboss_Home/server/de ... -
jboss安装
2010-06-30 15:53 1339Jboss: http://downloads.sourcef ... -
测试Jboss,Tomcat服务器有没有启动成功
2010-06-30 11:11 1781在自动化构建时,我们常常要判断web容器有没有正常启动,如下脚 ... -
tomcat 和 jboss的热部署(热发布)问题
2010-06-29 12:13 1855所谓的热部署(热发布)(下面称为“热部署”),就是说,在web ... -
Jboss5的安装配置
2010-06-28 13:33 1951<!--[if !supportLists]--> ... -
关于JBoss乱码的问题
2010-06-28 12:29 1192针对JBoss服务器,以前的解决方案如下: 1 修改 jbos ...
相关推荐
Struts2是一个基于MVC设计模式的Web应用框架,Spring2.5则是一个全面的企业级应用框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,而Hibernate3.3是一个持久化框架,负责对象关系映射(ORM)。 在这个整合...
9. **与其他框架的整合**:Spring 2.5增强了与Struts、JSF等其他Web框架的集成,以及与Quartz、JBoss等任务调度、EJB等企业服务的整合。 10. **性能优化**:Spring 2.5在性能方面也有提升,包括更快的启动时间,更...
Jboss7上+maven搭建struts2+spring3+hibernate3完整能运行工程源码,在tomcat7上运行也成功测试了,注意:我工程文件是用myeclipse2013开发的,你需要导入自己ide的时候,会有兼容性问题:最好阁下是自己新建一个maven...
刚开始用ssh,建了个试试,发现可以用。 根据自己的oracle数据库...struts2+hibernate3.3+spring2.5,我采用的是jboss服务器,用myeclipse6.0+jdk6.0开发的。 至于其他的问题可以加我QQ342057980.可以一起研究研究。
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
根据提供的标题、描述以及部分内容,本文将详细解析与MYECLIPSE + STRUTS2 + SPRING4 + HIBERNATE4 + STRUCTS2S+OGNL + MYSQL_5.7.12相关的技术栈及其应用。这些技术在企业级开发中非常常见,能够帮助开发者构建高效...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责不同的职责:Struts2专注于MVC(Model-View-Controller)架构的实现,Spring提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,而...
具体来说,Apache Struts2的action:、redirect:和redirectAction:前缀允许攻击者构造恶意URL,执行任意Java代码,甚至执行系统命令,这被CNVD评定为“高危”级别。为解决这一问题,最直接的办法是更新Struts2的jar包...
MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5的,hibernate版本较多些至3.2,首先选版本就选择最优的,struts2没的选只有2.1.6版的,所以先导入struts2支持,然后是spring选的是2.0,问题就出在...
标题中的"ejb3.rar_EJB3 struts2_MyEclipse EJ_ejb strut jboss_jboss_struts2"表明这是一个关于企业级Java开发的项目,主要涉及到EJB(Enterprise JavaBeans)3.0、Struts2框架、MyEclipse集成开发环境以及JBoss...
整合Spring框架和Struts2框架可以创建高效且可维护的Web应用程序。以下是详细配置步骤: 1. **开发工具准备**: - **Eclipse for Java EE**:下载并安装适用于Java EE开发的Eclipse版本。例如,可以选择Helios ...
最后,提供的"Struts2及jboss漏洞利用工具"可能是一个用于测试系统安全性的工具,也可能被恶意用户用来探测和利用漏洞。作为负责任的IT专业人员,我们应只在授权的环境中使用此类工具,并且仅用于合法的安全评估和...
`jboss-spring-int-vfs.jar`就是为了让Spring能够理解和利用JBoss的VFS,从而在JBoss环境下正确地处理文件资源,如加载配置文件、读写日志等。这个插件使得Spring应用无需关心具体的文件系统实现,只需遵循VFS接口,...
它提供了在JBoss AS环境下运行Spring应用所需的类和接口,确保Spring的配置和组件能够在JBoss服务器上正常启动和运行。这个版本可能包含对JBoss AS特定版本的适配和优化,以便更好地与Spring框架协作。 4. **`jboss...
本文档旨在提供一套详尽的指南,帮助读者顺利安装和部署 EJBCA(Enterprise JavaBeans Certification Authority)证书管理系统、MySQL 数据库以及 JBoss 应用服务器。这套组合在企业级应用中非常常见,尤其是对于...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同的职责:Struts2主要用于MVC(Model-View-Controller)架构的实现,提供业务逻辑与表现层的解耦;Hibernate则是ORM(Object-Relational ...
本资源包包含一下文件+详细教程 antlr-2.7.7.jar asm-5.2.jar asm-commons-5.2.jar asm-tree-5.2.jar byte-buddy-1.9.10.jar c3p0-0.9.5.2.jar ...struts2-spring-plugin-2.5.20.jar txw2-2.3.1.jar
"jboss-as-sprint-int-5.0.0.GA.jar" 和 "jboss-spring-int-vfs.jar" 是与JBoss应用服务器相关的两个关键组件,主要用于Spring框架与JBoss服务器的集成以及虚拟文件系统(Virtual File System,VFS)的支持。...
D:\spring 3.2.0+hibernate 4.1.6+struts2整合需要的jar包 的目录 2013/05/11 15:26 <DIR> . 2013/05/11 15:26 <DIR> .. 2013/03/21 18:20 445,288 antlr-2.7.7.jar 2013/03/21 18:20 4,467 aopalliance-1.0.jar ...