??????書接上回(間隔很久了,抱歉,各位看官!),Charpter1介紹了Portlet的一些基礎知識,本章從一個實例的開發,介紹如何應用Spring Portlet MVC開發自己的Portlet。
Charpter2 Spring Portlet MVC實例開發
實例介紹:
實現一個簡單的用戶注冊詳細信息的編輯與查看功能。
?
開發環境:
Dev Tool: Eclipse 3.2
Web Server: Tomcat 5.5
Framework: Spring 1.2.8 +?Spring Portlet MVC + Hibernate 3.2.0.GA
Portal Server:?Liferay Portal 4.3.0
Database: Oracle 9i
開發過程:
0) 建立工程結構
整個工程

source包下的結構:

web包下的結構:

1) 創建Model
創建注冊信息的Model實體,如下代碼:

/**?*//**
?*?WsspUser?申報用戶信息
?*?@author?Allen
?*/

@SuppressWarnings("serial")
@Entity
@Table(name?=?"MY_USER")
@Cache(usage?=?CacheConcurrencyStrategy.READ_WRITE)

public?class?WsspUser?extends?BaseNameObject?
{


????/**?*//**?public?attrrbutes?**/
????@Column(length?=?100)
????private?String?userType;//標識會員類型?企業會員:E?政府會員:G?個人會員:P?社團會員:C?其他會員:O
????
????@Column(length?=?4)
????private?int?personActive;?//用戶狀態:1?啟用,0?停用
????
????@Column(length?=?4)
????private?int?actAsAgent;?//是否為代辦:1?是,0?不是
????
????private?String?surrogateId;?//代辦人員編號
????private?String?wsspPersonId;?//用戶唯一標識,存放Liferay生成的用戶ID
????
????private?String?initials;?//昵稱
????
????@Temporal(TemporalType.TIMESTAMP)
????private?java.util.Date?createTime;?//創建日期
????
????@Temporal(TemporalType.TIMESTAMP)
????private?java.util.Date?modifyTime;//修改日期
????
????private?String?createBy;//創建人
????private?String?modifyBy;//修改人

????

????/**?*//**?personal?attrrbutes?**/
????private?String?trueName;?//用戶真實姓名
????
????@Column(length?=?100)
????private?String?sex;?//性別
????
????@Temporal(TemporalType.TIMESTAMP)
????private?java.util.Date?birthday;?//出生年月日
????
????

????/**?*//**?enterprise?attrrbutes?**/
????@Column(length?=?10)
????private?int?capital;?//注冊資金(萬元)
????
????private?String?businessCategory;?//經營范圍
????private?String?legalRepresentative;?//法人代表
????private?String?businessLicense;?//工商營業執照號、社團登記證號碼
????
????@Column(length?=?100)
????private?String?identityType;?//標識證件類別?身份證:I、軍官證:M、護照:P、其他證件:O
???
????private?String?identityCard;?//有效證件號、法人有效證件號
????private?String?address;?//住址、注冊地址、辦公地址
????private?String?postalCode;?//郵政編碼
????private?String?telephone;?//聯系電話、單位聯系電話
????private?String?mobile;?//手機、單位聯系人手機
????private?String?fax;?//單位傳真、個人傳真
????private?String?mail;?//電子郵件
????private?String?url;?//網址
????????.......
???這里以查看動作的Controller為例

/**?*//**
?*?UserRegViewController
?*?@author?Allen
?*?@time?10:09:34?AM?Mar?3,?2008
?*/

public?class?UserRegViewController?extends?BaseController?
{

????private?UserRegisterService?userRegisterService;
????

????public?void?setUserRegisterService(UserRegisterService?userRegisterService)?
{
????????this.userRegisterService?=?userRegisterService;
????}
????
????@Override

????protected?void?doFillData(RenderRequest?req,?Map?model)?
{
????????//0)?get?user?id?in?the?portlet
????????String?uid?=?req.getRemoteUser();
????????//1)?find?the?user's?properties?in?gea
????????WsspUser?wsspUser;
????????if?(null?==?uid)?uid?=?"";
????????String?hql?=?"FROM?WsspUser?AS?u?WHERE?u.wsspPersonId?=??";

????????wsspUser?=?userRegisterService.findForUnique(hql,?new?Object[]
{uid});
????????//2)?if?cannot?find?the?user?by?liferay?user?id,?it?means?we?haven't?set?the?properties?

????????if?(null?==?wsspUser)?
{
????????????wsspUser?=?new?WsspUser();
????????????wsspUser.setWsspPersonId(uid);
????????}
????????model.put("wsspUser",?wsspUser);
????}
????
}
???創建userregister.xml配置文件
<?xml?version="1.0"?encoding="UTF-8"??>
<!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"../../dtd/spring-beans.dtd">
<beans>
????<bean?id="userRegControllerTemplate"?abstract="true">
????????<property?name="userRegisterService"?ref="userRegisterService"?/>
????</bean>
????
????<!--?view?page?for?user?details?-->
????<bean?id="userRegViewController"?class="net.allen.portlet.userregister.controller.UserRegViewController"?parent="userRegControllerTemplate">
????????<property?name="viewName"?value="userregister/userView"?/>
????</bean>
????
????<bean?id="userRegEditController"?class="net.allen.portlet.userregister.controller.UserRegEditController"?parent="userRegControllerTemplate">
????????<property?name="sessionForm"?value="true"/>
????????<property?name="commandName"?value="wsspUser"?/>
????????<property?name="commandClass"?value="net.allen.portlet.userregister.domain.WsspUser"?/>
????????<property?name="formView"?value="userregister/userEdit"?/>
????</bean>
????
????<!--?Handler?Mapping?-->
????<bean?id="parameterMappingInterceptor"?class="org.springframework.web.portlet.handler.ParameterMappingInterceptor"/>

????<bean?id="portletModeParameterHandlerMapping"?class="org.springframework.web.portlet.handler.PortletModeParameterHandlerMapping">
????????<property?name="order"?value="10"/>
????????<property?name="interceptors">
????????????<list>
????????????????<ref?bean="parameterMappingInterceptor"/>
????????????????<ref?bean="openSessionInViewInterceptor"/>
????????????</list>
????????</property>
????????<property?name="portletModeParameterMap">
????????????<map>
????????????????<entry?key="view">
????????????????????<map>
????????????????????????<entry?key="viewUser"><ref?bean="userRegViewController"/></entry>
????????????????????????<entry?key="editUser"><ref?bean="userRegEditController"/></entry>
????????????????????</map>
????????????????</entry>
????????????</map>
????????</property>
????</bean>

????<bean?id="portletModeHandlerMapping"?class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
????????<property?name="interceptors">
????????????<ref?bean="openSessionInViewInterceptor"/>
????????</property>
????????<property?name="portletModeMap">
????????????<map>
????????????????<entry?key="view"><ref?bean="userRegViewController"/></entry>
????????????</map>
????????</property>
????</bean>

????<!--?Exceptions?Handler?-->
????<bean?id="defaultExceptionHandler"?parent="defaultExceptionHandlerTemplate"/>
????
</beans>

5) 創建View層(采用JSP)
???????采用JSP處理表現層頁面,其中采用Liferay的portlet標簽做參數傳遞或觸發動作,不在這里贅述了。下面的一段示例顯示了EDIT和HOME的鏈接操作。 - EDIT - HOME -
·在portlet.xml中添加
<portlet>
????????<portlet-name>userregister</portlet-name>
????????<display-name>My?User?Register</display-name>
????????<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
????????<init-param>
????????????<name>contextConfigLocation</name>
????????????<value>classpath*:/config/spring/portlet/userregister.xml</value>
????????</init-param>
????????<supports>
????????????<mime-type>text/html</mime-type>
????????????<portlet-mode>view</portlet-mode>
????????</supports>
????????<portlet-info>
????????????<title>my?user?register</title>
????????</portlet-info>??????
????</portlet>
·在liferay-portlet.xml中添加
<portlet>
????????<portlet-name>userregister</portlet-name>
????????<restore-current-view>false</restore-current-view>
????</portlet>
開發過程:
0) 建立工程結構
整個工程

source包下的結構:

web包下的結構:

1) 創建Model
創建注冊信息的Model實體,如下代碼:







































































????????.......
2) 創建持久層和Service層
???包括持久層和服務層的類和配置文件都很簡單,不做表述了。我這里是將這兩層合并了。
?
3) 創建表現層Controller
???這里以查看動作的Controller為例










































4) 配置 Spring Portlet MVC
???創建userregister.xml配置文件


























































5) 創建View層(采用JSP)
???????采用JSP處理表現層頁面,其中采用Liferay的portlet標簽做參數傳遞或觸發動作,不在這里贅述了。下面的一段示例顯示了EDIT和HOME的鏈接操作。 - EDIT - HOME -
???...
<p?style="text-align:center;">-?
????<a?href="<portlet:renderURL>
????????????<portlet:param?name="action"?value="editUser"/>
????????????<portlet:param?name="ID"?value="${model.wsspUser.id}"/>
????????????<portlet:param?name="uid"?value="${model.wsspUser.wsspPersonId}"/>
????????</portlet:renderURL>"><spring:message?code="button.edit"/></a>?-?
????<a?href="<portlet:renderURL?portletMode="view"/>"><spring:message?code="button.home"/></a>
-</p>
???...








???...
6) 配置Liferay Portlet
·在portlet.xml中添加
















·在liferay-portlet.xml中添加




·在liferay-display.xml中添加(我將開發的Portlet添加到測試目錄中)
<category?name="category.test">
????????<portlet?id="userregister"?/>
????</category>
·在web.xml中添加


<!--liferay?Portlet?Context?Listener?Config-->
????<listener>
????????<listener-class>com.liferay.portal.kernel.servlet.PortletContextListener</listener-class>
????</listener>




<!--?配置Liferay?Servlet?-->
<servlet>
????????<servlet-name>liferayServlet</servlet-name>
????????<servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class>
????????<init-param>
????????????<param-name>portlet-class</param-name>
????????????<param-value>org.springframework.web.portlet.DispatcherPortlet</param-value>
????????</init-param>
????????<load-on-startup>0</load-on-startup>
????</servlet>



<servlet-mapping>
????????<servlet-name>liferayServlet</servlet-name>
????????<url-pattern>/userregister/*</url-pattern>
????</servlet-mapping>




<!--?添加liferay?taglib?-->
<taglib>
????????<taglib-uri>http://java.sun.com/portlet</taglib-uri>
????????<taglib-location>/WEB-INF/tld/liferay-portlet.tld</taglib-location>
????</taglib>
????<taglib>
????????<taglib-uri>http://liferay.com/tld/portlet</taglib-uri>
????????<taglib-location>/WEB-INF/tld/liferay-portlet-ext.tld</taglib-location>
????</taglib>????



?



·在web.xml中添加











































?
??????經過這六步的操作,一個簡單的Portlet就完成了,現在可以部署Portlet應用到服務器中,在Liferay里體驗自己開發的Portlet了,是不是很簡單呢,呵呵。
????????????????????????????????????????????????????????????????????????????????????????????THE END
????????????????????????????????????????????????????????????????????????????????????????????THE END