天天看點

portal學習(二)portlet開發之hello world

portal開發的一個重要工作就是portlet的開發,網上一大堆hello world,都是最簡單的,用printwriter輸出字元串。今天介紹一下稍微複雜的,使用者轉到portlet的edit model,該頁面是有一個輸入框和一個按鈕,輸入你的名字,然後送出,将轉到此portlet的view model并輸出hello,your name。

    portlet與servlet非常相似,因為portlet就是在servlet規範的基礎上擴充的,并且portlet容器也是在servlet容器的基礎上擴充,同serlvet一樣,我們的helloworldporlet需要強制繼承自genericportlet類,genericportlet實作了portlet接口,看看完整代碼:

package net.rubyeye.portlets;

import javax.portlet.actionresponse;

import javax.portlet.genericportlet;

import javax.portlet.portletexception;

import javax.portlet.portletrequestdispatcher;

import javax.portlet.renderrequest;

import javax.portlet.renderresponse;

public class helloworldportlet extends genericportlet {

        @override

        protected void doedit(renderrequest req, renderresponse res)

                        throws portletexception, ioexception {

                res.setcontenttype("text/html");

                //擷取初始參數,在init-param中定義

                string jspname = getportletconfig().getinitparameter("edit-jsp");

                portletrequestdispatcher rd = getportletcontext().getrequestdispatcher(

                                jspname);

                rd.include(req, res);

        }

        protected void doview(renderrequest req, renderresponse res)

                //執行完processaction後設定了renderparamter,這裡得到

                string msg = req.getparameter("msg");

                printwriter out = res.getwriter();

                system.out.println(msg);

                //有就輸出

                if (msg != null)

                        out.write(msg);

                //預設輸出是hello world

                else

                        out.write("hello world!view!");

        //actionurl調用的processaction

        public void processaction(actionrequest req, actionresponse res)

                // todo auto-generated method stub

                string name = req.getparameter("name");

                system.out.println(name);

                res.setrenderparameter("msg", "hello," + name);

}

    解釋下代碼,portlet預設有三種model:view、edit和help,顧名思義分别對照浏覽、編輯和幫助狀态,其中隻有view是必須的,當然還可以自定義model。在portlet就有相應的doxxx方法用于呈現相應的片段,portlet還有一個render(renderrequest,renderresponse),這個方法與doview等方法的關系類似serlvet中service與doget、dohelp的關系,一般我們都不直接覆寫render,而是實作具體的doxxx方法。回到這個例子,helloworldportlet有兩個model:view和edit。

    在doview方法中很簡單,首先需要設定contenttype,然後擷取前面processaction設定的renderparamter,當然,一開始進入portlet是view,這個值根本沒有,預設就用printwriter輸出hello world。

    processaction用于處理actionrequest的方法,和一般的servlet程式設計沒有什麼不同,請注意,processaction執行之後才是執行相應的render方法,并且與render不共享parameter,是以為了在doview中獲得msg參數,我們需要通過actionresponse的setrenderparameter來設定renderrequest的parameter。

    doedit方法就比較簡單了,通過portletconfig的getinitparameter(與servletconfig一樣了)獲得屬性edit-jsp的值——編輯頁面的位置,然後将該頁面include進portlet。

    portlet需要一個配置檔案來告訴portlets容器具體資訊,這個檔案同樣放在web-inf目錄下,并且名為portlet.xml:

<?xml version="1.0" encoding="utf-8"?>

<portlet-app version="1.0"

        xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"

        xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">

        <portlet>

                <portlet-name>helloworldporlet_1</portlet-name>

                <portlet-class>

                        net.rubyeye.porlets.helloworldporlet

                </portlet-class>

                <init-param>

                        <name>edit-jsp</name>

                        <value>/portlets/edit.jsp</value>

                </init-param>

                <supports>

                        <mime-type>text/html</mime-type>

                        <portlet-mode>view</portlet-mode>

                        <portlet-mode>edit</portlet-mode>

                </supports>

                <portlet-info>

                        <title>helloworld</title>

                </portlet-info>

        </portlet>

</portlet-app>

  資訊非常清楚,就不多做解釋了,edit-jsp的值是/portlets/edit.jsp,portlets容器就會去portlets目錄下尋找edit.jsp。supports元素指定了portlet支援的model以及mime類型。更詳細的配置請參考官方規範

   最後就是edit.jsp,需要用到portlets規範規定的标簽,我們這裡用到了actionurl,該标簽用于form的action的生成,觸發帶有參數的request請求的processaction調用,當然還有一個renderurl,顧名思義僅是用于呈現,而非action的觸發。請注意,form的method必須是post,因為portlets容器可能将一些狀态資訊寫在url,使用post送出避免沖突。

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

<portlet:defineobjects/>

<div>

<form method="post" action="<portlet:actionurl portletmode="view" windowstate="normal"/>" >

please input your name:

<input type="text" name="name" size="10"/>

<input type="submit" value="submit"/>

</form>

  在使用portlet規範規定的标簽前,一定要先使用<portlet:defineobjects/> 标簽,以便定義下列變量讓jsp使用:

renderrequest

renderresponse

portletconfig

    我們通過actionurl标簽産生指向本portlet的url,并且指定沒有錯誤發生時這個portlet應該具有的model是view,視窗大小為normal。最後部署并運作,因為不同的portal的部署方式和所需要的其他配置檔案各不相同,這裡就不詳細介紹了。下面是在bea portal 10.0上的效果圖:

1.一開始看到的是view model,輸出hello world!view!:

portal學習(二)portlet開發之hello world

2.點選左上角的edit連結進入edit model:

portal學習(二)portlet開發之hello world

3.輸入dennis,送出,轉到view model:

portal學習(二)portlet開發之hello world

文章轉自莊周夢蝶  ,原文釋出時間2007 7 15

繼續閱讀