Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

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

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

          ?????
          為什么非得計算機(jī)當(dāng)前用戶名,因?yàn)?/span> portal 用了 ant deploy ,里面有個 xml 配置文件使用了系統(tǒng)環(huán)境變量。懶得
          去修改配置文件,就照它要求做。
          ?????
          我文件名是 release.avidis.properties ,文件內(nèi)容只一行:
          ????? lp.ext.dir=e:/cmproject/ext
          ?????
          即擴(kuò)展工程放置路徑。
          ??? (2)
          打開 myeclipse 里面 ant 視圖( window--> show view --> ant) , ant 視圖中,點(diǎn)擊添加,選擇 e:/cmproject/portal
          目錄下 build.xml
          ?????
          順序執(zhí)行 clean ,start ,build-ext 成功的話,在 e:/cmproject/ext 目錄下產(chǎn)生一系列的文件和目錄。
          ?????
          有時候在執(zhí)行過程中會失敗,報錯。主要是 portal 工程本身沒有 compile 完整。將 portal 重新 build
          project--build automatily )選擇上,注意,
          build 完成后,再執(zhí)行 clean ,start ,build-ext 完成標(biāo)志是 myeclipse 右下角進(jìn)度條完成 100%
          ??? (3)
          liferay-portal-tomcat-jdk5-4.1.0.zip 解壓到 e:/cmproject/ext/server/tomcat , e:/cmproject/ext
          目錄下我們可以看到 app.server.properties 文件,
          ?????
          同樣我們也要建立一個擴(kuò)展配置文件 app.server.${username}.properties ,文件內(nèi)容兩行:
          ??? ?lp.ext.dir=e:/cmproject/ext
          ??app.server.type=tomcat
          ? (4)
          同樣建立一個 java project 。工程名為 ext. myeclipse Navigator 里面可以看到 ext 工程的目錄結(jié)構(gòu)。
          配置 ext 工程 tomcat 服務(wù)器設(shè)置
          ? (1)
          打開 window --> preference -->myeclipse--> application servers 將其他應(yīng)用服務(wù)器 disabble 掉,
          找到 tomcat5 ,將 tomcat home diretory 指向 D:\cmproject\ext\servers\tomcat ,展開 tomcat5 jdk 選擇我們配置好的 jdk1.5
          ?Jdk
          選項(xiàng)下面 optional jave vm argument 輸入如下內(nèi)容:
          ??-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 文件內(nèi)容修改為:
          ??<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 工程數(shù)據(jù)庫 ?
          (1)?
          在服務(wù)器上 192.168.1.101 安裝建 mysql 數(shù)據(jù)庫服務(wù)。
          (2)?
          192.168.1.101 數(shù)據(jù)庫上執(zhí)行了 E:\cmproject\ext\sql\create 下的 create-mysql.sql
          ??? (3)
          mysql 數(shù)據(jù)庫上建立用戶名為 liferay password =liferay, 并將 databse lportal 的所有權(quán)限授予 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 服務(wù),啟動正常的話,在瀏覽器里輸入 http://localhost:8080
          可以看到 portal 系統(tǒng)了。
          ????
          ?portlet
          工程開發(fā)簡單說明
          ???
          我們看到無論是 portal ext 工程,目錄都很繁雜,其實(shí)我們只要關(guān)注 2 個目錄就夠了。 portal 里面的 portal-ejb
          portal-web Portal-ejb portal 工程已經(jīng)實(shí)現(xiàn)的所有 portlet java 代碼和部分資源文件 .portal-web 目錄是放置
          網(wǎng)頁文件和 portal 的配置文件。
          ? ext
          工程對應(yīng)目錄是 ext-ejb, ext-web portal-ejb 是放置我們自己開發(fā)的 portlet java 代碼。 ext-web 是自己開
          發(fā) portlet 對應(yīng)的網(wǎng)頁文件和配置文件。
          ??
          下面我們來新建一個自己 portlet
          ??
          這里我們采用 portal 里面代碼規(guī)范生成機(jī)制。對于持久化層和服務(wù)層的類都可以自動產(chǎn)生。我們的 portlet 功能很
          簡單就是從數(shù)據(jù)庫里面一個表中獲取數(shù)據(jù),并在頁面上顯示。
          建立業(yè)務(wù)數(shù)據(jù)表
          在數(shù)據(jù)庫里面新建一個表 a_user, 字段 userid,username,password. 并往表中插入幾個條數(shù)據(jù)。
          建立代碼模板配置文件
          1 )建立 service.xml 文件
          ext-ejb/src/com/ext/portlet 新建一個目錄 myuser, 在目錄下建立一個 service.xml 文件
          ??
          文件內(nèi)容為:
          <?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
          是和我們即將建立的和數(shù)據(jù)庫表 a_user 一一對應(yīng)實(shí)體的類名 , 可以和數(shù)據(jù)庫表名不同,
          但為方便起見一般和表名保持一致 -->
          (2)
          修改 ant 文件,增加 ant 任務(wù)
          建好 service.xml 文件后,我們在 ext-ejb 目錄下打開 build-perent.xml
          <target name="build-service">
          …….
          </target>
          下面添加任務(wù)
          <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 執(zhí)行 build-service-portlet-usertest 任務(wù)。
          我們發(fā)現(xiàn)在 ext-ejb/src/com/ext/portlet/myuser 下面多了幾個目錄和文件。這是都是系統(tǒng)自動產(chǎn)生的
          ebernate
          的實(shí)體類和持久化類。如果我們再細(xì)心些也可發(fā)現(xiàn)在 ext-ejb\classes\META-INF 目錄下配置文件
          都多些內(nèi)容。系統(tǒng)已經(jīng)自動將對應(yīng)的實(shí)體類、持久化類、工具類等配置為相應(yīng)的 javabean ejb webservice
          。無疑節(jié)省了很多時間,而且減少我們?nèi)斯づ渲玫腻e誤。

          業(yè)務(wù)實(shí)現(xiàn)編碼
          ?
          現(xiàn)在我們要實(shí)現(xiàn)一個查詢功能,將數(shù)據(jù)庫中表名 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 方式存儲。題外話,一般系統(tǒng)已經(jīng)自動產(chǎn)生了主要字段的查詢方法,
          我們可以直接拿來用或者稍作改動都可以使用。
          按一般慣例, a_userPersistence 一般是不暴露給外面類,我們都是通過它的一個持久化輔助類來調(diào)用。
          打開 a_userUtil.java, 同樣在里面增加方法 findAllUsername
          ?public static java.util.List findAllUsername ()
          ??????? throws com.liferay.portal.SystemException {
          ??????? return getPersistence().findAllUsername ();
          }
          然后我們在 spring service 層同樣增加一個方法。 Service 層的接口 a_userLocalService 里面增加一個函數(shù)
          public List getAllUsers() throws SystemException;
          Service 層接口 a_userLocalService 的實(shí)現(xiàn) a_userLocalServiceImpl.java 增加對應(yīng)方法,并調(diào)用持久層輔
          助類 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 層接口對應(yīng)具體實(shí)現(xiàn)是由工廠類指定。他們捆綁關(guān)系可以查看 spring 配置文件信息。
          在執(zhí)行 ant build-service-portlet-usertest 任務(wù)已經(jīng)完成了。
          myuser/action 目錄下建立一個 ViewUserAction.java 文件,完成響應(yīng)客戶端請求。
          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 的窗口狀態(tài)時普通,則定向到一個叫 portlet.ext.myuser.view 的目標(biāo)上。
          如果窗口狀態(tài)是最大化,那么就從調(diào)用 userLocalServiceUtil, 從數(shù)據(jù)庫里面獲取所有人員信息。
          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 就可以了。
          現(xiàn)在 portlet 的內(nèi)容是空的,我們用 jsp 頁面來展示用戶名稱方式來填充 portlet 里面內(nèi)容。
          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 內(nèi)容是顯示默認(rèn)的初始用戶名。具體值從初始化配置參數(shù)里獲取。

          建立 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 頁面目的是展示所有從數(shù)據(jù)庫里面取出來的用戶名。

          Ok ,完成以上工作后,我們整個 portlet 編碼工作已經(jīng)宣告結(jié)束,接下來的是配置 portlet
          參數(shù)工作。
          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 對應(yīng)的 actionurl <portlet-preferences>
          里面參數(shù)值是提供給這個 portlet 使用的參數(shù)初始值。這里配置是指 portlet 里面使用到參數(shù)名 user 的值是 jack
          portlet 不需要初始值參數(shù),則該項(xiàng)不需要配置。

          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 文件節(jié)點(diǎn) <category name="category.test">
          下面添加
          <portlet id="EXT_users" /> id
          必須和 portlet-ext 里面的 <portlet-name> 一致。

          struts-config.xml 文件里面添加內(nèi)容:
          <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>

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

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

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

          tiles-defs.xml 文件里面添加內(nèi)容:
          <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 參數(shù) path 值對應(yīng)的,指向真正的目標(biāo)頁面。

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

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

          ?

          主站蜘蛛池模板: 简阳市| 上饶县| 阿克| 汪清县| 旬邑县| 图木舒克市| 丰城市| 共和县| 黔南| 青田县| 余干县| 临湘市| 花莲县| 汽车| 林甸县| 新疆| 杭锦旗| 安新县| 庆阳市| 澳门| 嘉禾县| 太保市| 浪卡子县| 城口县| 正镶白旗| 吉木乃县| 包头市| 张家界市| 中方县| 梅河口市| 台北县| 定陶县| 龙陵县| 平湖市| 乌什县| 建宁县| 宣恩县| 黎平县| 麦盖提县| 收藏| 交城县|