【问题标题】:JSF form posting nullJSF 表单发布为空
【发布时间】:2018-02-20 12:10:18
【问题描述】:

我有一个包含三种不同类型字段的实体类,一种用于String 值,一种用于Integer 值,另一种用于Date 值。

@Column(name = "EVDE_VALUE_STR")
private String evdeValueStr;

@Column(name = "EVDE_VALUE_INT")
private Integer evdeValueInt;

@Column(name = "EVDE_VALUE_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date evdeValueDate;

我创建一个 JSF 表单来从我的 entity 创建新实例。如您所见,我根据我希望 entity 类存储的数据类型创建了不同类型的 <h:inputText> 字段。

    <h:form>
    <ui:repeat value="#{mainWorkerMB.showAvailableEventDetailTypes()}" var="eventDetail">
    <tr>
    <td>
    <h:outputText value="#{eventDetail.edtyId.edtyName}"></h:outputText>
    </td>

    <td>

    <h:inputText id="str_tst" rendered="#{eventDetail.edtyId.edtyDetailType == 'STR'}"
     styleClass="form-control" value="#{eventDetail.evdeValueStr}" >
    </h:inputText>

    <h:inputText id="int_tst" rendered="#{eventDetail.edtyId.edtyDetailType == 'INT'}"
    styleClass="form-control number_mask" value="#{eventDetail.evdeValueInt}" >
    </h:inputText>

    <h:inputText id="dat_tst" rendered="#{eventDetail.edtyId.edtyDetailType == 'DAT'}"
    styleClass="form-control datepicker_base" value="#{eventDetail.evdeValueDate}">
    <f:convertDateTime pattern="yyyy.mm.dd" />
    </h:inputText>

    </td>
    </tr>
    </ui:repeat>
    <p:commandButton styleClass="btn btn-primary" actionListener="#{mainWorkerMB.createNewEvent()}" value="Save" />
    </h:form>

这是jsf生成的html:

<table class="table table-bordered table-hover"> 
<tr>
<td>
dummy str
</td>                                                   
<td>
<input id="j_idt57:j_idt64:0:str_tst" type="text" name="j_idt57:j_idt64:0:str_tst" class="form-control" />
</td>                                                   
</tr>
<tr>
<td>
dummy int
</td>                                                   
<td><input id="j_idt57:j_idt64:1:int_tst" type="text" name="j_idt57:j_idt64:1:int_tst" class="form-control" />
</td>
</tr>
<tr>
<td>dummy dat
</td>                                                   
<td><input id="j_idt57:j_idt64:2:dat_tst" type="text" name="j_idt57:j_idt64:2:dat_tst" class="form-control" />
</td>                                                   
</tr>
</table>

所以我看到所有类型的字段都正确生成。

这是我的支持 bean 方法,它返回 entity 实例:

public List<BtrEventDetail> showAvailableEventDetailTypes() {
        log.debug("invoked..");
        List<BtrDEventDetailType> detailTypeList = sessionBucketMB.getAvailableEventDetailList();
        detailList.clear();
        if (detailTypeList != null) {
            for (BtrDEventDetailType detTyInstance : detailTypeList) {

                BtrEventDetail newDetail = new BtrEventDetail();
                log.debug("setting detail instance detTyInstance: " + detTyInstance.getEdtyDetailType());
                newDetail.setEdtyId(detTyInstance);
                detailList.add(newDetail);
            }
        }
        return detailList;
    }

这是我的createNewEvent() 方法的前几行:

public void createNewEvent() {
        log.debug("invoked...");
        try {
            newEvent = new NewEvenDTO();

            for (BtrEventDetail detail : detailList) {

                log.debug("detail: " + detail.getEdtyId().getEdtyName() + " value: " + detail.getEvdeValueStr());

            }

..

..

点击保存按钮后,我在 webconsole 的 POST 中看到了这个:

javax.faces.partial.ajax    true
javax.faces.source  j_idt57:j_idt71
javax.faces.partial.execute @all
j_idt57:j_idt71 j_idt57:j_idt71
j_idt57 j_idt57
j_idt57:j_idt60 18
j_idt57:j_idt64:0:str_tst   zzzz
j_idt57:j_idt64:1:int_tst   111
j_idt57:j_idt64:2:dat_tst   2017.11.11
javax.faces.ViewState   -2967681892162587485:-6016297341844807895

这在我的支持 bean 中:

2017-09-12 09:13:19 createNewEvent DEBUG MainWorkerMB:277 - invoked...
2017-09-12 09:13:19 createNewEvent DEBUG MainWorkerMB:283 - detail: dummy str value: zzzz
2017-09-12 09:13:19 createNewEvent DEBUG MainWorkerMB:283 - detail: dummy int value: null
2017-09-12 09:13:19 createNewEvent DEBUG MainWorkerMB:283 - detail: dummy dat value: null

这意味着,只有我的String 字段发布数据。所有其他字段的值为空。

你能帮我这是为什么吗?

更新!

在我的支持 bean 中,我之前只记录了 StringValue。所以没有任何错误,在我的支持 bean 日志中没有看到缺失的值。

        log.debug("detail: " + detail.getEdtyId().getEdtyName() + " value: " + detail.getEvdeValueStr());

添加这两行后,我的值将显示在支持 bean 日志中:

    log.debug("detail: " + detail.getEdtyId().getEdtyName() + " value: " + detail.getEvdeValueInt());
    log.debug("detail: " + detail.getEdtyId().getEdtyName() + " value: " + detail.getEvdeValueDate());

感谢您的帮助,抱歉。

【问题讨论】:

  • 请显示您的支持 bean 代码。 mainWorkerMB.showAvailableEventDetailTypes() 返回什么值?
  • 更新了我的问题。谢谢!

标签: jsf jsf-2


【解决方案1】:

检查eventDetail.edtyId.edtyDetailType。它可能不会被渲染。所有三个输入元素都不会同时呈现。

【讨论】:

  • 如果我这样做,输入字段值将是 INT,所以我认为它已正确呈现。
  • @solarenqu 您发布的 HTML 中没有 id= 属性。
  • 使用生成的 html 和完整的发布请求日志以及完整的 jsf 表单更新了问题。每个输入字段都正确呈现.. :(
  • 对不起,这是我的错。在我的 backing bean 中,我只记录了 String 值,而不是 date 和 int 值。所以我把它放在我的 backing bean 日志中:log.debug("detail:" + detail.getEdtyId().getEdtyName( ) + "值:" + detail.getEvdeValueStr()); log.debug("详细信息:" + detail.getEdtyId().getEdtyName() +" 值:" + detail.getEvdeValueInt()); log.debug("详细信息:" + detail.getEdtyId().getEdtyName() +" 值:" + detail.getEvdeValueDate());现在我看到正确发布的值..
猜你喜欢
  • 2011-09-22
  • 2021-06-26
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多