J2EE实践第三部分-创建一个完整的EJB Web应用(JPA示例)

来源:互联网 发布:淘宝网分销商 编辑:程序博客网 时间:2024/05/16 05:05

<!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 10]>

1.        1.本文主要技术采用了Servlet + JSP + EJB 3.0 + JPA,开发环境用的是EclipseHelios + JDK 1.6 + JBOSS 5.1 + MySQL 5.1数据库。

2.        2. 示例场景:用户通过Web页面对Employee进行创建、查找和删除。这个小例子重点是演示JPA的使用。JPAJavaPersistence API的缩写,主要是将关系数据库的操作对象化,它的j2ee的标准规范,由于其自身简单易用的优点,也是SAP推荐使用的数据库技术。

3.     3.准备工作:

(1)   安装JBOSS 5.1

(2)   安装MySQL 5.1

(3)   Jboss配置数据源

首先启动mysql后,创建一个数据库叫ejbtest,然后创建一个用户jboss,密码是password,并将ejbtest的权限赋给它。

然后在路径jboss-5.1.0.GA/server/default/deploy下放入mysql-ds.xml文件。

Mysql-ds.xml:
<datasources>
    <local-tx-datasource>
       <jndi-name>MySqlDS</jndi-name>
       <connection-url>jdbc:mysql://localhost:3306/ejbtest</connection-url>
       <driver-class>com.mysql.jdbc.Driver</driver-class>
       <user-name>jboss</user-name>
       <password>password</password>
    </local-tx-datasource>
</datasources>

4.      4.开发

   4.1先创建一个EJB Project,名字叫EmployeeEJB

然后在META-INF目录下新建一个persistence.xml文件

<?xmlversion="1.0"encoding="UTF-8"?>

<persistencexmlns="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

   http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

   version="1.0">

   <persistence-unitname="EmployeeDS">

       <jta-data-source>java:/MySqlDS</jta-data-source>

       <properties>

           <propertyname="hibernate.hbm2ddl.auto"value="update"/>

       </properties>

   </persistence-unit>

</persistence>

    4.2开始创建我们的Entity BeanEmployee类,它是一个简单的Java Bean

package com.sap.demo.ejb.employee.model;

 

import javax.persistence.Entity;

import javax.persistence.Id;

 

@Entity

public class Employee {

     @Id

     privateint id;

     

     publicint getId() {

           returnid;

     }

 

     publicvoid setId(int id) {

           this.id= id;

     }

 

     publicString getName() {

           returnname;

     }

 

     publicvoid setName(String name) {

           this.name= name;

     }

 

     privateString name;

}

      4.3 ejb项目中创建一个LocalSessionBean,名字叫EmployeeServicel,它的主要功能是对employee进行数据的操作,包括创建、查找、删除。

接口声明:

package com.sap.demo.ejb.employee.ejb;

 

import javax.ejb.Local;

 

importcom.sap.demo.ejb.employee.model.Employee;

 

@Local

public interface EmployeeServiceLocal {

     publicEmployee createEmployee(int id, String name);

 

     publicEmployee findEmployee(int id);

 

     publicvoid deleteEmployee(int id);

}

 

这里是接口的实现:

package com.sap.demo.ejb.employee.ejb;

 

import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;

import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

importcom.sap.demo.ejb.employee.model.Employee;

 

/**

 *Session Bean implementation class EmployeeService

 */

@Stateless

public class EmployeeService implementsEmployeeServiceLocal {

     @PersistenceContext(unitName= "EmployeeDS")

     privateEntityManager em;

 

     @Override

     publicEmployee createEmployee(int id, String name) {

           Employeeemp = new Employee();

           emp.setId(id);

           emp.setName(name);

           em.persist(emp);

           returnemp;

     }

 

     @Override

     @TransactionAttribute(TransactionAttributeType.SUPPORTS)

     publicEmployee findEmployee(int id) {

           returnem.find(Employee.class, new Integer(id));

     }

 

     @Override

     publicvoid deleteEmployee(int id) {

           Employeeemp = findEmployee(id);

           if(emp != null) {

                 em.remove(emp);

           }

 

     }

}

     这样EJB项目就创建完毕了。

4    4.4 然后创建Web Project,名字叫EmployeeWeb。这个项目很简单,包含一个Servlet和两个页面index.jspresult.jsp。用户在index.jspemployee进行创建、查找、删除,然后由result.jsp负责展示结果。

Index.jsp

<%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1"

   pageEncoding="ISO-8859-1"%>

<!DOCTYPEhtmlPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1">

<title>Insert titlehere</title>

</head>

<body>

<FORMACTION="ShowResult">

 Id:

 <INPUTTYPE="text"NAME="id"/><P>

 Name: 

 <INPUTTYPE="TEXT"NAME="name"/>

 <INPUTTYPE="hidden"NAME="method"VALUE="create"/>

 <INPUTTYPE="SUBMIT"VALUE="Createemployee and show result.">

</FORM>

 

<FORMACTION="ShowResult">

 Id:

 <INPUTTYPE="text"NAME="id"/>

 <inputTYPE="hidden"NAME="method"VALUE="find"/>

 <INPUTTYPE="SUBMIT"VALUE="Find employeeand show result.">

</FORM>

 

<FORMACTION="ShowResult">

 Id:

 <INPUTTYPE="text"NAME="id"/>

 <inputTYPE="hidden"NAME="method"VALUE="delete"/>

 <INPUTTYPE="SUBMIT"VALUE="Deleteemployee and show result.">

</FORM>

</body>

</html>

result.jsp

<%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1"

   pageEncoding="ISO-8859-1"%>

<!DOCTYPEhtmlPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1">

<title>Insert titlehere</title>

</head>

<body>

<jsp:useBeanid="employee"type="com.sap.demo.ejb.employee.model.Employee"scope="request"/>

id:<jsp:getPropertyname="employee"property="id"/>,

name:<jsp:getPropertyname="employee"property="name"/>

</body>

</html>

最后是Servlet ShowResult:

package com.sap.demo.ejb.servlets;

 

import java.io.IOException;

 

import javax.ejb.EJB;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

import com.sap.demo.ejb.employee.ejb.EmployeeServiceLocal;

importcom.sap.demo.ejb.employee.model.Employee;

 

/**

 *Servlet implementation class ShowResult

 */

 

public class ShowResult extends HttpServlet {

     privatestatic final long serialVersionUID = 1L;

   

     @EJB

     privateEmployeeServiceLocal service;

   /**

    *@see HttpServlet#HttpServlet()

    */

   public ShowResult() {

       super();

       // TODO Auto-generated constructor stub

   }

 

     /**

      * @see HttpServlet#doGet(HttpServletRequestrequest, HttpServletResponse response)

      */

     protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

 

           Stringmethod = request.getParameter("method");

           if(method.equals("create")) {

                 Stringname = request.getParameter("name");

                 Stringids = request.getParameter("id");

                 intid = Integer.parseInt(ids);

                 Employeeem = service.createEmployee(id, name);

                 request.setAttribute("employee",em);

           }elseif (method.equals("find")) {

                 Stringids = request.getParameter("id");

                 intid = Integer.parseInt(ids);

                 Employeeem = service.findEmployee(id);

                 request.setAttribute("employee",em);

           }else if (method.equals("delete")){

                 Stringids = request.getParameter("id");

                 intid = Integer.parseInt(ids);

                 Employeeem = service.findEmployee(id);

                 if(em != null){

                       service.deleteEmployee(id);

                       request.setAttribute("employee",em);

                 }

           }

           RequestDispatcherdispatcher = request.getRequestDispatcher("result.jsp");

           dispatcher.forward(request,response);

     }

 

     /**

      * @see HttpServlet#doPost(HttpServletRequestrequest, HttpServletResponse response)

      */

     protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

           //TODO Auto-generated method stub

     }

 

}

 

5.        5.部署程序、运行:

首先输入一个编号和用户名,点击创建


然后可以看到创建完毕。


然后输入编号,点查找


找到了结果。


最后看一下数据库,数据在数据库中


 

6.      6.小结

一共是三个项目,EmpoyeeESR,EmployeeEJB, EmployeeWeb。关于部署和运行的细节我就不细说了。这个例子虽然很简单,但是麻雀虽小,五脏俱全。有几个地方值得注意:

      (1)首先它还是演示了EJB3.0的诸多优点,Employee虽然是一个EntityBean,但是它只是一个普通的javabean,不过加了一个@Entity的注释。另外在Servelt中,我们使用SessionBean EmployeeServiceLocal的时候是通过Inception的方式,非常简单。

      (2)EJB项目里的persistent.xml保存了一些关于数据源的信息。在使用JPAEntityManager来进行数据操作时,必须首先声明persistentunit

      (3)Session Bean EmployeeService值得注意,它使用了JPAEntityManger,也是通过注入的方式。然后对数据库的操作也就是transaction都由服务器自动管理。对于find方法,我们使用了这样的注释:@TransactionAttribute(TransactionAttributeType.SUPPORTS)

这是指不用使用transaction。默认是自动打开事务并提交到数据库。

这个例子前端采用jsp展示,业务逻辑有EJB来实现,持久层使用了JPA来对业务对象进行操作。下一部分,我想使用SAPCAF来完成同样的功能。

原创粉丝点击