学习liferay是个痛苦的过程,整天都在那么多包和类中徘徊.一个功能涉及的文件比较多.
这段时间本想照着上次哪个贴里面的做一个操作数据库的例子,发现很多不会,包括关于spring,hibernate有很多配置都看
不懂,只能一步步来,首先先从struts开始配置,至于数据,只能是自己add进去
1.首先先写一个portlet 继承StrutsPortlet
public class MyPortalPortlet extends StrutsPortlet {
public void doView(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
PortletPreferences prefs = req.getPreferences();
super.doView(req, res);
}
}
2.再写一个 action继承portletAction 这里的action其实就是struts中的action,只是继承了liferay自己的类
public class MyPortletAction extends PortletAction {
public ActionForward render(
ActionMapping mapping, ActionForm form, PortletConfig config,
RenderRequest req, RenderResponse res)
throws Exception {
//if 如果窗口最小话的时候跳转到..(后面介绍),else如果最大化就跳转到view_users
if (req.getWindowState().equals(WindowState.NORMAL)) {
System.out.println("portlet.ext.myuser.view");
return mapping.findForward("portlet.ext.myuser.view");
}
else {
List users = new ArrayList();
users.add("One");
users.add("Two");
users.add("Three");
req.setAttribute("users", users);
System.out.println("portlet.ext.myuser.view_users");
return mapping.findForward("portlet.ext.myuser.view_users");
}
}
}
3.接着开始配置配置文件
先配置struts的相关配置文件,由于我是从ext开发,所以就直接配置struts-config-ext.xml(用过struts的都知道这个配置文件),在action-mapping中增加一个action,这里记着这个path的值,后面有用到
<action path="/ext/myuser/view_users" type="com.ext.portlet.myuser.action.MyPortletAction">
<forward name="portlet.ext.myuser.view" path="portlet.ext.myuser.view" />
<forward name="portlet.ext.myuser.view_users" path="portlet.ext.myuser.view_users" />
</action>
接着配struts的标签指向,配置tiles-defs-ext.xml,增加两个跳转,继承portlet,进行跳转,<definition name="">与上面的struts 的<forward name 是完全相同的
<definition name="portlet.ext.myuser.view" extends="portlet">
<put name="portlet_content" value="/portlet/ext/myuser/view.jsp" />
</definition>
<definition name="portlet.ext.myuser.view_users" extends="portlet">
<put name="portlet_content" value="/portlet/ext/myuser/view_users.jsp" />
</definition>
4.接着配置portlet配置文件,portlet-ext.xml,增加新类,也就是上面写的MyPortalPortlet ,给他进行注册,
<portlet>
<portlet-name>lpyPortal</portlet-name>
<display-name>Hello lpy</display-name>
<portlet-class>com.ext.portlet.myuser.MyPortalPortlet</portlet-class>
<init-param>
<name>view-action</name>
<value>/ext/myuser/view_users</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
</supports>
<resource-bundle>com.liferay.portlet.StrutsResourceBundle</resource-bundle>
<portlet-preferences>
<preference>
<name>user</name>
<value>123</value>
</preference>
</portlet-preferences>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
</portlet>
这里的portlet-name的名字给liferay给注册时需要用到
portlet-class写的就是上面写的MyPortalPortlet,连接jsp和action的portlet.
下面解释下上面的信息
<init-param>
<name>view-action</name>
<value>/ext/myuser/view_users</value>
</init-param>
初始参数这里的value就是上面struts-config-ext.xml里面的path路径
<portlet-preferences>
<preference>
<name>user</name>
<value>123</value>
</preference>
</portlet-preferences>
这里的参数选择,设置一个默认值,传递的函数是user,默认值是123,在JSP中我们可以通过prefs.getValue("user", "")来获取,其实就是写在默认跳转的view.jsp中,给他赋一个默认的值,具体可以参看下面的view.jsp的写法
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
配置该portlet 的角色,以及角色的显示名字,角色名role-name 是由portlet.xml 中进行定义
该portlet 由com.liferay.portal.apache.bridges.struts.LiferayStrutsPortletURLImpl 类的实例进行处理,允许使用模版和实时刷新页面。可配置administrator,guest,power-user,user 四种角色对其拥有不同的权限。至于权限的研究,嘿嘿,慢慢来
5.配置liferay-portlet-ext.xml
<portlet>
<portlet-name>lpyPortal</portlet-name>
<struts-path>ext/myuser</struts-path>
<use-default-template>false</use-default-template>
<restore-current-view>false</restore-current-view>
<private-request-attributes>false</private-request-attributes>
<private-session-attributes>false</private-session-attributes>
<render-weight>1</render-weight>
</portlet>
这里的<use-default-template>设置为false如果为true的话,会出现2个标题,效果图片参见附件1,这里的
portlet-name要和portlet-ext.xml里面写的portlet的name一样
6.写JSP文件
先写一个init.jsp 创建路径ext-web/docroot/html/portlet/ext/myuser/
<%@ include file="/html/common/init.jsp" %>
<portlet:defineObjects />
<% PortletPreferences prefs = renderRequest.getPreferences();%>
代码就几行,include包含的JSP,其实是一个通用的,如果看下里面的内容,可以发现里面的内容基本上把很多常用的类和变 量都包括在里面了
再写一个view.jsp
<%@ include file="/html/portlet/ext/myuser/init.jsp"%>
<a href="<portlet:renderURL windowState="<%= WindowState.MAXIMIZED.toString() %>" />">MyUser <%= prefs.getValue("user", "") %> </a>
这里的prefs是上面init.jsp中创建的,portal的页面就是一个jsp包含一个jsp,没有<html>这样的标签,因为都是统一的,只有table,或者div或者include,就一直往里面加内容
写一个view_users.jsp
<%@ include file="/html/portlet/ext/myuser/init.jsp" %>
<% List users = (List)request.getAttribute("users");%>
<%
for (int i = 0; i < users.size(); i++) {
String userName = (String)users.get(i);
%>
<%= userName %><br>
<%
}
%>
这个JSP上的值是从上面写的action中获取来的,可以参看上面MyPortletAction中的
req.setAttribute("users", users);
最后在liferay-dislpay.xml中注册你写的portlet
<category name="category.sample">
<portlet id="47" />
<portlet id="48" />
<portlet id="50" />
<portlet id="53" />
<portlet id="66" />
<portlet id="lpy"/>
<portlet id="lpyPortal"/>
<portlet id="EXT_1" />
</category>
我是把他放在samplet中,这看个人喜好
应该差不多了.
最后用ant编译下,把他们全部编译到你安装的服务器,