javascript
看一下即将发布的JSF 2.3 Push支持
如前幾篇文章所述,下一版本的JavaServer Faces(Mojarra)已添加了許多增強功能。 JSF 2.3計劃于2017年與Java EE 8一起發(fā)布,但是您現(xiàn)在可以通過從源代碼構建或運行里程碑版本來嘗試JSF的一些增強和更新,以進行測試。
對API的此類增強之一是通過f:websocket標簽和Push API添加了基于單向(服務器到客戶端)的websocket推送通信。 OmniFaces團隊開發(fā)了基于o:socket的JSF解決方案,該解決方案是OmniFaces實用程序庫的一部分。 具體來說,JSR 372專家組成員Bauke Scholtz和Arjan Tijms對Mojarra代碼庫做出了此以及許多其他增強和修復。
啟用f:websocket支持的補丁尚未應用于Mojarra 2.3分支,但是您可以從發(fā)行版JAVASERVERFACES_SPEC_PUBLIC-1396獲得補丁。 在將修補程序應用于本地Mojarra克隆之前,應確保從中央2.3分支更新源,以確保已應用最新更新。 用法很簡單,非常類似于OmniFaces站點上有據(jù)可查的o:socket功能,請執(zhí)行以下步驟來使用f:websocket 。
首先,添加
javax.faces.ENABLE_WEBSOCKET_ENDPOINT應用程序的web.xml的context參數(shù),并將其值設置為true。
<context-param><param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name><param-value>true</param-value></context-param>客戶端代碼
在您的客戶端(JSF視圖)上,添加f:websocket標記,并指定要連接的通道。 您還必須指定一個onmessage偵聽器,該偵聽器將在收到消息后執(zhí)行指定JavaScript函數(shù)。 還可以指定可選屬性onclose ,以允許指定JavaScript函數(shù)在連接關閉時執(zhí)行。 在以下示例中,我們指定套接字將與名為dukeSocketListener的onmessage偵聽器連接到名為“ duke”的通道:
<f:websocket channel="duke" onmessage="dukeMessageListener"/>可以使用三個參數(shù)(推送消息JSON對象,通道名稱,消息事件)調用onmessage偵聽器。 如果您只是希望傳遞一條消息,它可能類似于以下內容:
function dukeMessageListener(message) {PF('broadcastGrowl').show(message); }如果指定了可選的onclose偵聽器,則相應的函數(shù)可以接受三個參數(shù)(關閉原因碼–整數(shù),通道名稱,消息事件),但僅需要第一個。
在大多數(shù)情況下,其目的是向服務器發(fā)送一條消息,以通知具有相同websocket通道規(guī)范的所有客戶端視圖。 f:websocket上有一個可選的scope屬性,可以將其設置為“ session”,這會將消息限制為僅在當前會話中使用相同websocket通道的所有客戶端視圖。
最后,如果需要,可以將可選port屬性設置為指定除HTTP端口以外的TCP端口號。
服務器端代碼
由于我們計劃將消息從服??務器推送到所有連接的客戶端,因此讓我們看一下服務器端代碼。 可以通過包含@Push批注將新的PushContext注入到任何CDI工件中,并且上下文名稱可以對應于通道名稱,或者可以在@Push批注上指定可選的channel屬性以指示要訪問的通道該消息應廣播。
@Inject @Pushprivate PushContext duke; ... public void sendMessage(Object message){duke.send(message); }該消息將被編碼為JSON,并傳遞到為f:websocket的onmessage屬性指定的客戶端上JavaScript函數(shù)的message參數(shù)。 可以發(fā)送任何類型的容器作為消息,可以是普通的String,JavaBean,Map,Collection等。
用法示例
假設我們有一個用于Web應用程序的管理控制臺,并且我們想為管理員提供一種向客戶端發(fā)出警報的方法。 這樣,管理控制臺可以具有用于消息輸入的文本區(qū)域,以及用于調用消息發(fā)送的命令按鈕。
<h:inputText id="pushMessage" value="#{testBean.pushMessage}"/> <h:commandButton action="#{testBean.sendAdminMessage}" value="Send Message"/>然后,JSF控制器類testBean將具有sendAdminMessage方法,該方法將存儲在pushMessage字符串中的消息發(fā)送到我們的sendMessage方法。
@Inject @Pushprivate PushContext duke;...public void sendAdminMessage(){sendMessage(pushMessage);FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Message has been broadcasted")); }...public void sendMessage(Object message){duke.send(message); }任何將收到消息的客戶端都應包含f:websocket標記,指向duke通道。 客戶端還應該至少包括在收到消息時要調用JavaScript函數(shù)。
<f:websocket channel="duke" onmessage="dukeMessageListener"/><p:growl id="messages"/>function dukeMessageListener(message) {facesmessage.severity = 'info';PF('broadcastGrowl').show(message); }在此特定示例中,PrimeFaces咆哮消息組件將在收到消息時進行更新。
由于JSR 372專家組成員的所有杰出貢獻,JSF 2.3的狀態(tài)良好。
翻譯自: https://www.javacodegeeks.com/2016/02/look-upcoming-jsf-2-3-push-support.html
總結
以上是生活随笔為你收集整理的看一下即将发布的JSF 2.3 Push支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国军用装甲车和反IED车市场趋势报告、
- 下一篇: 图灵出品的人气O'Reilly动物书,你