Terry.Li-彬

虚其心,可解天下之问;专其心,可治天下之学;静其心,可悟天下之理;恒其心,可成天下之业。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  143 随笔 :: 344 文章 :: 130 评论 :: 0 Trackbacks
 

谈了这么多,还没说怎么自己往Liferay中创建和加入一个portlet,Liferay中定义了几种类型的portlet,如JSPPortlet,StrutsPortlet,和VelocityPortlet。先以JSPPortlet为例说明吧。

1. 定义新的JSP Portlet

a) 首先到 ...\portlet\ext中去加入自己要创建的portlet文件夹,例如myappletportlet,在文件夹中创建一个view.jsp,其中的内容可最简单为:

Hello JSPPortlet world!

最好的起始学习方法应该是照葫芦画瓢吧,找一个已有的portlet,看它的结构和代码。

b) 到 ...\WEB-INF\portlet-ext.xml 中加入
<portlet>
 <portlet-name>EXT_2</portlet-name>
 <!-- portlet 的最关键ID -->

 <display-name>My AppletPortlet</display-name>

 <portlet-class>com.liferay.portlet.JSPPortlet</portlet-class>
 <!-- portlet 所属的类 -->

 <init-param>
  <name>view-jsp</name>
  <value>/portlet/ext/myappletportlet/view.jsp</value>
  <!-- MVC中会直接传递到view.jsp -->
 </init-param>
 <expiration-cache>300</expiration-cache>
 <supports>
  <mime-type>text/html</mime-type>
 </supports>
 <portlet-info>
  <title>PENG Portlet</title>
  <!-- Portlet上显示的名字 -->
 </portlet-info>
 <security-role-ref>
  <role-name>Power User</role-name>
 </security-role-ref>
 <security-role-ref>
  <role-name>User</role-name>
 </security-role-ref>
</portlet>

c) 到 ...\WEB-INF\liferay-portlet-ext.xml 中加入

<portlet>
 <portlet-name>EXT_2</portlet-name>
</portlet>

d) 到...\WEB-INF\liferay-display.xml 中加入以下代码,以将EXT_2加入sample分类,到时候在Add Content时可以在这个sample组找到,否则在undefined中找。

<category name="category.sample">
 <portlet id="47"/>
 ......
 <portlet id="EXT_2"/>
</category>

e) 测试。如果上述的修改是直接在tomcat目录中进行的话,重新启动tomcat。如果是在前面提到的自己创建的EXT环境下进行的话,先用ant一下,再启动tomcat。然后http://localhost:8080/,用test@liferay.com/test进去,选择Add Content,应该可以在sample目录下找到前面创建的那个portlet了:PENG Portlet。


2. 定义新的StrutsPortlet。过程要略微复杂一些,谁叫我们要用传说中的MVC呢。先列出几个关键的配置文件:
portlet-ext.xml: 定义portlet(JSR-168 attributes)
liferay-portlet-ext.xml: 注册portlet(Liferay attributes)
struts-config.xml: 定义 page-flow (action mapping)
tiles-defs.xml: 定义 the page layout
更详细的信息可从Liferay的官方网站上获得。

a) 在ext中增加一个叫做Tiles的portlet文件夹,在其中创建一个view.jsp。内容可以简单为:

Hello StrutsPortlet world!

b) Portlet-ext.xml 中加入
<portlet>
 <portlet-name>EXT_3</portlet-name>
 <display-name>Tiles</display-name>
 <portlet-class>
  com.liferay.portlet.StrutsPortlet
  <!—实现JSR-168规范的类 -->
 </portlet-class>

 <init-param>
  <name>view-action</name>
  <value>/ext/tiles/view</value>
   <!-- portal会到struts-config.xml中去寻找/ext/tiles/view -->
 </init-param>
 <expiration-cache>0</expiration-cache>
 <supports>
  <mime-type>text/html</mime-type>
 </supports>
 <resource-bundle>
  com.liferay.portlet.StrutsResourceBundle
 </resource-bundle>
 <security-role-ref>
  <role-name>user</role-name>
 </security-role-ref>
</portlet>


c) liferay-portlet-ext.xml中加入

<portlet>
 <portlet-name>EXT_3</portlet-name>
 <struts-path>ext/tiles</struts-path>
 <!-- 告诉portal所有带有ext/tiles/*路径的请求可以认为是这个portlet的范围 -->
 <use-default-template>false</use-default-template>
 <!-- 因为将采用别的template,所以设置为false。将要使用的template在tiles-defs.xml中定义。-->
</portlet>


d) struts-config-ext.xml中加入

<action path="/ext/tiles/view"
 forward="portlet.ext.tiles.view" />
<!-- Struts 将会在 tiles-defs.xml 中寻找 portlet.ext.tiles.view -->

e) 在tiles-defs-ext.xml 中加入

<definition name="portlet.ext.tiles.view" extends="portlet">
<!-- 定义了哪个 template 将被使用,这里是portlet template。这个template 定义了portlet的borders和buttons(例如minimize, maximize, close 等等)。 -->

<put name="portlet_content" value="/portlet/ext/tiles/view.jsp" />
 <!-- portlet_content 是一个liferay的变量,portal可以使用这个变量来决定在portlet中会呈现什么内容。这里portlet的内容就是view.jsp。 -->
</definition>

f) 测试。

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2177436

posted on 2008-03-14 14:15 礼物 阅读(1477) 评论(2)  编辑  收藏 所属分类: Liferay

评论

# re: 深入浅出Liferay Portal (12) 2009-03-30 14:59 小雨
你好,
写得很好,受益匪浅,在下有两个问题,请仁兄赐教:
1. 本人想在 theme vm 中使用 iframe 让portal 内容部分 布局成左右两边,结果页面无法显示,该如何处理?

2.目前 portal内容/菜单都是同时刷新,是否可以实现 仅内容页面刷新,菜单/头部不刷新?
比如portal:/web/guest/aa 如果在portal_normal.vm中使用iframe a, a.src = "/web/guest/aa", 这样的话整个页面都加到了 a中,如何实现只加载portal 内容部分

谢谢!   回复  更多评论
  

# re: 深入浅出Liferay Portal (12) 2009-09-28 11:37 liferay
欢迎加群49588979一起讨论学习liferay  回复  更多评论