หน้าเว็บ

วันศุกร์ที่ 11 มกราคม พ.ศ. 2556

รู้จักกับ ManageBean ซึ่งเปรียบเสมือนกับ Web Controller : jsf

ManagedBean คืออะไร?
        ManagedBean เป็น java class อย่างนึงที่เปรียบเสมือน controller ของ web application (ที่เป็น JSF)  การคำนวณ หรือ การตัดสินใจที่เกี่ยวกับ business logic ต่างๆ ของ web application ของเรา  จะทำอยู่ที่ manage bean ครับ  action จากหน้า web หรือ view (html) จะถูกส่งจาก client (browser) มายัง managed bean  ก่อนเสมอ  แล้ว managed bean จึงจะไปเรียกใช้งาน service ต่างๆ ตามที่ต้องการอีกที  เดี๋ยวเราลองมาดูโครงสร้างการทำงานคร่าวๆ กันครับ


อันนี้เป็นโครงสร้างทั่วๆไปของแทบจะทุก application ที่ผมใช้  นั่นก็คือ
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 น่ะครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น