我有两页.搜索页面是获取用户输入的第一页.第二页显示了数据表中的结果集.第二页有3个面板用于结果集,更新并在单页中创建所有.根据单击的按钮,我将渲染面板设为true和false.
<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>
Run Code Online (Sandbox Code Playgroud)
在搜索页面中,我将这些创建和更新面板设置为false并仅显示结果集.单击结果集中的行后,我将显示updateForm面板,但将create panel保持为false.
但问题是,如果存在验证错误,则从搜索页面设置的属性将丢失,并显示所有面板.
如何获取之前从搜索页面设置的值(布尔值true或false),因为我没有导航到不同的页面.
我在第二个类中有boolean属性的getter和setter.我甚至尝试保留隐藏字段(即从搜索页面设置的布尔属性).在验证错误后,不应恢复所有提交的值.或者只是我们在表单中输入的那些.
什么是最好的解决方案?
任何帮助都非常感谢!!!
您确实需要将完全相同的布尔属性传递给下一个请求.理论上你可以使用<h:inputHidden value="#{bean.boolean1}" />它,但不幸的是,这些只会在更新模型值阶段设置,而实际上你需要它在应用请求值阶段可用.此外,当发生验证错误时,它们也会丢失.
有三种方法可以解决这种非直观的行为h:inputHidden(我曾经在Mojarra问题列表中提出了一个针对它的错误,但它们似乎没有对它做任何事情).
首先是使用bindingon h:inputHidden而不是:
<h:inputHidden binding="#{bean.hidden1}" />
Run Code Online (Sandbox Code Playgroud)
但是,这需要更改在支持bean代码中获取/设置布尔值的方式.例如:
private HtmlInputHidden hidden1 = new HtmlInputHidden(); // +getter +setter.
public void setBoolean1(boolean boolean1) {
hidden1.setValue(boolean1);
}
public boolean getBoolean1() {
return (Boolean) hidden1.getValue();
}
Run Code Online (Sandbox Code Playgroud)
二是使用战斧的t:saveState来代替.
<t:saveState value="#{bean.boolean1}" />
Run Code Online (Sandbox Code Playgroud)
主要优点是您不需要更改支持bean代码中的任何内容.它将在应用请求值阶段之前提前恢复该值.你只需要添加额外的库如果尚未完成,但战斧提供比只有更多的优势t:saveState,比如在基本JSF实现缺失的组件/功能t:inputFileUpload,t:dataList,t:dataTable preserveDataModel="true",t:selectOneRadio layout="spread"等等,这是值得的.
第三种方法是将它们存储在会话范围的bean中,但实际上您不希望对请求范围的变量执行此操作.它只会给"wtf?" 当最终用户在同一会话中打开多个选项卡/窗口时的体验.
编辑:根据评论,这是第二种方式的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>
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
相关部分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>
Run Code Online (Sandbox Code Playgroud)
游戏环境是Tomcat 6.0.20上的JSF 1.2_13.
| 归档时间: |
|
| 查看次数: |
7322 次 |
| 最近记录: |