[转]ejb3.0+struts2.0整合

最近在看Struts2和EJB3,出于好奇,就想试试用部署在tomcat上的struts2去访问部署在jboss上的EJB3程序。对于EJB3之前只用过里面的jpa,感觉很好用,或者说注释很方便,比xml好用。谁知就这个程序耗了我三四个晚上的时间。现在终于搞定了,记录一下,也帮助后来者少走弯路。(感谢论坛id:小疯子的热情帮助^-^)
首先是Struts2的前端页面,so easy!!输入用户名密码,提交。。。。
代码如下:

Xml代码
<form action="login.action" method="post">
name:<input type="text" name="name"/><br>
password:<input type="password" name="psd"/><br>
<input type="submit" value="submit">
</form>
<form action="login.action" method="post">
name:<input type="text" name="name"/><br>
password:<input type="password" name="psd"/><br>
<input type="submit" value="submit">
</form>


配置web.xml文件

Xml代码
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*.action</url-pattern>
</filter-mapping>

接着是struts2.xml文件

Xml代码
<struts>
<!-- Add packages here -->
<package name="struts2" extends="struts-default">
<action name="login" class="org.ivan.struts2.LoginAction">
<result name="success">success.jsp</result>
<result name="failture">failture.jsp</result>
</action>
</package>
</struts>
<struts>
<!-- Add packages here -->
<package name="struts2" extends="struts-default">
<action name="login" class="org.ivan.struts2.LoginAction">
<result name="success">success.jsp</result>
<result name="failture">failture.jsp</result>
</action>
</package>
</struts>


Action类

Java代码
package org.ivan.struts2;

import java.util.Properties;

import javax.naming.*;

import org.ivan.ejb.CheckBean;
import org.ivan.struts2.bean.Point;
import org.jnp.interfaces.NamingContextFactory;


public class LoginAction{

private String name;
private String psd;
private int age;
private Point point;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPsd() {
return psd;
}

public void setPsd(String psd) {
this.psd = psd;
}


public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Point getPoint() {
return point;
}

public void setPoint(Point point) {
this.point = point;
}

public String execute() throws Exception {
if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {
return true;
}
return false;
}
}
package org.ivan.struts2;

import java.util.Properties;

import javax.naming.*;

import org.ivan.ejb.CheckBean;
import org.ivan.struts2.bean.Point;
import org.jnp.interfaces.NamingContextFactory;


public class LoginAction{

private String name;
private String psd;
private int age;
private Point point;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPsd() {
return psd;
}

public void setPsd(String psd) {
this.psd = psd;
}


public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Point getPoint() {
return point;
}

public void setPoint(Point point) {
this.point = point;
}

public String execute() throws Exception {
if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {
return true;
}
return false;
}
}

这些东西随便找本struts2的书籍,一看就知道了,不多说。
程序往tomcat里一部署就搞定了。。
到这里都没遇到问题。

下面编写EJB程序,一个sessionbean,有个方法check,接收name和password参数,验证是否为Ivan和dd。
代码如下:

Java代码
package org.ivan.ejb;

public interface CheckBean {
boolean check(String name,String password);
}
package org.ivan.ejb;

public interface CheckBean {
boolean check(String name,String password);
}

实现类

Java代码
package org.ivan.ejb.impl;

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.ivan.ejb.CheckBean;
import org.ivan.ejb.jpa.UserBean;
import org.ivan.ejb.util.JPAUtil;

@Stateless
@Remote
public class CheckBeanImpl implements CheckBean {


@Override
public boolean check(String name, String password) {
if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {
return true;
}
return false;
}

}
package org.ivan.ejb.impl;

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.ivan.ejb.CheckBean;
import org.ivan.ejb.jpa.UserBean;
import org.ivan.ejb.util.JPAUtil;

@Stateless
@Remote
public class CheckBeanImpl implements CheckBean {


@Override
public boolean check(String name, String password) {
if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {
return true;
}
return false;
}

}


ok.依然很顺。部署到jboss4.22上,看见这个bean了。

一直到这里都没卡住。。。。。窃喜。。。。
下面问题来了,开始两个程序的相互调用。
修改Action类里的execute方法。改成如下代码。


Java代码
public String execute() throws Exception {
/*------------1---------------*/
Properties props = new Properties();

props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url", "jnp://localhost:1099");


InitialContext context = new InitialContext(props);
/*--------------2----------------*/
CheckBean checker = (CheckBean) context.lookup("CheckBeanImpl/remote");
if (checker.check(name, psd)) {
return "success";
}
return "failture";
}
public String execute() throws Exception {
/*------------1---------------*/
Properties props = new Properties();

props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url", "jnp://localhost:1099");


InitialContext context = new InitialContext(props);
/*--------------2----------------*/
CheckBean checker = (CheckBean) context.lookup("CheckBeanImpl/remote");
if (checker.check(name, psd)) {
return "success";
}
return "failture";
}

就这几行代码,我就折腾了一个晚上。。。。。晕。
首先,在1处,如果不创建Properties类,而写配置文件的话找不到配置文件。。。。它老找tomcat下的相应属性。(可能位置没放对,目前不清楚,待会再试试!)
再来,改成了目前这样的代码,运行,提示找不到org.jnp.interfaces.NamingContextFactory。。。。又搞一小时,需要把jboss目录下的client目录下的jar包添加到struts2程序的lib里。
接着,说找不到CheckBean接口。。。我已经把struts项目引了ejb项目了,依然没用,最后,拷贝了一份CheckBean到struts里面。

好不容易啊,终于有结果了。。。

再进一步,jpa访问数据库来验证数据。
数据库就两字段,name,password....
接着是EntityBean

Java代码
package org.ivan.ejb.jpa;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity(name="user")
public class UserBean {
@Id
private String name;
private String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}
package org.ivan.ejb.jpa;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity(name="user")
public class UserBean {
@Id
private String name;
private String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}


继续,修改CheckBeanImpl里的代码,调用EntityBean访问数据库。

Java代码
package org.ivan.ejb.impl;

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.ivan.ejb.CheckBean;
import org.ivan.ejb.jpa.UserBean;
import org.ivan.ejb.util.JPAUtil;

@Stateless
@Remote
public class CheckBeanImpl implements CheckBean {

@PersistenceContext(unitName="loginDS") //注入EntityManager,现在很流行注入啊,呵呵
EntityManager em ;
@Override
public boolean check(String name, String password) {
// if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {
// return true;
// }
// return false;

String sql = "SELECT u FROM user u WHERE u.name = :n AND u.password = :p";
Query query = em.createQuery(sql);
query.setParameter("n", name);
query.setParameter("p", password);
List<UserBean> us = query.getResultList();
if(us.size() > 0){
return true;
}
return false;
}

}
package org.ivan.ejb.impl;

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.ivan.ejb.CheckBean;
import org.ivan.ejb.jpa.UserBean;
import org.ivan.ejb.util.JPAUtil;

@Stateless
@Remote
public class CheckBeanImpl implements CheckBean {

@PersistenceContext(unitName="loginDS") //注入EntityManager,现在很流行注入啊,呵呵
EntityManager em ;
@Override
public boolean check(String name, String password) {
// if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {
// return true;
// }
// return false;

String sql = "SELECT u FROM user u WHERE u.name = :n AND u.password = :p";
Query query = em.createQuery(sql);
query.setParameter("n", name);
query.setParameter("p", password);
List<UserBean> us = query.getResultList();
if(us.size() > 0){
return true;
}
return false;
}

}


配置persistence.xml

Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<persistence-unit name="loginDS">

<provider>
org.apache.openjpa.persistence.PersistenceProviderImpl
</provider>

<jta-data-source>java:/MySqlDS</jta-data-source>

<class>org.ivan.ejb.jpa.UserBean</class>


</persistence-unit>
</persistence>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<persistence-unit name="loginDS">

<provider>
org.apache.openjpa.persistence.PersistenceProviderImpl
</provider>

<jta-data-source>java:/MySqlDS</jta-data-source>

<class>org.ivan.ejb.jpa.UserBean</class>


</persistence-unit>
</persistence>


好了,问题来了。。。。
它死活找不到数据源,网上搜了半天。。。。SessionBean访问数据源好像只能通过jta来配。。。。jta....从来没接触过。。就这个问题,郁闷了两天。最后终于解决了。。。
首先,到jboss-4.2.2.GA\docs\examples\jca目录下,看看,一堆配置文件。。。我用的mysql,就拷贝mysql-ds.xml到jboss-4.2.2.GA\server\default\deploy目录下。修改内容如下。

Xml代码
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/login</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/login</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>


应该很好懂吧。。。这就配置了mysql的数据源了。然后在persistence.xml里调用。
这一句

Xml代码
<jta-data-source>java:/MySqlDS</jta-data-source>
<jta-data-source>java:/MySqlDS</jta-data-source>

呼,再运行,又报错。。。。。找不到mysql驱动。。。。。晕,这些东西我早放程序里面去了。。。。
火了,直接把jar包给拷贝到了jboss的lib里去了。。。。。。
搞定。。。晕。。。


哎,花了一周时间就写了这么个程序。还从没花这么长时间来入门的。单独的struts2,ejb3程序也就一次搞定的。两者结合就搞出这么多毛病来。
要学的东西实在是太多了啊。。。
jta,jndi,rmi,jboss......
之前只用过tomcat,jetty等web容器,也用过glassfish,也就当web容器用。。。看来应用服务器要复杂得多啊。努力。。。。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangpinggod/archive/2008/08/20/2801691.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值