Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          搭建開發環境
          安裝 jdk1.4.2,jikes1.22,ant1.6.5
          ????
          以安裝在 c 盤為例
          ????
          設置環境變量:
          ???? ANT_HOME? =C:\apache-ant-1.6.5
          ???? JAVA_HOME =C:\jdk1.5
          ???? JIKES_HOME=C:\jikes1.22
          ????
          設置 path 變量 , 增加下面信息
          ???? %ANT_HOME%\bin;%JAVA_HOME%\bin;%JIKES_HOME%\bin;
          ????
          部分情況 ,classpath 變量會干擾環境,可以刪除。但我機器上沒刪除 classpath 都可以正常運作。
          ????
          設置完環境變量后,最好重新啟動機器,保證設置生效。
          安裝 Myeclipse 并建立 portal 工程
          準備好 myecipse 軟件、 iferay-portal-src-4.1.0.zip
          ???? (1)
          安裝 myeclipse
          ???? (2)
          e 盤建立 E:\cmproject 目錄,將 liferay-portal-src-4.1.0.zip 解壓到 e:\cmproject\portal 目錄下 ,
          ???? (3)
          進入 myeclipse ,設置 file-->switchworkspace 輸入 E:\cmproject ok 確認
          ???? (4)File -->New-->project-->java project
          輸入項目名稱為 portal, 其他默認, finish 結束
          ?????
          如果一切順利,則在 myeclipse 左側邊 Navigator 上看到 portal 的整個目錄結構
          建立 ext 工程(擴展環境)
          ??? (1)
          myeclipse 下,切換到 resource 視圖模式,展開 portal 工程目錄,我們可看到一個 release.properties 文件,
          實際上我們要建一個它的擴展配置文件,
          ???
          文件名為 release.${username}.properties ${username} 是計算機當前用戶名,比如 administrator,apple 等等 .
          在計算機開始菜單運行 cmd 出來的
          c:\document and setting\username>

          ?????
          為什么非得計算機當前用戶名,因為 portal 用了 ant deploy ,里面有個 xml 配置文件使用了系統環境變量。懶得
          去修改配置文件,就照它要求做。
          ?????
          我文件名是 release.avidis.properties ,文件內容只一行:
          ????? lp.ext.dir=e:/cmproject/ext
          ?????
          即擴展工程放置路徑。
          ??? (2)
          打開 myeclipse 里面 ant 視圖( window--> show view --> ant) , ant 視圖中,點擊添加,選擇 e:/cmproject/portal
          目錄下 build.xml
          ?????
          順序執行 clean ,start ,build-ext 成功的話,在 e:/cmproject/ext 目錄下產生一系列的文件和目錄。
          ?????
          有時候在執行過程中會失敗,報錯。主要是 portal 工程本身沒有 compile 完整。將 portal 重新 build
          project--build automatily )選擇上,注意,
          build 完成后,再執行 clean ,start ,build-ext 完成標志是 myeclipse 右下角進度條完成 100%
          ??? (3)
          liferay-portal-tomcat-jdk5-4.1.0.zip 解壓到 e:/cmproject/ext/server/tomcat , e:/cmproject/ext
          目錄下我們可以看到 app.server.properties 文件,
          ?????
          同樣我們也要建立一個擴展配置文件 app.server.${username}.properties ,文件內容兩行:
          ??? ?lp.ext.dir=e:/cmproject/ext
          ??app.server.type=tomcat
          ? (4)
          同樣建立一個 java project 。工程名為 ext. myeclipse Navigator 里面可以看到 ext 工程的目錄結構。
          配置 ext 工程 tomcat 服務器設置
          ? (1)
          打開 window --> preference -->myeclipse--> application servers 將其他應用服務器 disabble 掉,
          找到 tomcat5 ,將 tomcat home diretory 指向 D:\cmproject\ext\servers\tomcat ,展開 tomcat5 jdk 選擇我們配置好的 jdk1.5
          ?Jdk
          選項下面 optional jave vm argument 輸入如下內容:
          ??-Xms256m
          ??-Xmx512m
          ??-Djava.security.auth.login.config=d:/cmproject/ext/servers/tomcat/conf/jaas.config
          ? (2)
          E:\cmproject\ext\servers\tomcat\conf\Catalina\localhost 目錄下的 ROOT.xml 文件內容修改為:
          ??<Context path="" docBase="ROOT" debug="0" reloadable="true"
          ?????????? crossContext="true">
          ??????????
          ?????????? <Resource name="jdbc/LiferayPool" auth="Container"
          ?????????????? type="javax.sql.DataSource" maxActive="100" maxIdle="30"
          ?????????????? maxWait="10000" username="liferay" password="liferay"
          ?????????????? driverClassName="com.mysql.jdbc.Driver"
          ?????????????? url="jdbc:mysql://192.168.1.101/lportal">
          ?????????? </Resource>
          ??????????
          ?????????? <Resource name="mail/MailSession" auth="Container"
          ?????????????? type="javax.mail.Session" mail.transport.protocol="smtp"
          ?????????????? mail.smtp.host="localhost" />
          ??????????
          ?????????? <Realm className="org.apache.catalina.realm.JAASRealm"
          ?????????????? appName="PortalRealm"
          ?????????????? userClassNames="com.liferay.portal.security.jaas.PortalPrincipal"
          ?????????????? roleClassNames="com.liferay.portal.security.jaas.PortalRole"
          ?????????????? debug="99" useContextClassLoader="false" />
          ?????? </Context>
          建立 ext 工程數據庫 ?
          (1)?
          在服務器上 192.168.1.101 安裝建 mysql 數據庫服務。
          (2)?
          192.168.1.101 數據庫上執行了 E:\cmproject\ext\sql\create 下的 create-mysql.sql
          ??? (3)
          mysql 數據庫上建立用戶名為 liferay password =liferay, 并將 databse lportal 的所有權限授予 liferay
          lportal create-mysql 腳本自動建立的)
          (4)?
          解壓 mysql-connector-java-3.1.12.zip
          mysql-connector-java-3.1.12-bin.jar
          拷貝到 e:\cmproject\ext\servers\tomcat\common\lib 下。使 mysql jdbc 啟動程序正常可用。

          以上所有步驟順利完成后,啟動 myeclipse 里面 tomcat 服務,啟動正常的話,在瀏覽器里輸入 http://localhost:8080
          可以看到 portal 系統了。
          ????
          ?portlet
          工程開發簡單說明
          ???
          我們看到無論是 portal ext 工程,目錄都很繁雜,其實我們只要關注 2 個目錄就夠了。 portal 里面的 portal-ejb
          portal-web Portal-ejb portal 工程已經實現的所有 portlet java 代碼和部分資源文件 .portal-web 目錄是放置
          網頁文件和 portal 的配置文件。
          ? ext
          工程對應目錄是 ext-ejb, ext-web portal-ejb 是放置我們自己開發的 portlet java 代碼。 ext-web 是自己開
          portlet 對應的網頁文件和配置文件。
          ??
          下面我們來新建一個自己 portlet
          ??
          這里我們采用 portal 里面代碼規范生成機制。對于持久化層和服務層的類都可以自動產生。我們的 portlet 功能很
          簡單就是從數據庫里面一個表中獲取數據,并在頁面上顯示。
          建立業務數據表
          在數據庫里面新建一個表 a_user, 字段 userid,username,password. 并往表中插入幾個條數據。
          建立代碼模板配置文件
          1 )建立 service.xml 文件
          ext-ejb/src/com/ext/portlet 新建一個目錄 myuser, 在目錄下建立一個 service.xml 文件
          ??
          文件內容為:
          <?xml version="1.0"?>
          <!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 4.0.0//EN"
          " <service-builder root-dir=".." package-path="com.ext.portlet">
          ?<portlet name="Reports" short-name="Reports" />
          ?<entity name="ReportsEntry" local-service="false" remote-service="true"
          persistence-class="com.ext.portlet.reports.service.persistence.ReportsEntryPersistence">

          ??<!-- PK fields -->

          ??<column name="entryId" type="String" primary="true" />

          ??<!-- Audit fields -->

          ??<column name="companyId" type="String" />
          ??<column name="userId" type="String" />
          ??<column name="userName" type="String" />
          ??<column name="createDate" type="Date" />
          ??<column name="modifiedDate" type="Date" />

          ??<!-- Other fields -->

          ??<column name="name" type="String" />

          ??<!-- Order -->

          ??<order by="asc">
          ???<order-column name="name" case-sensitive="false" />
          ??</order>

          ??<!-- Finder methods -->

          ??<finder name="CompanyId" return-type="Collection">
          ???<finder-column name="companyId" />
          ??</finder>
          ??<finder name="UserId" return-type="Collection">
          ???<finder-column name="userId" />
          ??</finder>

          ??<!-- References -->

          ??<reference package-path="com.liferay.portal" entity="User" />
          ?</entity>
          ?<exceptions>
          ??<exception>EntryName</exception>
          ?</exceptions>
          </service-builder>
          ???
          <!--package-path
          是指我們即將建立 portlet 的上級目錄 -->
          <!-- portlet name
          就是我們新建文件夾名稱 myuser short-name 沒有作研究不太清楚使用途徑 -->
          <!--entity name
          是和我們即將建立的和數據庫表 a_user 一一對應實體的類名 , 可以和數據庫表名不同,
          但為方便起見一般和表名保持一致 -->
          (2)
          修改 ant 文件,增加 ant 任務
          建好 service.xml 文件后,我們在 ext-ejb 目錄下打開 build-perent.xml
          <target name="build-service">
          …….
          </target>
          下面添加任務
          <target name="build-service-portlet-usertest">
          ?<antcall target="build-service">
          ?<param name="service.file"
          ?value="src/com/ext/portlet/myuser/service.xml" />
          ?</antcall>
          </target>
          然后在 myexlipse ant 視圖里面打開 ext-ejb 目錄下的 build.xml 執行 build-service-portlet-usertest 任務。
          我們發現在 ext-ejb/src/com/ext/portlet/myuser 下面多了幾個目錄和文件。這是都是系統自動產生的
          ebernate
          的實體類和持久化類。如果我們再細心些也可發現在 ext-ejb\classes\META-INF 目錄下配置文件
          都多些內容。系統已經自動將對應的實體類、持久化類、工具類等配置為相應的 javabean ejb webservice
          。無疑節省了很多時間,而且減少我們人工配置的錯誤。

          業務實現編碼
          ?
          現在我們要實現一個查詢功能,將數據庫中表名 a_user 中所有記錄的 username 查詢出來,并顯示在前臺。
          ?
          打開 myuser/service/Persistence a_userPersistence.java 文件,建立一個方法名為 findAllUsername

          public List findAllUsername () throws SystemException {
          ??????? Session session = null;
          ??????? try {
          ??????????? session = openSession();
          ??????????? StringBuffer query = new StringBuffer();
          ??????????? query.append("FROM com.ext.portlet.myuser.model.a_user ");
          ??????????? Query q = session.createQuery(query.toString());
          ??????????? q.setCacheable(true);
          ??????????? return q.list();
          ??????? } catch (HibernateException he) {
          ??????????? throw new SystemException(he);
          ??????? } finally {
          ??????????? closeSession(session);
          ??????? }
          }

          返回表 a_user 所有記錄,并以 list 方式存儲。題外話,一般系統已經自動產生了主要字段的查詢方法,
          我們可以直接拿來用或者稍作改動都可以使用。
          按一般慣例, a_userPersistence 一般是不暴露給外面類,我們都是通過它的一個持久化輔助類來調用。
          打開 a_userUtil.java, 同樣在里面增加方法 findAllUsername
          ?public static java.util.List findAllUsername ()
          ??????? throws com.liferay.portal.SystemException {
          ??????? return getPersistence().findAllUsername ();
          }
          然后我們在 spring service 層同樣增加一個方法。 Service 層的接口 a_userLocalService 里面增加一個函數
          public List getAllUsers() throws SystemException;
          Service 層接口 a_userLocalService 的實現 a_userLocalServiceImpl.java 增加對應方法,并調用持久層輔
          助類 userUtil 方法 findAllUsername
          ??public List getAllUsers() throws SystemException {
          ???return a_userUtil. findAllUsername ();
          ?}
          同樣 spring service 也是通過輔助類作為對外唯一入口,所以在 a_userLocalServiceUtil 里面增加一
          個方法 findAllUsername 作為 service 層的方法 findAllUsername 的入口。
          public static List getAllUsers() throws SystemException{
          ??
          ??try{
          ???a_userLocalService service = a_userLocalServiceFactory.getService();
          ???return service.getAllUsers();
          ??}catch (SystemException se) {
          ???throw se;
          ??}
          ??catch (Exception e) {
          ???throw new com.liferay.portal.SystemException(e);
          ??}
          ??
          ?}
          需要注意的是 service 層接口對應具體實現是由工廠類指定。他們捆綁關系可以查看 spring 配置文件信息。
          在執行 ant build-service-portlet-usertest 任務已經完成了。
          myuser/action 目錄下建立一個 ViewUserAction.java 文件,完成響應客戶端請求。
          public class ViewUsersAction extends PortletAction {

          ?public ActionForward render(
          ???ActionMapping mapping, ActionForm form, PortletConfig config,
          ???RenderRequest req, RenderResponse res)
          ??throws Exception {

          ??if (req.getWindowState().equals(WindowState.NORMAL)) {
          ???return mapping.findForward("portlet.ext.myuser.view");
          ??}
          ??else {
          ???
          ???List users = a_userLocalServiceUtil.getAllUsers();
          ???List usernames = new ArrayList();
          ???for (int i=0;i<users.size();i++){
          ????usernames.add( ((a_user) users.get(i)).getUsername());
          ???}
          ???req.setAttribute("users", usernames);

          ?return mapping.findForward("portlet.ext.myuser.view_users");
          ??}
          ?}
          }
          里面大概功能是如果 porlet 的窗口狀態時普通,則定向到一個叫 portlet.ext.myuser.view 的目標上。
          如果窗口狀態是最大化,那么就從調用 userLocalServiceUtil, 從數據庫里面獲取所有人員信息。
          Portlet
          的生成
          建立自己的 portlet 。在 myuser 下面新建文件 UsersPortlet.java
          public class UsersPortlet extends StrutsPortlet {
          ?public void doView(RenderRequest req, RenderResponse res)
          ??throws IOException, PortletException {

          ??PortletPreferences prefs = req.getPreferences();

          ??System.out.println(prefs.getValue("user", ""));

          ??super.doView(req, res);
          ?}
          }
          portlet 重載了 doview 方法。如果自己 portlet view edit 有自己特性,那么只要重載 doview doedit 就可以了。
          現在 portlet 的內容是空的,我們用 jsp 頁面來展示用戶名稱方式來填充 portlet 里面內容。
          ext-web/docroot/html/portlet/ext 目錄下建立目錄 myuser, 并在 myuser 目錄下建立 init.jsp 文件

          <%@ include file="/html/common/init.jsp" %>

          <portlet:defineObjects />

          <% PortletPreferences prefs = renderRequest.getPreferences();

          建立 view.jsp 文件:

          <%@ include file="/html/portlet/ext/myuser/init.jsp" %>
          <a href="<portlet:renderURL
          windowState="<%= WindowState.MAXIMIZED.toString() %>" />">
          MyUser
          ?<%= prefs.getValue("user", "") %>
          </a>
          jsp 內容是顯示默認的初始用戶名。具體值從初始化配置參數里獲取。

          建立 view_users.jsp
          <%@ include file="/html/portlet/ext/myuser/init.jsp" %>
          <% List reports = (List)request.getAttribute("users");%>

          <%
          for (int i = 0; i < reports.size(); i++) {
          ?String reportName = (String)reports.get(i);
          %>

          ?<%= reportName %><br>

          <%
          }
          %>
          jsp 頁面目的是展示所有從數據庫里面取出來的用戶名。

          Ok ,完成以上工作后,我們整個 portlet 編碼工作已經宣告結束,接下來的是配置 portlet
          參數工作。
          Portlet
          的配置

          portlet 配置信息文件存放 Ext-web/web-inf 目錄下,在 port-ext.xml 文件里面添加

          <portlet>
          ??<portlet-name>EXT_users</portlet-name>
          ??<display-name>myusers</display-name>
          ??<portlet-class>com.ext.portlet.myuser.UsersPortlet</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>jack</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> 必須唯一,不得已有 portlet 名字沖突。 <display-name> 也必須唯一。
          <portlet-class>
          指向我們的建立 portlet 類。
          ?<name>view-action</name>
          里面值是指 view 這個 action 對應的 actionurl <portlet-preferences>
          里面參數值是提供給這個 portlet 使用的參數初始值。這里配置是指 portlet 里面使用到參數名 user 的值是 jack
          portlet 不需要初始值參數,則該項不需要配置。

          liferay-portlet-ext.xml 文件里面添加
          <portlet>
          ??<portlet-name>EXT_users</portlet-name>
          ??<struts-path>ext/myuser</struts-path>
          ??<use-default-template>false</use-default-template>
          </portlet>

          <portlet-name> 的值必須和 portlet-ext.xml 文件里面 <portlet-name> 值一致。


          liferay-display Xml 文件節點 <category name="category.test">
          下面添加
          <portlet id="EXT_users" /> id
          必須和 portlet-ext 里面的 <portlet-name> 一致。

          struts-config.xml 文件里面添加內容:
          <action path="/ext/myuser/view_users"
          ???????? type="com.ext.portlet.myuser.action.ViewUsersAction">
          <forward name="portlet.ext.myuser.view_1"
          ??path="portlet.ext.myuser.view" />
          <forward name="portlet.ext.myuser.view_users_1"
          path="portlet.ext.myuser.view_users" />
          </action>

          就是說,當前臺提交一個 actionUrl /ext/myuser/view_users 請求的時候,由 ViewUsersAction 負責處理這個
          action
          操作。后面 2 forward 指的是在 ViewUsersAction 定向返回請求目標頁面。
          …………
          return mapping.findForward("portlet.ext.myuser.view_1");

          ………
          return mapping.findForward("portlet.ext.myuser.view_users_1");

          findForward 的值為避免與其他 findForward 值沖突,一般將包名也帶上,保證不會重名。

          tiles-defs.xml 文件里面添加內容:
          <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>

          name 的值即隨同 struct-config.xml 配置信息里面 forward 參數 path 值對應的,指向真正的目標頁面。

          最后我們在 ext-ejb/classes/content 目錄下 language-ext.properties 文件里面增加內容:
          javax.portlet.title.EXT_user=MyUsers
          portlet 顯示出來時候,在 portlet 上面標題信息。

          Portlet 常見問題
          1.?
          運行提示 portlet path 找不到,則一般是 liferay-port-ext 文件里面 portlet struts–path 有問題。
          2.?
          啟動提示 jaas.config 錯誤,沒有在 tomcat jdk 參數配置 jaas.config 文件或配置路徑不對
          3.?
          提示 html/../.. 找不到,一般是 struts-config 文件里面 path 路徑有問題。
          4.?
          有執行和數據庫存取數據時候,提示 “columnname_” 字段不存在,去修改 ext-hbm.xml 文件, ant 執行
          build service
          任務時候,產生 ext-hbm.xml 信息有時會不準確,將對應的 <property name="columnname"
          column="columnname_ " />
          column 調整為數據庫對應正確的字段名。
          5.?
          大家在清除不用的 portlet 時候,請先登錄系統,將不用的 portlet 關閉,然后再刪除或屏蔽對應的代碼。
          不然直接刪除或屏蔽代碼,重新啟動后,會提示 portlet 找不到。注冊后的 portlet 會寫信息到數據庫中。

          ?

          主站蜘蛛池模板: 团风县| 克什克腾旗| 永丰县| 阿城市| 建宁县| 绥德县| 阳朔县| 平阴县| 石柱| 中方县| 丰镇市| 陵川县| 固始县| 满城县| 长宁县| 乌鲁木齐县| 天长市| 德令哈市| 清徐县| 明水县| 盐源县| 同德县| 平乐县| 遂川县| 穆棱市| 石门县| 佛冈县| 海口市| 祁阳县| 安庆市| 横峰县| 晋中市| 内乡县| 唐河县| 延寿县| 本溪市| 广州市| 涟水县| 南江县| 景德镇市| 浦县|