2009-12-17 48 views
1

我一直在嘗試有限的成功來編寫JSF應用程序。在應用程序的一部分中,我需要用戶從顯示可選狀態值列表的選擇菜單中進行選擇。用於填充選擇菜單中顯示的List的Status類(如下所示)是一個由兩個Strings組成的簡單類:一個是用於在數據庫中查找描述的代碼,另一個是人類可讀的描述。我試圖找出是否我需要一個轉換器,如果是的話,如何最好地實現轉換器。這是使用Java 1.5這個簡單的類是否需要定製JSF轉換器?

我使用的JSP下面的代碼JSF 1.1項目:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<f:view> 
<html> 
<h:graphicImage id="image" url="/images/appname.jpg" 
    alt="app name" /> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<jsp:include page="/jsp/menu.jsp" /> 
</head> 
<body> 

<h:outputText 
    value="Add Value" 
    style="font-size:20px;" /> 

<h:messages errorStyle="color: red" infoStyle="color: green" 
    layout="table" /> 

<h:form id="statusReasonEditForm"> 

    <table> 
     <tr> 
      <td><h:outputText id="txtvalue" value="Status" /></td> 
      <td><h:selectOneMenu id="selectStatus" 
       value="#{pc_statusReasonBacker.status}" 
       binding="#{pc_statusReasonBacker.selectItem}"> 
       <f:selectItems value="#{pc_statusReasonBacker.selectStatuses}" /> 
       <f:converter converterId="statusConverter" /> 
      </h:selectOneMenu> 
      <td><h:outputText id="txtvaluereason" value="Status Reason" /></td> 
      <td><h:inputText id="txtinputreason" 
       value="#{pc_statusReasonBacker.statusReason.statusReason}" 
       maxlength="100" size="40" /></td> 
      <td><h:outputText id="txtvaluereasondesc" 
       value="Status Reason Desc" /></td> 
      <td><h:inputText id="txtinputreasondesc" 
       value="#{pc_statusReasonBacker.statusReason.statusReasonDesc}" 
       maxlength="100" size="40" /></td> 
     </tr> 

    </table> 
    <tr> 
     <td><h:commandButton id="savebutton" value="Save" 
      action="#{pc_statusReasonBacker.save}" /></td> 
     <td><h:commandButton id="cancelbutton" value="Cancel" 
      action="#{pc_statusReasonBacker.cancel}" /></td> 
    </tr> 

</h:form> 
<hr /> 
</body> 
</html> 
</f:view> 

的支持bean如下所示(一些非相關的部分,如分頁,取消了清晰):

公共類StatusReasonBacker {

private List<StatusReason> statusReasonList; 
private List<Status> statusList; 
private List<SelectItem> selectStatuses; 
private StatusReason statusReason; 
private StatusDao sDao; 
private Status status; 
private UIData statusReasonTable; 
private HtmlSelectOneMenu selectItem; 
private String selectedStatus = ""; 

public StatusReasonBacker() { 
    sDao = new StatusDao(); 
    statusReason = new StatusReason(); 
    selectStatuses = new ArrayList<SelectItem>(); 
    status = new Status(); 
    selectItem = new HtmlSelectOneMenu(); 
} 

public String insert() { 
    status.setStatusCde(""); 
    statusReason.setStatus(status); 
    statusReason.setStatusReason(""); 
    statusReason.setStatusReasonCde(""); 
    statusReason.setStatusReasonDesc(""); 
    return "success"; 
} 

public String edit() { 
    this.statusReason = (StatusReason) statusReasonTable.getRowData(); 
    selectItem.setValue(statusReason.getStatus().getStatusCde()); 
    return "success"; 
} 

public String update() { 

    if ("".equalsIgnoreCase(statusReason.getStatusReason().trim())) { 
     Message 
       .addErrorMessage("You must enter a value for the status reason."); 
     return "failure"; 
    } else if (("".equalsIgnoreCase(statusReason.getStatusReasonDesc() 
      .trim()))) { 
     Message 
       .addErrorMessage("You must enter a value for the status reason description."); 
     return "failure"; 
    } 
    sDao.updateStatusReason(statusReason); 

    return "statusreasons"; 
} 

public String delete() { 
    StatusReason statReason = (StatusReason) statusReasonTable.getRowData(); 
    sDao.deleteStatusReason(statReason); 
    return "statusreasons"; 
} 

public String cancel() { 
    return "statusreasons"; 
} 

public String save() { 

    statusReason.setStatus(status); 
    sDao.insertStatusReason(statusReason); 
    return "statusreasons"; 
} 

... 

public StatusDao getSDao() { 
    return sDao; 
} 

public void setSDao(StatusDao dao) { 
    sDao = dao; 
} 

public List<StatusReason> getStatusReasonList() { 
    statusReasonList = sDao.getStatusReasons(); 
    return statusReasonList; 
} 

public void setStatusReasonList(List<StatusReason> statusReasonList) { 
    this.statusReasonList = statusReasonList; 
} 

public UIData getStatusReasonTable() { 
    return statusReasonTable; 
} 

public void setStatusReasonTable(UIData statusReasonTable) { 
    this.statusReasonTable = statusReasonTable; 
} 

public StatusReason getStatusReason() { 
    return statusReason; 
} 

public void setStatusReason(StatusReason statusReason) { 
    this.statusReason = statusReason; 
} 

public List<Status> getStatusList() { 
    statusList = sDao.getStatuses(); 
    return statusList; 
} 

public void setStatusList(List<Status> statusList) { 
    this.statusList = statusList; 
} 

public List<SelectItem> getSelectStatuses() { 

    selectStatuses.clear(); 
    if (statusList == null) { 
     statusList = this.getStatusList(); 
    } 

    for (Status sr : statusList) { 

     SelectItem si = new SelectItem(); 
     si.setValue(sr.getStatusCde()); 
     si.setLabel(sr.toString()); 
     si.setDescription(sr.toString()); 
     selectStatuses.add(si); 
    } 
    return selectStatuses; 
} 

public void setSelectStatuses(List<SelectItem> selectStatuses) { 
    this.selectStatuses = selectStatuses; 
} 

public String getSelectedStatus() { 
    selectedStatus = statusReason.getStatusDesc(); 
    return selectedStatus; 
} 

public void setSelectedStatus(String selectedStatus) { 
    this.selectedStatus = selectedStatus; 
} 

public Status getStatus() { 
    return status; 
} 

public void setStatus(Status status) { 
    this.status = status; 
} 

public HtmlSelectOneMenu getSelectItem() { 
    return selectItem; 
} 

public void setSelectItem(HtmlSelectOneMenu selectItem) { 
    this.selectItem = selectItem; 
} 

} 

謝謝!

回答

6

我想知道是否我需要一個轉換器在這裏,如果是這樣,如何最好地實現轉換器。

無論何時您想要將非標準Java對象從HTTP請求傳遞到另一個HTTP請求,您都需要一個轉換器。非標準我的意思是而不是 a StringNumberBoolean。這一切都只是因爲HTTP請求參數可以只有Strings。那NumberBoolean的作品是因爲EL可以識別它們並對它有內置的強制。

對於非標準的Java對象需要實現一個javax.faces.convert.Converter將對象轉換爲String(或Number所以你要,例如Long id它可以在數據庫表中的相關行的PK)內在HTML中顯示之前使用getAsString()方法。在處理請求參數期間(例如,從DAO獲取關聯對象的id),您可以在getAsObject()方法中進行相反的操作。

你可以找到here一個如何使用Converter作爲h:selectOneMenu的例子。你會發現這篇文章也包含了一個替代方案,但是你需要在backing bean中做更多的工作來自己轉換(映射)對象。