`
Ivan_Pig
  • 浏览: 381988 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

坎坷的Struts2+EJB3入门程序

阅读更多
最近在看Struts2和EJB3,出于好奇,就想试试用部署在tomcat上的struts2去访问部署在jboss上的EJB3程序。对于EJB3之前只用过里面的jpa,感觉很好用,或者说注释很方便,比xml好用。谁知就这个程序耗了我三四个晚上的时间。现在终于搞定了,记录一下,也帮助后来者少走弯路。(感谢论坛id:小疯子的热情帮助^-^)
首先是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>


配置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>

接着是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>


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;
			}
	}

这些东西随便找本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.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";
	}

就这几行代码,我就折腾了一个晚上。。。。。晕。
首先,在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;
	}
}



继续,修改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;
	}

}


配置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>



好了,问题来了。。。。
它死活找不到数据源,网上搜了半天。。。。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>



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

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




哎,花了一周时间就写了这么个程序。还从没花这么长时间来入门的。单独的struts2,ejb3程序也就一次搞定的。两者结合就搞出这么多毛病来。
要学的东西实在是太多了啊。。。
jta,jndi,rmi,jboss......
之前只用过tomcat,jetty等web容器,也用过glassfish,也就当web容器用。。。看来应用服务器要复杂得多啊。努力。。。。
分享到:
评论
2 楼 TaoistWar 2010-01-29  
你这也算整合?只是简单的累积到一起了。
1 楼 liyaxi 2009-02-15  
感谢了, 好人!

相关推荐

    java高手真经 高级编程卷 卷2(4卷)

    (2)EJB入门样例 EJBTest.zip //03.EJB入门样例——HelloWorld EJBTestJava.zip //03.Java测试客户端 EJBTestJSP.zip //03.JSP测试客户端 SessionBeanTest.zip //04.会话Bean开发样例 MDBTest.zip //...

    java高手真经 高级编程卷 卷3(4卷)

    (2)EJB入门样例 EJBTest.zip //03.EJB入门样例——HelloWorld EJBTestJava.zip //03.Java测试客户端 EJBTestJSP.zip //03.JSP测试客户端 SessionBeanTest.zip //04.会话Bean开发样例 MDBTest.zip //...

    java高手真经 高级编程卷 卷4(4卷)

    (2)EJB入门样例 EJBTest.zip //03.EJB入门样例——HelloWorld EJBTestJava.zip //03.Java测试客户端 EJBTestJSP.zip //03.JSP测试客户端 SessionBeanTest.zip //04.会话Bean开发样例 MDBTest.zip //...

    java高手真经 高级编程卷 光盘内容 卷1(4卷)

    (2)EJB入门样例 EJBTest.zip //03.EJB入门样例——HelloWorld EJBTestJava.zip //03.Java测试客户端 EJBTestJSP.zip //03.JSP测试客户端 SessionBeanTest.zip //04.会话Bean开发样例 MDBTest.zip //...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    SSH(Struts+spring+hibernate)整合资料

    jsp2.0(1) Spring(1) C#游戏编程(附几个游戏的源代码)(1) 使用ADO.NET和XML开发数据库应用程序(1) EJB-CMP_CMR(1) JSP(1) c#连接数据库完整代码(1) Hibernate(1) 语言规范(1) 2.0(1) Struts(1) 绝对值得下载的资料...

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

    EJB3与Struts与Spring整合开发(SSE),很不错的,可以借鉴下,提意见(EJB Bean放在JBoss服务器上,Web放在Tomcat服务器上)这入门程序,主要看配置

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、javamail、ejb 3的session bean、message driven bean、jpa、jax-ws 2、jaas等java ee知识,这部分知识以jsf+ejb 3+jpa整合开发为重点,通过使用netbeans ide工具...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    JSP快速入门教程

     Java EE包括2个体系:标准(上面介绍的)+流行(Struts+Hibernate+Spring)  两套体系都是JSP+Servlet为基础。 2 JSP会涉及哪些内容  JSP语法基础(Java+HTML):  对于Java,需要掌握Java的基本语法(类...

    J2EE JNDI配置原理详解 JBOSS安装配置 Maven入门 Ant使用入门

    1.7 struts1和truts2比较 1.8 Tomcat5启动流程与配置详解 1.9 HttpServlet详解 1.10 Ant使用入门 1.11 Maven Ant之间的比较 1.12 详解MANIFEST.MF文件 1.13 Maven入门--概念与实例 1.14 Subversion 1.15 jar...

    Struts原理、开发及项目实施

    Struts原理、开发及项目实施 Holen 2002-9-12 &lt;br/&gt;1、 摘要 2、 关键词 3、 Framework 4、 Struts的起源 5、 Struts工作原理 6、 Struts安装 7、 一个实例 8、 Struts优缺点...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    基于MVC的java Web设计与开发

    本书第1章到第3章为入门篇,通过两个Struts应用实例,引导读者把握设计、开发和部署Struts应用的整体流程,充分体会Struts框架在开放大型、可扩展的Web应用方面发挥的优势。第4章到第7章深入探讨了Struts框架的核心...

    Spring攻略(第二版 中文高清版).part2

    6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4 将Spring与JSF集成 226 6.4.1 问题 226 6.4.2 解决方案 226 6.4.3 工作原理 227 6.5 将Spring与DWR...

    计算机网络专业毕业实习报告3000字.docx

    基于struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是MVC设计模式的一种变化类型。Struts是一个web framwork,而不仅仅是一些标记库的组合。但 Struts 也包含了丰富的标记库和独立于该框架工作的...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics