หน้าเว็บ

วันอังคารที่ 11 ธันวาคม พ.ศ. 2555

JSF converter

        JSF (JavaServer Faces) Converter เป็นวิธีที่ใช้สำหรับการแปลงจาก String => Object, Object => String  ซึ่งเมื่อเราเขียน jsf ไปได้สักพักก็จะพบปัญหานี้    ซึ่งจะเกิดขึ้นในกรณีที่เราใช้
<h:selectonemenu value="#{bookMB.book.author}">
        <f:selectitems itemlabel="#{item.name}" 
                       itemvalue="#{item}" 
                       value="#{authorMB.authors}" 
                       var="item"/>
</h:selectonemenu>
        ถ้าแปลงไปเป็น html  มันก็คือ tag select option ธรรมดาๆ นี่เอง
ปัญหาคือ  เราไม่สามารถที่จะโยน Object จาก code html  มาใส่ใน List<Object> java ได้  ค่าที่โยนมาได้  เป็นได้แค่  data type ธรรมดาๆ เท่านั้น เช่น String, int, float, double, ...  เราจะโยน Object ต่างๆมาไม่ได้

วิธีแก้  เลยต้องใช้การ convert String => Object หรือ Object => String  ดังนี้

1. สร้าง class Converter ที่ต้องการ โดย implements Converter ของ JSF  จากนั้น  เขียน code ต่างๆ ลงไป

package com.blogspot.na5cent.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import com.blogspot.na5cent.models.Author;
import com.blogspot.na5cent.services.AuthorService;
import com.blogspot.na5cent.utils.JSFSpringUtils;

/**
 *
 * @author Redcrow
 */
public class AuthorConverter implements Converter {

    //code แปลง String => Object
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        AuthorService authorService = JSFSpringUtils.getBean(AuthorService.class); 
        return authorService.findByName(value);
    }

    //code แปลง Object => String
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {

        return ((Author)value).getName();
    }
}
2. ที่ไฟล์  faces-config.xml  ให้เพิ่มต่อไปนี้ลงไป
...
...
...
    <converter>
        <converter-id>
            authorConverter  
        </converter-id>
        <converter-class>
            com.blogspot.na5cent.converter.AuthorConverter 
        </converter-class>
    </converter>
 ...
 ...
 ...
</faces-config>
3. การใช้งาน
<h:selectonemenu value="#{bookMB.book.author}">
        <f:selectitems itemlabel="#{item.name}" 
                       itemvalue="#{item}" 
                       value="#{authorMB.authors}" 
                       var="item"/>
        <f:converter converterId="authorConverter"> 
</h:selectonemenu>
        แค่นี้ก็สามารถใช้งานได้แล้วครับ เมื่อเราเลือก select menu และ submit form มันก็จะทำการแปลงจาก String => Object ให้เราโดยอัติโนมัติ ฝั่ง java เราก็แค่รอรับค่าเป็น Object ก็พอ

1 ความคิดเห็น: