本文是讲述使用struts2-ejb3-plugin这个插件将Struts2与EJB3.0进行整合开发。
你可以从Apache的Struts2的Plugin列表了解它:
http://cwiki.apache.org/S2PLUGINS/home.html
也可直接进入主页了解它:
http://cwiki.apache.org/S2PLUGINS/struts2-ejb3-plugin.html
或者从该Google代码:
http://code.google.com/p/struts2-ejb3-plugin/
Struts2是时下比较流行的JAVA EE框架,而EJB为JAVA企业平台标准规范并且是JAVA EE体系的核心技术,不过前几年由于EJB2.1的烦琐以及spring、hibernate等轻量级框架的推广流行,EJB2.1大有被取代的趋势。在这种情况下,吸取了spring、hibernate等框架的优点的EJB3.0也就顺理成章的诞生,不过经过了漫长的发布过程后,貌似天下已经是spring、hibernate等轻量级框架的了,在中国国内更是满国尽是SSH(我自己也觉得说得夸张了点^_^)。EJB3.0貌似在中国的关注度并不是很高,也好象并没有多少公司多少人使用它,这也造成了EJB3.0的中文资料比较少,而与像Struts2这样的优秀的框架整合的资料就更少了。曾经在一个项目中决定使用Struts2与EJB3.0,在Struts2的Action与Interceptor里使用context.lookup来查找EJB组件是多么的痛苦。四处寻找好的整合方案,却空手而回。Apache的Struts2的Plugin列表里有两个EJB3.0的Plugin,可以通过注解完成整合,不过因为引入了第三方类库与必须是写死的引用路径而最终放弃了。最后,写了一种模拟应用服务器的规则以及EJB组件生命周期的Plugin,struts2-ejb3-plugin就是这个Plugin。
上面废话了这么多-。-下面进入正题。
插件的安装:
struts2-ejb3-plugin的安装比较简单,拖Struts2优秀的Plugin机制的福,只需要将struts2-ejb3-plugin.jar放到 /WEB-INF/lib 目录中就可以了。
除了plugin本身的配置以外,还需要在 classpath 下创建名为 jndi.properties 的资源文件用做 jndi配置
,plugin 中使用到的jndi查找依赖于该配置。
代码示例:
先是几个SessionBean
@Remote
public interface DemoRemote extends Serializable {
void remoteMethod();
}
@Local
public interface DemoLocal {
void localMethod();
}
@Stateless(name = "ejb/demo1")
public class DemoBean implements DemoLocal, DemoRemote {
private static final long serialVersionUID = -779739898907524857L;
public void localMethod() {
System.out.println("DemoBean本地方法。");
}
public void remoteMethod() {
System.out.println("DemoBean远程方法。");
}
}
@Stateless(name = "ejb/demo2")
public class DemoBean2 implements DemoLocal {
public void localMethod() {
System.out.println("DemoBean2本地方法。");
}
}
@Remote
public interface DemoMethodInjectRemote extends Serializable{
void method();
}
@Local
public interface DemoMethodInjectLocal {
void method();
}
@Stateless
public class DemoMethodInjectBean implements DemoMethodInjectLocal,
DemoMethodInjectRemote {
private static final long serialVersionUID = 806301363823340506L;
public void method() {
System.out.println("DemoMethodInjectBean");
}
}
下面是Interceptor
public class DemoInterceptor1 {
@AroundInvoke
public Object interceptorMethod(InvocationContext invocationContext) throws Exception {
System.out.println("拦截器1。");
return invocationContext.proceed();
}
}
public class DemoInterceptor2 {
@AroundInvoke
public Object interceptorMethod(InvocationContext invocationContext) throws Exception {
System.out.println("拦截器2。");
return invocationContext.proceed();
}
}
SessionBean 与 Interceptor 都会在执行到它们的时候打印出自己的信息。
下面是本文的重点,Struts2的Action
@Interceptors(DemoInterceptor1.class)
public class DemoAction extends ActionSupport {
private static final long serialVersionUID = -472366623817152071L;
@EJB
private DemoRemote demoRemote;
// /////
// 为 glassfish2时,要将本地接口的注入注释掉,glassfish不支持本地接口在web层调用,如果不注释掉会在部署时报错。
@EJB
private DemoLocal demoLocal;
// /////
private DemoMethodInjectRemote demoMethodInjectRemote;
@EJB(beanName = "ejb/demo1")
private DemoRemote demo1;
@EJB(beanName = "ejb/demo1")
private DemoRemote demo2;
@EJB
public void setDemoMethodInjectRemote(
DemoMethodInjectRemote demoMethodInjectRemote) {
this.demoMethodInjectRemote = demoMethodInjectRemote;
}
@PostConstruct
@Interceptors(DemoInterceptor2.class)
@ExcludeClassInterceptors()
public void init() {
System.out.println("初始化。");
}
@Interceptors( { DemoInterceptor2.class, DemoInterceptor1.class })
@Override
public String execute() throws Exception {
demoRemote.remoteMethod();
demoLocal.localMethod();
demoMethodInjectRemote.method();
demo1.remoteMethod();
demo2.remoteMethod();
return SUCCESS;
}
}
Action中通过EJB的注解注入前面的SessionBean,并且支持除全局默认拦截器注解外的拦截器相关注解。对于生命周期注解,目前只支持@PostConstruct。struts2-ejb3-plugin的好处是通过模拟应用服务器规则与模拟EJB组件生命周期完成整合,无须引入第三方类库。
对于Struts2自带的拦截器,struts2-ejb3-plugin也能够像Action一样正常工作。在Action的execute(或者自定义的名称)方法中同时使用struts2的Interceptor和@Interceptors 时,@Interceptors会在Interceptor之前开始,在Interceptor之后结束。
下面看个 Struts2的Interceptor
public class DemoStrutsInterceptor implements Interceptor {
private static final long serialVersionUID = 3525334943511726314L;
@EJB
private DemoRemote demoRemote;
public void destroy() {
}
public void init() {
System.out.println("struts拦截器初始化。");
}
@PostConstruct
@Interceptors(DemoInterceptor1.class)
public void pluginInit(){
System.out.println("struts2-ejb3-plugin初始化。");
}
@Interceptors(DemoInterceptor2.class)
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("Struts拦截器");
demoRemote.remoteMethod();
return arg0.invoke();
}
}
可以看出,对Struts2的拦截器不仅可以使用注入,还可以对它使用生命周期以及拦截器的注解(拦截器的拦截器。。。恩,有点绞。。^_^)。
对配置文件的一些说明
plugin的默认配置,该配置为 cn/agrael/struts/plugin/ejb3/default-struts-ejb3-plugin.properties中的配置。配置信息如下:
#ENC的默认名
ENCPath=java:comp/env/
#应用服务器的具体实现类,该类是 cn.agrael.struts.plugin.ejb3.ApplicationServer的实现类
ejbContainer=cn.agrael.struts.plugin.ejb3.JbossApplicationServer
#是否解析@Resource的标志 true 为解析,false 为不解析
isParseResource=false
#是否解析@EJB的标志 true 为解析,false 为不解析
isParseEJB=true
#ear的路径名,如果没有则为空字符串
earFileBaseName=
#为远程Bean时的JNDI路径
remote=remote
#为本地Bean时的JNDI路径
local=local
如果要修改默认的配置,需要在 classpath 下建立为 struts-ejb3-plugin.properties
的资源文件覆盖默认的配置。
目前的版本暂时不支持@PreDestroy。 现阶段只有 jboss与glassfish2.x 应用服务器的实现,在以后的版本中会陆续增加如 weblogic 等应用服务器的实现。如果现在需要 jboss与glassfish2.x之外的实现,可实现 cn.agrael.struts.plugin.ejb3.ApplicationServer 接口或者继承cn.agrael.struts.plugin.ejb3.AbstractApplicationServer类,并使用 struts-ejb3-plugin.properties 修改 ejbContainer 为实现类。
关于Struts2与EJB3.0的整合就写到这里了,附件里有完整的DEMO,因为比较简单,所以没写注释,希望大家见谅。
因为本人经验及水平有限,如有疏漏或者是错误的地方,希望大家多多拍砖^_^。
分享到:
相关推荐
最近温习ssh2整合编程,顺便浏览下struts2有什么更新的消息,下载了新版本的struts2的2.1.8.1版,使用的是MyEclipse8.0开发,但是问题就随之而来了。MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5...
4. `struts2-json-plugin.jar`:支持JSON(JavaScript Object Notation)数据格式的插件,使Struts2可以与AJAX和JSON API无缝集成。 5. `struts2-dojo-plugin.jar`:如果包含,这个插件将提供与Dojo JavaScript库的...
3. **视图技术**:如struts2-dojo-plugin.jar、struts2 freemarker-plugin.jar,用于支持不同的视图渲染技术,如Dojo、FreeMarker等。 4. **依赖的第三方库**:如ognl.jar(Object-Graph Navigation Language,用于...
例如,Spring的核心库spring-context、spring-web等,Hibernate的orm和ejb3-persistence模块,以及Struts2的核心库struts2-core、struts2-spring-plugin等。这些JAR文件是运行SSH框架项目的基础,需要按照正确的顺序...
在与Struts2整合时,Spring可以管理Struts2的Action实例,负责其生命周期和依赖关系。通过ApplicationContext.xml配置文件,我们可以声明bean并控制它们的行为。 3. **Hibernate框架**:Hibernate是一个流行的ORM...
junit-4.5.jar,mysql-connector-java-3.1.13-bin.jar,ognl-2.6.11.jar,slf4j-api-1.5.8.jar,slf4j-nop-1.5.8.jar,spring.jar,struts2-convention-plugin-2.1.6.jar,struts2-core-2.1.6.jar,struts2-spring-plugin-...
你需要配置Struts2的库依赖,包括struts2-core、struts2-convention-plugin等,并设置Maven或Gradle构建工具。 在“第三章 HelloWorld”中,你会学习到如何创建第一个Struts2应用。这个例子通常从简单的“Hello, ...
- `struts2-spring-plugin`: 与Spring框架集成的插件,用于管理Struts2的Action。 2. **Spring框架**: - `spring-beans`: 包含了Spring对Bean的管理和配置。 - `spring-context`: 提供了应用上下文,是Spring的...
Struts 2具有强大的插件扩展性,例如Struts2-dojo-plugin用于集成Dojo库,Struts2-convention-plugin简化了Action的配置,还有其他如Struts2-json-plugin、Struts2-spring-plugin等,极大地丰富了框架的功能。...
总的来说,"Struts工程师培训教程2"涵盖了JavaEE开发中的重要组成部分,从基础的Struts框架原理到与其他技术如Spring、Ajax、EJB的集成,都是JavaEE开发者必须掌握的知识点。通过深入学习本教程,你将能够更好地应对...
常见的库文件包括:struts2-core.jar、struts2-convention-plugin.jar、struts2-config-browser-plugin.jar等。 5. **配置Web.xml** 修改项目中的`Web.xml`文件,添加Struts2的过滤器配置,如下: ```xml ...
- struts2-spring-plugin.jar:Struts 2与Spring集成的插件,使得Action可以由Spring管理。 3. **Hibernate框架**: - hibernate-entitymanager.jar:Hibernate实体管理器,用于JPA(Java Persistence API)。 -...
- `ejb3-persistence.jar`: EJB 3的持久化API,与Hibernate整合使用。 4. **数据库驱动相关jar包**: - `mysql-connector-java.jar`: MySQL数据库的JDBC驱动,用于连接MySQL数据库。 - `ojdbc6.jar` (或 `ojdbc8...
- struts-config.xml:核心配置文件,定义了Action、ActionForm、ActionMapping和PlugIn等元素,是Struts框架的蓝图。 - web.xml:Web应用的部署描述符,配置ActionServlet。 **4. 表单验证** Struts 1.2提供了强大...
10.struts2-spring-plugin-2.1.8.jar(struts2与spring集成时使用的) Spring需要的jar包: 1.spring.jar(里面含有spring的所有核心类库) 2.commons-logging-1.1.1.jar(ASF出品的日志包,struts2 2、spring、...
1. Struts2的核心库:struts2-core.jar、struts2-convention-plugin.jar、struts2-config-browser-plugin.jar等。 2. Spring3的框架库:spring-beans.jar、spring-context.jar、spring-webmvc.jar、spring-aop.jar等...
### Struts环境配置详解 #### 一、Struts在Eclipse中的配置...通过以上步骤,你可以成功地在Eclipse环境中搭建Struts开发框架,并配置好与SQL Server 2000数据库的连接,为Java Web应用程序的开发奠定了坚实的基础。
- `struts2-struts1-plugin.jar`:与Struts1兼容的插件。 2. **Spring**: Spring是一个全面的Java企业级应用框架,提供了依赖注入、AOP(面向切面编程)、事务管理等功能。其主要jar包包括: - `spring-context...
### 整合Struts_Hibernate_Spring应用开发详解 #### J2EE应用与环境 - **J2EE应用概述** - **J2EE应用的分层模型:** Java EE(J2EE)架构通常采用多层设计模式,主要包括表现层、业务逻辑层和服务层。这种分层有...
2. **Json或XML响应**:Ajax请求通常期望得到JSON或XML格式的数据,Struts可以通过配置Action的返回类型,或者使用像Struts2的插件(如struts2-json-plugin)来生成这些格式的数据。 3. **JavaScript处理响应**:当...