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