<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 ก็พอ
jsf converter
ตอบลบ