Нужен ли специальный преобразователь JSF для этого простого класса? - PullRequest
1 голос
/ 17 декабря 2009

Я пытался с ограниченным успехом кодировать приложение JSF. В одном разделе приложения мне нужно, чтобы пользователи выбирали из меню выбора, которое отображает список выбираемых значений состояния. Класс Status (представлен ниже), который используется для заполнения списка, отображаемого в меню выбора, представляет собой простой класс, состоящий из двух строк: одна - это код, используемый для поиска описания в базе данных, другая - человекочитаемое описание. Я пытаюсь выяснить, нужен ли мне конвертер здесь, и если да, то как лучше всего реализовать конвертер. Это проект JSF 1.1, использующий Java 1.5

Я использую следующий код в 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>

Здесь показан базовый компонент (некоторые несвязанные разделы, такие как пейджинг, удалены для ясности):

открытый класс 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;
}

 }

Спасибо!

1 Ответ

6 голосов
/ 17 декабря 2009

Я пытаюсь выяснить, нужен ли мне здесь вообще конвертер, и если да, то как лучше всего реализовать конвертер.

Вам нужен конвертер, если вы хотите передать нестандартные объекты Java из HTTP-запроса в другой HTTP-запрос. Под нестандартным я подразумеваю , а не a String, Number или Boolean. Это все просто потому, что параметры HTTP-запроса могут только быть Strings. Number и Boolean работают потому, что EL может их распознавать и имеет встроенные меры принуждения.

Для нестандартных Java-объектов вам нужно реализовать javax.faces.convert.Converter, который преобразует объект в String (или Number, так что вы хотите, например, Long id, который может быть PK связанной строки в таблице базы данных) внутри метода getAsString() перед отображением в HTML. Вы делаете обратное в методе getAsObject() во время обработки параметров запроса (например, получите связанный объект из DAO его id).

Вы можете найти здесь пример использования Converter для h:selectOneMenu. Вы видите, что эта статья также содержит альтернативу, но вам нужно проделать немного больше работы с компонентом поддержки, чтобы самостоятельно преобразовать (отобразить) объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...