HTTP和HTML不理解複雜的Java對象。在Java透視圖中,他們只理解字符串。您最好將複雜的Java對象轉換爲字符串flavor中的唯一標識符,通常是其技術ID(例如,自動生成的數據庫PK),並將該標識符用作HTML鏈接中的HTTP請求參數。
給定一個List<Student>
主要內容如下表示爲表的鏈接,
<h:dataTable value="#{studentTable.students}" var="student">
<h:column>
<h:link value="Edit" outcome="updateStudent.xhtml">
<f:param name="id" value="#{student.id}" />
</h:link>
</h:column>
</h:dataTable>
您可以在目標視圖updateStudent.xhtml
使用<f:viewParam>
到通過學生ID轉換回Student
如下,
<f:metadata>
<f:viewParam name="id" value="#{updateStudent.student}" converter="#{studentConverter}" />
</f:metadata>
與
private Student student;
and
@ManagedBean
@ApplicationScoped
public class StudentConverter implements Converter {
@EJB
private StudentService studentService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.isEmpty()) {
return null;
}
if (!value.matches("[0-9]+")) {
throw new ConverterException("The value is not a valid Student ID: " + value);
}
long id = Long.valueOf(value);
return studentService.getById(id);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) {
return "";
}
if (!(value instanceof Student)) {
throw new ConverterException("The value is not a valid Student instance: " + value);
}
Long id = ((Student)value).getId();
return (id != null) ? String.valueOf(id) : null;
}
}
我在我的項目中使用'Jboss Seam'。現在我正在考慮刪除'Jboss Seam'。這就是爲什麼,我想研究像'對話'。 – CycDemo
@CycDemo我處於相同的位置,並選擇了ViewScoped beans和轉換器,如下面所示的BalusC(ConversationScoped是JEE7添加,但我不確定)。由於所有查找都是通過PK進行的,因此它們非常容易緩存,並且與JSF需要做的其他所有工作相比,應該閃電般快速。 – mabi