亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么JSF在服務器上保存UI組件的狀態?

為什么JSF在服務器上保存UI組件的狀態?

LEATH 2019-08-03 03:03:18
為什么JSF在服務器上保存UI組件的狀態?在什么時候JSF在服務器端保存UI組件的狀態&什么時候刪除UI組件的狀態信息?從服務器內存?當應用程序上的登錄用戶通過頁面導航時,組件的狀態會在服務器上不斷累積嗎?我不明白將UI組件狀態保持在服務器上有什么好處?。恐苯訉⒔涍^驗證/轉換的數據傳遞給托管bean還不夠嗎?我能或應該盡量避免它嗎?這難道不消耗太多內存在服務器端,如果有數千并發用戶會話?我有一個應用程序,用戶可以在其中發布關于某些主題的博客。這個博客很大。當有回帖或請求查看博客時,這些大頁面數據會被保存為組件狀態的一部分嗎?這會消耗掉太多的記憶。這不是個問題嗎?更新1:現在,不再需要在使用JSF時保存狀態??梢允褂酶咝阅艿臒o狀態JSF實現??催@個博客 & 這個問題相關細節及討論。還有,有一個開放的發行要在JSF規范中包含一個選項,可以為JSF提供無狀態模式。(P.S.考慮對這些問題進行表決)這,這個 & 這,這個如果這是一個對你有用的特性。)更新2:一個好消息Mojarra 2.1.19與.無狀態模式!見這里:http:/weblogs.java.net/blog/mriem/存檔/2013/02/08/jsf-無國籍?force=255http:/java.net/JIRA/瀏覽/JAVASERVERFACES-2731http:/balusc.blogpot.de/2013/02/無國籍-jsf.html
查看完整描述

3 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

為什么JSF需要保存服務器端UI組件的狀態?

因為HTTP是無狀態的,JSF是有狀態的。JSF組件樹受動態(編程)更改的影響。JSF只需知道表單顯示給Enduser時的確切狀態,就可以在表單被提交回服務器時根據原始JSF組件樹提供的信息成功地處理整個JSF生命周期。組件樹提供有關請求參數名稱、必要的轉換器/驗證器、綁定托管bean屬性和操作方法的信息。


在什么時候JSF在服務器端保存UI組件的狀態,以及何時從服務器內存中確切地刪除UI組件的狀態信息?

這兩個問題似乎歸結為同一個問題。無論如何,這是特定于實現的,也取決于狀態是保存在服務器上還是客戶端上。一個適當的實現將刪除它時,它已過期或隊列已滿。例如,當狀態保存設置為Session時,mojarra的默認限制為15個邏輯視圖。中的以下上下文param可配置此web.xml:

<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>15</param-value></context-param>

另見Mojarra常見問題對于其他mojarra特有的params和這個相關的答案com.sun.faces.number OfViewsInSession與com.sun.faces.number OfLogicalViews


當應用程序上的登錄用戶通過頁面導航時,組件的狀態會在服務器上不斷累積嗎?

從技術上講,這取決于實現。如果您說的是逐頁導航(只需要獲取請求),那么mojarra將不會在會話中保存任何內容。但是,如果它們是POST請求(帶有命令鏈接/按鈕的表單),則mojarra將保存會話中每個表單的狀態,直到達到最大值。這使Enduser能夠在同一會話中的不同瀏覽器選項卡中打開多個窗體。

或者,當狀態保存設置為Client時,JSF將不會在會話中存儲任何內容。您可以通過以下上下文param在web.xml:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value></context-param>

然后,它將被序列化為具有名稱的隱藏輸入字段中的加密字符串。javax.faces.ViewState表格的。


我不明白將UI組件的狀態保持在服務器端的好處是什么。直接將經過驗證/轉換的數據傳遞給托管bean還不夠嗎?我能/應該盡量避免嗎?

這不足以確保JSF的完整性和健壯性。JSF是一個具有單個控制點的動態框架。如果沒有狀態管理,就可以某種方式欺騙/哈克HTTP請求(例如操作)。disabledreadonlyrendered(屬性),讓JSF做不同的-也可能是危險的-的事情。它甚至容易受到CSRF攻擊和網絡釣魚。


如果有數千個并發用戶會話,那么服務器端不會消耗太多內存嗎?我有一個應用程序,用戶可以在其中發布關于某些主題的博客。這個博客很大。當出現回發或請求查看博客時,大型博客將被保存為組件狀態的一部分。這會消耗太多的內存。這不是個問題嗎?

記憶特別便宜。只要給應用服務器足夠的內存?;蛘撸绻W絡帶寬對您來說更便宜,只需將狀態保存切換到客戶端即可。要找到最佳匹配,只需壓力和配置您的Webapp與預期的最大并發用戶數量,然后給應用服務器125%~150%的最大測量內存。

請注意,JSF2.0在狀態管理方面有了很大改進。保存部分狀態是可能的。這個<h:form>將被拯救,而不是所有的東西<html>自始至終)。例如,莫扎拉就是這樣做的。一個平均表單有10個輸入字段(每個輸入字段都有一個標簽和消息)和2個按鈕,所需時間不超過1KB。如果會話中有15個視圖,則每個會話不應超過15 KB。對于~1000個并發用戶會話,應該不超過15 MB。

您應該更加關注會話或應用程序范圍中的實際對象(托管bean,甚至DB實體)。我看到了很多代碼和項目,它們不必要地將整個數據庫表復制到Java的內存中,就像會話作用域bean一樣,其中使用Java而不是SQL來過濾/分組/安排記錄。如果有1000條記錄,那就很容易超過10 MB每個用戶會話.




查看完整回答
反對 回復 2019-08-05
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

“只要給應用服務器足夠的內存?!边?,我的印象是,如果我們談論的是數千個并發用戶會話,那么我們在這里談論的是企業級的東西。如果企業中有企業級設備,就不能像在家里的Linux盒中那樣“給appserver足夠的內存”。



查看完整回答
反對 回復 2019-08-05
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

你的回答很清楚,謝謝。如果將javax.faces.PARTIAL_state_Saving設置為true,為什么JSF閃存范圍會消失。(getFacesContext().getExternalContext().getFlash().put(“buildingId”,buildingId)

查看完整回答
反對 回復 2019-08-05
  • 3 回答
  • 0 關注
  • 334 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號