搭建開發環境
安裝
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
會寫信息到數據庫中。
?