2009-12-17 55 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中做更多的工作来自己转换(映射)对象。

相关问题