基于EJB3.0的留言板项目的开发全过程

来源:互联网 发布:勇士vs雷霆西决数据 编辑:程序博客网 时间:2024/06/05 10:28

基于EJB3.0的留言板项目的开发全过程


因为工作关系,所以准备了EJB3.0的课程,其实以前就做过了这方面的工作,但是当时没有想到要讲课,所以学的很浅,而且很长时间不用也忘记了,这会又重写看了一下。其实,网上有很多的视频或者是什么的,但是貌似我就是没有看到一个稍微完整的项目例子的,很多都只是连上了数据库,稍微写一个方法就算完事了,所以这一次,我写了一个留言板,很简单的功能。当然很简单了,只是一对一的关系,但是这里面却也有一些体会。

好了,开始写了哦!
首先,不用说别的,肯定需要连接数据库,所以先创建一个数据库吧,我用的是mysql。都说了是很简单的留言板例子了,数据库当然简单的不象话了,这个不用多说了。配置一下数据源,说白了就是xml文件。这个文件不详细讲解了,一会我会把所有的文件打包传上来,并且在我前面的教程中也有这些内容。
好了,这几个准备工作完成了,那么我们创建一个EJB Project(EJB项目)。我们要知道这样子一个事情,EJB,我们用来作出一个一个的模块,然后我们在项目中去使用它。
项目创建好了以后,导入jar包,在jboss下的client下面。好了,一个项目建好了,我们在persistence.xml(在META-INF目录下面),创建项目的时候自动创建了一个,这个文件里面的内容是:

<?xml version=”1.0″?>
<persistence xmlns=”http://java.sun.com/xml/ns/persistence”
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
 xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence
 <A href=”http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd” target=_blank>http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd</A>” version=”1.0″>
 <persistence-unit name=”ejbdb” transaction-type=”JTA”>
  <jta-data-source>
   java:EJBDS
  </jta-data-source>
  <properties>
   <property name=”hibernate.hbm2dd1.auto” value=”create-drop”/>
  </properties>
 </persistence-unit>
</persistence>

简单说一下: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=”user”)
public class UserBean implements Serializable{
 
 private Integer user_id;
 
 private String username;
 
 private String password;

 @Id
 @Column(name=”user_id”)
 @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=”username”,length=50,nullable=false)
 public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 @Column(name=”password”,length=50,nullable=false)
 public String getPassword() {
  return password;
 }

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

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=”context”)
public class ContextBean implements Serializable{
 
 private Integer context_id;
 
 private String title;
 
 private String context;
 
 private String email;

 @Id
 @Column(name=”context_id”)
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Integer getContext_id() {
  return context_id;
 }

 public void setContext_id(Integer context_id) {
  this.context_id = context_id;
 }

 @Column(name=”title”,length=50,nullable=false)
 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }

 @Column(name=”context”,length=200,nullable=false)
 public String getContext() {
  return context;
 }

 public void setContext(String context) {
  this.context = context;
 }

 @Column(name=”email”,length=30,nullable=true)
 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }
}

我们看上面的代码,首先我们会发现,和以往我们看到的一般的Java Bean并没有太大的区别,都是一些属性,然后set,get方法。当然了,我们仔细观察,又看出了一些不同。这里面添加了很多的Java Annotation的内容,就是Java注解的内容。下面,我们来一一看一下这些个Java注解。
@Entity:表示这是一个实体Bean。
@Table(name=”context”):对应数据库中的那一张表。
@Id:主健
@Column(name=”context_id”):这一列在数据库中对应的是那一列,还有其他的一些参数可以设置。
@GeneratedValue(strategy=GenerationType.AUTO):自动增长
@Column(name=”email”,length=30,nullable=true):对应数据库中的email列,长度50,可以为空。
当然了,我们还需要实现Serializable,实现序列化。
好了,基本的出现的Java注解都已经讲完了,并且,我们的Java注解一定要写在get方法的上面,这是由相应的Java Annotation所规定的。
好的,实体Bean已经开发完了,那么我们就应该写一些业务方法了。所以我们先创建接口,代码给出来。
package org.adam.service;

import java.util.List;

import javax.ejb.Remote;

import org.adam.bean.UserBean;

@Remote
public interface UserService {
 
 public void regist(UserBean user);
 
 public void delete(Integer user_id);
 
 public void update(UserBean user);
 
 public UserBean getUser(Integer user_id);
 
 public List getAllUser();
}

package org.adam.service;

import java.util.List;

import javax.ejb.Remote;

import org.adam.bean.ContextBean;

@Remote
public interface ContextService {
 
 public void say(ContextBean con);
 
 public void deletecontext(Integer context_id);
 
 public void updatecontext(ContextBean con);
 
 public ContextBean getSomething(Integer context_id);
 
 public List getAllContext();
}

这是两个很简单的接口,没有什么好说的了,唯一稍有不同的在interface的上面有@Remote一句,这是表示一个远程接口的意思。
好的,既然已经写完了接口,那么我们自然就要实现它,所以我们创建了两个类实现了这两个接口,先把代码给出来。

package org.adam.service.impl;

import java.util.List;

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

import org.adam.bean.ContextBean;

import org.adam.service.ContextService;
@Stateless
public class ContextServiceBean implements ContextService{

 @PersistenceContext(unitName=”ejbdb”)
 EntityManager em;
 public void deletecontext(Integer context_id) {
  em.remove(em.find(ContextBean.class, context_id));
 }

 public List getAllContext() {
  return em.createQuery(“select c from ContextBean c”).getResultList();
 }

 public ContextBean getSomething(Integer context_id) {
  return em.find(ContextBean.class, context_id);
 }

 public void say(ContextBean con) {
  em.persist(con);
 }

 public void updatecontext(ContextBean con) {
  em.merge(con);
 }

}

package org.adam.service.impl;

import java.util.List;

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

import org.adam.bean.UserBean;
import org.adam.service.UserService;

@Stateless
public class UserServiceBean implements UserService{

 @PersistenceContext(unitName=”ejbdb”)
 EntityManager em;
 public void delete(Integer user_id) {
  em.remove(em.find(UserBean.class, user_id));
 }

 public List getAllUser() {
  return em.createQuery(“select u from UserBean u”).getResultList();
 }

 public UserBean getUser(Integer user_id) {
  return em.find(UserBean.class, user_id);
 }

 public void regist(UserBean user) {
  em.persist(user);
 }

 public void update(UserBean user) {
  em.merge(user);
 }

}

这两个类的结构和代码基本上都是一样的,主要的不同点就是在与操纵的是不同的表,但是这不要紧,我们明白了一个,自然也就明白了另外一个。很简单。
@Stateless:表示这是一个无状态的会话Bean。
@PersistenceContext(unitName=”ejbdb”) :记得我们在最前面的那个xml文件吗,里面有一项的内容就是ejbdb。在这里用到了。
剩下的就没有什么特殊的了,就是5个很平常的Java代码。这样子其实就完成了会话Bean的开发。

好了,绝大部分的内容都完成了,为了验证我们的程序是否正确,我们使用了JUnit。实际上我也不很会这部分内容,但是简单的使用还是可以的。我在前面的教程中也讲到了如何使用,以及使用步骤,需要注意的地方等等。好了,把测试的代码给出来。
package org.adam.unittest;

import static org.junit.Assert.*;

import java.util.List;
import java.util.Properties;

import javax.naming.InitialContext;
import org.adam.bean.UserBean;
import org.adam.service.UserService;

import org.junit.BeforeClass;
import org.junit.Test;

public class UserServiceTest {

 private static UserService user;
 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
  Properties props = new Properties();
  props.setProperty(“java.naming.factory.initial”,”org.jnp.interfaces.NamingContextFactory”);
  props.setProperty(“java.naming.provider.url”, “jnp://localhost:1099″);
  InitialContext ctx=new InitialContext(props); 
  user=(UserService)ctx.lookup(“UserServiceBean/remote”);
 }

 @Test
 public void testDelete() {
  user.delete(2);
 }

 @Test
 public void testGetAllUser() {
  List<UserBean> list=user.getAllUser();
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i).getUsername());
  }
 }

 @Test
 public void testGetUser() {
  UserBean u=user.getUser(1);
  System.out.println(u.getUsername()+” “+u.getPassword());
 }

 @Test
 public void testRegist() {
  UserBean u=new UserBean();
  u.setUsername(“Adam”);
  u.setPassword(“43046721″);
  user.regist(u);
 }

 @Test
 public void testUpdate() {
  UserBean u=new UserBean();
  u.setUser_id(1);
  u.setUsername(“张弘”);
  u.setPassword(“123456″);
  user.update(u);
 }

}

package org.adam.unittest;

import static org.junit.Assert.*;

import java.util.List;
import java.util.Properties;

import javax.naming.InitialContext;

import org.adam.bean.ContextBean;
import org.adam.service.ContextService;
import org.adam.service.UserService;
import org.junit.BeforeClass;
import org.junit.Test;

public class ContextServiceTest {

 private static ContextService context;
 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
  Properties props = new Properties();
  props.setProperty(“java.naming.factory.initial”,”org.jnp.interfaces.NamingContextFactory”);
  props.setProperty(“java.naming.provider.url”, “jnp://localhost:1099″);
  InitialContext ctx=new InitialContext(props); 
  context=(ContextService)ctx.lookup(“ContextServiceBean/remote”);
 }

 @Test
 public void testSay() {
  ContextBean c=new ContextBean();
  c.setTitle(“hello”);
  c.setContext(“helloworld”);
  c.setEmail(“xyx@163.com“);
  context.say(c);
 }

 @Test
 public void testDeletecontext() {
  context.deletecontext(1);
 }

 @Test
 public void testUpdatecontext() {
  ContextBean c=new ContextBean();
  c.setContext_id(1);
  c.setTitle(“welcome”);
  c.setContext(“helloworld”);
  c.setEmail(“xyx@163.com“);
  context.updatecontext(c);
 }

 @Test
 public void testGetSomething() {
  ContextBean c=context.getSomething(1);
  System.out.println(c.getTitle()+” “+c.getContext());
 }

 @Test
 @SuppressWarnings(“unchecked”)
 public void testGetAllContext() {
  List<ContextBean> list=context.getAllContext();
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i).getTitle()+” “+list.get(i).getContext());
  }
 }

}

经过验证,全部成功。那么,我们使用EJB3.0对于数据库的增删改查的功能就全部完成了,我们现在要做的,就是把这个EJB Project打成一个jar包,使用Eclipse自带的打包工具就可以,直接生成了一个jar包,拿来就可以使用了。
我们创建一个Web项目,把jar导入,创建页面和servlet就可以了,bean基本上就用不到了。
这个web项目我就写了一点点,没有什么难度了,大家参考一下吧!
谢谢!

原创粉丝点击