posts - 40,  comments - 187,  trackbacks - 0
          說在前面的話:
          ??????書接上回(間隔很久了,抱歉,各位看官!),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) 建立工程結構

          整個工程
          whole_project.jpg

          source包下的結構:
          src.jpg


          web包下的結構:
          web.jpg

          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;?//網址

          ????????.......

          2) 創建持久層和Service層

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

          ???這里以查看動作的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);
          ????}

          ????
          }

          4) 配置 Spring Portlet MVC

          ???創建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 -

          ???...
          <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中添加
          <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>

          ·在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>????


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


          ????????????????????????????????????????????????????????????????????????????????????????????THE END
          posted on 2008-07-03 13:25 小立飛刀 閱讀(3720) 評論(3)  編輯  收藏 所屬分類: Portal

          FeedBack:
          # re: 應用Spring Portlet MVC開發自己的Portlet(2)
          2008-07-11 15:34 | qqq
          羅主要是能提供代碼讓我們看看就好了  回復  更多評論
            
          # re: 應用Spring Portlet MVC開發自己的Portlet(2)
          2008-07-11 16:55 | 小立飛刀
          @qqq

          用空補個代碼上來 呵呵 最近很忙
            回復  更多評論
            
          # re: 應用Spring Portlet MVC開發自己的Portlet(2)
          2008-11-28 16:56 | freelancer
          How beautifully  回復  更多評論
            
          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          生存或毀滅,這是個必答之問題:是否應默默的忍受坎苛命運之無情打擊,還是應與深如大海之無涯苦難奮然為敵,并將其克服。此二抉擇,究竟是哪個較崇高?

          常用鏈接

          留言簿(12)

          隨筆分類(43)

          相冊

          收藏夾(7)

          朋友的博客

          電子資料

          搜索

          •  

          積分與排名

          • 積分 - 302749
          • 排名 - 192

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桂平市| 乌鲁木齐县| 天镇县| 陈巴尔虎旗| 墨脱县| 凤台县| 阜宁县| 绥滨县| 繁昌县| 西青区| 门头沟区| 威信县| 邵武市| 绥滨县| 堆龙德庆县| 寿宁县| 错那县| 呼和浩特市| 句容市| 敦煌市| 克什克腾旗| 阳朔县| 安龙县| 开原市| 绩溪县| 沧源| 磐石市| 明溪县| 富阳市| 定远县| 宜春市| 松滋市| 东明县| 浏阳市| 赤壁市| 岳西县| 科尔| 宜宾县| 滁州市| 榆林市| 湘乡市|