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!:

2.点击左上角的edit链接进入edit model:
3.输入dennis,提交,转到view model:
文章转自庄周梦蝶 ,原文发布时间2007 7 15