亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

編寫JSR-168 Portlet指南

2019-11-18 16:20:55
字體:
來源:轉載
供稿:網友

摘要

  JSR-168是適合于portlet開發人員的java API集合。設計符合規范的JSR-168 portlet的原因有很多??梢浦残跃鸵粋€顯而易見的好處。根據規范編寫的代碼更容易在門戶服務器之間移動。多數基于Java的門戶服務器都支持JSR-168 portlet。

  另一個好處是更易于聯合。當portlet符合JSR-168規范時,通過Web Services for Remote Portlets (WSRP)生產者公開JSR-168 Portlet會更容易一些。WSRP提供了一個通過Web service聯合portlet內容的標準。JSR-168和WSRP 1.0 portlet功能是緊密耦合的。JSR-168 to WSRP portlet橋利用JSR-168的URL重寫API。本文將闡述開發JSR-168 portlet以便獲得可移植性的最佳實踐。

1. 總是利用URL重寫API,以獲得Portlet中的內容

  Java開發人員經常在如下所示jsp中編寫圖像的URL:

<img src="http://www.QQread.com/<%= request.getContextPath()%>/images/logo.gif"/>

  這在JSR-168 portlet中是不正確的。正確的方法是:

<img  src="http://www.qqread.com/j2ee/<%= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/logo.gif")  %>"/>

  encodeURL()方法可以采用完全路徑URI或者完全限定URL。完全路徑URI是最常用的。在使用JSR-168 portlet將資源嵌入Web application Archive (WAR)中時,可以使用此技術。在將圖像放置到單獨服務器上時,可以使用完全限定URL。專門為靜態內容提供服務的緩存服務器就是一個示例,它卸掉來自門戶服務器的通信量。盡管可以通過對完全限定URL使用encodeURL()來引用portlet以外的內容,但應該只在無法通過客戶機訪問資源時這樣做。如果客戶機可以直接瀏覽資源,則無需對URL使用encodeURL()。例如,如果有一臺Web服務器,可用該服務器獲得門戶用戶無法直接瀏覽的防火墻內的靜態內容,則需要調用encodeURL()。如果這些內容在防火墻之外,并且門戶用戶可以直接瀏覽到Web服務器,則無需調用encodeURL()。

2. 不要將路徑附加到重寫URL中

  傳入RenderRequest的encodeUrl()方法中的URL在調用該方法之前必須是完整的。在調用該方法之后,無法添加URL的某些部分。例如,如果想從XSLT轉換中生成一個URL轉換,則不能將已編碼的基本URL(http://foo.com/)作為參數傳遞,并將路徑(pages/bar.jsp)附加到該轉換中的已編碼基本URL中。

  以下調用演示了將URL編碼到圖像中的正確方式:

<@= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/logo.gif")@>

  它使用一個.portal文件在BEA WebLogic Portal 9.2中生成以下Html片段:

<img src="http://localhost:7001/PortalWebApp/images/logo.gif;PORTAL_TAU=W3f6FbmLLcgZq9Fpv1JHLs5rrJG8Lgj2nnDVJqdfShhRGFnsqCKZ!-545815275"/>

  以下調用是不正確的。URL并不指向想要的資源。

<@= renderResponse.encodeURL(renderRequest.getContextPath()+     "/images/")+"logo.gif"@>

  它使用.portal文件在WebLogic Portal 9.2中生成以下HTML文件:

<img src="http://localhost:7001/PortalWebApp/images/;
PORTAL_TAU=W3f6FbmLLcgZq9Fpv1JHLs5rrJG8Lgj2nnDVJqdfShhRGFnsqCKZ!-545815275logo.gif"/>

3. 使用名稱空間限定客戶端腳本變量和方法

  假設您想使用portlet中的javascript驗證用戶輸入。以下Javascript功能可能很有用:

<script>function validate(foo) {    if (foo.bar.value=="") {        return false;    }    return true;}</script>


  同一頁面中的其他portlet可能也有一個命名為validate()的具有不同邏輯的JavaScript方法。門戶框架本身可能使用JavaScript方法。這個問題的解決方法是使用客戶端腳本中的名稱空間方法和頂層變量。<portlet:namespace/>標記將為每個portlet生成一個惟一標識符。第一步是通過taglib directive將標記庫包含在JSP中。

<%@taglib uri="http://java.sun.com/portlet" 

  腳本中的validate()方法可以對標記加以區分。

<script>function validate<portlet:namespace/>(foo) {    if (foo.bar.value=="") {        return false;    }    return true;}</script>

  以下是調用帶名稱空間的JavaScript方法的方式:

<form action="http://www.somesite.org/servlet"method="GET" onsubmit="return validate<portlet:namespace/>(this);"><label for="bar">Text(required): </label><input type="text" name="bar" id="bar"></form>
進入討論組討論。

4. 確保引用Portlet資源的內聯客戶端腳本符合規范

  客戶端腳本常常引用外部資源(如圖像、電影和外部頁面)來增強用戶界面。常見的示例是預先加載圖像以使交換圖像更有效的JavaScript。以下是一個示例:

<script>function preloadImages(){    var menuImage =    new Image();    menuImage.src = "images/icon.gif";    var menuImageDark=new Image();    menuImageDark.src = "images/icon.gif";}</script>

  客戶端腳本中的URL必須根據JSR-168規范進行重寫。這些腳本必須在JSP或JSP-168 portlet類中,以便調用重寫API的URL。它們不能在單獨的JavaScript (.js)文件中。以下是一個包含URL重寫的適當名稱空間腳本在JSR-168 portlet中看起來的樣子:

<script>function <portlet:namespace/>preloadImages(){    var menuImage = new Image();    menuImage.src = "<%=renderResponse.encodeURL(renderRequest.getContextPath()+ "images/icon.gif")%>";    var menuImageDark= new Image();    menuImageDark.src = "<%=renderResponse.encodeURL(renderRequest.getContextPath()+ "images/icon_dark.gif") %>";}</script>

5. 總是為portlet響應聲明一個內容類型

  根據JSR-168規范,“portlet必須使用RenderResponse接口的setContentType方法設置響應的內容類型”。沒有顯式設置其內容類型的portlet仍然會成功獲得編譯。但WebLogic Portal不會執行沒有設置其內容類型的portlet。確保您的portlet設置了其內容類型。

  以下示例演示了一個正確設置其內容類型的portlet:

public class MyPortlet extends GenericPortlet {    public void doView(RenderRequest request, RenderResponse response)        throws PortletException, IOException {        response.setContentType("text/html");        PrintWriter writer = response.getWriter();        writer.println("

I set my content type!

"); }}

  此示例是不正確的,但仍將獲得編譯:

public class MyPortlet extends GenericPortlet {    public void doView(RenderRequest request, RenderResponse response)        throws PortletException, IOException {        // no content type set!        PrintWriter writer = response.getWriter();        writer.println("

I did NOT set my content type!

"); }}
 
進入討論組討論。

6. 不要從Portlet發送Cookie

  根據JSR-168 portlet規范,在HttpServletResponse上調用addCookie()實際上不會設置一個cookie。允許設置cookie的portlet容器被打破。不要調用此方法。

  如果您喜歡在用戶使用門戶的時候基于每位用戶持久存儲信息,那么可以將信息存儲為portlet會話中的一個屬性。如果您喜歡在用戶退出后持久存儲信息,那么可以將信息存儲到數據存儲庫(文件系統、數據庫、LDAP等)中。

7. 將業務邏輯從表示中分離出來


  有經驗的開發人員都知道模型查看器控制器框架類似于Struts或Beehive,可以使開發富Web應用程序變得更容易。這同樣也適用于portlet。JSR-168并不是適用于平臺獨立portlet的惟一理想規范。WSRP portlet在實現標準的門戶(包括非Java門戶)之間移動很方便。WebLogic Portal 可以通過WSRP公開Beehive和Struts portlet。

  如果需要將portlet部署為JSR-168 WAR,您仍然有一些選擇。將業務邏輯從JSR-168 portlet的表示邏輯中分離出來的最簡單方法是指派一個JavaServer Page (JSP)。portlet處理呈現方法(比如render()和doView())中的業務邏輯。portlet使用應用程序級作用域或portlet作用域將信息傳遞給JSP。下面的示例將一個portlet請求指派給JSP,并傳遞portlet作用域中的一個字符串:

public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { response.setContentType("text/html"); request.setAttribute("foo","bar"); String jsp = "/pages/portal.jsp";   PortletContext ctx = getPortletContext(); PortletRequestDispatcher dispatcher = ctx.getRequestDispatcher(jsp);   dispatcher.include(request, response);}

  到達JSP(上述示例中的jsp)的路徑值并不包括portlet的Web歸檔文件(WAR)的上下文路徑。

  JSR-168的指派方法允許將業務邏輯與表示分離。不過,它們缺乏MVC框架的成熟度。

  適用于JSR-168開發的框架包括:

  • Spring Portlet MVC
  • WebWork
  • Struts Action 2

Struts Action 2是Struts和WebWork的組合,因此portlet代碼庫對現在而言幾乎是一樣的。這些框架簡化了復雜portlet的開發和維護。

結束語

  遵守這些指導原則會使您的portlet符合JSR-168規范。遵守規范會使您的portlet在Java門戶服務器之間移動變得更容易。還會使利用WSRP聯合門戶內容變得更容易。

參考資料

  • Java Community Process JSR-168 主頁
  • OASIS WSRP 主頁
  • WebLogic Portal 8.1 中的 URL(中文版,Dev2Dev,2005年5月)
  • 利用WebLogic Portal 8.1 SP3開發Java Portlets(中文版,Dev2Dev,2004年8月)
編寫JSR-168 Portlet指南(圖一)
 作者簡介編寫JSR-168 Portlet指南(圖二)
Drew VarnerDrew Varner 是一名在BEA Federal Professional Services方面具有豐富實踐經驗的高級首席顧問。在過去兩年中,他的工作是處理實現方面的防御和智能代理,包括JSR-168和WSRP門戶技術。

進入討論組討論。

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
浅井舞香一区二区| 欧美日韩黄色大片| 91禁国产网站| 国产精品久久久久福利| 亚洲成人三级在线| 欧美理论电影网| 成年无码av片在线| 日韩av在线不卡| 欧美精品第一页在线播放| 日韩精品欧美国产精品忘忧草| 富二代精品短视频| 国产日韩中文字幕| 国产成人免费av| 97av在线视频免费播放| 亚洲韩国日本中文字幕| 亚洲大胆人体视频| 久久视频这里只有精品| 国产狼人综合免费视频| 国产欧美精品在线播放| 欧美高清性猛交| 日韩成人网免费视频| 91精品国产高清久久久久久久久| 亚洲人成电影网站色www| 亚洲成人中文字幕| 日韩av在线电影网| 亚洲天堂av在线播放| 日韩av网站电影| 亚洲欧美色图片| 69国产精品成人在线播放| 久久精品国产电影| 欧美性猛交xxxx黑人猛交| 69久久夜色精品国产7777| 久久久久免费视频| 91亚洲精品久久久久久久久久久久| 日本中文字幕不卡免费| 日韩av网站大全| 国产精品最新在线观看| 欧美黑人一级爽快片淫片高清| 久久久久北条麻妃免费看| 欧美成人精品在线| 国内精品400部情侣激情| 一本色道久久88综合亚洲精品ⅰ| 亚洲精品在线观看www| 国产精品一区二区三区毛片淫片| 欧美日在线观看| 欧美亚洲视频一区二区| 2021国产精品视频| 亚洲片在线观看| 久久艹在线视频| 欧美激情亚洲激情| 亚洲女人被黑人巨大进入| 亚洲精品国产电影| 国产欧美久久一区二区| 日韩影视在线观看| 日韩风俗一区 二区| 亚洲成av人片在线观看香蕉| 亚洲欧美国产精品专区久久| 欧美日韩免费区域视频在线观看| 57pao国产成人免费| 国产精品久久久久久久久粉嫩av| 日韩国产欧美精品在线| 2018国产精品视频| 亚洲伊人成综合成人网| 国产欧美日韩综合精品| 精品爽片免费看久久| 91国自产精品中文字幕亚洲| 国产午夜精品全部视频在线播放| 亚洲久久久久久久久久久| 精品中文字幕乱| 亚洲成**性毛茸茸| 国产精欧美一区二区三区| 欧美成年人视频网站欧美| 精品视频偷偷看在线观看| 久久韩国免费视频| 欧美日韩另类在线| 日本不卡高字幕在线2019| 日韩av影视在线| 亚洲黄色有码视频| 亚洲永久在线观看| 久久精品视频在线播放| 精品久久久久久久久久久久久久| 成人a在线视频| 亚洲理论片在线观看| 久久久久久12| 色午夜这里只有精品| 大伊人狠狠躁夜夜躁av一区| 久久午夜a级毛片| 隔壁老王国产在线精品| 亚洲福利视频网站| 成人信息集中地欧美| 国产精品男人的天堂| 欧美电影第一页| 亚洲成人三级在线| 欧美激情xxxxx| 成人av资源在线播放| 91精品国产沙发| 日韩日本欧美亚洲| 欧美午夜美女看片| 国产精品一区二区久久| 国产免费亚洲高清| 夜夜躁日日躁狠狠久久88av| 亚洲国产一区自拍| 国模精品系列视频| 欧美大片在线看| 国产精品高清在线观看| 成人免费视频网址| 亚洲精品成人久久久| 91色视频在线导航| 一区二区三区四区精品| 亚洲精品国产精品国自产观看浪潮| 成人免费福利视频| 成人免费视频网址| 性欧美视频videos6一9| 91日韩在线播放| 久久久久成人精品| 2019中文字幕在线免费观看| 97视频在线观看视频免费视频| 精品日本美女福利在线观看| 国产欧美一区二区三区视频| 欧美日韩在线第一页| 日韩最新免费不卡| 精品视频—区二区三区免费| 亚洲国产精品va在线观看黑人| 琪琪亚洲精品午夜在线| 日韩男女性生活视频| 色噜噜国产精品视频一区二区| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲曰本av电影| 国产免费一区二区三区在线能观看| 国产精品视频26uuu| 精品久久久中文| 538国产精品一区二区在线| 日韩av在线免费看| 国产精品女主播视频| 欧美日韩裸体免费视频| 欧美国产日韩xxxxx| 伊人亚洲福利一区二区三区| 日韩精品免费电影| 亚洲欧美日韩中文在线| 国产啪精品视频网站| 国产欧美在线视频| 欧美xxxx14xxxxx性爽| 国产偷亚洲偷欧美偷精品| 国产精品久久久久久久美男| 日韩免费观看av| 国产欧美在线播放| 欧美一区二区大胆人体摄影专业网站| 欧美二区在线播放| 成人欧美一区二区三区黑人孕妇| 国产精品海角社区在线观看| 国产日韩欧美在线视频观看| 国产性猛交xxxx免费看久久| 97国产成人精品视频| 亚洲视频精品在线| 最近的2019中文字幕免费一页| 三级精品视频久久久久| 69av视频在线播放| 亚洲精品一区二区在线| 色综合色综合久久综合频道88| 日韩禁在线播放| 国产成人高清激情视频在线观看| 亚洲自拍av在线| 亚洲欧美国产日韩天堂区| 亚洲欧美中文日韩在线|