<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>北风技术专栏 &#187; Adam</title>
	<atom:link href="http://column.ibeifeng.com/wp-feed.php?author_name=adam43046721&#038;feed=feed" rel="self" type="application/rss+xml" />
	<link>http://column.ibeifeng.com</link>
	<description>用技术点亮生活中每个亮点</description>
	<pubDate>Sun, 25 Jul 2010 12:28:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>基于EJB3.0的留言板项目的开发全过程</title>
		<link>http://column.ibeifeng.com/adam43046721/20090210251.shtml</link>
		<comments>http://column.ibeifeng.com/adam43046721/20090210251.shtml#comments</comments>
		<pubDate>Tue, 10 Feb 2009 14:07:42 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://column.ibeifeng.com/?p=251</guid>
		<description><![CDATA[因为工作关系，所以准备了EJB3.0的课程，其实以前就做过了这方面的工作，但是当时没有想到要讲课，所以学的很浅，而且很长时间不用也忘记了，这会又重写看了一下。其实，网上有很多的视频或者是什么的，但是貌似我就是没有看到一个稍微完整的项目例子的，很多都只是连上了数据库，稍微写一个方法就算完事了，所以这一次，我写了一个留言板，很简单的功能。当然很简单了，只是一对一的关系，但是这里面却也有一些体会。
好了，开始写了哦！
首先，不用说别的，肯定需要连接数据库，所以先创建一个数据库吧，我用的是mysql。都说了是很简单的留言板例子了，数据库当然简单的不象话了，这个不用多说了。配置一下数据源，说白了就是xml文件。这个文件不详细讲解了，一会我会把所有的文件打包传上来，并且在我前面的教程中也有这些内容。
好了，这几个准备工作完成了，那么我们创建一个EJB Project（EJB项目）。我们要知道这样子一个事情，EJB，我们用来作出一个一个的模块，然后我们在项目中去使用它。
项目创建好了以后，导入jar包，在jboss下的client下面。好了，一个项目建好了，我们在persistence.xml（在META-INF目录下面），创建项目的时候自动创建了一个，这个文件里面的内容是：

&#60;?xml version=&#8221;1.0&#8243;?&#62;
&#60;persistence xmlns=&#8221;http://java.sun.com/xml/ns/persistence&#8221;
 xmlns:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221;
 xsi:schemaLocation=&#8221;http://java.sun.com/xml/ns/persistence
 &#60;A href=&#8221;http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&#8221; target=_blank&#62;http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&#60;/A&#62;&#8221; version=&#8221;1.0&#8243;&#62;
 &#60;persistence-unit name=&#8221;ejbdb&#8221; transaction-type=&#8221;JTA&#8221;&#62;
  &#60;jta-data-source&#62;
   java:EJBDS
  &#60;/jta-data-source&#62;
  &#60;properties&#62;
   &#60;property name=&#8221;hibernate.hbm2dd1.auto&#8221; value=&#8221;create-drop&#8221;/&#62;
  &#60;/properties&#62;
 &#60;/persistence-unit&#62;
&#60;/persistence&#62;
简单说一下：ejbdb是我后面要用到的一个名字，随便起，当然要满足一定的规则。EJBDS是我配置的mysql-ds.xml里面的JNDI名字。因为这是一个全局的JNDI，所以我们使用java:EJBDS就可以找到。
接着看，我们开始创建Entity Bean。这个更加简单了，尤其是对于有Hibernate基础的朋友来说，这部分真的实在是太简单了。先把代码给大家。
package org.adam.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name=&#8221;user&#8221;)
public class UserBean implements Serializable{
 
 private Integer user_id;
 
 private String username;
 
 private String password;
 @Id
 @Column(name=&#8221;user_id&#8221;)
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Integer getUser_id() {
  return user_id;
 }
 public void setUser_id(Integer user_id) {
  this.user_id = user_id;
 }
 @Column(name=&#8221;username&#8221;,length=50,nullable=false)
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 @Column(name=&#8221;password&#8221;,length=50,nullable=false)
 public String getPassword() {
  return password;
 }
 public void [...]]]></description>
			<content:encoded><![CDATA[<p>因为工作关系，所以准备了EJB3.0的课程，其实以前就做过了这方面的工作，但是当时没有想到要讲课，所以学的很浅，而且很长时间不用也忘记了，这会又重写看了一下。其实，网上有很多的视频或者是什么的，但是貌似我就是没有看到一个稍微完整的项目例子的，很多都只是连上了数据库，稍微写一个方法就算完事了，所以这一次，我写了一个留言板，很简单的功能。当然很简单了，只是一对一的关系，但是这里面却也有一些体会。</p>
<p>好了，开始写了哦！<br />
首先，不用说别的，肯定需要连接数据库，所以先创建一个数据库吧，我用的是mysql。都说了是很简单的留言板例子了，数据库当然简单的不象话了，这个不用多说了。配置一下数据源，说白了就是xml文件。这个文件不详细讲解了，一会我会把所有的文件打包传上来，并且在我前面的教程中也有这些内容。<br />
好了，这几个准备工作完成了，那么我们创建一个EJB Project（EJB项目）。我们要知道这样子一个事情，EJB，我们用来作出一个一个的模块，然后我们在项目中去使用它。<br />
项目创建好了以后，导入jar包，在jboss下的client下面。好了，一个项目建好了，我们在persistence.xml（在META-INF目录下面），创建项目的时候自动创建了一个，这个文件里面的内容是：</p>
<p><span id="more-251"></span></p>
<p>&lt;?xml version=&#8221;1.0&#8243;?&gt;<br />
&lt;persistence xmlns=&#8221;<a href="http://java.sun.com/xml/ns/persistence">http://java.sun.com/xml/ns/persistence</a>&#8221;<br />
 xmlns:xsi=&#8221;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;<br />
 xsi:schemaLocation=&#8221;<a href="http://java.sun.com/xml/ns/persistence">http://java.sun.com/xml/ns/persistence</a><br />
 &lt;A href=&#8221;<a href="http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd</a>&#8221; target=_blank&gt;http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&lt;/A&gt;&#8221; version=&#8221;1.0&#8243;&gt;<br />
 &lt;persistence-unit name=&#8221;ejbdb&#8221; transaction-type=&#8221;JTA&#8221;&gt;<br />
  &lt;jta-data-source&gt;<br />
   java:EJBDS<br />
  &lt;/jta-data-source&gt;<br />
  &lt;properties&gt;<br />
   &lt;property name=&#8221;hibernate.hbm2dd1.auto&#8221; value=&#8221;create-drop&#8221;/&gt;<br />
  &lt;/properties&gt;<br />
 &lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;</p>
<p>简单说一下：ejbdb是我后面要用到的一个名字，随便起，当然要满足一定的规则。EJBDS是我配置的mysql-ds.xml里面的JNDI名字。因为这是一个全局的JNDI，所以我们使用java:EJBDS就可以找到。</p>
<p>接着看，我们开始创建Entity Bean。这个更加简单了，尤其是对于有Hibernate基础的朋友来说，这部分真的实在是太简单了。先把代码给大家。<br />
package org.adam.bean;</p>
<p>import java.io.Serializable;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.GeneratedValue;<br />
import javax.persistence.GenerationType;<br />
import javax.persistence.Id;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name=&#8221;user&#8221;)<br />
public class UserBean implements Serializable{<br />
 <br />
 private Integer user_id;<br />
 <br />
 private String username;<br />
 <br />
 private String password;</p>
<p> @Id<br />
 @Column(name=&#8221;user_id&#8221;)<br />
 @GeneratedValue(strategy=GenerationType.AUTO)<br />
 public Integer getUser_id() {<br />
  return user_id;<br />
 }</p>
<p> public void setUser_id(Integer user_id) {<br />
  this.user_id = user_id;<br />
 }</p>
<p> @Column(name=&#8221;username&#8221;,length=50,nullable=false)<br />
 public String getUsername() {<br />
  return username;<br />
 }</p>
<p> public void setUsername(String username) {<br />
  this.username = username;<br />
 }</p>
<p> @Column(name=&#8221;password&#8221;,length=50,nullable=false)<br />
 public String getPassword() {<br />
  return password;<br />
 }</p>
<p> public void setPassword(String password) {<br />
  this.password = password;<br />
 }<br />
}</p>
<p>package org.adam.bean;</p>
<p>import java.io.Serializable;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.GeneratedValue;<br />
import javax.persistence.GenerationType;<br />
import javax.persistence.Id;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name=&#8221;context&#8221;)<br />
public class ContextBean implements Serializable{<br />
 <br />
 private Integer context_id;<br />
 <br />
 private String title;<br />
 <br />
 private String context;<br />
 <br />
 private String email;</p>
<p> @Id<br />
 @Column(name=&#8221;context_id&#8221;)<br />
 @GeneratedValue(strategy=GenerationType.AUTO)<br />
 public Integer getContext_id() {<br />
  return context_id;<br />
 }</p>
<p> public void setContext_id(Integer context_id) {<br />
  this.context_id = context_id;<br />
 }</p>
<p> @Column(name=&#8221;title&#8221;,length=50,nullable=false)<br />
 public String getTitle() {<br />
  return title;<br />
 }</p>
<p> public void setTitle(String title) {<br />
  this.title = title;<br />
 }</p>
<p> @Column(name=&#8221;context&#8221;,length=200,nullable=false)<br />
 public String getContext() {<br />
  return context;<br />
 }</p>
<p> public void setContext(String context) {<br />
  this.context = context;<br />
 }</p>
<p> @Column(name=&#8221;email&#8221;,length=30,nullable=true)<br />
 public String getEmail() {<br />
  return email;<br />
 }</p>
<p> public void setEmail(String email) {<br />
  this.email = email;<br />
 }<br />
}</p>
<p>我们看上面的代码，首先我们会发现，和以往我们看到的一般的Java Bean并没有太大的区别，都是一些属性，然后set,get方法。当然了，我们仔细观察，又看出了一些不同。这里面添加了很多的Java Annotation的内容，就是Java注解的内容。下面，我们来一一看一下这些个Java注解。<br />
@Entity：表示这是一个实体Bean。<br />
@Table(name=&#8221;context&#8221;)：对应数据库中的那一张表。<br />
@Id：主健<br />
@Column(name=&#8221;context_id&#8221;)：这一列在数据库中对应的是那一列，还有其他的一些参数可以设置。<br />
@GeneratedValue(strategy=GenerationType.AUTO)：自动增长<br />
@Column(name=&#8221;email&#8221;,length=30,nullable=true)：对应数据库中的email列，长度50，可以为空。<br />
当然了，我们还需要实现Serializable，实现序列化。<br />
好了，基本的出现的Java注解都已经讲完了，并且，我们的Java注解一定要写在get方法的上面，这是由相应的Java Annotation所规定的。<br />
好的，实体Bean已经开发完了，那么我们就应该写一些业务方法了。所以我们先创建接口，代码给出来。<br />
package org.adam.service;</p>
<p>import java.util.List;</p>
<p>import javax.ejb.Remote;</p>
<p>import org.adam.bean.UserBean;</p>
<p>@Remote<br />
public interface UserService {<br />
 <br />
 public void regist(UserBean user);<br />
 <br />
 public void delete(Integer user_id);<br />
 <br />
 public void update(UserBean user);<br />
 <br />
 public UserBean getUser(Integer user_id);<br />
 <br />
 public List getAllUser();<br />
}</p>
<p>package org.adam.service;</p>
<p>import java.util.List;</p>
<p>import javax.ejb.Remote;</p>
<p>import org.adam.bean.ContextBean;</p>
<p>@Remote<br />
public interface ContextService {<br />
 <br />
 public void say(ContextBean con);<br />
 <br />
 public void deletecontext(Integer context_id);<br />
 <br />
 public void updatecontext(ContextBean con);<br />
 <br />
 public ContextBean getSomething(Integer context_id);<br />
 <br />
 public List getAllContext();<br />
}</p>
<p>这是两个很简单的接口，没有什么好说的了，唯一稍有不同的在interface的上面有@Remote一句，这是表示一个远程接口的意思。<br />
好的，既然已经写完了接口，那么我们自然就要实现它，所以我们创建了两个类实现了这两个接口，先把代码给出来。</p>
<p>package org.adam.service.impl;</p>
<p>import java.util.List;</p>
<p>import javax.ejb.Stateless;<br />
import javax.persistence.EntityManager;<br />
import javax.persistence.PersistenceContext;</p>
<p>import org.adam.bean.ContextBean;</p>
<p>import org.adam.service.ContextService;<br />
@Stateless<br />
public class ContextServiceBean implements ContextService{</p>
<p> @PersistenceContext(unitName=&#8221;ejbdb&#8221;)<br />
 EntityManager em;<br />
 public void deletecontext(Integer context_id) {<br />
  em.remove(em.find(ContextBean.class, context_id));<br />
 }</p>
<p> public List getAllContext() {<br />
  return em.createQuery(&#8221;select c from ContextBean c&#8221;).getResultList();<br />
 }</p>
<p> public ContextBean getSomething(Integer context_id) {<br />
  return em.find(ContextBean.class, context_id);<br />
 }</p>
<p> public void say(ContextBean con) {<br />
  em.persist(con);<br />
 }</p>
<p> public void updatecontext(ContextBean con) {<br />
  em.merge(con);<br />
 }</p>
<p>}</p>
<p>package org.adam.service.impl;</p>
<p>import java.util.List;</p>
<p>import javax.ejb.Stateless;<br />
import javax.persistence.EntityManager;<br />
import javax.persistence.PersistenceContext;</p>
<p>import org.adam.bean.UserBean;<br />
import org.adam.service.UserService;</p>
<p>@Stateless<br />
public class UserServiceBean implements UserService{</p>
<p> @PersistenceContext(unitName=&#8221;ejbdb&#8221;)<br />
 EntityManager em;<br />
 public void delete(Integer user_id) {<br />
  em.remove(em.find(UserBean.class, user_id));<br />
 }</p>
<p> public List getAllUser() {<br />
  return em.createQuery(&#8221;select u from UserBean u&#8221;).getResultList();<br />
 }</p>
<p> public UserBean getUser(Integer user_id) {<br />
  return em.find(UserBean.class, user_id);<br />
 }</p>
<p> public void regist(UserBean user) {<br />
  em.persist(user);<br />
 }</p>
<p> public void update(UserBean user) {<br />
  em.merge(user);<br />
 }</p>
<p>}</p>
<p>这两个类的结构和代码基本上都是一样的，主要的不同点就是在与操纵的是不同的表，但是这不要紧，我们明白了一个，自然也就明白了另外一个。很简单。<br />
@Stateless：表示这是一个无状态的会话Bean。<br />
@PersistenceContext(unitName=&#8221;ejbdb&#8221;) ：记得我们在最前面的那个xml文件吗，里面有一项的内容就是ejbdb。在这里用到了。<br />
剩下的就没有什么特殊的了，就是5个很平常的Java代码。这样子其实就完成了会话Bean的开发。</p>
<p>好了，绝大部分的内容都完成了，为了验证我们的程序是否正确，我们使用了JUnit。实际上我也不很会这部分内容，但是简单的使用还是可以的。我在前面的教程中也讲到了如何使用，以及使用步骤，需要注意的地方等等。好了，把测试的代码给出来。<br />
package org.adam.unittest;</p>
<p>import static org.junit.Assert.*;</p>
<p>import java.util.List;<br />
import java.util.Properties;</p>
<p>import javax.naming.InitialContext;<br />
import org.adam.bean.UserBean;<br />
import org.adam.service.UserService;</p>
<p>import org.junit.BeforeClass;<br />
import org.junit.Test;</p>
<p>public class UserServiceTest {</p>
<p> private static UserService user;<br />
 @BeforeClass<br />
 public static void setUpBeforeClass() throws Exception {<br />
  Properties props = new Properties();<br />
  props.setProperty(&#8221;java.naming.factory.initial&#8221;,&#8221;org.jnp.interfaces.NamingContextFactory&#8221;);<br />
  props.setProperty(&#8221;java.naming.provider.url&#8221;, &#8220;jnp://localhost:1099&#8243;);<br />
  InitialContext ctx=new InitialContext(props); <br />
  user=(UserService)ctx.lookup(&#8221;UserServiceBean/remote&#8221;);<br />
 }</p>
<p> @Test<br />
 public void testDelete() {<br />
  user.delete(2);<br />
 }</p>
<p> @Test<br />
 public void testGetAllUser() {<br />
  List&lt;UserBean&gt; list=user.getAllUser();<br />
  for(int i=0;i&lt;list.size();i++){<br />
   System.out.println(list.get(i).getUsername());<br />
  }<br />
 }</p>
<p> @Test<br />
 public void testGetUser() {<br />
  UserBean u=user.getUser(1);<br />
  System.out.println(u.getUsername()+&#8221; &#8220;+u.getPassword());<br />
 }</p>
<p> @Test<br />
 public void testRegist() {<br />
  UserBean u=new UserBean();<br />
  u.setUsername(&#8221;Adam&#8221;);<br />
  u.setPassword(&#8221;43046721&#8243;);<br />
  user.regist(u);<br />
 }</p>
<p> @Test<br />
 public void testUpdate() {<br />
  UserBean u=new UserBean();<br />
  u.setUser_id(1);<br />
  u.setUsername(&#8221;张弘&#8221;);<br />
  u.setPassword(&#8221;123456&#8243;);<br />
  user.update(u);<br />
 }</p>
<p>}</p>
<p>package org.adam.unittest;</p>
<p>import static org.junit.Assert.*;</p>
<p>import java.util.List;<br />
import java.util.Properties;</p>
<p>import javax.naming.InitialContext;</p>
<p>import org.adam.bean.ContextBean;<br />
import org.adam.service.ContextService;<br />
import org.adam.service.UserService;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;</p>
<p>public class ContextServiceTest {</p>
<p> private static ContextService context;<br />
 @BeforeClass<br />
 public static void setUpBeforeClass() throws Exception {<br />
  Properties props = new Properties();<br />
  props.setProperty(&#8221;java.naming.factory.initial&#8221;,&#8221;org.jnp.interfaces.NamingContextFactory&#8221;);<br />
  props.setProperty(&#8221;java.naming.provider.url&#8221;, &#8220;jnp://localhost:1099&#8243;);<br />
  InitialContext ctx=new InitialContext(props); <br />
  context=(ContextService)ctx.lookup(&#8221;ContextServiceBean/remote&#8221;);<br />
 }</p>
<p> @Test<br />
 public void testSay() {<br />
  ContextBean c=new ContextBean();<br />
  c.setTitle(&#8221;hello&#8221;);<br />
  c.setContext(&#8221;helloworld&#8221;);<br />
  c.setEmail(&#8221;<a href="mailto:xyx@163.com">xyx@163.com</a>&#8220;);<br />
  context.say(c);<br />
 }</p>
<p> @Test<br />
 public void testDeletecontext() {<br />
  context.deletecontext(1);<br />
 }</p>
<p> @Test<br />
 public void testUpdatecontext() {<br />
  ContextBean c=new ContextBean();<br />
  c.setContext_id(1);<br />
  c.setTitle(&#8221;welcome&#8221;);<br />
  c.setContext(&#8221;helloworld&#8221;);<br />
  c.setEmail(&#8221;<a href="mailto:xyx@163.com">xyx@163.com</a>&#8220;);<br />
  context.updatecontext(c);<br />
 }</p>
<p> @Test<br />
 public void testGetSomething() {<br />
  ContextBean c=context.getSomething(1);<br />
  System.out.println(c.getTitle()+&#8221; &#8220;+c.getContext());<br />
 }</p>
<p> @Test<br />
 @SuppressWarnings(&#8221;unchecked&#8221;)<br />
 public void testGetAllContext() {<br />
  List&lt;ContextBean&gt; list=context.getAllContext();<br />
  for(int i=0;i&lt;list.size();i++){<br />
   System.out.println(list.get(i).getTitle()+&#8221; &#8220;+list.get(i).getContext());<br />
  }<br />
 }</p>
<p>}</p>
<p>经过验证，全部成功。那么，我们使用EJB3.0对于数据库的增删改查的功能就全部完成了，我们现在要做的，就是把这个EJB Project打成一个jar包，使用Eclipse自带的打包工具就可以，直接生成了一个jar包，拿来就可以使用了。<br />
我们创建一个Web项目，把jar导入，创建页面和servlet就可以了，bean基本上就用不到了。<br />
这个web项目我就写了一点点，没有什么难度了，大家参考一下吧！<br />
谢谢！</p>
]]></content:encoded>
			<wfw:commentRss>http://column.ibeifeng.com/adam43046721/20090210251.shtml/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
