这个简单类需要一个自定义JSF转换器吗?

我一直在努力编写JSF应用程序。 在应用程序的一个部分中,我需要用户从选择菜单中进行选择,该菜单显示可选状态值列表。 Status类(如下所示),用于填充选择菜单中显示的List,是一个由两个字符串组成的简单类:一个是用于在数据库中查找描述的代码,另一个是人类可读的描述。 我试图找出我在这里是否需要转换器,如果是这样,如何最好地实现转换器。 这是一个使用Java 1.5的JSF 1.1项目

我在JSP中使用以下代码:

              

这里显示了支持bean(为了清楚起见,删除了一些非相关的部分,例如分页):

公共类StatusReasonBacker {

 private List statusReasonList; private List statusList; private List 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(); 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 getStatusReasonList() { statusReasonList = sDao.getStatusReasons(); return statusReasonList; } public void setStatusReasonList(List 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 getStatusList() { statusList = sDao.getStatuses(); return statusList; } public void setStatusList(List statusList) { this.statusList = statusList; } public List 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 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; } } 

谢谢!

我试图找出我在这里是否需要转换器,如果是这样,如何最好地实现转换器。

每当您想要将非标准Java对象从HTTP请求传递到另一个HTTP请求时,您都需要一个转换器。 非标准我的意思是不是 StringNumberBoolean 。 这一切都只是因为HTTP请求参数只能StringsNumberBoolean工作原理是因为EL可以识别它们并且具有内置强制function。

对于非标准Java对象,您需要实现一个javax.faces.convert.Converter ,它将Object转换为String (或您想要的数字,例如Long id ,它可以是数据库表中关联行的PK) )在以HTML格式显示之前,在getAsString()方法内部。 在处理请求参数期间,您在getAsObject()方法中执行相反的操作(例如,通过其id从DAO获取关联的对象)。

你可以在这里找到一个如何使用Converter来实现h:selectOneMenu的例子。 您会看到本文还包含一个替代方案,但您需要在辅助bean中进行更多工作以自行转换(映射)对象。