日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSF基于事件的沟通:过时的方法

發布時間:2023/12/3 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSF基于事件的沟通:过时的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用JSF編寫的Web應用程序由相互交互的bean組成。 在開發Web應用程序時,bean之間的通信是主要的設計模式之一。 有時,一個bean需要向其他bean發送事件,以通知它們某些更改或其他任何更改。 我們通常可以將托管bean或Spring bean注入另一個bean的屬性中,以便另一個bean可以直接通知注入的bean。 注入是好的,但是它并不是出于交流目的而引入的。 它與動態的松散耦合系統相距甚遠,在該系統中,每個bean都不了解其他bean。 在松耦合系統中,我們需要一種基于事件的良好通信機制。 這篇文章將涵蓋兩種設計模式:觀察者/事件監聽器和中介者模式。 這些模式如今已在許多Web應用程序中廣泛使用,但是它們具有缺點。 該系統并不是真正與它們松散耦合。 有很多更好的現代方法。 因此,我在帖子名稱中寫了“ Old-school approach”。 新學校的方法將在下一篇文章中公開。

觀察員/事件聽眾
?

我們將從觀察者(也稱為事件監聽器)模式開始。 一個稱為主題或可觀察對象的對象會維護其依賴項的列表(稱為觀察者),并自動將狀態變化通知他們。 在Java中,有一些類java.util.Observer和java.util.Observable可以幫助實現此模式。 通過此模式進行的基于事件的通信的其他相關構造是類java.util.EventObject和接口java.util.EventListener。 讓我們開始編碼。 假設我們有一個I18N Web應用程序,并且用戶可以在用戶設置中的某處選擇一種語言(語言環境)。 假設我們有一個名為UserSettingsForm的bean,它負責用戶設置。 某些會話作用域的Bean可以保留I18N文本/消息,因此,當用戶更改當前語言時,需要以最后選擇的語言重置以前的文本/消息。 首先,我們需要一個LocaleChangeEvent。 public class LocaleChangeEvent extends EventObject {Locale locale;public LocaleChangeEvent(Object source, Locale locale) {super(source);this.locale = locale;}public Locale getLocale() {return locale;} }

其次,我們需要一個接口LocaleChangeListener。

public interface LocaleChangeListener extends EventListener {void processLocaleChange(LocaleChangeEvent event); } 我們的UserSettingsForm現在可以通過注冊字符串并通知它們來管理LocaleChangeListener類型的實例。 @ManagedBean @SessionScoped public class UserSettingsForm implements Serializable {private Locale selectedLocale;private List<SelectItem> locales;private List<LocaleChangeListener> localeChangeListeners = new ArrayList<LocaleChangeListener>();public void addLocaleChangeListener(LocaleChangeListener listener) {localeChangeListeners.add(listener);}public void localChangeListener(ValueChangeEvent e) {...// notify listenersLocaleChangeEvent lce = new LocaleChangeEvent(this, this.selectedLocale);for (LocaleChangeListener lcl : localeChangeListeners) {lcl.processLocaleChange(lce);}}... } 方法localChangeListener()是JSF ValueChangeListener,可以在例如h:selectOneMenu中應用。 每個實現LocaleChangeListener的bean都應該由UserSettingsForm注冊,以便通過語言環境更改得到通知。 @ManagedBean @SessionScoped public MyBean implements LocaleChangeListener, Serializable {// UserSettingsForm can be injected e.g. via @ManagedProperty annotation or via Spring facilityprivate UserSettingsForm userSettingsForm;@PostConstructpublic void initialize() {userSettingsForm.addLocaleChangeListener(this);}public void processLocaleChange(LocaleChangeEvent event) {// reset something related to I18N data...} }

就觀察者模式而言,UserSettingsForm是可觀察的,而LocaleChangeListener的實例(如MyBean)則是觀察者。 討論的模式帶有一些您需要注意的重要問題。 豆緊密耦合。 有很多手動工作來重新注冊bean。 Bean必須實現定義的接口。 如果您有100個語義不同的更改通知了bean,則它必須實現100個接口。 無法通知已注冊的偵聽器的子集–即使不需要通知所有偵聽器,也總是會通知他們。 最后但并非最不重要的– 內存管理問題 。 馬丁·福勒(Martin Fowler)寫道: “假設我們有一些觀察某些域對象的屏幕。 關閉屏幕后,我們希望將其刪除,但是域對象實際上通過觀察者關系攜帶了對屏幕的引用。 在內存管理的環境中,壽命長的域對象可能會占據很多僵尸屏幕,從而導致大量內存泄漏。”

調解員
?

與“觀察者/事件偵聽器”模式相比,“中介者”模式改善了基于事件的通信。 使用中介者模式,對象之間的通信將與中介者對象一起封裝。 對象不再彼此直接通信,而是通過調解器進行通信。 這減少了通信對象之間的依賴性。 我們將看到它如何用于JSF-Spring Bean(在上面的示例中是標準托管Bean)。 我們將實現一個Mediator類來管理作用域bean之間的通信。 重要的是要理解一個bean只能通知范圍更廣的另一個bean。 視圖作用域的bean可以通知視圖作用域的會話,會話作用域和應用程序作用域的bean,但不能請求作用域較小的作用域的bean。 請遵循此規則以避免麻煩。 這是作用域Bean的一種特性–您可能還記得,可以始終將作用域更廣的bean注入到作用域更窄的bean中,反之亦然。 為了開始使用Mediator,我們將引入兩個接口MediatorEvent,MediatorListener和中心類Mediator。 public interface MediatorEvent {... }public interface MediatorListener {public void listenToEvent(MediatorEvent event); }public class Mediator implements Serializable {private Collection<MediatorListener> collaborators = new HashSet<MediatorListener>();public static Mediator getCurrentInstance() {// access Mediator bean by JSF-Spring facilityreturn ContextLoader.getCurrentWebApplicationContext().getBean("mediator");}public void fireEvent(MediatorEvent event) {for (MediatorListener mediatorListener : collaborators) {mediatorListener.listenToEvent(event);}}public void addCollaborator(MediatorListener collaborator) {collaborators.add(collaborator);}public void removeCollaborator(MediatorListener collaborator) {collaborators.remove(collaborator);} } 介體是一個有作用域的bean,可以注冊并通知協作者。 協作者通過調解員進行注冊。 在Spring中,bean可以實現接口InitializingBean,以便在bean實例化之后自動調用afterPropertiesSet()方法。 這類似于@PostConstruct。 afterPropertiesSet()是此類bean通過介體注冊的正確位置。 Bean還應該實現MediatorListener以便被通知(請參見listenToEvent())。 public MyBean implements MediatorListener, InitializingBean, Serializable {public void afterPropertiesSet() throws Exception {...Mediator.getCurrentInstance().addCollaborator(this);}@Overridepublic void listenToEvent(MediatorEvent event) {if (event instanceof LocaleChangeEvent) {// do something}} } 我們將在UserSettingsForm和區域設置更改中使用相同的方案。 由Mediator注冊的Bean將通過fireEvent()進行通知。 public class LocaleChangeEvent implements MediatorEvent {... }public class UserSettingsForm implements Serializable {private Locale selectedLocale;private List<SelectItem> locales;public void localChangeListener(ValueChangeEvent e) {...// notify listenersMediator.getCurrentInstance().fireEvent(new LocaleChangeEvent(this, this.selectedLocale));}... } 調解器模式提供了豆之間更好的耦合,但是它們仍與調解器耦合。 進一步的缺點:仍然需要手動注冊bean –請參見附加代碼Mediator.getCurrentInstance()。addCollaborator(this)。 每個bean仍應至少實現一個MediatorListener,這會帶來另一個約束– listenToEvent()。 每個bean都應實現此接口方法! JSF中介體模式的最大缺點可能是它是有作用域的bean。 視圖作用域調解器只能與視圖作用域的bean一起順利使用。 當視圖作用域調解器被銷毀時,注冊的視圖作用域Bean將自動刪除。 其他情況可能會導致內存泄漏或幾個問題。 例如,應該通過調用removeCollaborator()手動刪除由視圖作用域介體注冊的請求作用域Bean(很容易忘記)。 會話作用域的Bean應該由會話作用域的介體注冊,否則銷毀視圖作用域的介體后,它們將不會得到通知。 等等 實際上,中介器模式僅比常規的“觀察者/事件偵聽器”概念好一步。 有更靈活的方法,其中“任何方法”都可以捕獲引發的事件,而不僅可以修復指定的問題,例如listenToEvent()。 在下一篇文章中,我們將看到簡單而簡單的方法,如何僅通過一種方法和其他建議來捕獲乘法事件。

參考: JSF中基于事件的通信。 我們的JCG合作伙伴 Oleg Varaksin在“ 軟件開發思想”博客上的過時做法 。


翻譯自: https://www.javacodegeeks.com/2012/07/jsf-event-based-communication-old.html

總結

以上是生活随笔為你收集整理的JSF基于事件的沟通:过时的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一区在线视频观看 | 总裁边开会边做小娇妻h | 光棍影院一区二区 | 台湾男男gay做爽爽的视频 | 软萌小仙自慰喷白浆 | 不卡的一区二区 | 国产日韩欧美激情 | 免费av大片 | 999精品视频在线观看 | 精品香蕉99久久久久网站 | 久久99精品国产麻豆婷婷洗澡 | 91极品视频 | 日本黄色生活片 | 欧美久久一区二区 | 九色蝌蚪91 | 国产麻豆天美果冻无码视频 | wwwxx欧美 | 中文字幕精品无 | 黄色国产毛片 | 成人首页 | 任你躁av一区二区三区 | 久久精品人妻一区二区三区 | 欧美特黄一级 | 91啦中文 | 欧美黄色激情视频 | 亚洲 欧美 综合 | 性欧美激情| 欧美色图第一页 | 欧美极品少妇xxxxⅹ裸体艺术 | 国产东北真实交换多p免视频 | 欧美亚洲日本 | 精品自拍视频在线观看 | 激情婷婷网 | 日韩区在线观看 | 少妇又色又爽又高潮极品 | 四虎网站最新网址 | 神马久久网站 | 国产二区精品 | 欧洲精品二区 | av在线电影网站 | 精品人妻无码一区二区性色 | 欧美片17c07.com | 黄色毛毛片 | 天天干天天天天 | 国产人成精品 | 国产调教在线观看 | 99热这里只 | 久草影视在线观看 | 午夜免费在线 | 国产精品一区二区三区在线看 | 国外亚洲成av人片在线观看 | 国产精品入口a级 | 国外亚洲成av人片在线观看 | 精品少妇无码av无码专区 | 欧美美女在线 | 狠狠一区| 免费看欧美黄色片 | 成人在线视频一区二区 | 亚洲成人mv| 日韩天堂网 | 婷婷亚洲五月色综合 | 久久久久久久久久网站 | 性史性农村dvd毛片 日韩精品在线视频观看 | 久久叉 | 午夜在线精品偷拍 | 欧洲精品久久久久毛片完整版 | 日韩欧美aaa | 肉嫁高柳家 高清 | 香蕉一级视频 | 色综合久久久久久 | www.天堂av.com | 极品美女扒开粉嫩小泬 | 日韩精品首页 | 久久午夜国产 | 亚洲第一视频网站 | 欧美黄色a | 波多野结衣在线视频免费观看 | 久热这里有精品 | 动漫av网站免费观看 | 国产精品久久网站 | 拍国产真实乱人偷精品 | 四虎最新网址在线观看 | 97国产在线观看 | 在线观看羞羞漫画 | 5月婷婷6月丁香 | 国产精品久久久久久久久久久久久久久 | 长篇高h肉爽文丝袜 | 波多野结衣二区 | 免费看欧美一级特黄a大片 国产免费的av | 天天久久久 | 国产精品交换 | 久草不卡 | 亚洲熟悉妇女xxx妇女av | 免费在线观看av网站 | 亚洲综合国产精品 | 国产裸体视频 | 69色堂| cekc老妇女cea0 | 在线视频二区 |