javascript
jsf tree组件_JSF和“立即”属性–命令组件
jsf tree組件
JSF中的即時(shí)屬性通常被誤解。 如果您不相信我,請(qǐng)查看Stack Overflow 。 造成混淆的部分原因可能是由于輸入(即<h:inputText />)和命令(即<h:commandButton />)組件都立即可用,每個(gè)組件對(duì)JSF生命周期的影響都不同。
這是標(biāo)準(zhǔn)的JSF生命周期:
出于本文的目的,我假設(shè)您熟悉JSF生命周期的基礎(chǔ)知識(shí)。 如果您需要簡(jiǎn)介或內(nèi)存更新,請(qǐng)查看Java EE 6教程– JavaServer Faces應(yīng)用程序的生命周期 。
注意:本文中的代碼示例適用于JSF 2(Java EE 6),但其原理與JSF 1.2(Java EE 5)相同。
在Command組件上為Instant = true
在標(biāo)準(zhǔn) JSF生命周期中,在“ 調(diào)用應(yīng)用程序”階段評(píng)估Command組件上的action屬性。 例如,假設(shè)我們有一個(gè)User實(shí)體/ bean:
public class User implements Serializable {@NotBlank@Length(max = 50)private String firstName;@NotBlank@Length(max = 50)private String lastName;/* Snip constructors, getters/setters, a nice toString() method, etc */ }還有一個(gè)UserManager用作我們的托管bean:
@SessionScoped @ManagedBean public class UserManager {private User newUser;/* Snip some general page logic... */public String addUser() {//Snip logic to persist newUserFacesContext.getCurrentInstance().addMessage(null,new FacesMessage("User " + newUser.toString() + " added"));return "/home.xhtml";}還有一個(gè)基本的Facelets頁(yè)面newUser.xhtml ,以呈現(xiàn)視圖:
<h:form><h:panelGrid columns="2"><h:outputText value="First Name: " /><h:panelGroup><h:inputText id="firstName"value="#{userManager.newUser.firstName}" /><h:message for="firstName" /></h:panelGroup><h:outputText value="Last Name: " /><h:panelGroup><h:inputText id="lastName" value="#{userManager.newUser.lastName}" /><h:message for="lastName" /></h:panelGroup></h:panelGrid><h:commandButton value="Add User" action="#{userManager.addUser()}" /> </h:form>所有這些結(jié)合起來(lái)產(chǎn)生了這種可愛(ài)的形式:
當(dāng)用戶單擊“ 添加用戶”按鈕時(shí),將在“ 調(diào)用應(yīng)用程序”階段調(diào)用 #{userManager.addUser} 。 這是有道理的,因?yàn)槲覀兿M诔志帽4孑斎胱侄沃跋葘?duì)其進(jìn)行驗(yàn)證,轉(zhuǎn)換并將其應(yīng)用于newUser。
現(xiàn)在,讓我們?cè)陧?yè)面上添加一個(gè)“取消”按鈕,以防用戶改變主意。 我們將在頁(yè)面中添加另一個(gè)<h:commandButton />:
<h:form><!-- Snip Input components --> <h:commandButton value="Add User" action="#{userManager.addUser()}" /><h:commandButton value="Cancel" action="#{userManager.cancel()}" /> </h:form>以及UserManager的cancel()方法:
public String cancel() {newUser = new User();FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Cancelled new user"));return "/home.xhtml"; }看起來(lái)不錯(cuò)吧? 但是,當(dāng)我們實(shí)際嘗試使用“取消”按鈕時(shí),會(huì)收到錯(cuò)誤消息,提示您需要輸入名字和姓氏:
這是因?yàn)?strong>#{userManager.cancel}直到在流程驗(yàn)證階段之后發(fā)生的“ 調(diào)用應(yīng)用程序”階段才被調(diào)用 ; 由于我們沒(méi)有輸入名字和姓氏,因此在調(diào)用#{userManager.cancel}之前驗(yàn)證失敗,并且在“ 過(guò)程驗(yàn)證”階段之后呈現(xiàn)響應(yīng)。
我們當(dāng)然不希望最終用戶在取消之前輸入有效用戶! 幸運(yùn)的是,JSF在Command組件上提供了即時(shí)屬性。 當(dāng)直接設(shè)置為true的命令組件上,行動(dòng)調(diào)用的應(yīng)用請(qǐng)求值階段:
這非常適合我們的“取消”用例。 如果我們將Instant = true添加到Cancel,則在進(jìn)行任何驗(yàn)證之前,將在Apply Request Values階段調(diào)用# {userManager.cancel} 。
<h:form> <!-- Snip Input components --><h:commandButton value="Add User" action="#{userManager.addUser()}" /><h:commandButton value="Cancel" action="#{userManager.cancel()}" immediate="true" /> </h:form>因此,現(xiàn)在單擊“取消”時(shí),將在“ 應(yīng)用請(qǐng)求值”階段中調(diào)用#{userManager.cancel} ,并通過(guò)預(yù)期的取消消息返回首頁(yè)。 沒(méi)有驗(yàn)證錯(cuò)誤!
輸入組件也具有即時(shí)屬性,該屬性還將其所有邏輯移至“ 應(yīng)用請(qǐng)求值”階段。 但是,其行為與Command組件略有不同,特別是取決于對(duì)Input組件的驗(yàn)證是否成功。 我的下一篇文章將介紹Input組件上的Instant = true 。 現(xiàn)在,這里是JSF生命周期如何受到影響的預(yù)覽:
參考: JSF on Java博客上的 JSF和“立即”屬性–命令組件,來(lái)自我們的JCG合作伙伴 Jerry Orr。
翻譯自: https://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html
jsf tree組件
總結(jié)
以上是生活随笔為你收集整理的jsf tree组件_JSF和“立即”属性–命令组件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 注塑机顶针设置参数(注塑顶针的正确设置)
- 下一篇: 使用Apache Cassandra设置