我正在学习JSF,当我意识到每当我们使用时<h:form>,JSF的标准行为总是向我显示浏览器中上一页的URL ,而不是当前页面的URL,我感到非常惊讶和困惑.
我知道这与JSF总是将表单发布到同一页面的方式有关,然后只是呈现控制器将其返回给浏览器的任何页面,而浏览器不知道页面位置已更改.
似乎JSF已经存在了足够长的时间,必须有一个干净,可靠的方法来处理这个问题.如果是这样,你介意分享吗?
我找到了各种解决方法,但遗憾的是,这似乎不是一个真正可靠的解决方案.
"?faces-redirect=true"到每个 bean的操作的返回值然后
@RequestScoped用其他东西替换(Flash Scopes,CDI对话,@ SessionScoped,......).如果它"?faces-redirect=true"是如此好,有没有办法配置整个应用程序以这种方式处理所有请求?
我有多种形式,我有必填字段和可选字段.
要提交这样的表单,我需要对要执行的required属性进行验证,这样可以正常工作.要取消这样的形式我使用属性immediate="true"上p:commandbutton,这使得在其作用发生应用请求值 -PHASE如下处理:点击一个特定的按钮时如何跳过验证?
但是,对于大型表单,我想为用户提供一个Save-Button,以便他可以稍后继续.
为了保存当前状态,我还想忽略required-attribute的验证.但是,使用immediate="true"不起作用,因为那时我的save方法简单保存,因为JSF生命周期永远不会命中"UpdateModelValues"-Phase.(根据http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html)
那么,如何绕过所需的检查但不跳过生命周期的一半?
我创建了表单,我希望在新表创建时在表上显示以前的现有项目.我希望在填写表格时显示匹配的项目.但是当我尝试在没有完成表单的情况下过滤列表时,会出现验证消息,并且表格不会更新.
不知道是否可能,但我想做的事情是这样的:
<h:form id="form">
<h:outputText value="Name: "/>
<p:inputText value="#{itemsBean.name}" id="name" required="true"/>
<br/>
<h:outputText value="Description: "/>
<p:inputText value="#{itemsBean.description}" id="description" required="true"/>
<p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
<p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.
<p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">
<p:column>
<h:outputText value="#{item.name}"/>
</p:column>
<p:column>
<h:outputText value="#{item.description}"/>
</p:column>
</p:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)
我是JSF的新手.
在一个表单中,我有一些带有两个commandButton的inputText,一个用于accept,一个用于cancel.如何仅对取消按钮禁用验证?
<h:form id="detailsForm">
<p:inputText id="editUsername" value="#{userController.editUser.usrUsername}" />
<p:inputText id="editFirstName" value="#{userController.editUser.usrFirstName}" />
<p:inputText id="editLastName" value="#{userController.editUser.usrLastName}" />
<p:commandButton value="Accept" update=":detailsForm" actionListener="#{userController.onDetailsEditAccept}" />
<p:commandButton value="Cancel" update=":detailsForm" actionListener="#{userController.onDetailsEditCancel}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
我已经尝试required="false"在字段上插入但它没有用.我也尝试<f:validateBean disabled="true" />在字段上插入但它没有用.
最初immediateflag仅用于ActionSource接口.但后来它也被添加到EditableValueHolder界面中.设计决策的原因是什么?
我有一个JSF/PrimeFaces表单页面设置来编辑一些配置细节.底部是提交和取消按钮实现为CommandButton."取消"按钮如下所示:
<p:commandButton
action="priorPage.xhtml?faces-redirect=true"
value="Cancel" />
Run Code Online (Sandbox Code Playgroud)
问题是视图bean仍然会对输入到表单中的数据进行更多处理,而不是我想要的.它不会更新数据库中的任何内容,但是如果(比方说)我将字符串输入到正在查找bean中的数字的字段中,它仍然会产生错误.
当然,我的解决方案的一部分是让bean优雅地处理那种糟糕的数据,我正在研究它.但是我也想调整那个按钮,这样它就可以将用户带到前一页.我可以设置一些属性来阻止表单被处理吗?
所以我有这个取消按钮:
<p:commandButton id="cancelButton" value="Cancel" action="#{myBean.doOnCancel}" onclick="dialogWidget.hide();" />
Run Code Online (Sandbox Code Playgroud)
取消按钮所在的小部件 ( <p:dialog>) 有一个日期字段。每次我打开对话框时,输入一些有效值并单击取消 -myBean.doOnCancel执行并隐藏对话框。现在,每次我打开对话框时,输入一个无效值,例如单个字母而不是日期,我都会收到一条验证消息,指出日期格式错误,然后单击取消 - 对话框已隐藏,但操作中定义的方法 ( myBean.doOnCancel)不被执行。知道为什么吗?