Download - Java EE Programming [EJB 3.0 and JPA] Using Eclipse and JBoss

Transcript
Page 1: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

1

Hand-onExercises

การพัฒน�ฒนาโปรแกรมEJB 3.0 and JPA

โดยใช้� �Eclipse และ JBoss

Assoc.Prof.Dr.Thanachart NumnondaSoftware Park Thailand

andAsst Prof.Thanisa Kruawaisayawan

King Mongkut's Institute of Technology Ladkrabang

June 2011

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 2: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

2

บทนำ���

��������� �� ���������������������Java 301 : EJB 3.0 ��������� ��Mini Master of Java

Technology !"��#!������������#$��%�������&����� ��& �!'"#������������������&'�����!(��)*��� +,� �����-� �� ��&%.���������������Java Enterprise Application #�*�� �Enterprise Java Bean 3.0 ��+Java Persistence API #��������/.�������� ���������!�)*���)�����������&����Eclipse ��������+JBoss Application Server

[email protected] twitter.com/thanachart

www.facebook.com/thanachart www.thaijavadev.com

��%'�����2554

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 3: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

3

สารบัญ��ญExercise 1 Stateless Session Bean Using EJB 3.0................................................................................4Exercise 2 Stateful Session Bean Using EJB 3.0...............................................................................21Exercise 3 Entity Class (JPA).............................................................................................................26Exercise 4 การพัฒนาJSP เพื่อเ�ฒนา JSP เพัฒนาJSP เพื่อเอเร�ยกใช้ EJB 3.036��������x�����1�King � EJB 3.0.....................................................................................36Exercise 5 JPA : Entity Relationships................................................................................................41Exercise 6 JPA: Inheritance................................................................................................................60Exercise 7 Message Driven Bean.......................................................................................................70Exercise 8 EJB Security.....................................................................................................................75Exercise 9 Using Java Persistence API in Visual Web JSF applications...........................................83

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 4: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

4

Exercise 1 Stateless Session Bean Using EJB 3.0

��/.������� �0���������������Enterprise Java Bean (EJB) ����� �EJB 3.0 �� ���Session

Bean ����� ����1������������ �Session Bean &���Web Application ����� �Java Servlet ��&��+Desktop Application ����� �Java SE

ข��นตอนในการพัฒนาโปรแกรม��ฒนาโปรแกรม1. �� ���Enterprise Application Project

2. ������Session Bean

3. ������Web Application

4. ������Desktop Application

1.1 ก�รสร�ง Enterprise Application Project

�� ���Project ���Enterprise Application 2.*����EJB Module ���Web Module 3���� ���Project

1. �� ���Project �����)�������File → New → Enterprise Application Project

�4�����Project Name �0��SessionBeanDemo

2. �� ���Server #�*&�����Click #�*'1��New Runtime...

�4�����Directory #�*���JBoss Application Server ���13. ���Next ��'1��New Module... ��)���EJB Module ���Web Module ���Finish &�&��Wizard

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 5: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

5

ร�ปที่ �� 1.1 การสร�าง Enterprise Application Project

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 6: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

6

1.2 ก�รพัฒน�ฒนำ��โปรแกรม Session Bean

������EJB &��� �Session Bean ����� �� 1����������)*�5�3������EJB Container

��� Session Bean &������� ���Business Method 1��5�����/.����&��� ���Session Bean #�*�)*�+BLSession #�*���Business method �����6��!)�

● String sayHi(String name)● double currencyConvert(String currency, double amt)

�����������%#�*&�������������� -� ������1. !��7����#�*�SessionBeanDemoEJB → New → Session Bean(EJB 3.x)

2. �4�����Java package = ejbClass Name = BLSession State Type = Stateless Create Business Interface ��)��#����Remote ���Local �����#�*�1.2

ร�ปที่ �� 1.2 ไดอะล็อกการสร้าง S�อกการสร�าง Session Bean

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 7: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

7

3. � �����Finish �����&��� ��-8�( 1��5����� �����

ร�ปที่ �� 1.3 โครงสร�างของไฟล็อกการสร้าง S ของ Session Bean

4. Declare Method Signature 2 methods #�*�Interface BLSessionLocal , BLSessionRemote

Method Name �)*��sayHiReturn Type : StringInput Parameter = name �0� String

Method Name �)*�+ currencyConvertReturn Type : doubleInput Parameter 1 = currency �0��String

Input Parameter 2 = amt �0��double

#4�-� ��4�����Signature Method �� ����Interface? ���2 ��"��!)�1. ,� ������EJB ���1���Virtual Machine ������������EJB

,� �����&��� ��� Method #�*���'���Interface BLSessionLocal

2. ,� ��������1!��� Virtual Machine ��)�!����!�)*��,� �����&��� ��� Method #�*���'���Interface BLSessionRemote

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 8: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

8

Listing 1.1 ����$� Signature Method #�*� Interface #���� Local ��� Remote --- File Local--------------------------------------------------------------@Localpublic interface BLSessionLocal {

public String sayHi(String name);public double currencyConvert(String currency,double amt);

}

--- File Remote-------------------------------------------------------------@Remotepublic interface BLSessionRemote {

public String sayHi(String name);public double currencyConvert(String currency,double amt);

}

5. &���0��1����Error �����.��#�*�BLSession.java (Concrete Class) �� �� �mouse ���#�*�Error

eclipse &�����1��� �implement method #�*�interface ���!��-� ����"��������)��#�*����#�����Add Unimplemented Methods ������+

ร�ปที่ �� 1.4 ที่ !าการ Implement source code ที่ �� concrete class : BLSession

6. �� �Implement source code �4������Business Method #������������ public String sayHi(String name) { return "Hello " + name; }

public double currencyConvertor(String currency, double amt) { if (currency.equals("baht")) { return (amt / 35); } else if (currency.equals("euro")) { return (amt * 2); } else { return 0; } }

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 9: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

9

1.3 ก�รพัฒน�ฒนำ��โปรแกรม Web Application

������EJB &��0��1������Business Logic �#1���������������1������Presentation &� ���� ������Web Application ��)��Java SE

������ �����&������������Web Application ��)*�������� ����Business Method ����BLSession

#�*�)*��sayHi ����4������ ,� �� �1�������� ��(�String myName -�Servlet #�*�)*���SayHiServlet

1. !��7����#�*�SessionBeanDemoWeb ��)���New → Servlet

2. �4�����Package = controller Class Name = SayHiServlet

ร�ปที่ �� 1.5 สร�าง Servlet เพัฒนาโปรแกรม�#�อต$ดต%อก�บ EJB3

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 10: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

10

3. Set �� ��Web Project �� &���EJB Project ���!������#�*�SessionBeanDemoWeb

��)���Build Path → Configure Build Path

ร�ปที่ �� 1.6 ที่ !าให้ Web Projec� Web Project มองเห้ Web Projec�น EJB Project

4. ���*��Source code �����������EJB #�*�Servlet ����Declare �0��Instant Variable

public class SayHiServlet extends HttpServlet {

@EJBprivate BLSessionLocal blSession;..............................

5. �� ����'���Source code ����6���processRequest ������protected void processRequest(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException

{request.setCharacterEncoding("TIS-620");response.setContentType("TIS-620"); PrintWriter out = response.getWriter();out.println("<html><body>");out.println(blSession.sayHi(request.getParameter("myName")));out.println("</body></html>");out.close();

}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 11: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

11

1.4 ก�รทดสอบโปรแกรม

1. #4���� Add ����� SessionBeanDemo �� ���1�JBoss Application Server

2. ��1�URL ����Web Browser �0�http://localhost:8080/SessionBeanDemoWeb/SayHiServlet?myName=Thana

3. ������Web Browser &����� �!����Hello Thana �����

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 12: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

12

1.5 ก�รพัฒน�ฒนำ��โปรแกรม Desktop Application ติดต่อกับ EJB 3.0�姍�x�愭楬��2�โปรแกรม W�ดติดต่อกับ EJB 3.0�姍�x�愭楬��2�โปรแกรม W�อก�บ EJB 3.0

��������%#�*&������������Desktop Application ��)*�#�*&�������� �EJB ������ �����&��0���������������Java SE ��)*�������� ��Business Method ����BLSession ���&�#4������������������������������!)�������Main.java &��������6��#�*�)*��sayHi &���command prompt �1�������#�*���!)�������CurrencyConvertor.java &��������6��#�*�)*��currencyConvert ����4������ �����������GUI ��)*��� ,� �� ��� ������)*�� 4������'�������&4����������������� ����������������

1. !������#�*�SessionBeanDemo ��)���New → Application Client Module

�4�����Project Name = SessionBeanDemoClient

2. !�����)���check box �0� Add project to an EAR ��)���dropdown �)*��SessionBeanDemo

ร�ปที่ �� 1.7 การเพัฒนาโปรแกรม�$�ม Enterprise Application Client เข�าส�% Enterprise Application Project

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 13: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

13

1.5.1 � -��+ +EJB Project (+ +���*��+ +Mapping Name)+ +��)*��� �Application Client ������� �SessionBean ����EJB -� &� ���Register �)*�����SessionBean �� ���1 �Context ��)�������1�����Mapping

-#�*�SessionBeanDemoEJB

#�*�@Stateless �� ���*������0��� ����Ctrl+Space &����hint ���� ��)���mappedName � ���1�)*�#�* �����

ร�ปที่ �� 1.8 การเพัฒนาโปรแกรม�$�มชื่อของ Session Bea#�อของ Session Bean เข�าส�% Context ของ JBoss Application Server

1.5.2 ��������������+ +Main.java+ +Implement Source code ����Main.java ������

import java.util.Hashtable;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import ejb.BLSessionRemote;public class Main { public static void main(String[] args) throws NamingException {

Context ctx = getJBossNamingContext();BLSessionRemote sb = (BLSessionRemote)ctx.lookup("SessionBeanForClient");String result = sb.sayHi("Thana");System.out.println(result);

}

public static Context getJBossNamingContext() throws NamingException{Hashtable<String, String> env = new Hashtable<String, String>();env.put("java.naming.factory.initial","org.jboss.naming.NamingContextFactory");env.put("java.naming.provider.url", "localhost:1099");return new InitialContext(env);

} }

#�*�Method getJBossNamingContext() ���1�������Config %.��host:port ����Naming Service

(�0�#�*5���&��� �-%�����Session Bean �)*��9SessionBeanForClient”) ���&� �����port ����Server #�*��+EJB ���1�2.*�#4�-� ����double click #�*�Server JBoss �����

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 14: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

14

ร�ปที่ �� 1.9 การห้ Web Projecา JNDI port ของ Server ที่ �� EJB Project Deploy อยู่��t ���������A�Hashtable<String, String> env = new Hashta�%

&������#4��������Application &�-� ,����6(!)��Hello Thana print �����#�*�Console

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 15: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

15

1.5.3 ��������������+ +CurrencyConvertor.java+ +

������Desktop Application &������:"����������&��� �GUI Designer (Jigloo) ����������

ร�ปที่ �� 1.10 GUI ของโปรแกรม CurrencyConvertor

1. !������#�*������SessionBeanDemoClient ��)���appClientModule → New → Other... → GUI Forms → Swing → Jframe &���-����0���.������4�����Package = swing ���Class Name = CurrencyConvertor

ร�ปที่ �� 1.11 สร�าง Swing GUI

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 16: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

16

2. !��7�#�*�JFrame � ����*���property #�*�)*���title �0��Currency Convertor

ร�ปที่ �� 1.12 สร�าง Swing GUI

3. ���*��JPanel ���Form

ร�ปที่ �� 1.13 สร�าง Swing GUI

4.

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 17: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

17

5. ���-�!���Label ���Swing Controls &���Table Compoments Drag & Drop -#�*�� � 1��������� ��4����!1��

ร�ปที่ �� 1.14 การวาง Label ใน Components Windows

6. !��7���)���jLabel 1�� ��������*���property #�*�)*��text �0��currency, amount ���value

7. ���-�!���Combo Box ���� 4���1�#������)�����currency &���������property �� ��)���model

����4�����Item ����������� �0��baht ���euro �����

ร�ปที่ �� 1.15 การก!าห้ Web Projecนดค%า item ของ ComboBox

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 18: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

18

8. #4�����implement sourcecode �����

9. Implement source code ��"�#�*�������'1��Calculate ���� -���source code ������

private void jButton1ActionPerformed(ActionEvent evt) {System.out.println("jButton1.actionPerformed, event="+evt); try {

Context ctx = getJBossNamingContext(); BLSessionRemote obj = (BLSessionRemote) ctx.lookup("SessionBeanForClient"); int index = jComboBox1.getSelectedIndex(); String currency = (String) jComboBox1.getItemAt(index); String amtStr = jTextField1.getText(); double amt = Double.parseDouble(amtStr); double usDollar = obj.currencyConvertor(currency, amt); jTextField2.setText(usDollar + ""); } catch (Exception ex) { ex.printStackTrace(); }}

public Context getJBossNamingContext() throws NamingException{ Hashtable<String, String> env = new Hashtable<String, String>();

env.put("java.naming.factory.initial","org.jboss.naming.NamingContextFactory"); env.put("java.naming.provider.url", "localhost:1099"); return new InitialContext(env);}

10. '1��Exit #4���1���������'1��Calculateprivate void jButton2ActionPerformed(ActionEvent evt) {

System.out.println("jButton2.actionPerformed, event=" + evt);System.exit(0);

}11. #�����������������)����'�������� ��&4���������� ���'1��Calculate

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 19: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

19

Source Code #�*�Jigloo �� ���.�������#�*�������'�#������package swing;

import com.jgoodies.forms.layout.CellConstraints;import com.jgoodies.forms.layout.FormLayout;

import ejb.BLSessionRemote;

import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Hashtable;

import javax.naming.*;import javax.swing.ComboBoxModel;import javax.swing.DefaultComboBoxModel;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;

import javax.swing.WindowConstants;import javax.swing.SwingUtilities;

import org.apache.bsf.Main;

/** * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI * Builder, which is free for non-commercial use. If Jigloo is being used * commercially (ie, by a corporation, company or business for any purpose * whatever) then you should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. Use of Jigloo implies * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR * ANY CORPORATE OR COMMERCIAL PURPOSE. */public class CurrencyConverter extends javax.swing.JFrame {

private JPanel jPanel1;private JLabel jLabel3;private JButton jButton1;private JComboBox jComboBox1;private JButton jButton2;private JTextField jTextField2;private JTextField jTextField1;private JLabel jLabel2;private JLabel jLabel1;

/** * Auto-generated main method to display this JFrame */public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {public void run() {

CurrencyConverter inst = new CurrencyConverter();inst.setLocationRelativeTo(null);inst.setVisible(true);

}});

}

public CurrencyConverter() {super();initGUI();

}

private void initGUI() {try {

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);{

jPanel1 = new JPanel();FormLayout jPanel1Layout = new FormLayout(

"53dlu, 42dlu, 41dlu, 44dlu", "max(p;5dlu), max(p;5dlu), max(p;5dlu), max(p;5dlu)");

getContentPane().add(jPanel1, BorderLayout.CENTER);jPanel1.setLayout(jPanel1Layout);jPanel1.setPreferredSize(new java.awt.Dimension(182, 104));{

jLabel1 = new JLabel();jPanel1.add(jLabel1, new CellConstraints(

"1, 1, 1, 1, default, default"));jLabel1.setText("Currency");

}{

jLabel2 = new JLabel();jPanel1.add(jLabel2, new CellConstraints(

"1, 2, 1, 1, default, default"));jLabel2.setText("Amount");

}{

jLabel3 = new JLabel();jPanel1.add(jLabel3, new CellConstraints(

"1, 3, 1, 1, default, default"));jLabel3.setText("Value [Dollars] ");

}{

jTextField1 = new JTextField();jPanel1.add(jTextField1, new CellConstraints(

"2, 2, 1, 1, default, default"));}{

jTextField2 = new JTextField();

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 20: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

20

jPanel1.add(jTextField2, new CellConstraints("2, 3, 1, 1, default, default"));

}{

jButton1 = new JButton();jPanel1.add(jButton1, new CellConstraints(

"1, 4, 1, 1, default, default"));jButton1.setText("Calculate");jButton1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {jButton1ActionPerformed(evt);

}});

}{

jButton2 = new JButton();jPanel1.add(jButton2, new CellConstraints(

"2, 4, 1, 1, default, default"));jButton2.setText("Exit");jButton2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {jButton2ActionPerformed(evt);

}});

}{

ComboBoxModel jComboBox1Model = new DefaultComboBoxModel(

new String[] { "baht", "euro" });jComboBox1 = new JComboBox();jPanel1.add(getJComboBox1(), new CellConstraints("2, 1, 1, 1, default, default"));jComboBox1.setModel(jComboBox1Model);

}}pack();

} catch (Exception e) {e.printStackTrace();

}}

private void jButton2ActionPerformed(ActionEvent evt) {System.out.println("jButton2.actionPerformed, event=" + evt);System.exit(0);

}public JComboBox getJComboBox1() {

return jComboBox1;}

private void jButton1ActionPerformed(ActionEvent evt) {System.out.println("jButton1.actionPerformed, event="+evt);

try { Context ctx = getJBossNamingContext(); BLSessionRemote obj = (BLSessionRemote) ctx.lookup("SessionBeanForClient"); int index = jComboBox1.getSelectedIndex(); String currency = (String) jComboBox1.getItemAt(index); String amtStr = jTextField1.getText(); double amt = Double.parseDouble(amtStr); double usDollar = obj.currencyConvertor(currency, amt); jTextField2.setText(usDollar + ""); } catch (Exception ex) { ex.printStackTrace(); }}public Context getJBossNamingContext() throws NamingException{

Hashtable<String, String> env = new Hashtable<String, String>();env.put("java.naming.factory.initial","org.jboss.naming.NamingContextFactory");env.put("java.naming.provider.url", "localhost:1099");return new InitialContext(env);

} }

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 21: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

21

Exercise 2 Stateful Session Bean Using EJB 3.0

เน#�อห้ Web Projecาที่ ��ต�องศึกษาก่อน Ses-กษาก%อน+++Session Bean Using EJB 3.0

��/.�������#��� �0��������� Stateful Session Bean �4������Shopping Cart ����� �EJB 3.0

����4������ �Session Bean ���)*��0��Cart �����Business Methods �����6��!)�● void putItem(String itemId, int quantity)● void removeItem(String itemId)● Hashtable getItems()

���&����� &������6���#�*%�������&���@PostConstruct !)�● void initialize()

���Bean Class &��� ���������&0!�(instance variable) ��� ��!)�● String customerId● Hashtable cart

����/.������� ���&������ Java Servlet �.������)*�������� �Cart Session Bean #�*�)*�+CartManager.java ��)*��� ��������*�/�����������&���Cart �����)*����������#�*���1���Cart ���,� #�*������� �CartManager &� ���1�������� ��(#�*�)*��action ����)����'�1� �����#4���-�����Cart ������action ������

● add ��)*����*������������Cart

● remove ��)*������������&���Cart

● list ��)*�������������Cart

[������ '�% ������ �� Servlet ����5-8�(��)*�#4��� �#�* 1��������1��AddCartServlet,

RemoveCartServlet ���ListCartServlet ������Stateful Session Bean &��� ���bean instance

�4������Servlet 1�� ��#4��� �� �Session #�* 1�����]

���� �����������������1. ������Stateful Session Bean

2. �����������CartManager.java

3. �����������CartList.java

2.1 ก�รพัฒน�ฒนำ��โปรแกรม Stateful Session Bean

��/.�������&��� ���&0!�����(SessionBeanDemo) #�*�� ������/.�������Session Bean Using

EJB 3.0 ������� ���Stateful Session Bean ��������� �������������������� -� ������

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 22: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

22

1. !��7����#�*�SessionBeanDemoEJB → New → Session Bean(EJB 3.x)

2. �4�����Java package = ejb , Class Name = Cart ���State Type = Stateful

ร�ปที่ �� 2.1 การก!าห้ Web Projecนดค%าของ Cart Stateful Session Bean

3. #4���� Add Business Method ������*�&���� ���Signature Method ���Interface CartLocal ��+CartRemote ������

Declare Method Signature 3 methods #�*�Interface CartLocal , CartRemote

Method Name �)*��putItem

Input Parameter 1 = itemId �0� String

Input Parameter 2 = quantity �0��int

Method Name �)*�+removeItem

Input Parameter = itemId �0� String

Method Name �)*��getItemsReturn Type : Hashtable

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 23: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

23

4. &�-� �Business Method ���1���Interface #�������(local,remote) 3 Methods !)�void putItem(String itemId , int quantity);void removeItem(String itemId);Hashtable getItems();Implement source code ���Listing 2.1 ���2.2

Listing 2.1 ������ CartLocal.java package ejb;import java.util.Hashtable;import javax.ejb.Local;

@Localpublic interface CartLocal {

void putItem(String itemId, int quantity);void removeItem(String itemId);Hashtable getItems();

}Listing 2.2 ������ CartRemote.java

package ejb;

import java.util.Hashtable;

import javax.ejb.Remote;

@Remotepublic interface CartRemote {

void putItem(String itemId, int quantity);void removeItem(String itemId);Hashtable getItems();

}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 24: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

24

5. &�������Fix Error ����Class Cart.java ����Implement source code ���Listing 2.3 ������Listing 2.3 ������ Cart.java

package ejb;

import java.util.Hashtable;import javax.annotation.PostConstruct;import javax.ejb.Stateful;

@Statefulpublic class Cart implements CartRemote, CartLocal {

Hashtable<String, Integer> cart;@PostConstructpublic void initialize(){

cart = new Hashtable<String, Integer>();}@Overridepublic void putItem(String itemId, int quantity) {

cart.put(itemId, quantity);}

@Overridepublic void removeItem(String itemId) {

cart.remove(itemId);}

@Overridepublic Hashtable getItems() {

return cart;}

}

2.2 ก�รพัฒน�ฒนำ��โปรแกรม CartManager.java

������CartManager.java �0�������Java Servlet ��)*�������� ����Business Method ����Cart

Bean ��������*������������Cart ����4������ ,� �� �1�������� ��(����������������● itemId !)��������������������! �● quantity !)�&4����������������! �● method % ���!1��0��add !)����*����������% ���!1��0��remove !)���������

�'�!4���*� 1��5�3�����CartManager �6����-� ������

1. ����$ ����cart �0������CartLocal ����� �annotation #�*�)*��@EJB ������@EJB private CartLocal cart;

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 25: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

25

2. !4���*��1��!1�������� ��( 1��5�����4������ ��������� ��(�1�,1����&���request !)��action, item ���quantity �����!4���*�������

String action = request.getParameter("action"); String item = request.getParameter("item"); String quantity = request.getParameter("quantity"); cart.putItem(item, Integer.parseInt(quantity));

3. !4���*����������Enterprise Bean ���action #�* 1����������� �

if (action.equals("add")) { cart.putItem(item, Integer.parseInt(quantity)); } else if (action.equals("remove")) {

cart.removeItem(item);} else if (action.equals("list")) {

Hashtable items = cart.getItems();………

}���� �����������+ +Class CartManager+ +

1. ��)���� � 1���Projects � �!��7����#�*������SessionBeanDemoWeb

&��������)��!4���*��New → Servlet

�4�����Package = controller , Class Name = CartManager

2. ���� � 1���Editor �� ���*��Source code �����������EJB ����������$�instant variable �0������CartLocal ��������&��)*��������EJB ,1���Interface CartLocal

@EJB private CartLocal cart;

3. Implement source code ����Method processRequest( ) ������Listing 2.4 ������ CartManager.java package controller;

import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Hashtable;

import javax.ejb.EJB;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import ejb.CartLocal;public class CartManager extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

processRequest(request, response);}

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

processRequest(request, response); }

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 26: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

26

@EJBprivateCartLocal cart;protected void processRequest(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("TIS-620");response.setContentType("TIS-620");PrintWriter out = response.getWriter();

String action = request.getParameter("action");String item = request.getParameter("item");String quantity = request.getParameter("quantity");out.println("<html><body><h1>Cart Manager</h1>");

if (action.equals("add")) {cart.putItem(item, Integer.parseInt(quantity));

} else if (action.equals("remove")) {cart.removeItem(item);

} else if (action.equals("list")) {Hashtable items = cart.getItems();Enumeration itemNames = items.keys();while (itemNames.hasMoreElements()) {

String itemId = (String) itemNames.nextElement();out.println("Item id: " + itemId + " Quantity : "

+ items.get(itemId));out.println("<BR>");

}}out.println("</body></html>");

}}

2.3 ก�รทดสอบโปรแกรม

1. #4�����Publish ��)*��� #'��Project #4�����Synchronized ���+

ร�ปที่ �� 2.2 การ Publish เพัฒนาโปรแกรม�#�อ Synchronized Project ใน Enterprise Application

2. #4������1�����������)���URL ����Web Browser �0�http://localhost:8080/SessionBeanDemoWeb/CartManager?action=add&item=125&quantity=3������#4������1���������*�� �������)���URL ����Web Browser �0�+http://localhost:8080/SessionBeanDemoWeb/CartManager?action=add&item=123&quantity=23. ������������Cart �����)���URL �0�

++++++++++++http://localhost:8080/SessionBeanDemoWeb/CartManager?action=list4. #�����������������)���URL ����Web Browser �0�

++++++++++++http://localhost:8080/SessionBeanDemoWeb/CartManager?action=remove&item=1235. ������������Cart ���1�����)���URL �0�

+++++++++++http://localhost:8080/SessionBeanDemoWeb/CartManager?action=list

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 27: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

27

Exercise 3 Entity Class (JPA)

��/.�������#��� �0���������������Enterprise Java Bean (EJB) ���&��0�������������� �� 1����;��� �����MySQL ����� �EJB3.0 ���JBoss Application Server &������� ���Entity Class #�*��)*�������� ����#�*�)*��books ���Session Bean ��)*��� �����&��������*��� -������� �������table books -� �

ข��นตอนในการพัฒนาโปรแกรม��ฒนาโปรแกรม1. �� ���Enterprise Application Project

2. ������Entity Class

3. ������Session Bean

4. ������Web Application

3.1 ก�รสร�ง Enterprise Application Project �� ���Enterprise Application Project ������EJB Module ���Web Module ���13�����Project

1. ��)�������File → New → Enterprise Application Project

�4�����Project Name = BookApp

2. �� ���Module ���1

ร�ปที่ �� 3.1 สร�าง Module EJB แล็อกการสร้าง Sะ Web ใน Enterprise Application

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 28: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

28

3.2 ก�ร Config ให้ Project ใช Project ใช้งาน JPA เพื่อเชื่อมต่อกง�นำ� JPA เพัฒน��อเช้งาน JPA เพื่อเชื่อมต่อก��อมติดต่อกับ EJB 3.0�姍�x�愭楬��2�โปรแกรม W�อก�บ Database ได

Java EE 5 &��� !������3#�Entity ��)*��0����&0!#�*���!� ����� ������;��� �������#�*��� ���&��� ���Entity Class #�*�)*��Books.java &�� ����#�*�)*��books 2.*�������� �����1��� ����������� ��������������������������

1. Copy EclipseLink , MySQLConnection (.jar file) -#�*�%JBOSS_HOME\common\lib

2. !������#�*�BookAppEJB ��)���Build path → Configure Build path...

3. ��)���Project Facets → JPA #4�����Config �����

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 29: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

29

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 30: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

30

ร�ปที่ �� 3.2 Configuration ส%วนของ EclipseLink ใน EJB Project

4. �� ���JNDI DataSource �� �JBoss (!� �����������*��file context.xml ���Tomcat6)

����Folder $JBOSS_HOME\docs\examples\jca\ � ��copy file mysql-ds.xml -#�*+$JBOSS_HOME\server\default\deploy\

5. #4�����config file mysql-ds.xml �����

ร�ปที่ �� 3.3 Config JNDI Context ให้ Web Projec� JBoss

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 31: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

31

6. Config persistence.xml ���BookAppEJB ��)*��� �JPA �� �Database #�*���'

ร�ปที่ �� 3.4 Config persistence.xml

7. #4�������*��JVM Arguments -Djava.endorsed.dirs=$JBOSS_HOME/lib/endorsed

ร�ปที่ �� 3.5 Config persistence.xml

8. Add (Deploy) BookApp �� JBoss ��#4�����Start JBoss Application Server

Monitor ���log #�*�Console ��-�1���ERROR

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 32: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

32

3.3 ก�รพัฒน�ฒนำ��โปรแกรม Entity Class �� �� Entity Classes ����!������#�*�BookAppEJB → New → Entities from Tables

ร�ปที่ �� 3.6 แสดงการสร�าง Entity Class

&�-� �Entity Class �)*�+++Books.java+ + #�*���Getter/Setter ���#'��Field ���table books

���*��1����� statement ����Query � ����-#�*���#��� ���1������@Table(name = "books") ������@NamedQuery (name = "Books.findByIsbn", query = "SELECT b FROM Books b WHERE b.isbn = :isbn")

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 33: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

33

Listing 3.1 ������ Books.java package entity;import java.io.Serializable;import javax.persistence.*;

@Entity@Table(name="books")@NamedQuery (name = "Books.findByIsbn",

query = "SELECT b FROM Books b WHERE b.isbn = :isbn")public class Books implements Serializable {

private static final long serialVersionUID = 1L;

@Id@Column(name="ISBN")private String isbn;

@Column(name="AUTHOR")private String author;

@Column(name="PRICE")private float price;

@Column(name="TITLE")private String title;

public String getIsbn() {return this.isbn;

}

public void setIsbn(String isbn) {this.isbn = isbn;

}

public String getAuthor() {return this.author;

}

public void setAuthor(String author) {this.author = author;

}

public float getPrice() {return this.price;

}

public void setPrice(float price) {this.price = price;

}

public String getTitle() {return this.title;

}

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

}

}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 34: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

34

3.4 ก�รพัฒน�ฒนำ��โปรแกรม Session Bean

������EJB &��� �Session Bean ����� �� 1����������)*�5�3������EJB Container �����������1�����&� �� 1�����Entity Class ���,1���Session Bean ��/.�������&��� ���Session Bean #�*�)*�+BooksFacade.java #�*���Business method �������������� ������� ����#�*�)*��books ����� �Entity Class �)*�+Books.java ���EntityManager ���&������� ����������������

1. !������#�*�����BookAppEJB ��)���New → SessionBean (EJB 3.x)

ร�ปที่ �� 3.7 แสดงการสร�าง Session Bean

2. �4�����Package = sbClass name = BookFacadeeclipse &��� ���Interface BookFacadeLocal.java ��

3. ���*��Signature method #�*�interface ������! ��������)���������)*��String isbn ��)*�-�����,� Books find(String isbn);

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 35: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

35

Listing 3.2 ������ BookLocal.java package sb;import javax.ejb.Local;

import entity.Books;

@Localpublic interface BookFacadeLocal {

Books find(String isbn);}

4. Fix Error #�*�class BookFacade.java implements concrete class

������'�)*��JPA #�*�� !)��BookAppEJB � ��� �������1��Books.class (Books Entity Class)

-�� �entity manager → em.find(Books.class, id);

Listing 3.3 ������ BookFacade.java package sb;import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;

import entity.Books;

@Statelesspublic class BookFacade implements BookFacadeLocal {

@PersistenceContext(unitName = "BookAppEJB")private EntityManager em;@Overridepublic Books find(String isbn) {return em.find(Books.class, isbn);}

}

3.5 ก�รพัฒน�ฒนำ��โปรแกรม Web Application

������EJB &��0��1������Business Logic �#1���������������1������Presentation &� ���� ������Web Application (��)��Java SE) ��/.������� &������������Web Application ��)*��� ,� �� ���isbn ��������)����� ���0��findBook.html � ������&������������Servlet #�*�)*�+ShowBook.java ��)*����������������������)������1����������������� ����������������

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 36: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

36

3.5.1 ���������������+ +findBook.html+ +

������findBook.html �0���0���&#�*�� ���8��(��4������� ,� �� ���isbn ��������)����������� ����������������

1. !������#�*�����BookAppWeb ��)��!4���*��New → HTML

2. �4�����HTML File Name: �0��findBook � ����Finish

3. ������source code ���-8�(�findBook.html ���Listing #�*��3.4+

Listing 3.4 ������findBook.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <form action="ShowBook" method="POST"> <h2>Search Book from ISBN</h2> Enter ISBN <input type="text" name="isbn" /> <input type="submit" value="Find" /> </form></body></html>

3.5.2 ��������������+ +ShowBook.java+ +

������ShowBook.java �0�������Java Servlet #�*&��1����������ISBN #�*,� �� ����&���� ��findBook.html ��&��������6���find() ����session bean #�*�)*��BooksFacade ��)*����������������������)����������� ���������������������

1. !������#�*�����BookAppWeb ��)���New → ServletPackage = servletsFile Name = ShowBook

2. ���*��source code �����������EJB (����$�0��Instance Varible)

@EJBprivate BooksFacadeLocal booksFacade;

Eclipse &�& ��Error ������Web -�1��0��EJB Project

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 37: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

37

�� #4�������*��Build path �� ���Library ����EJB Project �����)��#�*�Fix Project Setup

���set Build path �� �����

ร�ปที่ �� 3.8 แสดงการ Fix Project Setup

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 38: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

38

3. �� ����'��Source code ����6���processRequest ����Listing � ���1��Listing 3.5 ������ ShowBook.java

package servlets;

import java.io.IOException;import java.io.PrintWriter;

import javax.ejb.EJB;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import sb.BookFacadeLocal;import entity.Books;

public class ShowBook extends HttpServlet {private static final long serialVersionUID = 1L;

@EJBprivate BookFacadeLocal bookFacade;public ShowBook() {

super();}

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

processRequest(request, response);}

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

processRequest(request, response);}

protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("TIS-620");response.setContentType("TIS-620");

PrintWriter out = response.getWriter();

out.println("<html>");out.println("<head>");out.println("<title>Servlet ShowBook</title>");out.println("</head>");out.println("<body>");String isbn = request.getParameter("isbn");Books book = bookFacade.find(isbn);out.println("Title: " + book.getTitle() + "<BR>");out.println("Author: " + book.getAuthor() + "<BR>");out.println("Price: " + book.getPrice() + "<BR>");out.println("</body>");out.println("</html>");out.close();

}}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 39: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

39

3.6 ก�รทดสอบโปรแกรม

1. Re-Publish JBoss Server2. ������http://localhost:8080/BookAppWeb/findBook.html

3. �����isbn #�*�����table books � ����Find �� �&��0&����������������������)������

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 40: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

40

Exercise 4 ก�รพัฒน�ฒนำ�� JSP เพัฒน��อเร ยกใช้งาน JPA เพื่อเชื่อมต่อก EJB 3.0

เน#�อห้ Web Projecาที่ ��ต�องศึกษาก่อน Ses-กษาก%อน+Entity Class

��/.������� �0���������������JSP ��)*�������� �Entity Class #�*�)*��Books ���Session Bean #�*�)*��BooksFacade 2.*��������&����/.������)*���Entity Class � �&�������� �Stateful Session Bean #�*�)*�+Cart ������� Servlet #�*�)*��CartManager.java #�*�������&����/.������)*���Stateful Session Bean

Using EJB 3.0 ��)*���1����)*������)������Cart ����)*����������#�*���1���Cart ����� ��Project #�*,1�����)*��SessionBeanDemoWeb

������showBook.jsp �0�������JSP #�*&�������� �Custom Tag #�*�)*��<EJBTags:GetBooks>

2.*�&��0��Tag #�*������� ���6���findAll() ����BooksFacade Session Bean � ���0��List ��������)�#������-� ���session ������showBook.jsp �0&��������)*������)�#���������� ,� �� ��)�������Cart �������� �������-8�( 1��5�!)�

● Tag Library Descriptor● Tag Handler● JSP File

��������� ����������������

4.1.1 �� ���+ +Tag Library Descriptor+ +

-8�(��� &��� ��0������)*��Tag 1��5#�*�����1��)*������%�4��tag 1��5����� ��������JSP ����� !4���*�+<%@taglib ...%> ����� ���Tag Library Descriptor &������� ��������

1. !������#�*�����BookAppWeb

2. �� ���8�����(�\Web Pages\WEB-INF\tlds3. �� ��-8�(#�*�)*��EJBTags.tld ���implements ������

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 41: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

41

Listing 4.1 โปรแกรม EJBTags.tld <?xml version="1.0" encoding="UTF-8"?><taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" id="WebApp_ID" version="2.1">

<tlib-version>1.2</tlib-version><short-name>EJBTags</short-name><uri>/WEB-INF/tlds/EJBTags</uri><tag>

<name>GetBooks</name><tag-class>tags.GetBooks</tag-class><body-content>scriptless</body-content>

</tag></taglib>

4.1.2 �� ��-8�(�+ +Tag Handler+ +

-8�(�Tag Handler &��0������&���#�*������.����)*����'�1����)*�������� �tag � �&� ��#4�!4���*���1��-����#�*���&��4�����)*��Tag �0��GetBook ��������� ����������������

1. !��7����#�*�Project BookAppWeb &��������)��!4���*��New → Class

�4�����Package = tags , Class Name = GetBooks��)���SuperClass = SimpleTagSupport

2. #4�����Implement Method �)*��doTag( ) : Call Enterprise Bean ����� �annotation @EJB @EJB private BooksFacadeLocal booksFacade;

3. �� ���*��Signature Method => List<Books> findAll(); #�*�interface BookFacadeLocal

Listing 4.2 ������ BooksFacadeLocal.java package sb;import java.util.List;import entity.Books;

@Localpublic interface BookFacadeLocal {

Books find(String isbn);List<Books> findAll();

}

4. Fix Error �������Implements BooksFacade.java ������++++ public List<Books> findAll() {

CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(Books.class)); return em.createQuery(cq).getResultList();

}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 42: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

42

5. � -��Books.java ���������������� ���1�'��Query statement ��-@NamedQueries({@NamedQuery(name = "Books.findAll", query = "SELECT b FROM Books b"),@NamedQuery(name = "Books.findByIsbn", query = "SELECT b FROM Books b WHERE b.isbn = :isbn")})Listing 4.3 ������ Books .java package entity;import java.io.Serializable;import javax.persistence.*;

@Entity@Table(name = "books")@NamedQueries({@NamedQuery(name ="Books.findAll",query="SELECT b FROM Books b"),@NamedQuery(name ="Books.findByIsbn",query="SELECT b FROM Books b WHERE b.isbn = :isbn") })public class Books implements Serializable {

private static final long serialVersionUID = 1L;

@Id@Column(name = "ISBN")private String isbn;@Column(name = "AUTHOR")private String author;@Column(name = "PRICE")private float price;@Column(name = "TITLE")private String title;public String getIsbn() {

return this.isbn;}public void setIsbn(String isbn) {

this.isbn = isbn;}public String getAuthor() {

return this.author;}public void setAuthor(String author) {

this.author = author;}public float getPrice() {

return this.price;}public void setPrice(float price) {

this.price = price;}public String getTitle() {

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

this.title = title;}

}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 43: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

43

6. Implement source code ���class GetBooks.java #�*��6���doTag() ������

public void doTag() throws JspException {JspWriter out = getJspContext().getOut();

try{JspFragment f = getJspBody();if (f != null)f.invoke(out);List<Books> books = bookFacade.findAll();getJspContext().setAttribute("books",books,PageContext.SESSION_SCOPE);

} catch (IOException ex) {throw new JspException(ex.getMessage());

}}

Listing 4.4 ������ GetBooks .java

package tags;import java.io.IOException;import java.util.List;import javax.ejb.EJB;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;import entity.Books;

import sb.BookFacadeLocal;

public class GetBooks extends SimpleTagSupport {

@EJBprivate BookFacadeLocal bookFacade;@Overridepublic void doTag() throws JspException {

JspWriter out = getJspContext().getOut();

try {JspFragment f = getJspBody();if (f != null)f.invoke(out);List<Books> books = bookFacade.findAll();getJspContext().setAttribute("books",

books,PageContext.SESSION_SCOPE);} catch (IOException ex) {

throw new JspException(ex.getMessage());}

}}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 44: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

44

4.1.3 �����������+ +showBook.jsp+ +1. !������#�*�BookAppWeb &��������)��!4���*��New → JSP

�4�����JSP File Name: �0��showBook

2. ���� � 1���editor �� � -��source code ���-8�(��showBook.jsp �� �0�- ���Listing #�*�4.5

��������&��� ,����6(��� ����1������#�*�4.1

ร�ปที่ �� 4.1 ผล็อกการสร้าง Sล็อกการสร้าง S�พัฒนาโปรแกรม�ธ์โปรแกรม showB โปรแกรม showBook.jsp

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 45: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

45

Listing 4.5 ������ showBook.jsp

<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="/WEB-INF/tlds/EJBTags" prefix="EJB" %><html><body> <EJB:GetBooks/> <h1>Please Select Books</h1> <form action="http://localhost:8080/SessionBeanDemoWeb/CartManager" > <input type="HIDDEN" name="action" value="add" /> <table border="1"> <thead> <tr> <th></th> <th> Title </th> <th> Author </th> <th> Price </th> <th> Quantity </th> </tr> </thead> <tbody> <c:forEach var="book" items="${sessionScope.books}"> <tr> <td><input type="checkbox" name="item" value="${book.isbn}" /></td> <td>${book.title}</td><td>${book.author}</td> <td>${book.price}</td> <td><input type="text" name="${book.isbn}" value="0" size="3" />

</td> </tr> </c:forEach> </tbody> </table> <p> <input type="submit" value="Add" /> </form> </body></html>

4.2 ก�รปร�บปร"งโปรแกรม CartManager.java

������+CartManager.java ����&��4������ �1��� ���������1���������! ����Cart #�*��������+��)*��� ����������%�1��� �������������! �#�*&���0����1�� ��������(�����String #�*��&������������2.*�%����)����&���checkbox #�*���1���� ��showBook.jsp -� ������ � -��source code ��-8�(+CartManager.java �1���+ +Business Logic + +���������*�� ����+ ++������

if (action.equals("add")) { cart.putItem(item, Integer.parseInt(quantity)); }

�0�

if (action.equals("add")) { String[] items = request.getParameterValues("item"); for (int i = 0; i < items.length; i++) { String qty = request.getParameter(items[i]); cart.putItem(items[i], Integer.parseInt(qty)); } }

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 46: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

46

Listing 4.6 โปรแกรม CartManager.java package controller;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Hashtable;import javax.ejb.EJB;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import ejb.CartLocal;

public class CartManager extends HttpServlet {private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {processRequest(request, response);

}

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {processRequest(request, response);

}

@EJBCartLocal cart;protected void processRequest(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("TIS-620");response.setContentType("TIS-620");String action = request.getParameter("action");String item = request.getParameter("item");String quantity = request.getParameter("quantity");PrintWriter out = response.getWriter();out.println("<html><body><h1>Cart Manager</h1>");

if (action.equals("add")) { String[] items = request.getParameterValues("item"); for (int i = 0; i < items.length; i++)

{ String qty = request.getParameter(items[i]); cart.putItem(items[i], Integer.parseInt(qty)); }

} else if (action.equals("remove")) {cart.removeItem(item);

} else if (action.equals("list")) {Hashtable items = cart.getItems();Enumeration itemNames = items.keys();while (itemNames.hasMoreElements()) {

String itemId = (String) itemNames.nextElement();out.println("Item id: " + itemId + " Quantity : "

+ items.get(itemId));out.println("<BR>");

}}out.println("</body></html>");

}}

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan

Page 47: Java EE Programming [EJB 3.0 and JPA] Using  Eclipse and JBoss

47

4.3 ก�รทดสอบโปรแกรม

1. #4������Build ���Deploy ���&0!�SessionBeanDemo ���BookApp

2. ��� URL http://localhost:8080/BookAppWeb/showBook.jsp �� ���#������)������1� ����3. ��)*���'1��Add ������0&���0������)�#�*��)�����Cart

4. ������������Cart �����)���URL �0�http://localhost:8080/SessionBeanDemoWeb/CartManager?action=list

�������������� ���Enterprise Java Bean 3.0 Assoc.Prof.Dr.Thanachart Numnonda/ Asst Prof.Thanisa Kruawaisayawan