`
squall140
  • 浏览: 146247 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

JBoss 6中整合EJB3与Struts2

    博客分类:
  • EJB
 
阅读更多

文章转自: http://zhouke-nwpu.iteye.com/blog/1058318

 

 

 

 

下面是鄙人做JBoss 6整合EJB3与Struts2时遇到的一些问题,解决之后决定把它整理出来,或许能帮到某位正在为此问题困惑的同仁,若有疏漏或错误请直接扔砖。
    最近在做一个Java平台下的项目,考虑到后期业务逻辑可能非常复杂,为了今后能充分利用JBoss应用服务器所提供的服务,因此决定采用EJB3实现业务逻辑,而又想充分利用Struts2作为WEB框架所带来的简洁性,因此决定采用EJB3整合Struts2,但之前的尝试发现Struts2无法在JBoss6中部署,此问题一直未能解决,于是选择了一种折中的方案,JBoss中部署EJB模块,Tomcat中部署表现层模块,由Spring为Struts2提供ObjectFactory,并负责通过JNDI查找并注入EJB远程业务对象。
    原型开发完毕之后,发现性能不佳,原因也显而易见,引入了分布式——RMI,于是决定只使用JBoss6作为应用服务器,去掉Tomcat。但Struts2无法在JBoss6中部署,直接用Servlet开发WEB层又过于繁琐,于是痛下决心,看看究竟什么原因让Struts2无法与JBoss6并存,看着部署时的各种堆栈异常发呆,迟迟找不到解决方案,于是拿出最后的杀手锏——Google一番,相关资料很少,煞费苦心之后终于找到了一些参考,还是国外的——英语,勉强看吧,原来是Struts2中的Xwork包不能在JBoss6中部署,原因是由于JBoss6中增加了一种新的Jar文件前缀vfs,而XWork仅能兼容JBoss5之前的版本,只需对XWork一个类中的代码稍加修改,一切OK。
    该项目采用Maven做项目管理,考虑到项目构建的跨平台性,决定将XWork源码修改后作为自己项目的一个子模块发布,修改相当简单,只需对com.opensymphony.xwork2.util.URLUtil类稍作修改即可,以下是XWork发布包中该类的部分源代码:

Java代码 复制代码   收藏代码
  1. /*  
  2.  * Copyright (c) 2002-2003 by OpenSymphony  
  3.  * All rights reserved.  
  4.  */   
  5. package  com.opensymphony.xwork2.util;   
  6.   
  7. import  java.util.regex.Pattern;   
  8. import  java.util.regex.Matcher;   
  9. import  java.net.URL;   
  10. import  java.net.MalformedURLException;   
  11.   
  12. /**  
  13.  * Helper class to extract file paths from different urls  
  14.  */   
  15. public   class  URLUtil {   
  16.   
  17.      /**  
  18.      * Prefix for Jar files in JBoss Virtual File System  
  19.      */   
  20.      public   static   final  String JBOSS5_VFSZIP =  "vfszip" ;   
  21.      public   static   final  String JBOSS5_VFSMEMORY =  "vfsmemory" ;   
  22.   
  23.          /**  
  24.      * Check if given URL is pointing to JBoss 5 VFS resource  
  25.      * @param fileUrl  
  26.      * @return  
  27.      */   
  28.      public   static   boolean  isJBoss5Url(URL fileUrl) {   
  29.          final  String protocol = fileUrl.getProtocol();   
  30.          return  JBOSS5_VFSZIP.equals(protocol) || JBOSS5_VFSMEMORY.equals(fileUrl.getProtocol());   
  31.     }   
  32.   
  33. }  
/*
 * Copyright (c) 2002-2003 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.xwork2.util;

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.net.URL;
import java.net.MalformedURLException;

/**
 * Helper class to extract file paths from different urls
 */
public class URLUtil {

    /**
     * Prefix for Jar files in JBoss Virtual File System
     */
    public static final String JBOSS5_VFSZIP = "vfszip";
    public static final String JBOSS5_VFSMEMORY = "vfsmemory";

        /**
     * Check if given URL is pointing to JBoss 5 VFS resource
     * @param fileUrl
     * @return
     */
    public static boolean isJBoss5Url(URL fileUrl) {
        final String protocol = fileUrl.getProtocol();
        return JBOSS5_VFSZIP.equals(protocol) || JBOSS5_VFSMEMORY.equals(fileUrl.getProtocol());
    }

}


以下是修改后的源文件,仅需添加一个新的静态字符串常量"vfs"并对isJBoss5Url方法稍作修改即可:

Java代码 复制代码   收藏代码
  1. /*  
  2.  * Copyright (c) 2002-2003 by OpenSymphony  
  3.  * All rights reserved.  
  4.  */   
  5. package  com.opensymphony.xwork2.util;   
  6.   
  7. import  java.util.regex.Pattern;   
  8. import  java.util.regex.Matcher;   
  9. import  java.net.URL;   
  10. import  java.net.MalformedURLException;   
  11.   
  12. /**  
  13.  * Helper class to extract file paths from different urls  
  14.  */   
  15. public   class  URLUtil {   
  16.   
  17.      /**  
  18.      * Prefix for Jar files in JBoss Virtual File System  
  19.      */   
  20.      public   static   final  String JBOSS6_VFS =  "vfs" ;   
  21.      public   static   final  String JBOSS5_VFSZIP =  "vfszip" ;   
  22.      public   static   final  String JBOSS5_VFSMEMORY =  "vfsmemory" ;   
  23.   
  24.      /**  
  25.      * Check if given URL is pointing to JBoss 5 VFS resource  
  26.      * @param fileUrl  
  27.      * @return  
  28.      */   
  29.      public   static   boolean  isJBoss5Url(URL fileUrl) {   
  30.          final  String protocol = fileUrl.getProtocol();   
  31.          return  JBOSS6_VFS.equals(protocol) || JBOSS5_VFSZIP.equals(protocol) || JBOSS5_VFSMEMORY.equals(fileUrl.getProtocol());   
  32.     }   
  33.   
  34. }  
/*
 * Copyright (c) 2002-2003 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.xwork2.util;

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.net.URL;
import java.net.MalformedURLException;

/**
 * Helper class to extract file paths from different urls
 */
public class URLUtil {

    /**
     * Prefix for Jar files in JBoss Virtual File System
     */
	public static final String JBOSS6_VFS = "vfs";
    public static final String JBOSS5_VFSZIP = "vfszip";
    public static final String JBOSS5_VFSMEMORY = "vfsmemory";

    /**
     * Check if given URL is pointing to JBoss 5 VFS resource
     * @param fileUrl
     * @return
     */
    public static boolean isJBoss5Url(URL fileUrl) {
        final String protocol = fileUrl.getProtocol();
        return JBOSS6_VFS.equals(protocol) || JBOSS5_VFSZIP.equals(protocol) || JBOSS5_VFSMEMORY.equals(fileUrl.getProtocol());
    }

}


    OK,就这么简单,为了便于在以后的项目中重用,特意把XWork发布包的POM文件做了一番修改,将修改后的XWork作为自己项目的一个模块来使用,POM文件代码就不列出了,构建该项目时使用的是Maven3,如果哪位同仁遇到了同样的问题,而且在用Maven做项目管理,那么该模块可以直接添加到你的项目中,整个模块作为Maven项目上传在附件中:
    好了,终于可以在JBoss 6中部署Struts2,但是,Spring现在用来做什么呢?JNDI查找?依赖注入?既然是在同一个容器中,那么能不能直接把EJB注入Struts中的Action呢,
只知道EJB能被注入Servlet等受管资源中,试一试再说。首先彻底将Spring移除,哇,项目发布包小了不少,给力,呵呵~~,然后直接在Struts2 Action中采用注解注入EJB,修改完成之后,部署运行,果不出所料,NullPointerException~~~,看来是不行,Google一下,找到了一个插件——strus2-ejb3-plugin,该插件是个Google开源项目,项目首页是
http://code.google.com/p/struts2-ejb3-plugin/ ,大家可以看看怎么使用。相当简单,几乎是零配置,默认的配置就可以搞定,只需要把这个插件添加在你的类路径中。我的项目是打包成EAR包,如application.ear,那么仅需要在类路径下添加struts2-ejb3-plugin.properties,内容如下所示:

Java代码 复制代码   收藏代码
  1. #struts-ejb3-plugin.properties   
  2.   
  3. # ear file path, leave empty  if  not applicable   
  4. earFileBaseName=application  
#struts-ejb3-plugin.properties

# ear file path, leave empty if not applicable
earFileBaseName=application


除此之外,在你的类路径下添加jndi.properties文件,如下所示:

Java代码 复制代码   收藏代码
  1. java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory   
  2. java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces   
  3. java.naming.provider.url=jnp: //localhost:1099   
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099


    重新构建部署项目,一切OK,尽情享受EJB3与Struts2的整合吧,enjoy it!
    哦,不对,还有一点小小的缺陷,既然我的项目是用Maven作项目管理的,而这个插件项目并未使用Maven,搜索过几个主要的仓库之后,都没有该构件,如果直接把该插件放在类路径中,那岂不是失去了Maven的长处?OK,这个好办,既然是开源的,那就自己用Maven构建它,和上面的XWork模块一样,将它作为自己项目的一部分,让Maven来为你做这些吧。该构件也作为Maven项目一并上传至附件中。遇到同样问题的同仁可以直接使用它,不用浪费自己宝贵的时间了。OK,就这么多,经过调整之后,性能有了明显的改善,以后若采用同样的架构,便可一劳永逸。
    第一次在JavaEye上发文章,以前一直看各位大侠的文章来帮助自己解决问题,提高自己,实在不好意思写什么,因为自己很菜。昨天解决了这个困扰自己已久的问题,有点小激动,于是乎把这些问题整理出来,兴许能帮到哪位同仁!!!

 

分享到:
评论

相关推荐

    EJB3与Struts与Spring整合开发(SSE)

    在"EJB3与Struts与Spring整合开发(SSE)"的场景中,开发者可能将EJB3作为业务逻辑层,处理复杂的业务操作;Struts作为前端控制器,负责用户交互和请求转发;而Spring则作为整个应用的“胶水”,实现各层间的协调和...

    struts2-ejb3配置

    在JBoss 6这样的应用服务器上整合Struts2和EJB3时,可能会遇到一些挑战。首先,Struts2在JBoss 6中可能出现部署问题,这主要是因为JBoss 6引入了新的Jar文件前缀“vfs”,而Struts2的Xwork组件对此不兼容。Xwork是...

    ejb3整合Struts1.x实例

    整合EJB3和Struts1.x可以帮助我们构建一个分层架构的Web应用,使得业务逻辑和用户界面分离,提高了代码的可维护性和可扩展性。同时,利用EJB3的事务管理和JPA的ORM能力,可以有效地处理数据库操作。在实际开发中,还...

    EJB+struts2整合示例

    在整合EJB与Struts2的项目中,Struts2负责接收用户请求,调用EJB方法处理业务逻辑,然后将结果传递给视图层进行展示。 **整合过程** 可能包括以下步骤: 1. **配置Struts2**:首先,需要在Struts2的配置文件(通常...

    spring+struts+ejb整合

    它与Spring的集成可以通过Spring-Struts2插件实现,这样可以利用Spring的依赖注入功能,增强Struts 2的控制器组件。 3. **EJB 3**:在JBOSS服务器下运行,EJB 3提供了一种简化的方式来创建和部署业务逻辑组件。EJB ...

    Struts2与EJB3完美整合

    在本文中,我们将探讨如何将流行的Java Web框架Struts2与企业级JavaBeans(EJB)3.0版本进行整合,以实现一个简单的登录功能。Struts2是一个强大的MVC框架,而EJB3则提供了企业级服务,如事务管理、安全性以及组件的...

    精通java Web开发--基于Struts EJB.zip

    - **松耦合**:Struts与EJB之间通过接口通信,降低了组件间的依赖性。 - **可重用性**:EJB可以独立于Struts使用,也可以与其他框架结合。 - **事务管理**:EJB提供内置的事务支持,确保数据的一致性和完整性。 在...

    struts2.1.6+spring2.0+hibernate3.2常用配置包

    最近温习ssh2整合编程,顺便浏览下struts2有什么更新的消息,下载了新版本的struts2的2.1.8.1版,使用的是MyEclipse8.0开发,但是问题就随之而来了。MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5...

    EJB模式开发的CMSDemo

    CMSDemo通过整合EJB和Struts,构建了一个高效且可扩展的Web内容管理系统。开发者可以从这个项目中学习到如何使用Java EE技术栈来构建企业级应用,同时理解MVC模式在实际开发中的应用。通过分析其源代码,可以深入...

    Jboss seam 一个深度集成框架

    这解决了 JSF 和 EJB3 在 JavaEE 中未能很好整合的问题。在传统方法中,如果要实现 JSF 页面中的数据库操作,开发者通常需要编写大量的 JSF BackingBean 代码来处理 UI 事件。而 Seam 通过允许使用 EJB3 Beans 直接...

    struts2.1.8 + spring2.5.6 + hibernate3.3.2整合

    ### Struts2.1.8 + Spring2.5.6 + Hibernate3.3.2整合实践 #### 一、概述 在Java Web开发领域,Struts2、...通过以上步骤,可以实现Struts2、Spring和Hibernate的整合,为开发复杂的Java Web应用提供强大的技术支持。

    精通Struts-Java流行服务器、框架、工具及整合应用(戎伟,张双编著).rar

    Java流行服务器、框架、工具及整合应用》一书旨在为Java开发者提供一套全面的学习和实践指南,帮助他们掌握使用Struts进行Web开发的技能,理解与之相关的各种工具和技术,并能灵活地将它们整合到实际项目中,提升...

    JBoss_AS7+JBoss_Tools+Eclipse3.7集成介绍

    在这个版本中,JBoss Tools 被整合进来,使得开发者可以在一个统一的环境中进行 JBoss 相关的工作。通过 "Help -> Install New Software…" 功能,用户可以轻松地添加和更新 JBoss Tools 插件,以增强 Eclipse 对 ...

    EJB3.0个人笔记

    #### 七、EJB3.0与其他技术的整合 常见的技术组合包括: - **Struts/MyFaces + EJB (JDBC):** 适用于需要分布式技术的大型项目,尤其是对于大并发访问量和高性能要求的场景。 - **Struts/MyFaces + Spring + ...

    使用JBOSS 学习JAVA 快速WEB 编程

    2. 实体类与数据库表的映射是Java Persistence API(JPA)的基础,开发者需要理解如何使用注解或XML配置来定义这种关系。 3. 类成员的命名也应遵循驼峰式命名,并且要清晰反映其功能,以便团队协作时能快速理解。 4....

    SSH+JBoss+多线程的电子宠物系统

    SSH+JBoss+多线程的电子宠物系统是一种基于Java技术栈开发的复杂应用程序,它融合了Spring、Struts和Hibernate三大主流框架的优势,利用JBoss应用服务器提供服务,并通过多线程技术来实现高性能和高并发处理。...

    [程序天下:J2EE整合详解与典型案例.教程_光盘4.rar

    这包括Web容器(如Tomcat或Jetty)与EJB容器(如JBoss或WebLogic)的协同工作,以及如何配置和管理各种服务,如数据库连接池、安全机制、事务管理等。 【典型案例分析】 光盘4可能包含一些实际的项目案例,用于...

Global site tag (gtag.js) - Google Analytics