<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
ตอบลบ