Professional Documents
Culture Documents
Tài liệu dành cho môn Phân tích thiết kế, Lớp D07CNTT, Học viện CNBCVT
import javax.ejb.Stateless;
@Stateless
public class ConverterBean implements Converter {
@Override
public double cToF(double c) {
return c * 9/5 + 32;
}
@Override
public double fToC(double f) {
return (f - 32) * 5/9;
}
}
@Stateless
@WebService
public class HelloServiceBean {
private String message = "Hello, ";
public void HelloServiceBean() {
}
@WebMethod
public String sayHello(String name) {
return message + name + ".";
}
}
4.2.5. Entity Bean
Một entity bean biểu diễn một dữ liệu bền được sao lưu bởi một cơ sở dữ liệu. Các sinh
viên, các giáo viên, và các khóa học là những ví dụ của entity bean. Mỗi entity bean có
một bảng trong cơ sở dữ liệu và mỗi thể hiện của bean được lưu giữ trong một hàng của
bảng. Một entity không tương ứng với bất kỳ một khách hàng cụ thể nào. Nó cung cấp
một truy cập được chia sẻ. Nó được hỗ trợ bởi dịch vụ giao tác EJB qua container của nó.
Nó có một trạng thái bền với một định danh khóa chính duy nhất, có thể được sử dụng
bởi một client để xác định vị trí một entity bean cụ thể.
Với EJB 2.x, có 2 loại entity bean :các entity bean Bean Managed Persistence
(BMP) và các entity bean Container Managed Persistence (CMP). Đây là một ví dụ của
entity bean BMP sinh viên. Một bảng cơ sở dữ liệu phải được tạo bằng SQL :
CREATE TABLE student
(id VARCHAR(3) CONSTRAINT pk_student PRIMARY KEY,
gpa Number(2,1)
);
//The following is the home interface for this student BMP entity
//bean.
import javax.ejb.*;
import java.util.*;
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.NamedQuery;
@Entity
@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book
b")
public class BookEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String title;
private float price;
@Column(length = 2000)
private String description;
private String isbn;
private int nbOfPage;
private boolean illustrations;
public BookEntity() {
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the
id fields are not set
if (!(object instanceof BookEntity)) {
return false;
}
BookEntity other = (BookEntity) object;
if ((this.id == null && other.id != null) || (this.id !=
null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.me.bookws.Book[id=" + id + "]";
}
}
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface BookRemote {
List<BookEntity> findAll();
int count();
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
@Stateless
public class BookBean implements BookRemote {
@PersistenceContext(unitName = "BookWSPU")
private EntityManager em;
@MessageDriven(mappedName = "jms/Queue")
public class SimpleMessageBean implements MessageListener {
@Resource
private MessageDrivenContext mdc;
public SimpleMessageBean() {
}
@Override
public void onMessage(Message inMessage) {
TextMessage msg = null;
try {
if (inMessage instanceof TextMessage) {
msg = (TextMessage) inMessage;
System.out.println("MESSAGE BEAN: Message
received: " + msg.getText());
} else {
System.out.println(
"Message of wrong type: "
+ inMessage.getClass().getName());
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
}
}
4.3. MÔ HÌNH KẾT NỐI CỦA EJB
Trong phần này, chúng ta sẽ thảo luận về các cơ chế kết nối giữa các thành phần EJB.
Chúng ta sẽ tìm hiểu cách liên kết thành phần cơ bản thành các khối để tạo thành các
thành phần mới hoặc các ứng dụng mới. Mô hình kết nối của EJB đưa ra các hướng dẫn
trong thiết kế các Thành phần EJB, các kết nối, và các giao tiếp giữa các thành phần.
[thành phần 2004].
Để cho một đối tượng client Thành phần EJB nói với các đối tượng Thành phần
EJB khác, client phải lấy được một đối tượng tham chiếu tới thành phần đích và một thể
hiện từ xa (RMI). Điều này có thể được thấy từ ví dụ chuyển đổi nhiệt độ.
Có thể có các kết nối đồng bộ hoặc không đồng bộ giữa 2 EJB thành phầns
thông qua interface từ xa hoặc cục bộ của các Thành phần EJB. Một Thành phần EJB
cũng có thể được truy cập bằng J2EE Web thành phần cũng như một JavaBean thành
phần, một Servlet thành phần, hoặc một JSP thành phần. Một EJB thành phần cũng có
thể truy cập các đối tượng dữ liệu khác của EIS bằng JDBC. Hình 4.4 biểu thị một
session bean phía trước kết nối với 2 entity bean phía sau bằng một cơ sở dữ liệu.
import java.util.*;
import javax.ejb.CreateException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ejb.CreateException;
import javax.ejb.EJBLocalHome;
import javax.ejb.FinderException;
public interface LocalStudentHome extends EJBLocalHome {
public LocalStudent create (String studentID, String Name)
throws CreateException;
import java.util.ArrayList;
import javax.ejb.EJBLocalObject;
public interface LocalStudent extends EJBLocalObject {
public String getStudentID();
public String getName();
public ArrayList getCourseList();
}
Ở đây chúng ta chỉ có danh sách entity CMP sinh viên, và entity bean CMP khóa học có
cấu trúc rất giống nhau trừ trường cmp và cmr. Bean khoá học bao gồm các phương thức
tương đương get và set tất cả các sinh viên được liên kết tới khóa học cụ thể.
public abstract Collection getStudents();
public abstract void setStudents(Collection students);
DD chỉ rõ mối quan hệ enterprise bean. Công cụ triển khai có thể được sử dụng
trong cả 2 lĩnh vực CMP và CMR , quan hệ bean-to-bean và code EJB SQL cho các
phương pháp cụ thể.
@Remote
public interface Cart {
public void initialize(String person) throws BookException;
public void initialize(
String person,
String id) throws BookException;
public void addBook(String title);
public void removeBook(String title) throws BookException;
public List<String> getContents();
public void remove();
}
Tạo lớp bắt ngoại lệ BookException
package cart.util;
import cart.util.BookException;
import cart.util.IdVerifier;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
@Stateful()
public class CartBean implements Cart {
List<String> contents;
String customerId;
String customerName;
customerId = "0";
contents = new ArrayList<String>();
}
if (idChecker.validate(id)) {
customerId = id;
} else {
throw new BookException("Invalid id: " + id);
}
if (result == false) {
throw new BookException("\"" + title + "\" not in
cart.");
}
}
@Remove()
public void remove() {
contents = null;
}
}
Bước 3: Xây dựng client
package cart.client;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import cart.ejb.Cart;
import cart.util.BookException;
/**
*
* The client class for the CartBean example. Client adds books
to the cart,
* prints the contents of the cart, and then removes a book which
hasn't been
* added yet, causing a BookException.
* @author ian
*/
public class CartClient {
@EJB
private static Cart cart;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
CartClient client = new CartClient(args);
client.doTest();
}
bookList = cart.getContents();
while (iterator.hasNext()) {
String title = iterator.next();
System.out.println
("Retrieving book title from cart: " +
title);
}
System.out.println
("Removing \"Gravity's Rainbow\" from
cart.");
cart.removeBook("Gravity's Rainbow");
cart.remove();
System.exit(0);
} catch (BookException ex) {
System.err.println
("Caught a BookException: " +
ex.getMessage());
System.exit(1);
} catch (Exception ex) {
System.err.println("Caught an unexpected
exception!");
ex.printStackTrace();
System.exit(1);
}
}
}
import javax.ejb.Remote;
/**
*
* @author HP
*/
@Remote
public interface Converter {
import javax.ejb.Stateless;
@Stateless
public class ConverterBean implements Converter {
@Override
public double cToF(double c) {
return c * 9/5 + 32;
}
@Override
public double fToC(double f) {
return (f - 32) * 5/9;
}
}
Bước 4: Build converter-ejb
Click chuột phải vào converter-ejb chọn build để build project
Bước 5: Tạo một ứng dụng web sử dụng converter-ejb: converter-war
<%!
private Converter converter = null;
public void jspInit() {
try {
InitialContext ic = new InitialContext();
converter = (Converter)
ic.lookup(Converter.class.getName());
} catch (Exception ex) {
System.out.println
("Couldn't create converter bean."+
ex.getMessage());
}
}
<html>
<head>
<title>Temperature Converter</title>
</head>
<body bgcolor="white">
<h1><b><center> Temperature Converter </center></b></h1>
<hr>
<p>Enter a degree to convert:</p>
<form method="get">
<input type="text" name="degree" size="25">
<br>
<p>
<input type="submit" name="fToC"
value="Fahrenheit to Centigrade">
<input type="submit" name="cToF"
value="Centigrade to Fahrenheit">
</form>
<%
DecimalFormat twoDigits = new DecimalFormat ("0.00");
String degree = request.getParameter("degree");
if ( degree != null && degree.length() > 0 ) {
double d = Double.parseDouble(degree);
%>
<%
if (request.getParameter("fToC") != null ) {
%>
<p>
<%= degree %> fahrenheit degrees are
<%= twoDigits.format(converter.fToC(d)) %>
centigrade degrees.
<% }
%>
<% if (request.getParameter("cToF") != null ) {
%>
<p>
<%= degree %> centigrade degrees are
<%= twoDigits.format (converter.cToF(d)) %>
fahrenheit degrees .
<% }
%>
<% }
%>
</body>
</html>
Bước 6: Built project converter-war
Click chuột phải vào converter chọn build
Bước 7: Chạy project converter-war
Kết quả:
4.6. KẾT LUẬN
EJB 2.x cung cấp một cơ sở hạ tầng thành phần tương tự như CORBA 3.0. Mô hình
thành phần của công nghệ EJB đc sử dụng trong việc xây dựng ứng dụng Java enterprise
trong môi trường phân tán. Bất cứ thánh phần EJB nào cũng có 2 interface và một lớp
bean để thực thi interface. giao diện home EJB quản lý vòng đời của một đối tượng EJB
như tạo, xoá một thể hiện,và tìm kiếm một thể hiện bean thực thể bằng khóa
chính.interface EJB cung cấp và thể hiện tất cả phương thức logic business logic để được
sử dụng bởi client của nó. Thực thi lớp bean mở rộng một lớp sesion bean hay lớp bean
entity,triển khai dựa trên kiểu của thành phần EJB. Có hai kiểu của session bean, stateless
và stateful,và cả hai đều hoạt động dựa trên các hành vi của client của nó. Thành phần
Stateless EJB không lưu giữ các thông tin trạng thái trong suốt phiên của chúng như một
máy tính điện tử online. Mặt khác stateful session bean cân lưu giữ vài thông tin về trạng
thái trong suốt phiên của chúng. Chẳng hạn, một session bean shopping cart cần theo
dõi việc thu thập của mục hàng của client. Có hai kiểu của entity bean - BMP và CMP -
cả hai đều sử dụng tầng back - end để kết nối đến database và hỗ trợ việc lưu trữ. Mỗi
entity bean có một bảng quan hệ sau nó. Mỗi thể hiện của thành phần entity EJB đc lưu
trữ trong bảng như là một cột. CMP entity bean được tự do truy cập code trong SQLvà
ánh xạ đến database được hoàn thành bởi developer trong thời gian triển khai.
EJB 3.0 có một số đặc tính mới giúp cho người phát triển dễ dàng hơn trong việc cài đặt
và triển khai các enterprise bean. Bất kỳ thành phần EJB nào được đánh giá qua các EJB
container, nó cung cấp các dịch vụ cần thiết và tạo ra các EJB khả chuyển hơn. Một
thành phần EJB được đóng gói, hợp, và triển khai trên server.