Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

EJB3 – JPA – JSF trong 1 ví dụ

EJB3 – JPA – JSF với Eclipse

Created-by: Võ Văn Hải
Blog: https://vovanhai.wordpress.com

Trong bài này, chúng ta dùng lại bài đã nói về JSF trong Eclipse. Ta sẽ hoàn thành các công việc sau:

Tạo Database trong MySQL

Bạn có thể dùng MySQL command-line, hoặc tool MySQLQueryBrowser, hoặc tool MySQLAdministrator để tạo 1 database có tên là test1.

Tạo database project với Eclipse

Trong Eclipse, vào menu Window->Open Perspective, chọn Other

jsfejb

Chọn Database Development. Nhấn OK. Layout của eclipse sẽ đổi và phía bên trái của ta có cửa sổ Data Source Explorer thay vì Project Explorer.

jsfejb

Nhấn phải chuột lên mục Databases, chọn New. Cửa sổ sau xuất hiện

jsfejb

Chọn mục MySQL, gõ tên của Connection Profile là « CustomersDB_profiles ». nhấn Next, gõ vào các thông tin cần thiết như hình.

jsfejb

Bạn có thể nhấn nút Test Connection để đảm bảo rằng kết nối của bạn thành công trước khi tiếp tục làm việc tiếp. Nhấn Finish để kết thúc việc tạo database project. Kết quả trong Data Source Explorer như sau

jsfejb

Bạn tạo bảng mới trong database vừa tạo bằng cách nhấn phải chuột lên mục Tables trong Data Souce Explorer của database vửa tạo rồi chọn “New Table”. Theo wizard bạn tạo bảng để có kết quả như câu query sau:

CREATE TABLE customers (

id INT NOT NULL,

name VARCHAR(255),

PRIMARY KEY (id)

);

Kết quả hoàn tất:

jsfejb

OK. Bây giờ phần Database đã hoàn tất, bạn có thể tạo 1 EJB project được rồi đấy.

Tạo EJB Project (làm Business Logic)

Bạn quay lại JavaEE Perspective bằng cách vào menu Window->Open Perspective->Others, chọn Java EE.

Vào menu File->New->Others, chọn mục EJB->EJB Project.

Đặt tên Project là FirstJPAProject.

Mục Target runtime chọn Jboss4.2.2 (nếu chưa có bạn phải cấu hình 1 cái bằng cách nhấn nút New bên cạnh). EJB Module version chọn 3.0.

Trong mục Configuration, nhấn nút Modify. Chọn “Java Persistence 1.0” như hình

jsfejb

Nhấn OK.

Nhấn Next 2 lần, cửa sổ sau xuất hiện

jsfejb

Đảm bảo bạn chọn đúng như hình. Nhấn Finish để hoàn tất bước này.

Tạo Entity

Bây giờ chúng ta sẽ dùng wizard “Generate Entities” để sinh ra JPA entity từ bảng cơ sở dữ liệu của chúng ta.

Nhấn phải chuột lên project JPA của chúng ta, chọn đến mục “JPA Tools->Generate Entities…”. Cấu hình như hình sau:

jsfejb

Nhấn Next. Trong package gõ vovanhai.wordpress.jpa và trong Tables nhớ check vào bảng customers như hình.

jsfejb

Nhấn Finish. Chúng ta sẽ có lớp Customers trong gói vovanhai.wordpress.jpa. Nhưng mọi thứ dường như có lỗi. Hãy an tâm! Chúng ta cần phải chuyển perspective cho nó và fix lỗi này bằng cách:

Vào menu Window->Open Perspective, chọn Other sau đó chọn JPA. Eclipse sẽ chuyển layout sang JPA. Ở góc dưới của màn hình bên phải ta thấy bảng sau xuất hiện và bạn sẽ cấu hình như hình sau

jsfejb

Good! Lưu file Customers.java, mọi lỗi sẽ được giải quyết!.

Có lẽ chúng ta nên đổi tên lớp từ Customers lại thành Customer bởi theo chuẩn thì tên lớp không thể ở dạng số nhiều bằng cách chọn tên lớp Customers, nhấn tổ hợp phím Alt-Shift-R sau đó bỏ chữ s rồi nhấn Enter. Sau đó ta phải đổi annotation của lớp lại như sau:

@Entity

@Table(schema=“test1”, name=customers”)

public class Customer implements Serializable {

//…

}

Bạn có thể hiệu chỉnh lớp này lại theo ý mình, chẳng hạn tôi thêm vào annotation cho phép id tự động tăng khi thêm 1 mẫu tin. Code hoàn chỉnh như sau:

package vovanhai.wordpress.jpa;

import java.io.Serializable;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

@Entity

@Table(schema=“test1”, name=“customers”)

public class Customer implements Serializable {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private int id;

private String name;

private static final long serialVersionUID = 1L;

public Customer() {

super();

}

public Customer(String name) {

this.name=name;

}

public int getId() {

return this.id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

}

Tạo Enterprise Java Bean

1. Tạo Remote Interface: Vào Menu File->New->Interface, đặt tên Interface là CustomerDAO. Tất nhiên nó nằm cùng gói với Customer class. Nội dung như sau

package vovanhai.wordpress.jpa;

import java.util.Collection;

import javax.ejb.Remote;

@Remote

public interface CustomerDAO {

public void addCustomer(Customer customer);

public Customer findCustomerByID(int id);

public Collection<Customer>getAllCustomers();

}

2. Tạo stateless session bean: tạo 1 lớp mới có tên CustomerDAOBean với nội dung sau:

package vovanhai.wordpress.jpa;

import java.util.Collection;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

@Stateless

public class CustomerDAOBean implements CustomerDAO {

@PersistenceContext (name=“FirstJPAProject”)

private EntityManager entityManager;

@Override

public void addCustomer(Customer customer) {

entityManager.persist(customer);

}

@Override

public Customer findCustomerByID(int id) {

return entityManager.find(Customer.class, id);

}

@SuppressWarnings(“all”)

@Override

public Collection<Customer> getAllCustomers() {

return (Collection<Customer>)

(entityManager.createQuery(“from Customer c”)

.getResultList());

}

}

3. Cấu hình đặc tả triển khai (deployment descriptor):

Mở file Persistence.xml và cấu hình như sau

<?xml version=“1.0” encoding=“UTF-8”?>

<persistence version=“1.0”

xmlns=http://java.sun.com/xml/ns/persistence&#8221; xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance&#8221;

xsi:schemaLocation=http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&#8221;>

<persistence-unit name=“demoJPA”>

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

<properties>

<property name=“hibernate.dialect” value=“org.hibernate.dialect.MySQLDialect” />

<property name=“hibernate.hbm2ddl.auto” value=“create-drop” />

</properties>

</persistence-unit>

</persistence>

Lưu ý :

<jta-data-source>java:/MySQLDS</jta-data-source> là data source mà bạn phải cấu hình trong Jboss bằng cách thêm hoặc sửa file mysql-ds.xml sao cho có dạng sau

<datasources>

<local-tx-datasource>

<jndi-name>MySQLDS</jndi-name>

<connection-url>jdbc:mysql://localhost:3306/test1</connection-url>

<driver-class>com.mysql.jdbc.Driver</driver-class>

<user-name>root</user-name>

<password></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>

<!–các data source khác ở phần tiếp theo–>

<!–…–>

</datasources>

<property name=“hibernate.hbm2ddl.auto” value=“create-drop” /> chỉ cho hibernate tạo mới bảng khi triển khai cũng như xóa bảng khi kết thúc. Nếu ban muốn giữ các mẫu tin sau khi kết thúc thì bạn đổi value lại thành update (Chỗ này đọc thêm trong tài liệu hibernate sẽ hiểu thêm).

4. Triển khai

Bạn có thể nhấn phải chuột lên project và chọn Run As-> Run on server. Nhớ chọn server là Jboss nhé.

Bạn sẽ thấy kết quả khi triển khai dạng như sau

…………

15:23:46,356 INFO [NamingHelper] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}

15:23:46,527 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer

15:23:46,531 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=FirstJPAProject.jar,name=CustomerDAOBean,service=EJB3 with dependencies:

15:23:46,531 INFO [JmxKernelAbstraction] persistence.units:jar=FirstJPAProject.jar,unitName=FirstJPAProject

15:23:46,570 INFO [EJBContainer] STARTED EJB: vovanhai.wordpress.jpa.CustomerDAOBean ejbName: CustomerDAOBean

15:23:46,619 INFO [EJB3Deployer] Deployed: file:/E:/javaSoft/jboss-4.2.3.GA/server/default/deploy/FirstJPAProject.jar

15:23:46,745 INFO [TomcatDeployer] deploy, ctxPath=/jmx-console, warUrl=…/deploy/jmx-console.war/

15:23:47,010 INFO [Http11Protocol] Starting Coyote HTTP/1.1 on http-127.0.0.1-8080

15:23:47,028 INFO [AjpProtocol] Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009

15:23:47,037 INFO [Server] JBoss (MX MicroKernel) [4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)] Started in 25s:806ms

Chúc mừng bạn đã thành công!

5. Tạo Client để thử

Tạo lớp có tên Client với nội dung code như sau:

package vovanhai.wordpress.jpa;

import javax.naming.InitialContext;

public class Client {

public static void main(String[] args) {

try {

System.setProperty(“java.naming.factory.initial”,

“org.jnp.interfaces.NamingContextFactory”);

System.setProperty( “java.naming.provider.url”, “localhost:1099” );

System.setProperty( “java.naming.factory.url.pkgs”, “org.jboss.naming” );

InitialContext context=new InitialContext();

CustomerDAO dao=(CustomerDAO)context.lookup(“CustomerDAOBean/remote”);

Customer firstCust=new Customer();

firstCust.setId(1);

firstCust.setName(“Nguyen Van Teo”);

dao.addCustomer(firstCust);

Customer found=dao.findCustomerByID(1);

System.out.println(found.getName());

} catch (Exception e) {

e.printStackTrace();

}

}

}

Mọi thứ tuyệt vời quá phải không? Mở database MySQL, bạn sẽ thấy mẫu tin của bạn đã có ở đấy.

Tạo JSF project (làm Presentation Logic)

Ở đây thay vì tạo mới 1 JSF project, ta sử dụng lại bài tạo JSF project đã nói ở phần trước. Ta chỉ hiệu chỉnh lại vài chỗ:

1. Tham chiếu cho project đến JPA project của chúng ta

Nhấn phải chuột lên FirstJSFProject chọn Properties. Chọn mục “java EE Module Dependencies” sau đó check vào FirstJPAProject. Nhấn OK.

jsfejb

2. Thay đổi nội dung bean và các trang jsp

Nội dung của lớp CustomerBean bây giờ như sau

package vovanhai.com.web;

import java.util.Collection;

import javax.naming.InitialContext;

import vovanhai.wordpress.jpa.Customer;

import vovanhai.wordpress.jpa.CustomerDAO;

public class CustomerBean {

private int id;

private String name;

public CustomerBean() {

this.id = 0;

this.name = “no-name”;

}

public CustomerBean(int id, String name) {

this.id = id;

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String add(){

CustomerDAO dao=getCustomerDAO();

Customer cust=new Customer();

cust.setId(id);

cust.setName(name);

dao.addCustomer(cust);

return “success”;

}

public Collection<Customer>getAll(){

return getCustomerDAO().getAllCustomers();

}

private CustomerDAO getCustomerDAO(){

CustomerDAO dao=null;

try {

System.setProperty(“java.naming.factory.initial”,

“org.jnp.interfaces.NamingContextFactory”);

System.setProperty( “java.naming.provider.url”, “localhost:1099” );

System.setProperty( “java.naming.factory.url.pkgs”, “org.jboss.naming” );

InitialContext context=new InitialContext();

dao=(CustomerDAO)context.lookup(“CustomerDAOBean/remote”);

} catch (Exception e) {

e.printStackTrace();

}

return dao;

}

}

Nội dung file addCustomer,jsp không đổi.

Nội dung của trang listCustomers.jsp bây giờ như sau

<%@taglib uri=http://java.sun.com/jsf/core&#8221; prefix=“f”%><%@taglib

uri=http://java.sun.com/jsf/html&#8221; prefix=“h”%><%@ page language=“java”

contentType=“text/html; charset=UTF-8” pageEncoding=“ISO-8859-1”%>

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” http://www.w3.org/TR/html4/loose.dtd&#8221;>

<html>

<head>

<meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1”>

<title>List Customers</title>

</head>

<body>

<f:view>

<h:form>

<h:dataTable border=“1” value=“#{customerBean.all}”

var=“currentCustomer”>

<h:column id=“column1”>

<h:outputText value=“#{currentCustomer.id}”></h:outputText>

<f:facet name=“header”>

<h:outputText value=“id”></h:outputText>

</f:facet>

</h:column>

<h:column id=“column2”>

<h:outputText value=“#{currentCustomer.name}”></h:outputText>

<f:facet name=“header”>

<h:outputText value=“name”></h:outputText>

</f:facet>

</h:column>

</h:dataTable>

</h:form>

</f:view>

</body>

</html>

Chạy file addCustomer.jsp. Bạn thử thêm vài mẫu tin. Mở database lên xem thử kết quả thế nào!

Chúc các bạn thành công!

9 Responses to “EJB3 – JPA – JSF trong 1 ví dụ”

  1. vinhnguyenvn said

    Chao a Hai. Em da chay thu ví dụ trên nhưng ở giai đọan triển khai project trên server thì nó báo lổi

    org.jboss.deployers.spi.DeploymentException: Error deploying FirstJPAProject.jar: could not be found: vovanhai.wordpress.jpa.CustomerDAOBean.FirstJPAProject
    at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:201)
    at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:103)
    at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
    at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
    at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
    at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:698)
    at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
    at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
    at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
    at org.jboss.Main.boot(Main.java:209)
    at org.jboss.Main$1.run(Main.java:547)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.RuntimeException: could not be found: vovanhai.wordpress.jpa.CustomerDAOBean.FirstJPAProject
    at org.jboss.injection.InjectionUtil.findInjectionTarget(InjectionUtil.java:223)
    at org.jboss.injection.InjectionUtil.injectionTarget(InjectionUtil.java:299)
    at org.jboss.injection.PersistenceContextHandler.loadXml(PersistenceContextHandler.java:64)
    at org.jboss.ejb3.EJBContainer.processMetadata(EJBContainer.java:588)
    at org.jboss.ejb3.Ejb3Deployment.processEJBContainerMetadata(Ejb3Deployment.java:415)
    at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:523)
    at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:194)
    … 22 more

    Mong anh hướng dẩn giúp em giải quyết vấn đề này. Cảm ơn anh Hải nhiều.

  2. vinhnguyenvn said

    Cai loi nay e chinh dc roi(do thieu file cau hinh cho mysql). Nhung gio em chay file Client.java thì nó báo lổi javax.naming.NameNotFoundException: CustomerDAOBean not bound.

    Xin a huong dan cai loi nay giup em.

  3. Phan Tien Dung said

    Em cũng gặp phải lỗi này khi viết EJB mong thầy có thể hưỡng dẫn bọn em!

  4. Hien Huynh said

    Cho mình góp ý, nếu đã xài EJB3, thì nên xài Annotation, không nên dùng JNDI lookup:

    System.setProperty(“java.naming.factory.initial”,

    “org.jnp.interfaces.NamingContextFactory”);

    System.setProperty( “java.naming.provider.url”, “localhost:1099″ );

    System.setProperty( “java.naming.factory.url.pkgs”, “org.jboss.naming” );

    InitialContext context=new InitialContext();

    CustomerDAO dao=(CustomerDAO)context.lookup(“CustomerDAOBean/remote”);

    nên inject CustomerDAO như cách bên dưới:
    @EJB
    private CustomerDAO dao;

    Đây là URL để tham khảo Faces và EJB3: http://www.packtpub.com/article/Building-JSF-EJB3-Applications

    Hope this help.

  5. an said

    xin gui cho toi

  6. NguyenDuc said

    khi triển khai project JPA trên server e mắc lỗi như sau:

    00:28:44,312 ERROR [AbstractKernelController] Error installing to Real: name=vfszip:/C:/sorf/jboss-5.0.0.GA/server/default/deploy/FirstJPAProject.jar state=PreReal mode=Manual requiredState=Real
    org.jboss.deployers.spi.DeploymentException: Error deploying FirstJPAProject.jar: could not be found: vovanhai.wordpress.jpa.CustomerDAOBean.FirstJPAProject
    at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:203)
    at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:104)
    at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
    at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
    at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
    at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
    at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
    at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
    at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
    at org.jboss.Main.boot(Main.java:209)
    at org.jboss.Main$1.run(Main.java:547)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.RuntimeException: could not be found: vovanhai.wordpress.jpa.CustomerDAOBean.FirstJPAProject
    at org.jboss.injection.InjectionUtil.findInjectionTarget(InjectionUtil.java:223)
    at org.jboss.injection.InjectionUtil.injectionTarget(InjectionUtil.java:299)
    at org.jboss.injection.PersistenceContextHandler.loadXml(PersistenceContextHandler.java:64)
    at org.jboss.ejb3.EJBContainer.processMetadata(EJBContainer.java:584)
    at org.jboss.ejb3.Ejb3Deployment.processEJBContainerMetadata(Ejb3Deployment.java:415)
    at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:523)
    at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:196)
    … 22 more
    00:28:44,343 ERROR [ProfileServiceBootstrap] Failed to load profile: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):

    *** CONTEXTS IN ERROR: Name -> Error

    vfszip:/C:/sorf/jboss-5.0.0.GA/server/default/deploy/FirstJPAProject.jar -> java.lang.RuntimeException: could not be found: vovanhai.wordpress.jpa.CustomerDAOBean.FirstJPAProject

    Mong thầy giúp e với ạ! Nếu được thầy có thể gửu e file jar và war của 2 project này được k ạ. em cảm ơn.

  7. Phuong said

    Thua Thay.Em dang lam ePro cua sem4.Muon lam identity id.Vd nhu CuatomerID la cust01 , neu insert thi tang len cust02 , cust03.Mong thay demo giup em.Cam on Thay.

  8. giaminhle said

    Chu y cac ban dang su dung JPA 1.0 hay JPA 2.0
    JPA 2.0 con bug

  9. […] EJB3 – JPA – JSF trong 1 ví dụ « Võ Văn Hải's blog – EJB3 – JPA – JSF với Eclipse Created-by: Võ Văn Hải Blog: https://vovanhai. wordpress.com Trong bài này, chúng ta dùng lại bài đã nói về JSF trong Eclipse. Ta sẽ hoàn thành các công việc sau: Tạo Database trong MySQL Bạn có thể dùng MySQL command-line, hoặc tool MySQLQueryBrowser, hoặc tool. […]

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.