ManagedBean เป็น java class อย่างนึงที่เปรียบเสมือน controller ของ web application (ที่เป็น JSF) การคำนวณ หรือ การตัดสินใจที่เกี่ยวกับ business logic ต่างๆ ของ web application ของเรา จะทำอยู่ที่ manage bean ครับ action จากหน้า web หรือ view (html) จะถูกส่งจาก client (browser) มายัง managed bean ก่อนเสมอ แล้ว managed bean จึงจะไปเรียกใช้งาน service ต่างๆ ตามที่ต้องการอีกที เดี๋ยวเราลองมาดูโครงสร้างการทำงานคร่าวๆ กันครับ
1. view(html) จะมาเรียกใช้งาน managed bean(business logic)
2. managed bean(business logic) เรียกใช้งาน service (ที่ต้องการทำอะไรบางอย่าง (อาจมี transaction มาเกี่ยวข้อง))
3. service เรียกใช้งาน persistent ซึ่งอาจจะเป็น database, jms(java message service), ...
4. จากนั้นจะคืนค่าต่างๆ กลับไปจนถึง view ตามลำดับ
ตัวอย่างแรกของ managed bean
package com.blogspot.na5cent.jsflearning.managedbean; import java.io.Serializable; import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; //ต้องเป็น javax.faces.bean น่ะ อย่าหลงผิด import javax.faces.bean.SessionScoped; /** * * @author Redcrow */ @ManagedBean(name="firstMB") //บอกว่าเป็น managed bean ชื่อ firstMB @SessionScoped //บอกว่า ตัวแปรทุกตัวใน managed bean นี้ อยู่ในระดับ session scope //scope มันก็จะมีอยู่หลายระดับ เช่น //@RequestScoped คือ request ทุกครั้ง managed bean จะสร้างตัวแปรใหม่ทุกครั้ง //@SessionScoped คือ สร้าง attribute ครั้งเดียวเฉพาะตอน create session attribute ที่เหลือก็จะไปเอาจาก session มาใช้ //@ApplicationScoped คือสร้างครั้งเดียว ตอน start application, scope นี้ ทุกคนใน application จะมองเห็นเป็นค่าเดียวกันหมด ซึ่งต่างจาก SessionScoped ที่จะมองเห็นเฉพาะ session ใคร session มัน //@ViewScoped public class FitstManagedBean implements Serializable{ //implements Serializable ใช้ในกรณีที่เป็น SessionScoped และ ApplicationScoped เพื่อให้สามารถจัดเก็บค่า attribute ต่างๆ ไว้ใน application ได้ private String firstName; private String lastName; @PostConstruct //บอกว่า ให้ทำหลังจากที่เรียก constructor public void postConstruct() { firstName = "redcrow"; lastName = "na5cent"; } //การเรียกใช้งาน attribute ต่างๆ ของ managed bean จะเรียกผ่าน method getter setter เสมอ **** //ไม่เกียวกับจำนวน attribute ที่มีอยู่ครับ public String getFirstName() { return firstName; } //ทั้งๆ ที่ไม่มี attribute id แต่ก็สามารถเรียกใช้งาน method id ได้ public int getId(){ retern 501; } //การ set ค่าให้กับ attribute จะเรียกใช้ setter method ของ attribute นั้น public void setFirstName(String firstName) { this.firstName = firstName; } //ส่วนการอ่านค่า จะเรียกใช้ getter method ของ attribute นั้นครับ public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } //อันนี้ เราอาจมองว่ามันคือ action อะไรบางอย่างก็ได้ ที่เราอยากที่ view action เข้ามา //เราอาจจะตั้งเป็น onSave(), onAdd(), onRemove() ... หรือตั้งชื่อว่าอะไรก็ได้น่ะครับ เพียงแต่ผมชอบใช้ on นำหน้า เพื่อให้รู้ว่ามันคือ action ที่รองรับการเกิด event ต่างๆ ตามที่เราต้องการ public void onAction(){ System.out.println("call action"); System.out.println("first name => " + firstName); System.out.println("last name => " + lastName); } }หน้า view เรียกใช้ managed bean
firstMB.xhtml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" > <h:head> <title>first managed bean</title> </h:head> <h:body> <h:form> <h:panelGrid columns="2"> <h:outputText value="firstName : "/> <!-- เวลาเราเรียกใช้ managed bean มันจะเรียกผ่าน #{} expression language แล้วข้างในจะเป็นชื่อ managed bean(name = firstMB) ครับ แต่ถ้าเราไม่กำหนด มันก็จะเป็น ชื่อ class managed bean นั้น แต่ตัวแรกจะเป็นตัวอักษรตัวเล็กเสมอ --> <!-- ตัว #{firstMB.firstName} .firstName ตัวนี้ถูกเรียกจาก getFirstName() และ setFirstName() น่ะครับ ไม่ใช่ attribute name --> <p:inputText value="#{firstMB.firstName}"/> <h:outputText value="lastName"/> <p:inputText value="#{firstMB.lastName}"/> </h:panelGrid> <!-- เรียกใช้งาน action method ใน managed bean --> <p:commandButton value="save" actionListener="#{firstMB.onAction()}"/> </h:form> </h:body> </html>
เราจะเห็นว่ามันมี attribute id โผล่ขึ้นมา ทั้งๆ ที่ใน managed bean ของเราไม่มี attribute id อยู่แต่จะมี method getId() อยู่แทน ฉะนั้น attribute id นี้ จะสามารถอ่านค่าได้เท่านั้น จะไม่สามารถ set ค่าได้ ถ้าอยากให้ set ค่า หรือส่งค่ากลับไปยัง managed bean ได้ จะต้องใช้ setter method หรือ setId()
จะเห็นว่า มีการอ่านค่าจาก managed bean มาแสดงผล ตามที่ผมได้ initial ค่าไว้ นั่นก็คือ firstName = "redcrow", lastName = "na5cent"
เรามาลองทดสอบ เปลี่ยนค่า input ใหม่ เป็น JSF และ Managed Bean แล้วกดปุ่ม save เพื่อส่ง action event ไปที่ managed bean ดูครับ มันจะเอาค่าใน input text นี้ไป set ใส่ใน method setFirstName(String firstName) และ setLastName(String lastName) ให้เราเองโดยอัตโนมัติ ทำให้ attribute firstName และ lastName มีค่าเป็น JSF และ Managed Bean ตามลำดับ
มีการ call action เกิดขึ้น
หวังว่าคงพอเข้าใจ concept การทำงานคร่าวๆ ของ managed bean น่ะครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น