最近在看
Struts2和
EJB3,出于好奇,就想试试用部署在tomcat上的
struts2去访问部署在jboss上的
EJB3程序。对于
EJB3之前只用过里面的jpa,感觉很好用,或者说注释很方便,比xml好用。谁知就这个程序耗了我三四个晚上的时间。现在终于搞定了,记录一下,也帮助后来者少走弯路。(感谢论坛id:小疯子的热情帮助^-^)
首先是 Struts2的前端页面,so easy!!输入用户名密码,提交。。。。
代码如下:
配置web.xml文件
接着是 struts2.xml文件
Action类
这些东西随便找本 struts2的书籍,一看就知道了,不多说。
程序往tomcat里一部署就搞定了。。
到这里都没遇到问题。
下面编写EJB程序,一个sessionbean,有个方法check,接收name和password参数,验证是否为Ivan和dd。
代码如下:
实现类
ok.依然很顺。部署到jboss4.22上,看见这个bean了。
一直到这里都没卡住。。。。。窃喜。。。。
下面问题来了,开始两个程序的相互调用。
修改Action类里的execute方法。改成如下代码。
就这几行代码,我就折腾了一个晚上。。。。。晕。
首先,在1处,如果不创建Properties类,而写配置文件的话找不到配置文件。。。。它老找tomcat下的相应属性。(可能位置没放对,目前不清楚,待会再试试!)
再来,改成了目前这样的代码,运行,提示找不到org.jnp.interfaces.NamingContextFactory。。。。又搞一小时,需要把jboss目录下的client目录下的jar包添加到 struts2程序的lib里。
接着,说找不到CheckBean接口。。。我已经把struts项目引了ejb项目了,依然没用,最后,拷贝了一份CheckBean到struts里面。
好不容易啊,终于有结果了。。。
再进一步,jpa访问数据库来验证数据。
数据库就两字段,name,password....
接着是EntityBean
继续,修改CheckBeanImpl里的代码,调用EntityBean访问数据库。
配置persistence.xml
好了,问题来了。。。。
它死活找不到数据源,网上搜了半天。。。。SessionBean访问数据源好像只能通过jta来配。。。。jta....从来没接触过。。就这个问题,郁闷了两天。最后终于解决了。。。
首先,到jboss-4.2.2.GA/docs/examples/jca目录下,看看,一堆配置文件。。。我用的mysql,就拷贝mysql-ds.xml到jboss-4.2.2.GA/server/default/deploy目录下。修改内容如下。
应该很好懂吧。。。这就配置了mysql的数据源了。然后在persistence.xml里调用。
这一句
呼,再运行,又报错。。。。。找不到mysql驱动。。。。。晕,这些东西我早放程序里面去了。。。。
火了,直接把jar包给拷贝到了jboss的lib里去了。。。。。。
搞定。。。晕。。。
哎,花了一周时间就写了这么个程序。还从没花这么长时间来入门的。单独的 struts2, ejb3程序也就一次搞定的。两者结合就搞出这么多毛病来。
要学的东西实在是太多了啊。。。
jta,jndi,rmi,jboss......
之前只用过tomcat,jetty等web容器,也用过glassfish,也就当web容器用。。。看来应用服务器要复杂得多啊。努力。。。。
首先是 Struts2的前端页面,so easy!!输入用户名密码,提交。。。。
代码如下:
- <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文件
- <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文件
- <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类
- 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。
代码如下:
- 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); }
实现类
- 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方法。改成如下代码。
- 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
- 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访问数据库。
- 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 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目录下。修改内容如下。
- <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里调用。
这一句
- <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容器用。。。看来应用服务器要复杂得多啊。努力。。。。