谈了这么多,还没说怎么自己往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