这个简单类需要一个自定义JSF转换器吗? [英] Is a custom JSF converter needed for this simple class?

查看:74
本文介绍了这个简单类需要一个自定义JSF转换器吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have been trying with limited success to code a JSF application. In one section of the application, I need users to select from a select menu which displays a list of selectable status values. The Status class (presented below), which is used to populate the List that is displayed in the select menu, is a simple class made up of two Strings: one is the code used to look up the description in the database, the other is the human-readable description. I am trying to find out if I need a converter here at all, and if so, how best to implement the converter. This is a JSF 1.1 project using Java 1.5

我在JSP中使用以下代码:

I am using the following code in the JSP:

<%@ 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(为了清楚起见,删除了一些非相关的部分,例如分页) :

The backing bean is shown here (some non-related sections, such as paging, removed for clarity):

public class StatusReasonBacker {

public class 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;
}

 }

谢谢!

推荐答案


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

每当你想从HTTP传递非标准Java对象时,你需要一个转换器请求另一个HTTP请求。非标准我的意思是 a 字符串 Number Boolean 。这一切都只是因为HTTP请求参数 字符串 Number 布尔的工作原理是因为 EL 可以识别它们,并且内置了强制措施。

You need a converter whenever you want to pass non-standard Java Objects from a HTTP request to another HTTP request. With non-standard I mean not a String, Number or Boolean. This all simply because HTTP request parameters can only be Strings. That Number and Boolean works is because EL can recognize them and has built-in coercions for it.

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

For non-standard Java Objects you need to implement a javax.faces.convert.Converter which converts the Object to a String (or a Number so you want, for example a Long id which can be the PK of the associated row in database table) inside the getAsString() method before displaying in HTML. You do the other way round in the getAsObject() method during processing of the request parameters (e.g. get the associated object from DAO by its id).

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

You can find here an example of how to use a Converter for a h:selectOneMenu. You see that this article also contains an alternative, but you'll need to do a bit more work in the backing bean to convert (map) the objects yourself.

这篇关于这个简单类需要一个自定义JSF转换器吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆