<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 會寫信息到數據庫中。

    ?

    主站蜘蛛池模板: 亚洲欧洲日本在线观看 | 在线A级毛片无码免费真人| 亚洲免费在线视频| 久久这里只精品99re免费| 国产亚洲人成网站观看| 免费看无码特级毛片| 亚洲AV无码久久寂寞少妇| 久久成人免费播放网站| 久久亚洲sm情趣捆绑调教| 91香蕉国产线在线观看免费| 亚洲欧洲日韩综合| 野花高清在线观看免费3中文 | 国产AV无码专区亚洲AV蜜芽 | 亚洲精品456播放| 全部一级一级毛片免费看| 亚洲乱码国产一区网址| 二个人看的www免费视频| 久久亚洲国产午夜精品理论片| 成人性生交大片免费看中文| 亚洲黄网在线观看| 好大好深好猛好爽视频免费| 美女尿口扒开图片免费| 国产亚洲AV无码AV男人的天堂| 在线人成免费视频69国产| 精品无码一区二区三区亚洲桃色| 中文字幕影片免费在线观看 | 中文字幕免费播放| 亚洲高清视频免费| 日本无吗免费一二区| 无遮挡国产高潮视频免费观看| 日韩亚洲欧洲在线com91tv| 亚洲国产精品免费在线观看| 亚洲av片在线观看| 久久精品国产亚洲7777| 91精品成人免费国产片| 一级毛片免费在线观看网站| 亚洲美女一区二区三区| 又黄又爽的视频免费看| 全部免费毛片在线播放| 黄网站色视频免费看无下截| 久久久久久亚洲AV无码专区|