gpt4 book ai didi

jsf - JSF 中的验证错误后丢失的值

转载 作者:行者123 更新时间:2023-12-04 16:47:15 26 4
gpt4 key购买 nike

我有两页。搜索页面是第一个接受用户输入的页面。第二页显示数据表中的结果集。第二页有 3 个面板,用于结果集、更新和在单个页面中创建。根据单击的按钮,我将面板呈现为真和假。

<h:panelGroup styleClass="panelGroup"
id="resultSet" rendered="#{bean.truefalse1}">
.
.
</h:panelGroup

<h:panelGroup styleClass="panelGroup"
id="updateForm" rendered="#{bean.truefalse2}">
.
.
</h:panelGroup


<h:panelGroup styleClass="panelGroup"
id="createForm" rendered="#{bean.truefalse3}">
.
.
</h:panelGroup>

在搜索页面中,我将这些创建和更新面板设置为 false 并仅显示结果集。单击结果集中的行后,我正在显示
updateForm 面板但保持创建面板为 false。

但这里的问题是,如果出现验证错误,那么从搜索页面设置的属性就会丢失,并且所有面板都会显示出来。

我如何获取之前从搜索页面设置的值( bool 值 true 或 false),因为我没有导航到不同的页面。

我在第二类中有用于 bool 属性的 getter 和 setter。我什至尝试保留隐藏字段(即从搜索页面设置的 bool 属性)。
验证错误后不应该恢复所有提交的值。或者只是我们在表单中输入的那些。

最好的解决方案是什么?

任何帮助都非常感谢!!!

最佳答案

您确实需要将完全相同的 bool 属性传输到下一个请求。您理论上可以使用 <h:inputHidden value="#{bean.boolean1}" />为此,但不幸的是,这些只会在更新模型值阶段设置,而您实际上需要它在应用请求值阶段可用。此外,当发生验证错误时,它们也会丢失。

有三种方法可以修复 h:inputHidden 的这种非直观行为。 (我曾经在 Mojarra 问题列表中针对它提交了一个错误,但他们似乎没有对它做任何事情)。

首先是使用bindingh:inputHidden反而:

<h:inputHidden binding="#{bean.hidden1}" />

但是,这需要更改您在支持 bean 代码中获取/设置 bool 值的方式。例如:
private HtmlInputHidden hidden1 = new HtmlInputHidden(); // +getter +setter.

public void setBoolean1(boolean boolean1) {
hidden1.setValue(boolean1);
}

public boolean getBoolean1() {
return (Boolean) hidden1.getValue();
}

二是使用 Tomahawkt:saveState反而。
<t:saveState value="#{bean.boolean1}" />

主要优点是您不需要更改支持 bean 代码中的任何内容。它将在应用请求值阶段之前尽早恢复该值。如果还没有完成,您只需要添加额外的库,但由于 Tomahawk 提供的优势远不止 t:saveState ,例如在基本 JSF 实现中缺少组件/特性 t:inputFileUpload , t:dataList , t:dataTable preserveDataModel="true" , t:selectOneRadio layout="spread"等等,这是值得的。

第三种方法是将它们存储在 session 范围的 bean 中,但您实际上不想为请求范围的变量这样做。它只会给“wtf?”当最终用户在同一 session 中打开多个选项卡/窗口时的体验。

编辑:根据评论,这里是 SSCCE第二种方式:

JSF 页面:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<f:view>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<h:form id="form">
<h:inputHidden binding="#{myBean.hidden}" converter="javax.faces.Boolean" />
<h:commandButton value="submit" action="#{myBean.submit}"/>
<h:outputText value="Current boolean value: #{myBean.hidden.value}" />
</h:form>
</body>
</html>
</f:view>

MyBean 类:
package mypackage;

import javax.faces.component.html.HtmlInputHidden;

public class MyBean {

private HtmlInputHidden hidden = new HtmlInputHidden();

public void submit() {
if (hidden.getValue() == null) {
hidden.setValue(true); // Set to true on 1st submit.
} else {
hidden.setValue(!((Boolean) hidden.getValue())); // Toggle true/false.
}
}

public HtmlInputHidden getHidden() {
return hidden;
}

public void setHidden(HtmlInputHidden hidden) {
this.hidden = hidden;
}

}
faces-config.xml的相关部分:
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>mypackage.MyBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Playground 环境是 Tomcat 6.0.20 上的 JSF 1.2_13。

关于jsf - JSF 中的验证错误后丢失的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1925118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com