基于Tomcat开发Portlet

基于Tomcat开发Portlet

本节通过配置一个基于LiferayTomcat绑定二进制包建立一个扩展开发Liferay的环境,这个环境特别适用于对新的Portlet组件进行调试和开发。这个方法几乎不会修改Liferay自身的代码,所有的改动都是在扩展环境里完成,可以在Liferay升级时比较容易地实现扩展了的功能的迁移。但这个方法也有一个缺点,就是开发的Portlet如果不执行deploy步骤,就不能在Liferay里启用。因此在开发和调试Portlet的过程中,一般还是在Liferay以外的环境中开发调试好,之后移植到此扩展开发环境中,与Liferay联调,成功后部署应用。具体工作中,可以与后面“改进和调试Liferay自身代码”一节中调试Portlet的方法稍作比较,选择适合自己情况的方法。

 

3.1  配置扩展开发环境

为了方便进行自己的修改和定制开发,同时又能与Liferay的更新保持兼容,我们使用单独的目录来放置自己的修改,这样在Liferay发布新版本时,可以直接升级Liferay部署,而不会与我们的修改相冲突。具体地,我使用了d:\liferay\ext 目录来放置所有的扩展(包括JSPclass文件及依赖库等)。

首先要在d:\liferay\portal 目录下建立一个名为“release.${username}.properties”的配置文件,其中${username}就是当前Windows登陆的用户名,可以通过“开始菜单-》运行-》cmd.exe”后显示的默认路径看到,跟在“Documents and Settings”字样后面的就是当前登陆的用户名。这样,我的配置文件的名称是release.administrator.properties 。文件的内容只写一行:lp.ext.dir={Liferay}\ext其中“{Liferay}”指的是Liferay源代码存放的上级目录,比如我写的这一行就是:

lp.ext.dir=d:\liferay\ext

 回到上一节建立好的Eclipse中的Ant视图中,双击展开根节点Portal,应该可以看到很多Ant任务,顺序执行 clean, start,build-ext 。屏幕下方的命令行窗口会跳跃大堆大堆的文字提示信息,如果一切正确,那么其中不应该有红色的错误信息(绝大多数此处可能出现的错误都是配置文件不正确所引起的)。一切正常的话,那么d:\liferay\ext 目录下应该生成了很多东西了。

(转载者注:一种错误有可能是Jikes缺少,其余基本上是路径配置问题)

 

我们将前面准备好的与Tomcat绑定的Liferay Professional版本的压缩包解压到d:\liferay\ext\servers\tomcat 目录下,并且在d:\liferay\ext 目录下建立一个名为app.server.{username}.properties的文件,在我这也就是app.server.administrator.properties,文件内容写如下两行:

lp.ext.dir={Liferay}\ext

app.server.type=tomcat

 

在我这也就是:

lp.ext.dir=d:\liferay\ext

app.server.type=tomcat

 

然后仿照前面在Eclipse里建立新的Java工程的方法,建立一个新的Java项目,指向d:\liferay\ext 目录,也就是说,在输入Java项目的项目名称时,输入“ext”而不是前面输入“portal”。

 

3.2  添加插件支持

为了能够在基于TomcatLiferay Porfessional版本的运行环境上实现我们编写的插件的调试,需要给Eclipse环境添加一个借助

Tomcat服务器开展调试的插件,也就是Sysdeo这个插件,可以到 http://www.sysdeo.com/eclipse/tomcatplugin 下载,我下载的是tomcatPluginV31.zip文件(将下载的这个zip文件包解压,拷贝到Eclipse安装目录的plugins目录下,比如我这里就是拷贝到了C:\j2sdk1.4.1_07\eclipse\plugins\ 目录下。关闭并且重启Eclipse,如果插件安装成功,那么在界面的左上角应该可以看到Tomcat的图标(转载者注:一只小猫,另一只小猫身上带着一个红叉)。现在我们来配置Sysdeo插件的参数,在Eclipse里“Windows->Preferences”,选择“Tomcat”标签,选择“Version 5.x”版本,然后修改参数“Tomcat Home”为“{Liferay}\ext\servers\tomcat”,在我这里也就是“D:\liferay\ext\servers\tomcat ”;修改参数“Configuration File”为“{Liferay}\ext\servers\tomcat\conf\server.xml”,在我这里也就是

D:\liferay\ext\servers\tomcat\conf\server.xml”。

 接着我们要继续给Tomcat执行的JVM虚拟机增加运行参数,启用JAAS支持以及扩大默认内存占用量,也就是展开“Tomcat”标签,选择“JVM Settings”,在“Append to JVM Parameters”选择“Add”,先添加

-Djava.security.auth.login.config=d:\liferay/ext/servers/tomcat/conf/jaas.config

再添加

-Xmx512m

还要在这里修改Tomcat运行所使用的虚拟机,要注意这里必须指定一个JDK附带的虚拟机而不可以指向JRE附带的虚拟机环境,否则Tomcat在运行过程中会出现错误。如果这里的下拉选项没有出现与JDK中虚拟机有关的选项,那么我们要首先手动建立一个,我们需要到Java标签下的“Installed JREs”,选择“Add”,“JRE home directory”选择“C:\j2sdk1.4.1_07”,给这个JRE环境起个名字,比如“J2SDK1.4.1_07”,之后点Ok保存设置,再重新开启“Window->Preferences”对话框,到Tomcat的“JVM Settings”项选择刚才建立的“J2SDK1.4.1_07”这个JRE就可以了。

 这样,只要再配置好Liferay的数据库连接参数,就可以通过点击Eclipse里面的Tomcat图标启动Tomcat服务器了。(转载者注:

可以通过浏览器测试。地址http://localhost:8080

________________________________________

 

3.3  配置数据库和执行Liferay

这里选择了使用MySql数据库,到MySql官方网站下载

MySqlWindows下的可执行包mysql-5.0.21-win32.zip

MySqlJDBC驱动程序mysql-connector-java-3.1.12.zip

MySql管理工具mysql-administrator-1.1.9-win.msi

MySql数据查询工具mysql-query-browser-1.1.20-win.msi

MySql数据建模工具mysql-workbench-1.0.6-beta-win32.msi

 

JDBC驱动外,其他几个包都可以双击执行安装向导完成。安装完毕后,使用MySql数据查询工具Query Browser连接数据库,选择

File->Open Script”载入D:\liferay\ext\sql\create 目录下的create-mysql.sql 文件,点击“Execute”按钮执行。刷新会发现得到了新的数据库实例lportal

 使用MySql管理工具administrator,以root用户连接数据库,点“User Administration”,在左下方用户帐号列表一栏点击右键

,建立新用户liferay,输入密码sql606,点击“Schema Privileges”标签,点击lportal数据库,把除了grant权限外的所有权限

都给liferay这个用户,点击“Apply changes”按钮保存这个新账户。这样完成了数据导入以及建立MySql数据库用户的过程。

 

编辑D:\liferay\ext\servers\tomcat\conf\Catalina\localhost 目录下的ROOT.xml文件,将其中的

<Resource

                name="jdbc/LiferayPool"

                auth="Container"

                type="javax.sql.DataSource"

                driverClassName="org.hsqldb.jdbcDriver"

                url="jdbc:hsqldb:test"

                username="sa"

                password=""

                maxActive="20"

        />

替换为

<Resource

        name="jdbc/LiferayPool"

        auth="Container"

        type="javax.sql.DataSource"

        driverClassName="com.mysql.jdbc.Driver"

        url="jdbc:mysql://localhost/lportal?useUnicode=true&amp;characterEncoding=UTF-8"

        username="liferay"

        password="sql606"

        maxActive="100"

        maxIdle="30"

        maxWait="10000"

    />

请注意,这里如果按照官方文档的说法设置会出现错误,官方文档将数据库url中的“&”错误地写成了“&”,会造成Tomcat启动失败。

 

再解压MySqlJDBC驱动程序mysql-connector-java-3.1.12.zip 中的mysql-connector-java-3.1.12-bin.jar 文件,复制到

D:\liferay\ext\servers\tomcat\common\lib 目录下,使得Liferay能够找到MySqlJDBC驱动。

 这样数据库有关的内容已经全部配置完成,可以点击Eclipse里面的Tomcat图标启动Liferay了,如果没有出现错误,那么已经可以用浏览器访问http://localhost:8080 访问到Liferay Professional版本的Tomcat服务。

这里要注意,Sysdeo插件与LiferayTomcat绑定二进制包默认指定的Hypersonic数据库驱动有冲突,所以我们在本节使用了MySql

数据库。如果一定要使用Hypersonic数据库的话,就不能通过Sysdeo插件启动Tomcat,而需要直接执行

D:\liferay\ext\servers\tomcat\bin目录下的startup.bat来启动。

 3.4  完成一个最简单的JSPPortlet

我们通过完成一个最简单的类似Hello World那样的JSP Portlet来展示Portlet的基本组成部分,更复杂的功能或者基于Structs等框架的Portlet请参见后续文档。

 D:\liferay\ext\ext-web\docroot\html\portlet\ext 目录建立一个新的文件夹myjspportlet 。接着打开D:\liferay\ext\ext-web\docroot\WEB-INF 文件夹下的portlet-ext.xml 文件进行编辑,加入对这个即将建立的新Portlet的描述,如下:

<portlet>

  <portlet-name>EXT_2</portlet-name>

  <display-name>My JSPPortlet</display-name>

  <portlet-class>com.liferay.portlet.JSPPortlet</portlet-class>

  <init-param>

    <name>view-jsp</name>

    <value>/portlet/ext/myjspportlet/view.jsp</value>

  </init-param>

  <expiration-cache>300</expiration-cache>

  <supports>

    <mime-type>text/html</mime-type>

  </supports>

  <portlet-info>

    <title>My JSP Portlet</title>

  </portlet-info>

  <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   记录此PortletPortal中的显示名称,在将Portlet加入到Portal中时如果看到了这个名字,那么就可以找到现在编写的这个Portlet组件,此名称不必是唯一的。

portlet-class    描述与此Portlet对应的Java类的完整路径。

init-param        通过name/value对的形式指定此Portlet初始化时的参数。

expiration-cache      定义Portlet输出缓存的超时时间,以秒为单位,超出这里指定的时间后就认为Portlet的输出已经超时了,如果这里是-1则说明输出永远不超时。

supports  包括所支持的MIME格式,同时定义对一种特定的MIME格式,此Portlet所支持的模式,所有的Portlet都必须支持View模式。

portlet-info       定义Portlet有关的信息。

security-role-ref       包含Web应用与系统角色之间的映射,在Liferay中,这里表示什么样的角色有权限访问此Portlet。(

一般来讲,Power User有权个人化Portal,而User无权进行个人化)

现在我们已经完成了对Portlet的描述,现在我们建立此PortletJSP页面,到刚才创建的myjspportlet目录下,建立一个名为init.jsp的文件,加入如下两行:

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

<portlet:defineObjects />

 

这两行导入了每个Portlet都要包含的公共class文件以及公共变量,如果需要导入此Portlet专用的类或者进行此Portlet专用的变量的初始化,那么可以仿照common/init.jsp 文件中的写法写在myjspportlet目录下的init.jsp文件中。再添加一个名为view.jsp的文件,此文件将包含Portlet要输出的内容,再文件中写入“Hello [your name here]!”。Portal能够找到并且执行这个JSP文件是因为我们在portlet-ext.xml文件中的init-param标签指定了view-jsp参数的值是/ext/myjspportlet/view.jsp ,这个JSP文件就被作为默认的JSP页面被显示了。

最后,我们需要在D:\liferay\ext\ext-ejb\classes\content 目录下的Language-ext.properties 文件中加入下面这行,才能在

Portal中加入我们创建的这个Portlet

javax.portlet.title.EXT_2=My JSP Portlet

因为我们已经创建了扩展开发环境,因此我们可以通过Ant脚本来向Portal添加我们新创建的这个Portlet。在EclipseAnt视图中

,导入D:\liferay\ext 目录下的build.xml文件,之后执行deploy [default]这个Ant任务,就可以完成新Portlet的发布。当这个

任务执行完毕,启动Tomcat,登陆系统,就可以在“添加内容”功能中找到我们新创建的Portlet了。

4.  改进和调试Liferay自身代码

本节将建立一个编译、调试Liferay自身代码的环境。如果希望参与Liferay社区对Liferay Portal的改进开发、提交补丁等,则需要按照本节的说明配置开发环境。

 此外,本节也能建立一种开发和调试Portlet组件的环境,依赖于Orion服务器的热部署特性,能够实现对Portlet组件的实时调试。但是,由于本节的调试环境是一个完整的J2EE环境,因此也是比基于Tomcat的方法更为沉重庞大的选择,也说不上简洁高效。具

体做Portlet开发时还要根据自己工作的具体状况和对J2EE的熟悉程度选择一种Portlet开发环境。

4.1  安装Orion服务器

Liferay官方在开发时使用的就是Orion服务器,因此虽然可以使用其他的J2EE Server配置开发环境,我们还是选择了Orion。而且Orion服务器对开发者和非商业应用提供一个免费使用的授权,同时文档支持和应用程序的热部署功能也不错,还是值得推荐的。

 首先到Orion的官方网站http://www.orionserver.com 下载Orion服务器的二进制文件,我选择的是2.0.6版本,那会是一个zip压缩包。将这个压缩包中的内容解压到C:\j2sdk1.4.1_07\orion 目录下。这时进入这个目录,使用“java -jar orion.jar”指令应

该能够在http://localhost 上运行起来了。

4.2  Eclipse中配置Orion

Eclipse中通过“Run->Debug..”菜单进入Debug环境设置对话框。在“Java Application”下面有个“orion”标签,我们需要修改这个标签下面的参数。

 Main”标签下的“Project”项需要改为“Portal”,原来写的是“ext”,其他的选项保持默认的即可,也即“Main class”一项仍保持为“com.evermind.server.ApplicationServer”。

Arguments”标签下,开始Eclipse会报错,说“${ORION_HOME}”变量没有定义,我们点击“Program arguments”栏目下的“Variables”按钮,在新弹出的对话框中点击“Edit Variables...”按钮,点击“New”,“Name”项输入“ORION_HOME”,“Value”项输入“C:\j2sdk1.4.1_07\orion”,点击3Ok关闭对话框。这样“Program arguments”栏仍保持为“-config

${ORION_HOME}/config/server.xml -userThreads”;“VM arguments”还保持为“-Xbootclasspath/a:${workspace_loc}\portal\lib\xercesImpl.jar;${workspace_loc}\portal\lib\xml-apis.jar -Xmx512m -Dfile.encoding=UTF-8 -Duser.timezone=GMT”。

在“Classpath”标签下,将“User Entries”下带环境变量的orion.jar引用路径删除,然后点击“Add External JARs”按钮,重新添加本机上的orion.jar库文件。

在“JRE”标签,选择“Alternate JRE”,改为“j2sdk1.4.1_07”,如果这里使用纯JRE的运行环境而不是JDK附带的运行环境,很可能会造成Orion运行中的一些编译类的错误。

4.3  修改Orion配置参数

编辑C:\j2sdk1.4.1_07\orion\config\server.xml 文件,在行

<web-site path="./default-web-site.xml" />

下面添加行

<web-site path="./web-sites/portal.liferay.com-web.xml" />

并且加入行

<compiler executable="jikes" classpath="C:\j2sdk1.4.1_07/jre/lib/rt.jar" />

来启用jikes编译器。其中C:\j2sdk1.4.1_07/jre/lib/rt.jar 指向JDK附带的JRE运行环境库。如果不启用jikes,则会使用sunJDK附带的编译器,可能与Liferay代码造成冲突,因此建议启用jikes

建立新目录C:\j2sdk1.4.1_07\orion\config\web-sites ,在其中建立文件portal.liferay.com-web.xml ,文件内容如下:

<?xml version="1.0" ?>

<!DOCTYPE web-site PUBLIC "Orion Web-site" "http://www.orionserver.com/dtds/web-site.dtd">

 

<web-site host="[ALL]" port="8080">

        <default-web-app application="default" name="portal.liferay.com-web" load-on-startup="true" />

        <!-- <web-app application="default" name="test-web" root="/test" load-on-startup="false" /> -->

        <web-app application="default" name="portal-web" root="/portal" load-on-startup="true" />

        <web-app application="default" name="tunnel-web" root="/tunnel" load-on-startup="true" />

        <!-- <web-app application="default" name="axis-web" root="/axis" load-on-startup="false" /> -->

        <access-log path="../../log/default-web-access.log" />

</web-site>

我没有找到test-webaxis-web包,因此我没有启用这两项。编辑C:\j2sdk1.4.1_07\orion\config\application.xml文件,添加如下行:

[Get Code]

<!-- START -->

 

        <ejb-module id="counter-ejb" path="../applications/counter-ejb.jar" remote="false" />

        <ejb-module id="documentlibrary-ejb" path="../applications/documentlibrary-ejb.jar" remote="false" />

        <ejb-module id="lock-ejb" path="../applications/lock-ejb.jar" remote="false" />

        <ejb-module id="mail-ejb" path="../applications/mail-ejb.jar" remote="false" />

 

        <ejb-module id="portal-ejb" path="file:D:/liferay/portal/portal-ejb/classes" remote="false" />

 

        <web-module id="portal-web" path="file:D:/liferay/portal/portal-web/docroot" />

 

        <web-module id="portal.liferay.com-web" path="file:D:/liferay/portal/web-sites/liferay.com-web/docroot" />

        <web-module id="tunnel-web" path="../applications/tunnel-web.war" />

 

        <!-- -->

 

        <mail-session location="mail/MailSession" smtp-host="smtp.server.com">

                <description>description</description>

                <property name="mail.from" value="mail.sender@server.com" />

                <property name="mail.transport.protocol" value="smtp" />

                <property name="mail.smtp.from" value="mail.sender@server.com" />

        </mail-session>

 

        <user-manager class="com.evermind.sql.DataSourceUserManager">

                <property name="dataSource" value="jdbc/LiferayPool" />

                <property name="table" value="User_" />

                <property name="usernameField" value="userId" />

                <property name="passwordField" value="password_" />

                <property name="defaultGroups" value="users" />

                <property name="staleness" value="0" />

        </user-manager>

 

        <!-- END -->

官方文档说如果使用了“80%9d\j2sdk1.4.1_07\orion\applications\bf%99a0e7%9a%84ae%9abd%8d96e58fbc%8c88%99a6%81bf%9daf%819cgreen%C:' rel='nofollow'>file:”这样的定位方式,则要保证在C: 目录中没有portal-ejb.jar文件,通常这个文件产生于Ant脚本的Deploy过程。不过我不清楚官方文档为什么提出这一点,也没发现有什么影响。可能如果存在这个jar文件,则源码

目录下的classes文件都会被覆盖,这样如果只是修改并编译了源码目录下的classes文件,很可能由于jar文件的覆盖而没法生效,给调试带来麻烦。接着配置MySql数据源,参考3.3节配置数据库和执行Liferay的做法,在数据库中建立与Liferay对应的数据库lportal,将MySql

Java版本驱动的jar文件复制到C:\j2sdk1.4.1_07\orion\lib 目录下。再编辑C:\j2sdk1.4.1_07\orion\config\data-sources.xml ,使之内容如下:

<?xml version="1.0"?>

<!DOCTYPE data-sources PUBLIC "Orion data-sources" "http://www.orionserver.com/dtds/data-sources.dtd">

<data-sources>

        <!--

                An example/default DataSource that uses an ordinary

                JDBC-driver (in this case hsql) to create the connections.

                This tag creates all the needed kinds

                of data-sources, transactional, pooled and EJB-aware sources.

                The source generally used in application code is the "EJB"

                one - it provides transactional safety and connection pooling.

        -->

        <data-source

                class="com.evermind.sql.DriverManagerDataSource"

                name="Liferay"

                location="jdbc/LiferayCore"

                pooled-location="jdbc/LiferayPool"

                xa-location="jdbc/xa/LiferayXA"

                ejb-location="jdbc/LiferayEJB"

                connection-driver="com.mysql.jdbc.Driver"

                url="jdbc:mysql://localhost/lportal"

                username="liferay"

                password="sql606"

                inactivity-timeout="30"

                schema="database-schemas/"

        />

</data-sources>

4.4  修改Liferay的配置文件

Liferay使用一个名为portal.properties 的文件来配置一些重要的参数,但我们一般不要直接修改这个文件,而是另外写一个配置文件来覆盖里面的设置即可,这样可以比较容易地使我们的修改与Liferay的官方设置相兼容。在D:\liferay\portal\util-java\classes 目录下建立一个名为portal-ext.properties的文件(官方文档写这个文件的存放位置写错了)。填写这个文件的内容为:

portal.ctx=/portal

4.5  Orion上部署Liferay系统

D:\liferay\portal\ 目录建立一个app.server.{username}.properties 文件,在我的机器上就是app.server.Administrator.properties 文件({username}的含义参考“3.1节配置扩展开发环境”,文件内容为app.server={orion}在我这写的就是

app.server=C:/j2sdk1.4.1_07/orion

EclipseAnt视图顺序执行portal项目中的startdeploy任务。记得删除portal-ejb.jar文件。在Eclipse中用Debug界面启动Orion,这时应该可以在http://localhost:8080 看到启动的Liferay了。(如果Ant脚本运行的时候

说什么javac类找不到,那么调整Eclipse菜单中的:Windows->Preferences窗口中的Ant配置,把JDKlib目录下的tools.jar文件显式引用进去,就一切正常了(不可以是JRElib目录下的tools.jar文件,那不一样)。)

4.6  另一种调试Portlet组件的方法

Liferayportal源码工作环境下,还有一种开发调试Portlet组件的方法。我们用D:\liferay\portal\portlets\sample-jsp-portlet.war这个Liferay自带的Portlet作为例子。

我们将D:\liferay\portal\portlets\sample-jsp-portlet.war 目录复制成为D:\liferay\sample-jsp-portlet 目录,之后修改C:\j2sdk1.4.1_07\orion\config\application.xml文件,添加如下行

<web-module id="sample-jsp-portlet" path="file:D:/liferay/sample-jsp-portlet" />

再修改C:\j2sdk1.4.1_07\orion\config\web-sites\portal.liferay.com-web.xml 文件,在其中添加如下行

 <web-app application="default" name="sample-jsp-portlet" root="/sample-jsp-portlet" load-on-startup="true" />

之后重启Orion,登陆Liferay后就可以在“Add Content”界面的Test类别中找到这个sample-jsp-portlet

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值