Привет всем,
В этой статье мы собираемся продемонстрировать, как правильно интегрировать GWT и EJB3 , чтобы реализовать пример проекта, собрать его с помощью maven и развернуть на сервере приложений JBoss 5.1 . На самом деле вы можете легко изменить зависимости в файле сборки maven и развернуть проект на своем любимом сервере приложений. Чтобы быть как можно более универсальными, мы будем использовать командную строку maven и текстовый редактор gedit.
Сначала мы должны создать проект POM . Мы назовем это ejb-gwt.
|
1
2
3
|
mkdir ejb-gwt cd ejb-gwtgedit pom.xml |
pom.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.javacodegeeks</groupid> <artifactid>ejb-gwt</artifactid> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>ejb-gwt</name> <properties> <project.build.sourceencoding>UTF-8</project.build.sourceencoding> </properties> <dependencies> </dependencies> <modules> </modules> <build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <configuration> 1.6 <target>1.6</target> </configuration> </plugin> </plugins> </build></project> |
Затем мы создадим модуль, который будет содержать классы ejb. Мы назовем это ejb-jar.
|
1
2
3
4
5
6
7
|
mvn archetype:create -DgroupId=com.javacodegeeks -DartifactId=ejb-jarcd ejb-jar/src/mainmkdir resourcescd resourcesmkdir META-INFcd META-INFgedit persistence.xml |
Мы настроим файл persistence.xml для использования источника данных по умолчанию jboss.
persistence.xml
|
01
02
03
04
05
06
07
08
09
10
11
|
<persistence version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="MyPersistenceUnit"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="update"> <property name="hibernate.show_sql" value="true"> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"> </property></property></property></properties> </persistence-unit></persistence> |
В src / java вы разместите свой ejb-код. В нашем примере у нас есть бин сущности
Employee.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
package com.javacodegeeks.ejb.entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "EMPLOYEE")public class Employee implements java.io.Serializable { private static final long serialVersionUID = 7440297955003302414L; @Id @Column(name="employee_id") private long employeeId; @Column(name="employee_name", nullable = false, length=30) private String employeeName; @Column(name="employee_surname", nullable = false, length=30) private String employeeSurname; @Column(name="job", length=50) private String job; public Employee() { } public Employee(int employeeId) { this.employeeId = employeeId; } public Employee(long employeeId, String employeeName, String employeeSurname, String job) { this.employeeId = employeeId; this.employeeName = employeeName; this.employeeSurname = employeeSurname; this.job = job; } public long getEmployeeId() { return employeeId; } public void setEmployeeId(long employeeId) { this.employeeId = employeeId; } public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } public String getEmployeeSurname() { return employeeSurname; } public void setEmployeeSurname(String employeeSurname) { this.employeeSurname = employeeSurname; } public String getJob() { return job; } public void setJob(String job) { this.job = job; }} |
Локальный интерфейс сессионного компонента.
EmployeeService.java
|
01
02
03
04
05
06
07
08
09
10
11
|
package com.javacodegeeks.ejb.session;import com.javacodegeeks.ejb.entity.Employee;public interface EmployeeService { public Employee findEmployee(long employeeId); public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception; public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception; public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception; public void deleteEmployee(long employeeId) throws Exception;} |
И, наконец, сессионный компонент.
EmployeeServiceBean.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package com.javacodegeeks.ejb.session;import javax.ejb.Local;import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import com.javacodegeeks.ejb.entity.Employee;@Stateless(name = "employeeService")@Local(EmployeeService.class)public class EmployeeServiceBean implements EmployeeService { @PersistenceContext private EntityManager entityManager; public void deleteEmployee(long employeeId) throws Exception { entityManager.remove(entityManager.find(Employee.class, employeeId)); } public Employee findEmployee(long employeeId) { return entityManager.find(Employee.class, employeeId); } public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception { Employee emp = new Employee(); emp.setEmployeeId(employeeId); emp.setEmployeeName(name); emp.setEmployeeSurname(surname); emp.setJob(jobDescription); entityManager.persist(emp); } public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception { Employee emp = new Employee(); emp.setEmployeeId(employeeId); emp.setEmployeeName(name); emp.setEmployeeSurname(surname); emp.setJob(jobDescription); entityManager.merge(emp); } public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception { Employee emp = entityManager.find(Employee.class, employeeId); emp.setEmployeeName(name); emp.setEmployeeSurname(surname); emp.setJob(jobDescription); entityManager.merge(emp); }} |
Pom.xml модуля ejb-jar должен быть:
pom.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <parent> <artifactid>ejb-gwt</artifactid> <groupid>com.javacodegeeks</groupid> <version>0.0.1-SNAPSHOT</version> </parent> <groupid>com.javacodegeeks</groupid> <artifactid>ejb-jar</artifactid> <version>0.0.1-SNAPSHOT</version> <name>ejb-jar</name> <packaging>ejb</packaging> <repositories> <repository> <id>jboss-maven2</id> </repository> </repositories> <dependencies> <dependency> <groupid>org.jboss.jbossas</groupid> <artifactid>jboss-as-client</artifactid> <version>5.1.0.GA</version> <type>pom</type> <scope>provided</scope> </dependency> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-ejb-plugin</artifactid> <configuration> <ejbversion>3.0</ejbversion> </configuration> </plugin> </plugins></build></project> |
Теперь мы создадим наш веб-проект на основе gwt-maven-plugin archertype.
|
1
2
3
|
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.2 -DgroupId=com.javacodegeeks -DartifactId=warcd wargedit pom.xml |
pom.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <parent> <artifactid>ejb-gwt</artifactid> <groupid>com.javacodegeeks</groupid> <version>0.0.1-SNAPSHOT</version> </parent> <groupid>com.javacodegeeks</groupid> <artifactid>war</artifactid> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <properties> <gwt.version>2.0.4</gwt.version> <maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> </properties> <dependencies> <dependency> <groupid>com.google.gwt</groupid> <artifactid>gwt-servlet</artifactid> <version>${gwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupid>com.google.gwt</groupid> <artifactid>gwt-user</artifactid> <version>${gwt.version}</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.jboss.jbossas</groupid> <artifactid>jboss-as-client</artifactid> <version>5.1.0.GA</version> <type>pom</type> <scope>provided</scope> </dependency> <dependency> <groupid>com.javacodegeeks</groupid> <artifactid>ejb-jar</artifactid> <version>0.0.1-SNAPSHOT</version> <type>ejb</type> <scope>provided</scope> </dependency> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build> <finalname>war</finalname> <outputdirectory>war/WEB-INF/classes</outputdirectory> <plugins> <plugin> <groupid>org.codehaus.mojo</groupid> <artifactid>gwt-maven-plugin</artifactid> <version>1.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>generateAsync</goal> <goal>test</goal> </goals> </execution> </executions> <configuration> <runtarget>com.javacodegeeks.war.Application/Application.html</runtarget> </configuration> </plugin> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <version>2.0.2</version> <configuration> ${maven.compiler.source} <target>${maven.compiler.target}</target> </configuration> </plugin> </plugins> </build></project> |
|
1
2
|
cd src/main/webapp/WEB-INFgedit web.xml |
web.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<web-app version="2.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>GWT-Maven-Archetype</display-name> <servlet> <servlet-name>emp</servlet-name> <servlet-class>com.javacodegeeks.war.server.services.EmployeeServiceGWTImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>emp</servlet-name> <url-pattern>/com.javacodegeeks.war.Application/emp</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list></web-app> |
web.xml должен применяться со спецификацией 2.5, если мы хотим сделать ejb-инъекцию в контейнере сервлета.
Теперь давайте посмотрим на сервис gwt.
EmployeeServiceGWT.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
package com.javacodegeeks.war.shared.services;import com.google.gwt.user.client.rpc.RemoteService;import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;import com.javacodegeeks.war.shared.entity.EmployeeUtil;@RemoteServiceRelativePath("emp")public interface EmployeeServiceGWT extends RemoteService { public EmployeeUtil findEmployee(long employeeId); public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception; public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception; public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception; public void deleteEmployee(long employeeId) throws Exception;} |
Обратите внимание, что RemoteServiceRelativePath связан с путем сервлета /com.javacodegeeks.war.Application/emp, который мы определили в файле web.xml.
EmployeeServiceGWTImpl.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
package com.javacodegeeks.war.server.services;import javax.annotation.Resource;import javax.ejb.EJB;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.transaction.UserTransaction;import com.google.gwt.user.server.rpc.RemoteServiceServlet;import com.javacodegeeks.ejb.entity.Employee;import com.javacodegeeks.ejb.session.EmployeeService;import com.javacodegeeks.war.shared.entity.EmployeeUtil;import com.javacodegeeks.war.shared.services.EmployeeServiceGWT;public class EmployeeServiceGWTImpl extends RemoteServiceServlet implements EmployeeServiceGWT{ /** * */ private static final long serialVersionUID = 5995064321382986251L; private EmployeeService employeeService; @Resource(name="java:UserTransaction") UserTransaction ut; @EJB public void setEmployeeService(EmployeeService employeeService) { this.employeeService = employeeService; } public void deleteEmployee(long employeeId) throws Exception { employeeService.deleteEmployee(employeeId); } public EmployeeUtil findEmployee(long employeeId) { Employee emp = employeeService.findEmployee(employeeId); if(emp != null) { try { ut.begin(); EmployeeUtil util = new EmployeeUtil(emp.getEmployeeId(), emp.getEmployeeName(), emp.getEmployeeSurname(), emp.getJob()); ut.commit(); return util; } catch (Exception e) { } } return null; } public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception { employeeService.saveEmployee(employeeId, name, surname, jobDescription); } public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception { employeeService.saveOrUpdateEmployee(employeeId, name, surname, jobDescription); } public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception { employeeService.updateEmployee(employeeId, name, surname, jobDescription); }} |
Как видите, мы внедряем сессионный компонент employeeService с помощью аннотации @EJB.
Обратите внимание, что мы используем класс EmployeeUtil по основной причине :
GWT не может обрабатывать отложенные инициализированные отношения, поэтому мы заменяем коллекцию прокси реальными коллекциями. Замена должна находиться в области транзакции.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
package com.javacodegeeks.war.shared.entity;import java.io.Serializable;public class EmployeeUtil implements Serializable { /** * */ private static final long serialVersionUID = -2732740011239267035L; private long employeeId; private String employeeName; private String employeeSurname; private String job; public EmployeeUtil() { } public EmployeeUtil(int employeeId) { this.employeeId = employeeId; } public EmployeeUtil(long employeeId, String employeeName, String employeeSurname, String job) { this.employeeId = employeeId; this.employeeName = employeeName; this.employeeSurname = employeeSurname; this.job = job; } public long getEmployeeId() { return employeeId; } public void setEmployeeId(long employeeId) { this.employeeId = employeeId; } public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } public String getEmployeeSurname() { return employeeSurname; } public void setEmployeeSurname(String employeeSurname) { this.employeeSurname = employeeSurname; } public String getJob() { return job; } public void setJob(String job) { this.job = job; }} |
Остальная часть исходного кода для интерфейса gwt приведена в исходном коде этой статьи.
Теперь у нас есть последний шаг, чтобы построить ухо. Мы создадим модуль для этого.
|
1
2
3
4
|
mvn archetype:create -DgroupId=com.javacodegeeks -DartifactId=earcd earrm -rf srcgedit pom.xml |
pom.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <parent> <artifactid>ejb-gwt</artifactid> <groupid>com.javacodegeeks</groupid> <version>0.0.1-SNAPSHOT</version> </parent> <groupid>com.javacodegeeks</groupid> <artifactid>ear</artifactid> <version>0.0.1-SNAPSHOT</version> <packaging>ear</packaging> <name>ear</name> <description>ear for gwt ejb3</description> <dependencies> <dependency> <groupid>com.javacodegeeks</groupid> <artifactid>ejb-jar</artifactid> <version>0.0.1-SNAPSHOT</version> <type>ejb</type> </dependency> <dependency> <groupid>com.javacodegeeks</groupid> <artifactid>war</artifactid> <version>0.0.1-SNAPSHOT</version> <type>war</type> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-ear-plugin</artifactid> <configuration> <generateapplicationxml>true</generateapplicationxml> <modules> <webmodule> <groupid>com.javacodegeeks</groupid> <artifactid>war</artifactid> <contextroot>ejb-gwt</contextroot> </webmodule> <ejbmodule> <groupid>com.javacodegeeks</groupid> <artifactid>ejb-jar</artifactid> </ejbmodule> </modules> </configuration> </plugin> </plugins> </build></project> |
Для создания проекта перейдите в корневой проект и введите:
установить mvn
Исходный код этой статьи находится здесь .
Спасибо
./pat
Статьи по Теме :
- GWT 2 Spring 3 JPA 2 Hibernate 3.5 Учебник
- GWT Spring и Hibernate входят в мир Data Grids
- Spring 3 RESTful веб-сервисы
- Учебник по GWT 2 Spring 3 JPA 2 Hibernate 3.5 — демонстрация Eclipse и Maven 2
- Аспектно-ориентированное программирование с Spring AspectJ и Maven
- JAX – WS с руководством по Spring и Maven