ejb3.0+struts2.0整合

最近在看 Struts2EJB3,出于好奇,就想试试用部署在tomcat上的 struts2去访问部署在jboss上的 EJB3程序。对于 EJB3之前只用过里面的jpa,感觉很好用,或者说注释很方便,比xml好用。谁知就这个程序耗了我三四个晚上的时间。现在终于搞定了,记录一下,也帮助后来者少走弯路。(感谢论坛id:小疯子的热情帮助^-^)
首先是 Struts2的前端页面,so easy!!输入用户名密码,提交。。。。
代码如下:
Xml代码 复制代码
  1.         <form action="login.action" method="post">  
  2.     name:<input type="text" name="name"/><br>  
  3.     password:<input type="password" name="psd"/><br>  
  4.     <input type="submit" value="submit">  
  5. </form>  


配置web.xml文件
Xml代码 复制代码
  1.  <filter>  
  2. <filter-name>struts2</filter-name>  
  3.     <filter-class>  
  4.              org.apache.struts2.dispatcher.FilterDispatcher   
  5.          </filter-class>  
  6.       </filter>  
  7.   
  8.  <filter-mapping>  
  9. <filter-name>struts2</filter-name>  
  10. <url-pattern>/*.action</url-pattern>  
  11.  </filter-mapping>  

接着是 struts2.xml文件
Xml代码 复制代码
  1. <struts>  
  2.     <!-- Add packages here -->  
  3.     <package name="struts2" extends="struts-default">  
  4.        <action name="login" class="org.ivan.struts2.LoginAction">  
  5.          <result name="success">success.jsp</result>  
  6.          <result name="failture">failture.jsp</result>  
  7.        </action>  
  8.     </package>  
  9. </struts>  


Action类
Java代码 复制代码
  1. package org.ivan.struts2;   
  2.   
  3. import java.util.Properties;   
  4.   
  5. import javax.naming.*;   
  6.   
  7. import org.ivan.ejb.CheckBean;   
  8. import org.ivan.struts2.bean.Point;   
  9. import org.jnp.interfaces.NamingContextFactory;   
  10.   
  11.   
  12. public class LoginAction{   
  13.        
  14.     private String name;   
  15.     private String psd;   
  16.     private int age;   
  17.     private Point point;   
  18.   
  19.     public String getName() {   
  20.         return name;   
  21.     }   
  22.   
  23.     public void setName(String name) {   
  24.         this.name = name;   
  25.     }   
  26.   
  27.     public String getPsd() {   
  28.         return psd;   
  29.     }   
  30.   
  31.     public void setPsd(String psd) {   
  32.         this.psd = psd;   
  33.     }   
  34.   
  35.   
  36.     public int getAge() {   
  37.         return age;   
  38.     }   
  39.   
  40.     public void setAge(int age) {   
  41.         this.age = age;   
  42.     }   
  43.   
  44.     public Point getPoint() {   
  45.         return point;   
  46.     }   
  47.   
  48.     public void setPoint(Point point) {   
  49.         this.point = point;   
  50.     }   
  51.        
  52.     public String execute() throws Exception {   
  53.          if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {   
  54.             return true;   
  55.         }   
  56.         return false;   
  57.             }   
  58.     }  

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

下面编写EJB程序,一个sessionbean,有个方法check,接收name和password参数,验证是否为Ivan和dd。
代码如下:
Java代码 复制代码
  1. package org.ivan.ejb;   
  2.   
  3. public interface CheckBean {   
  4.     boolean check(String name,String password);   
  5. }  

实现类
Java代码 复制代码
  1. package org.ivan.ejb.impl;   
  2.   
  3. import java.util.List;   
  4.   
  5. import javax.ejb.Remote;   
  6. import javax.ejb.Stateless;   
  7. import javax.persistence.EntityManager;   
  8. import javax.persistence.Query;   
  9.   
  10. import org.ivan.ejb.CheckBean;   
  11. import org.ivan.ejb.jpa.UserBean;   
  12. import org.ivan.ejb.util.JPAUtil;   
  13.   
  14. @Stateless  
  15. @Remote  
  16. public class CheckBeanImpl implements CheckBean {   
  17.   
  18.        
  19.     @Override  
  20.     public boolean check(String name, String password) {   
  21.         if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {   
  22.             return true;   
  23.         }   
  24.         return false;   
  25.             }   
  26.   
  27. }  


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

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

Java代码 复制代码
  1. public String execute() throws Exception {   
  2.           /*------------1---------------*/  
  3.         Properties props = new Properties();   
  4.   
  5.         props.setProperty("java.naming.factory.initial",   
  6.         "org.jnp.interfaces.NamingContextFactory");   
  7.   
  8.         props.setProperty("java.naming.provider.url""jnp://localhost:1099");   
  9.            
  10.                
  11.         InitialContext context = new InitialContext(props);   
  12.             /*--------------2----------------*/  
  13.         CheckBean checker = (CheckBean) context.lookup("CheckBeanImpl/remote");   
  14.         if (checker.check(name, psd)) {   
  15.             return "success";   
  16.         }   
  17.         return "failture";   
  18.     }  

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

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

再进一步,jpa访问数据库来验证数据。
数据库就两字段,name,password....
接着是EntityBean
Java代码 复制代码
  1. package org.ivan.ejb.jpa;   
  2.   
  3. import javax.persistence.Entity;   
  4. import javax.persistence.Id;   
  5.   
  6. @Entity(name="user")   
  7. public class UserBean {   
  8.     @Id  
  9.     private String name;   
  10.     private String password;   
  11.   
  12.     public String getName() {   
  13.         return name;   
  14.     }   
  15.   
  16.     public void setName(String name) {   
  17.         this.name = name;   
  18.     }   
  19.   
  20.     public String getPassword() {   
  21.         return password;   
  22.     }   
  23.   
  24.     public void setPassword(String password) {   
  25.         this.password = password;   
  26.     }   
  27. }  


继续,修改CheckBeanImpl里的代码,调用EntityBean访问数据库。
Java代码 复制代码
  1. package org.ivan.ejb.impl;   
  2.   
  3. import java.util.List;   
  4.   
  5. import javax.ejb.Remote;   
  6. import javax.ejb.Stateless;   
  7. import javax.persistence.EntityManager;   
  8. import javax.persistence.PersistenceContext;   
  9. import javax.persistence.Query;   
  10.   
  11. import org.ivan.ejb.CheckBean;   
  12. import org.ivan.ejb.jpa.UserBean;   
  13. import org.ivan.ejb.util.JPAUtil;   
  14.   
  15. @Stateless  
  16. @Remote  
  17. public class CheckBeanImpl implements CheckBean {   
  18.   
  19.     @PersistenceContext(unitName="loginDS")      //注入EntityManager,现在很流行注入啊,呵呵   
  20.     EntityManager em ;   
  21.     @Override  
  22.     public boolean check(String name, String password) {   
  23. //      if ("Ivan".equals(name.trim()) && "dd".equals(password.trim())) {   
  24. //          return true;   
  25. //      }   
  26. //      return false;   
  27.            
  28.         String sql = "SELECT u FROM user u WHERE u.name = :n AND u.password = :p";   
  29.         Query query = em.createQuery(sql);   
  30.         query.setParameter("n", name);   
  31.         query.setParameter("p", password);   
  32.         List<UserBean> us = query.getResultList();   
  33.         if(us.size() > 0){   
  34.             return true;   
  35.         }   
  36.         return false;   
  37.     }   
  38.   
  39. }  

配置persistence.xml
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  3.     
  4.     <persistence-unit name="loginDS">  
  5.        
  6.          <provider>  
  7.            org.apache.openjpa.persistence.PersistenceProviderImpl   
  8.         </provider>  
  9.            
  10.         <jta-data-source>java:/MySqlDS</jta-data-source>  
  11.            
  12.         <class>org.ivan.ejb.jpa.UserBean</class>  
  13.            
  14.            
  15.     </persistence-unit>  
  16. </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代码 复制代码
  1. <datasources>  
  2.   <local-tx-datasource>  
  3.     <jndi-name>MySqlDS</jndi-name>  
  4.     <connection-url>jdbc:mysql://localhost:3306/login</connection-url>  
  5.     <driver-class>com.mysql.jdbc.Driver</driver-class>  
  6.     <user-name>root</user-name>  
  7.     <password>root</password>  
  8.     <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>  
  9.     <metadata>  
  10.        <type-mapping>mySQL</type-mapping>  
  11.     </metadata>  
  12.   </local-tx-datasource>  
  13. </datasources>  


应该很好懂吧。。。这就配置了mysql的数据源了。然后在persistence.xml里调用。
这一句
Xml代码 复制代码
  1. <jta-data-source>java:/MySqlDS</jta-data-source>  

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




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值