小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

faces portlet開(kāi)發(fā)框架初體驗(yàn)

 smoking_boy 2005-08-24

IBM中國(guó)軟件實(shí)驗(yàn)室
2004 年 7 月

本文介紹了最新版WSAD 5.1.2上基于 JSF技術(shù)的Faces Portlet 框架的特色,從 MVC模式角度與基本的 portlet 進(jìn)行了比較,并進(jìn)一步深入分析了Faces portlet 開(kāi)發(fā)過(guò)程中的關(guān)鍵類的具體含義與功能。

簡(jiǎn)介
最新發(fā)布的 IBM WebSphere Studio Application Developer 和 IBM WebSphere Studio Site Developer 5.1.2 版支持新的行業(yè)標(biāo)準(zhǔn),可以簡(jiǎn)化針對(duì)豐富 Web 用戶界面、商務(wù)邏輯(business logic)和交互式門戶的開(kāi)發(fā)。全新的快速應(yīng)用程序開(kāi)發(fā)(RAD)和代碼生成工具是WebSphere Studio 的一大亮點(diǎn),可以幫助實(shí)現(xiàn)項(xiàng)目流程自動(dòng)化,簡(jiǎn)化Java開(kāi)發(fā),從而加快整個(gè)團(tuán)隊(duì)的開(kāi)發(fā)速度。

使用新的WebSphere Studio產(chǎn)品來(lái)構(gòu)建豐富的用戶界面、數(shù)據(jù)連接以及面向Web應(yīng)用程序的商務(wù)邏輯,Java開(kāi)發(fā)人員可以立即獲得工作效率的提升。WebSphere Studio 支持最近獲得Java Community ProcessSM批準(zhǔn)的 JavaServer? Faces (JSF)標(biāo)準(zhǔn)和Java Community ProcessSM推薦的Service Data Objects(SDO)標(biāo)準(zhǔn)。WebSphere Studio使用這些標(biāo)準(zhǔn)來(lái)最大限度地減少構(gòu)建數(shù)據(jù)驅(qū)動(dòng)的Web應(yīng)用程序和豐富的Web用戶界面所需要的Java編碼和手動(dòng)操作。JSF和SDO的可視化工具使開(kāi)發(fā)人員可以方便地將JSF用戶界面(UI)組件拖放到頁(yè)面,點(diǎn)擊即可連接到關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)源。

因此,借助WSAD V5.1.2開(kāi)發(fā)工具的幫助,我們可以使用JSF相關(guān)的技術(shù)來(lái)實(shí)現(xiàn)終端用戶自己開(kāi)發(fā)的小型系統(tǒng),更大規(guī)模的門戶應(yīng)用,或者是規(guī)模龐大的企業(yè)系統(tǒng)。

此外,該版本的WebSphere Studio Application Developer 還包括 IBM WebSphere Portal 測(cè)試環(huán)境,新的可視化 portlet 開(kāi)發(fā)工具,并支持新行業(yè)標(biāo)準(zhǔn) portlet Application Programming Interface (API),可確保 portlet 互操作性和便攜性。構(gòu)建 portlet 的可視化工具可簡(jiǎn)化門戶開(kāi)發(fā),而與 JSF 的集成使其可以輕易地整合 portlet 中的豐富的用戶界面(UI)組件和 Web 窗體。與過(guò)去相比,這大大簡(jiǎn)化了整個(gè)門戶開(kāi)發(fā)過(guò)程,速度也大幅提高,但對(duì)相應(yīng)開(kāi)發(fā)人員技能卻沒(méi)有很高的要求。 這就是最新的Faces Portlet開(kāi)發(fā)框架。

本文是有關(guān)Faces Portlet開(kāi)發(fā)的系列文章的第一篇,在這些文章中作者會(huì)和開(kāi)發(fā)人員談?wù)撚嘘P(guān)Faces Portlet開(kāi)發(fā)方面很多有趣的話題。

目標(biāo)讀者:希望讀者閱讀本文之前,能夠?qū)VC,portlet和JSF有一定的了解,相關(guān)的資料可以在參考資料中找到。

出發(fā)之前,先來(lái)準(zhǔn)備我們的開(kāi)發(fā)測(cè)試環(huán)境吧。

Faces Portlet開(kāi)發(fā)測(cè)試環(huán)境的準(zhǔn)備:我們使用的開(kāi)發(fā)工具是WSAD V5.1.2,同時(shí)還需要安裝IBM提供的Portal Toolkit V5.0.2.2。

  • WSAD V5.1.2
    您可以從下面這個(gè)鏈接下載到WSAD V5.1.2的試用版,請(qǐng) 下載安裝。注意:這里一般不能從WSAD的老版本通過(guò)更新管理器來(lái)升級(jí)您的WSAD版本,最方便可靠的辦法是重新安裝這個(gè)新的版本。
  • 運(yùn)行環(huán)境:
    WebSphere Portal V5.0.2或者WebSphere Portal Express V5.0.2 都可以用來(lái)發(fā)布Faces Portlet應(yīng)用。

好了,做完上面這一切,你就可以開(kāi)始著手開(kāi)發(fā)Faces Portlet應(yīng)用了。

(圖1)

如上圖(圖1),WSAD V5.1.2提供了四種不同的創(chuàng)建portlet應(yīng)用的向?qū)?。開(kāi)發(fā)人員以前最常用的是Basic portlet這個(gè)向?qū)?,這里我們就先來(lái)比較一下Basic portlet和Faces portlet有哪些區(qū)別和類似之處。

傳統(tǒng)上Basic portlet的開(kāi)發(fā)過(guò)程
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0403_lynn/0403_lynn.html從上面這篇文章,你可以了解到以前開(kāi)發(fā)一個(gè)最簡(jiǎn)單的portlet的一般步驟,最基本的步驟如下:

1. 創(chuàng)建目錄結(jié)構(gòu):使用Basic portlet的創(chuàng)建向?qū)?,WSAD會(huì)幫你自動(dòng)創(chuàng)建目錄結(jié)構(gòu)。

2. 準(zhǔn)備JSP文件: 準(zhǔn)備好需要顯示的所有JSP頁(yè)面。

3. 創(chuàng)建Portlet: 創(chuàng)建Portlet類,它通常是繼承于PortletAdapter的,需要實(shí)現(xiàn)的最重要的方法是actionPerformed()和doView()。

4. 準(zhǔn)備配置文件: 打包發(fā)布之前需要維護(hù)web.xml以及portlet.xml,通常WSAD會(huì)幫你完成這一切。

5. 打包,發(fā)布這個(gè)應(yīng)用:將你的應(yīng)用導(dǎo)出成WAR包,然后在WebSphere Portal Server上安裝,并且把它裝載到某個(gè)頁(yè)面中,你就可以看到它的外觀了。

Faces Portlet的主要優(yōu)點(diǎn)
Faces portlet脫胎于Basic portlet,并在其基礎(chǔ)上將JSF技術(shù)整合進(jìn)來(lái),充分吸收了JSF的很多優(yōu)點(diǎn),包括豐富的用戶界面控件,便捷的事件處理和頁(yè)面導(dǎo)航等特性,進(jìn)一步降低了開(kāi)發(fā)portlet應(yīng)用的門檻。如果能夠充分利用WSAD V5.1.2提供的工具支持的話,開(kāi)發(fā)人員幾乎感覺(jué)不到是在開(kāi)發(fā)portlet應(yīng)用,而只是在開(kāi)發(fā)基于JSF技術(shù)的動(dòng)態(tài)Web應(yīng)用。

正是由于項(xiàng)目中有了下面這些Jar包的支持,F(xiàn)aces portlet才能正常工作。

jsf-api.jar,jsf-ibm.jar,jsf-impl.jar,jsf-portlet.jar

下面,我們?cè)賮?lái)從實(shí)現(xiàn)MVC模式的角度來(lái)比較Basic portlet和Faces portlet的異同:

模型(Model)-視圖(View)-控制(Controller)模式

(圖2)

如圖2描述,MVC模式是由下面三個(gè)重要的部分組成的:

Model層實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯,通常可以用Java Bean或是EJB來(lái)實(shí)現(xiàn)。
View層用于與用戶的交互,通常用JSP來(lái)實(shí)現(xiàn)。
Controller層是Model和View之間溝通的橋梁,它用來(lái)分派用戶的請(qǐng)求并且選擇恰當(dāng)?shù)囊晥D用于顯示,同時(shí),它還將用戶的輸入映射為模型層相應(yīng)可執(zhí)行的操作。

Basic portlet和MVC模式的對(duì)應(yīng)關(guān)系

(圖3)

如圖3,在Basic portlet框架中,后臺(tái)的business bean或是EJB則封裝了應(yīng)用的業(yè)務(wù)邏輯,對(duì)應(yīng)于Model層;JSP頁(yè)面對(duì)應(yīng)于 View層,它們是用戶所看到的內(nèi)容;而控制器則是一個(gè)繼承于PortletAdapter類的Portlet類,其通過(guò)actionPerformed()方法和doView()方法來(lái)完成接收用戶請(qǐng)求,分派調(diào)用處理函數(shù),選擇適當(dāng)?shù)囊晥D跳轉(zhuǎn)等控制工作。

下面兩個(gè)代碼片斷給出了Portlet類中actionPerformed() 和 doView()的樣例。

代碼片斷1:actionPerformed()通常負(fù)責(zé)接收用戶事件,再分派至相應(yīng)的處理函數(shù)。



public void actionPerformed(ActionEvent event) throws PortletException {
        // ActionEvent handler
        String actionString = event.getActionString();
        // Add action string handler here
        PortletRequest request = event.getRequest();

        PortletSession session = request.getPortletSession();
        actionBean.setSession(session);
        actionBean.setRequest(request);

        try {
            Class actionClass = actionBean.getClass();

            Method method = actionClass.getMethod("on_" + actionString, null);
            method.invoke(actionBean, null);
        } catch (Exception e) {
        }
}

代碼片斷2:doView()則通常負(fù)責(zé)根據(jù)后臺(tái)的業(yè)務(wù)邏輯選擇指定相應(yīng)的頁(yè)面視圖。



    public void doView(PortletRequest request, PortletResponse response)
        throws PortletException, IOException {
        PortletSession session = request.getPortletSession();
        String JSPFile = (String) session.getAttribute(JSPPAGENAME);
        if (JSPFile == null) {
            // First time enter into the portle
        }

        // Set actionURI
        setActionURIs(request, response);

        // Invoke the JSP to render      		
        getPortletConfig().getContext().include(JSPFile, request, response);
    }
    

Faces portlet中和mvc模式的對(duì)應(yīng)關(guān)系

(圖4)

如圖4,后臺(tái)同樣是通過(guò)business bean或是EJB,封裝了應(yīng)用的業(yè)務(wù)邏輯,對(duì)應(yīng)于Model層;

而View層則是采用了Faces JSP(這是一種特別的JSP,它的界面是由JSF用戶界面控件組成的)。 相對(duì)而言,這里的控制層(Controller)較為復(fù)雜,每個(gè)Faces JSP頁(yè)面都對(duì)應(yīng)著一個(gè)Action Bean,負(fù)責(zé)處理該頁(yè)面上所有的用戶輸入檢驗(yàn),事件處理,以及相關(guān)頁(yè)面之間的跳轉(zhuǎn),這些都是Basic portlet中portlet類中的actionPerformed()和doView()所要做的。 看上去好像以前那個(gè)控制器已經(jīng)被拋棄了,但事實(shí)卻不是這樣,正如圖4中Controller右側(cè)的虛線框表示的那樣,它被巧妙的隱藏了起來(lái),開(kāi)發(fā)人員不會(huì)感覺(jué)到它的存在,但它卻沒(méi)有離開(kāi),依舊在后面控制著一切。

比較了Basic portlet和Faces portlet在MVC模式的實(shí)現(xiàn)上的異同之后,該來(lái)深入了解一下Faces portlet了。

深入了解faces portlet項(xiàng)目

1. 目錄結(jié)構(gòu)
通過(guò)Faces portlet wizard新建一個(gè)Portlet項(xiàng)目,分析一下目錄結(jié)構(gòu)

(圖5)

上面這張圖是一個(gè)初始的Portlet項(xiàng)目的目錄圖。

先來(lái)看WebContent

  • \WebContent
    這里會(huì)存放所有的JSP頁(yè)面,但是當(dāng)頁(yè)面數(shù)量很多的時(shí)候這并不是一個(gè)好辦法。也許可以將頁(yè)面分類分別存放在一些子目錄里。
  • \WebContent\META-INF
    這里通常會(huì)有一個(gè)METAFEST.MF文件,存放著一些和項(xiàng)目相關(guān)的元數(shù)據(jù)。我們并不需要關(guān)心它里面有些什么。
  • \WebContent\theme
    這里則是用來(lái)放置Portlet應(yīng)用相關(guān)的頁(yè)面樣式等,諸如css文件,這通常是美工會(huì)關(guān)心的地方。
  • \WebContent\WEB-INF
    這里是整個(gè)項(xiàng)目的核心重地,存放了項(xiàng)目所有重要的配置文件。
  • \WebContent\WEB-INF\lib
    這里存放著和Faces Portlet開(kāi)發(fā)框架密切相關(guān)的一些Jar包。
  • \WebContent\WEB-INF\classes
    這里則存放了編譯好的一些Java類文件。

接下來(lái),再來(lái)看Java Resources

  • \Java Resources\pagecode
    這里存放著和WebContent中每個(gè)JSP頁(yè)面對(duì)應(yīng)的Java類,用來(lái)處理JSP頁(yè)面的后臺(tái)動(dòng)作,而所有這些都是繼承PageCodeBase這樣一個(gè)基類。

之前我們提到過(guò),每個(gè)Faces JSP頁(yè)面都會(huì)有個(gè)Action Bean和其相對(duì)應(yīng),它們應(yīng)該在Java Resources中,那JSP文件是如何與這個(gè)Action Bean關(guān)聯(lián)起來(lái)的呢?

答案在這里,在每個(gè)Faces JSP頁(yè)面中都有一段注釋,如下面這個(gè)例子:

<%-- jsf:codeBehind language="java" location="/JavaSource/pagecode/Master.java" --%><%-- /jsf:codeBehind --%>

通過(guò)這段注釋,這個(gè)Faces JSP頁(yè)面就和/JavaSource/pagecode/Master.java 這個(gè)Action Bean建立了對(duì)應(yīng)關(guān)系。注:編輯這段注釋,你可以改變這種對(duì)應(yīng)關(guān)系,但似乎在WSAD的編輯器中是沒(méi)有辦法直接修改的,你可以用記事本直接在磁盤(pán)上修改它。

2. PageCodeBase.java (附件1中是這個(gè)類的完整內(nèi)容)
這個(gè)類是構(gòu)建一切Action Bean的基礎(chǔ),它封裝了JSF技術(shù)的一些最基本的功能。下面就抽取了其中最重要的幾個(gè)函數(shù),分別講解它們的作用。

代碼片斷3:



	public PageCodeBase() {
		facesContext = FacesContext.getCurrentInstance();

		requestScope =
			(Map) facesContext
				.getApplication()
				.createValueBinding("#{requestScope}")
				.getValue(facesContext);
		sessionScope =
			(Map) facesContext
				.getApplication()
				.createValueBinding("#{sessionScope}")
				.getValue(facesContext);
		applicationScope =
			(Map) facesContext
				.getApplication()
				.createValueBinding("#{applicationScope}")
				.getValue(facesContext);
		requestParam =
			(Map) facesContext
				.getApplication()
				.createValueBinding("#{param}")
				.getValue(facesContext);

	}
	

這個(gè)函數(shù)是PageCodeBase這個(gè)類的構(gòu)造器,它負(fù)責(zé)獲取當(dāng)前FacesContext的實(shí)例之后,將FacesContext之間傳遞數(shù)據(jù)的4個(gè)Map結(jié)構(gòu)中的數(shù)據(jù)提取出來(lái),分別是#{requestScope},"#{sessionScope}","#{applicationScope}","#{param}"它們分別表示在request范圍內(nèi),在session范圍內(nèi),在application范圍內(nèi)共享的變量以及頁(yè)面之間需要傳遞的參數(shù)。

代碼片斷4:



	protected void gotoPage(String pageName) {
		if (pageName != null) {
			UIViewRoot newView =
				facesContext.getApplication().getViewHandler().createView(
					facesContext,
					pageName);
			facesContext.setViewRoot(newView);
		}
	}
	

這個(gè)函數(shù)實(shí)現(xiàn)了基本的頁(yè)面跳轉(zhuǎn)的功能,通過(guò)gotoPage(String pageName)這個(gè)函數(shù),頁(yè)面可以重定向到新的頁(yè)面。

代碼片斷5:



public static UIComponent findComponent(UIComponent base, String id) {

		// Is the "base" component itself the match we are looking for?
		if (id.equals(base.getId())) {
			return base;
		}

		// Search through our facets and children
		UIComponent kid = null;
		UIComponent result = null;
		Iterator kids = base.getFacetsAndChildren();
		while (kids.hasNext() && (result == null)) {
			kid = (UIComponent) kids.next();
			if (id.equals(kid.getId())) {
				result = kid;
				break;
			}
			result = findComponent(kid, id);
			if (result != null) {
				break;
			}
		}
		return result;
	}

這個(gè)函數(shù)一般情況下不會(huì)調(diào)用,在JSF中,每個(gè)頁(yè)面中包含的所有的控件根據(jù)相互之間的嵌套關(guān)系組成一個(gè)控件樹(shù),這個(gè)函數(shù)的作用就是在控件樹(shù)上查找并返回指定的控件實(shí)例。

代碼片斷6:



	protected void putTreeAttribute(String key, Object value) {
		getFacesContext().getViewRoot().getAttributes().put(key, value);
	}

protected Object getTreeAttribute(String key) {
		return getFacesContext().getViewRoot().getAttributes().get(key);
	}
	

頁(yè)面之間很多數(shù)據(jù)都是以該頁(yè)面所對(duì)應(yīng)的控件樹(shù)的某些屬性值的形式來(lái)存儲(chǔ)的, 這兩個(gè)函數(shù)可以讓開(kāi)發(fā)人員在代碼中存取一些需要特殊維護(hù)的數(shù)據(jù)。

代碼片斷7:



protected Object resolveExpression(String expression) {
		Object value = null;
		if ((expression.indexOf("#{") != -1)
			&& (expression.indexOf("#{") < expression.indexOf(‘}‘))) {
			value =
				getFacesContext().getApplication().createValueBinding(
					expression).getValue(
					getFacesContext());
		} else {
			value = expression;
		}
		return value;
	}

為什么在Faces JSP頁(yè)面中出現(xiàn)的所有變量都是以#{beanname.fieldname}來(lái)存在呢,奧秘就在這個(gè)函數(shù),F(xiàn)aces Portlet框架內(nèi)部解析變量時(shí)就默認(rèn)采用了這樣一種格式。

代碼片斷8:



	protected void resolveParams(
		Map paramMap,
		String[] argNames,
		String[] argValues,
		String cacheMapKey) {

		Object rawCache = getTreeAttribute(cacheMapKey);
		Map cache = Collections.EMPTY_MAP;
		if (rawCache instanceof Map) {
			cache = (Map) rawCache;
		}
		for (int i = 0; i < argNames.length; i++) {
			Object result = resolveExpression(argValues[i]);
			if (result == null) {
				result = cache.get(argNames[i]);
			}
			paramMap.put(argNames[i], result);
		}
		putTreeAttribute(cacheMapKey, paramMap);
	}
	

這個(gè)函數(shù)是用來(lái)解析頁(yè)面之間傳遞的參數(shù)的,通常不需要開(kāi)發(fā)人員來(lái)調(diào)用。

代碼片斷9:



protected static String getRealPath(String relPath) {
		String path = relPath;
		try {
			URL url =
				FacesContext
					.getCurrentInstance()
					.getExternalContext()
					.getResource(
					relPath);
			if (url != null) {
				path = url.getPath();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		return path;
	}

這個(gè)函數(shù)用來(lái)返回當(dāng)前的FacesContext所對(duì)應(yīng)Faces JSP頁(yè)面的絕對(duì)路徑,在某些場(chǎng)合下非常有用。

代碼片斷10:



	protected void logException(Throwable throwable) {
		StringWriter stringWriter = new StringWriter();
		PrintWriter printWriter = new PrintWriter(stringWriter);
		throwable.printStackTrace(printWriter);
		log(stringWriter.toString());
	}
	

這個(gè)函數(shù)在調(diào)試程序時(shí)非常有用,它將發(fā)生的異常的StackTrace重定向到日志文件中而不是簡(jiǎn)單的打印在控制臺(tái)上。

3. faces-config.xml
這個(gè)配置文件存儲(chǔ)了幾乎所有和Faces portlet密切相關(guān)的配置信息。從 http://java./dtd/web-facesconfig_1_0.dtd你可以找到它的DTD的具體內(nèi)容。

不可能解釋所有的屬性和標(biāo)簽,這里通過(guò)一個(gè)具體的例子(附件2中是它的完整內(nèi)容)來(lái)熟悉最常用的一些屬性。

代碼片斷11:



<lifecycle>
	<phase-listener>com.ibm.faces.webapp.ValueResourcePhaseListener
</phase-listener>
</lifecycle>

這里定義了在JSF的頁(yè)面生命周期每個(gè)階段狀態(tài)的監(jiān)聽(tīng)器,默認(rèn)是不需要修改的,這里使用的是IBM提供的實(shí)現(xiàn):com.ibm.faces.webapp.ValueResourcePhaseListener

代碼片斷12:



<factory>
		<faces-context-factory>
	com.ibm.faces.context.WPPortletFacesContextFactoryImpl
</faces-context-factory>
</factory>

這里則定義了和FacesContext相關(guān)的類工廠實(shí)現(xiàn),這里默認(rèn)也是IBM提供的實(shí)現(xiàn):com.ibm.faces.context.WPPortletFacesContextFactoryImpl

代碼片斷13:



<application>
		<locale-config>
			<default-locale>zh_CN</default-locale>
			<supported-locale>en_US</supported-locale>
			<supported-locale>de_DE</supported-locale>
			<supported-locale>fr_FR</supported-locale>
		</locale-config>
		<message-bundle>messagebundle</message-bundle>
	</application>

這里定義了這個(gè)Portlet應(yīng)用支持的locale的種類,特別指出了默認(rèn)支持的locale,并且還指定了應(yīng)用中存儲(chǔ)各種類型的message所需要的message bundle的名稱。

代碼片斷14:



<managed-bean>
		<managed-bean-name>pc_PTestView</managed-bean-name>
		<managed-bean-class>pagecode.PTestView</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
		<managed-bean-name>businessbean</managed-bean-name>
		<managed-bean-class>pagecode.businessbean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

在Faces portlet應(yīng)用中,任何使用的Java Bean都會(huì)在配置文件中注冊(cè)為一個(gè)managed bean,包括變量引用時(shí)使用的名稱,具體的實(shí)現(xiàn)類名,以及它們的使用范圍(request, session, application)

代碼片斷15:



	<navigation-rule>
		<display-name>navigation rule sample</display-name>
		<from-view-id>/master.jsp</from-view-id>
		<navigation-case>
			<from-action>#{pc_Master.doDetailsBtnAction}</from-action>
			<from-outcome>success</from-outcome>
			<to-view-id>/details.jsp</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-action>#{pc_Master.doDetailsBtnAction}</from-action>
			<from-outcome>failure</from-outcome>
			<to-view-id>/homepage.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	

這段也是常見(jiàn)的配置信息,它定義了portlet應(yīng)用中各個(gè)頁(yè)面之間的跳轉(zhuǎn)關(guān)系。 from-view-id 定義了這條跳轉(zhuǎn)規(guī)則中的源頁(yè)面 <navigation-case></navigation-case> 則通過(guò)這個(gè)標(biāo)簽定義了針對(duì)一個(gè)源頁(yè)面的各種跳轉(zhuǎn)情況。 <from-action> Faces portlet中的跳轉(zhuǎn)規(guī)則是根據(jù)某個(gè)事件處理函數(shù)的返回值來(lái)判斷的,這里就定義了具體事件處理函數(shù)的名稱。 <from-outcome> 這里則定義了這種跳轉(zhuǎn)情形所對(duì)應(yīng)的事件處理函數(shù)的返回值。<to-view-id> 這里定義了在事件處理函數(shù)返回相應(yīng)的返回值后跳轉(zhuǎn)的目標(biāo)頁(yè)面。

小結(jié):
Faces Portlet是一個(gè)不錯(cuò)的Portlet應(yīng)用開(kāi)發(fā)框架,值得去體驗(yàn)一下。如果你過(guò)去有過(guò)開(kāi)發(fā)portlet應(yīng)用的經(jīng)驗(yàn),這些寶貴的經(jīng)驗(yàn)會(huì)讓你事半功倍。 希望這篇文章能夠讓你對(duì)Faces portlet印象深刻。

參考資料

  1. http://publib.boulder.ibm.com/infocenter/wsphelp/index.jspInformation Center of WebSphere Studio and WebSphere Application Server
  2. http://publib.boulder.ibm.com/pvc/wp/502/ent/en/InfoCenter/index.htmlInformation Center of WebSphere Portal Server v5.0.2
  3. WSAD V5.1.2的聯(lián)機(jī)幫助,它會(huì)隨WSAD一起安裝。
  4. http://www.ibm.com/developerworks/cn/cnwsdd.nsf/wsdd-onlinecourse-bynewest/7DF1D2C22B4ACCD9C8256E7E00230C9D?OpenDocument教程:創(chuàng)建基于 Web 的用戶界面--使用 WebSphere Studio V5.1.1 來(lái)開(kāi)發(fā) JavaServer Faces 應(yīng)用程序
  5. http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0403_lynn/0403_lynn.htmlHello World -- WebSphere Portal V5 最簡(jiǎn)單的 portlet
  6. http://www./en/jsr/detail?id=127JSR127,這是JCP通過(guò)的JSF規(guī)范
  7. http://www./非常不錯(cuò)的一個(gè)關(guān)于JSF的開(kāi)發(fā)社區(qū)
  8. http://www.ibm.com/developerworks/cn/websphere/zones/studio/theme/studionewtech.htmlWSStudio新功能入門專題
  9. www.google.com上搜索關(guān)鍵字MVC,你可以很快找到很多關(guān)于MVC的材料。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多