JSF和“立即”屬性–命令組件

JSF中的即時屬性通常被誤解。 如果您不相信我,請查看Stack Overflow 。 造成這種混亂的部分原因可能是輸入(即<h:inputText />)和命令(即<h:commandButton />)組件都立即可用,每個組件對JSF生命周期的影響都不同。

這是標準的JSF生命周期:

出于本文的目的,我假設您熟悉JSF生命周期的基礎知識。 如果您需要簡介或內存更新,請查看Java EE 6教程– JavaServer Faces應用程序的生命周期 。

注意:本文中的代碼示例適用于JSF 2(Java EE 6),但是其原理與JSF 1.2(Java EE 5)相同。

在Command組件上為Instant = True

標準 JSF生命周期中,在“ 調用應用程序”階段評估Command組件上的action屬性。 例如,假設我們有一個User實體/ 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 */
}

還有一個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";}

還有一個基本的Facelets頁面newUser.xhtml ,以呈現視圖:

<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>

所有這些結合起來產生了這種可愛的形式:

當用戶單擊“ 添加用戶”按鈕時,將在“ 調用應用程序”階段調用 #{userManager.addUser} 。 這是有道理的,因為我們希望在持久保存輸入字段之前對它們進行驗證,轉換并將其應用于newUser。

現在,讓我們在頁面上添加一個“取消”按鈕,以防用戶改變主意。 我們將在頁面中添加另一個<h:commandButton />:

<h:form><!-- Snip Input components --> <h:commandButton value="Add User" action="#{userManager.addUser()}" /><h:commandButton value="Cancel" action="#{userManager.cancel()}" />
</h:form>

還有UserManagercancel()方法:

public String cancel() {newUser = new User();FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Cancelled new user"));return "/home.xhtml";
}

看起來不錯吧? 但是,當我們實際嘗試使用“取消”按鈕時,會收到錯誤消息,提示您需要輸入名字和姓氏:

這是因為直到流程驗證階段之后發生的調用應用程序階段才調用 #{userManager.cancel} 。 由于我們沒有輸入名字和姓氏,因此在調用#{userManager.cancel}之前驗證失敗,并且在“ 過程驗證”階段之后呈現響應。

我們當然不希望最終用戶在取消之前輸入有效用戶! 幸運的是,JSF在Command組件上提供了即時屬性。 當直接設置為true的命令組件上,行動調用的應用請求值階段:

這非常適合我們的“取消”用例。 如果我們將Instant = true添加到Cancel,則在進行任何驗證之前,將在Apply Request Values階段調用# {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>

因此,現在單擊“取消”時,將在“ 應用請求值”階段中調用#{userManager.cancel} ,并通過預期的取消消息返回首頁。 沒有驗證錯誤!


輸入組件也具有即時屬性,該屬性還將其所有邏輯移至“ 應用請求值”階段。 但是,其行為與Command組件略有不同,特別是取決于對Input組件的驗證是否成功。 我的下一篇文章將介紹Input組件上的Instant = true 。 現在,這里是JSF生命周期如何受到影響的預覽:

參考: JSF on Java博客上的 JSF和“立即”屬性–命令組件,來自我們的JCG合作伙伴 Jerry Orr。


翻譯自: https://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過joystick遙感和按鍵控制機器人--11

原創博客&#xff1a;轉載請表明出處&#xff1a;http://www.cnblogs.com/zxouxuewei/ 1.首先安裝joystick遙控器驅動&#xff1a; sudo apt-get install ros-indigo-joystick-drivers ros-indigo-turtlebot-teleop 2.運行tulterbot機器人&#xff1a; roslaunch rbx1_bringup …

php mysql 線程安全_PHP 線程安全與非線程安全版本的區別深入解析

從2000年10月20日發布的第一個Windows版的PHP3.0.17開始的都是線程安全的版本&#xff0c;這是由于與Linux/Unix系統是采用多進程的工作方式不同的是Windows系統是采用多線程的工作方式。如果在IIS下以CGI方式運行PHP會非常慢&#xff0c;這是由于CGI模式是建立在多進程的基礎之…

奶牛健美操(codevs 3279)

題目描述 Description Farmer John為了保持奶牛們的健康&#xff0c;讓可憐的奶牛們不停在牧場之間 的小路上奔跑。這些奶牛的路徑集合可以被表示成一個點集和一些連接 兩個頂點的雙向路&#xff0c;使得每對點之間恰好有一條簡單路徑。簡單的說來&#xff0c; 這些點的布局就是…

Nginx 實現網站 http、https 配置

在 nginx conf 目錄下新建 ssl 目錄&#xff0c;將申請的 ssl證書文件拷貝到此處&#xff1a; 修改 nginx 配置文件使支持 https&#xff0c;修改如下&#xff1a; server {listen 80;listen 443 ssl;ssl_certificate ssl/cert-xuexiyuan.cn.crt;ssl_certificat…

實用垃圾收集,第1部分–簡介

這是我打算寫的一系列博客文章的第一部分&#xff0c;其目的是解釋垃圾回收在現實世界中的工作方式&#xff08;特別是在JVM中 &#xff09;。 我將介紹一些我認為對于充分理解垃圾收集對于實際目的是必要的理論&#xff0c;但是將其降至最低。 其動機是在各種情況下&#xff0…

數據結構之楊氏矩陣

轉自&#xff1a; http://blog.csdn.net/jiyanfeng1/article/details/8189228轉載于:https://www.cnblogs.com/neversayno/p/5256262.html

mysql 導出 沒有函數_沒有MYSQL FILE函數的CSV導出

構建最佳CSV。你可以按照以下方式做。$filename data.csv;$csv_terminated "\n";$csv_separator ",";$csv_enclosed ";$csv_escaped "\\";$results array(1,2,3);// value$schema_insert ;$header array(a,b,c);// headerfor ($i 0…

使用jdk壓縮war包

首先安裝jdk 壓縮 ..../jdk/bin/jar -cvf file.war file 解壓 ..../jdk/bin/jar -xvf file.war 轉載于:https://www.cnblogs.com/chongchong88/p/6049690.html

MongoDB查詢性能分析—— explain 操作返回結果詳解

MongoDB 提供 db.collection.explain(), cursort.explain() 及 explain 命令獲取查詢計劃及查詢計劃執行統計信息。 explain 結果將查詢計劃以階段樹的形式呈現。 每個階段將其結果&#xff08;文檔或索引鍵&#xff09;傳遞給父節點。 葉節點訪問集合或索引。 中間節點操縱由…

.deb包的安裝方法

deb是Debian linux的安裝格式&#xff0c;跟redhat的rpm非常相似&#xff0c;最基本的安裝命令是&#xff1a; dpkg -i file.deb dpkg是Debian Package的簡寫&#xff0c;是為Debian專門開發的管理系統套件&#xff0c;方便軟件的安裝&#xff0c;更新和移除。所有源自Debian的…

html回復評論_3天內看了3000多篇《哈佛商業評論》,挑出來最有用的分享下

上次分享過一個工具&#xff1a;一鍵批量下載公眾號歷史消息&#xff08;后臺回復001獲取&#xff09;。我把《哈佛商業評論》的歷史文章&#xff0c;全部爬了下來。該雜志被全球商業譽為“管理圣經”。我最感興趣的一部分是&#xff1a;個人管理。先搜索關鍵詞&#xff1a;&qu…

Java中的高性能庫

越來越多的庫被描述為高性能&#xff0c;并且有支持該要求的基準。 這是我所知道的選擇。 Disruptor庫 – http://code.google.com/p/disruptor/ LMAX旨在成為世界上最快的交易平臺。 顯然&#xff0c;為了實現這一目標&#xff0c;我們需要做一些特殊的事情&#xff0c;以通過…

Linux 命令行上執行多個命令(分隔符簡介使用)

Linux 系統可以在一個命令行上執行多個命令&#xff0c;相應的命令行的分隔符簡介及使用如下&#xff1a; ; 如果命令被分號(;)所分隔&#xff0c;那么命令會連續的執行下去&#xff0c;就算是錯誤的命令也會繼續執行后面的命令。示例如下&#xff1a; ls /home/; ls /etc/i…

codeforces 732/D 二分

給出考試時間和考試需要準備的時間&#xff0c;問最早考完所有科目的時間 二分答案 NlogN 二分抄神犇的寫法 感覺挺舒服的嘻嘻嘻 1 #include<bits/stdc.h>2 using namespace std;3 const int MAXN1e55;4 int N,M,d[MAXN],w[MAXN],cnt[MAXN];5 void read(int &x){6 …

XML基礎(二)

XML命名規則&#xff1a; ①名稱可以含字母、數字以及其他的字符 ②名稱不能以數字或標點符號開始 ③名稱不能以“xml”開始 ④名稱不能包含空格 ⑤盡量避免"-", "." ,":"等字符 xml元素是可擴展的。 XML屬性&#xff1a; 屬性提供有關元素的額外…

NoSQLBooster for MongoDB 中跨庫關聯查詢

? 使用 MongoDB 是我們常常會遇到一些特殊的需求需要跨庫關聯查詢&#xff0c;比如訂單明細缺商品重量需要補商品重量&#xff0c;而商品重量數據又在商品庫中&#xff0c;這事就需要跨庫關聯操作&#xff0c;示例代碼如下&#xff1a; // 使用 order 庫&#xff0c;注意語句…

網頁版的svn怎樣同步代碼_學會使用Hdlbits網頁版Verilog代碼仿真驗證平臺

大家推薦一款網頁版的 Verilog代碼編輯仿真驗證平臺&#xff0c;這個平臺是國外的一家開源FPGA學習網站&#xff0c;通過“https://hdlbits.01xz.net/wiki/Main_Page”地址鏈接進入網頁&#xff0c;在該網頁上可以進行Verilog代碼的編寫、綜合&#xff0c;而且最后還能夠仿真出…

遇到的零碎問題

Show()時&#xff0c;其他窗口仍可響應&#xff0c;ShowDialog()時其他窗口無響應。 在public Form1()中使用messagebox會先出現信息窗口&#xff0c;再顯示主窗體&#xff0c;故考慮加入了start按鈕。 play()會被打斷&#xff0c;PlaySync&#xff08;&#xff09;會播放完再執…

Tomcat上具有JAX-WS的Web服務

讓我們假設一家企業正在一個集中式系統中維護用戶身份驗證詳細信息。 我們需要創建一個AuthenticationService&#xff0c;它將獲取憑據&#xff0c;對其進行驗證并返回狀態。 其余的應用程序將使用AuthenticationService對用戶進行身份驗證。 創建AuthenticationService接口&a…

Python的下載及安裝

1、官網下載地址&#xff1a;https://www.python.org/downloads/ 2、python設置環境變量&#xff1a; 在系統變量里添加Python的安裝位置 3、在cmd里輸入python里即可轉載于:https://www.cnblogs.com/fun0623/p/5257573.html