索引
- 介紹
- 安裝Eclipse
- 安裝 JBoss Portal 2.2
- 創(chuàng)建項(xiàng)目
- Classpath 設(shè)置
- portlet.xml
- web.xml
- Hello World!
- xwork.xml
- JBoss Portal 描述文件
- 部署
- 下一步
- 重新部署
Step-by-Step 教程
介紹
這篇教程帶你經(jīng)歷建立簡(jiǎn)單portlet應(yīng)用的流程, 使用Eclipse, JBoss Portal 2.2 和 WebWork Portlet框架.
安裝Eclipse
這篇教程中, 我們將會(huì)使用 Eclipse 3.1.1, 可以從此處下載 http://www.eclipse.org
安裝 JBoss Portal 2.2
JBoss Portal 2.2 可以在這里下載 http://www.jboss.com/products/jbossportal/downloads
.
創(chuàng)建項(xiàng)目
一個(gè)Portlet應(yīng)用與一般的web應(yīng)用程序的打包方式基本相同, 但是需要附加描述文件; portlet.xml. 本教程的第一步是在eclipse里面建立項(xiàng)目結(jié)構(gòu). 首先, 我們創(chuàng)建這個(gè) Java 項(xiàng)目本身, 使用新建項(xiàng)目的向?qū)? 我們命名項(xiàng)目為 'MyPortlet'. 確定選擇了 "Create separate source and output folders (創(chuàng)建單獨(dú)的源文件和輸出目錄)"選項(xiàng), 下一步, 設(shè)置 'src' 源文件目錄的輸出目錄(output folder)為'MyPortlet/webapp/WEB-INF/classes'. 講講方便我們?cè)谕瓿身?xiàng)目的時(shí)候?qū)С霰卷?xiàng)目為 WAR 包.
New project wizard (新建項(xiàng)目向?qū)?

New project wizard, cont (新建項(xiàng)目向?qū)? 續(xù))

Classpath 設(shè)置
在 build 應(yīng)用程序之前, 我們需要添加一些需要的jar包到 build classpath 和 WEB-INF/lib 目錄中. 首先, 創(chuàng)建 WEB-INF/lib 目錄, 然后下載 WebWork 2.2.1 發(fā)布包并將起解壓縮到本地硬盤(pán). 找到下面屏幕截圖中的jar包并將它們放到新創(chuàng)建的 WEB-INF/lib 目錄中. 選擇所有的jar包, 點(diǎn)鼠標(biāo)右鍵選擇 "Build Path(Build路徑) -> Add to Build Path(添加Build路徑)". 現(xiàn)在你的本地項(xiàng)目應(yīng)該看起來(lái)和屏幕截圖中相同.

portlet.xml
Next thing we do is create a portlet.xml file in the WEB-INF folder. In this file, write the following:
我們下面要做的是在 WEB-INF 目錄中創(chuàng)建一個(gè) portlet.xml 文件. 在這個(gè)文件中, 寫(xiě)下如下內(nèi)容:
<portlet-app version="1.0" xmlns="http:
xmlns:xsi="http:
xsi:schemaLocation="http:>
<portlet>
<description xml:lang="EN">My very first WebWork Portlet</description>
<portlet-name>MyPortlet</portlet-name>
<display-name xml:lang="EN">My first WebWork Portlet</display-name>
<portlet-class>com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<init-param>
<!-- 視圖模式(view mode)的命名空間(namespace). 映射到xwork配置中的命名空間 -->
<name>viewNamespace</name>
<value>/view</value>
</init-param>
<init-param>
<!-- 在視圖模式中調(diào)用的默認(rèn)action名稱(chēng) -->
<name>defaultViewAction</name>
<value>index</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
</supports>
<supported-locale>en</supported-locale>
<portlet-info>
<title>My very own WebWork Portlet</title>
<short-title>WWPortlet</short-title>
<keywords>webwork,portlet</keywords>
</portlet-info>
</portlet>
</portlet-app>
本 portlet.xml 文件設(shè)定這個(gè) portlet 使用 com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher Portlet 實(shí)現(xiàn). 它還告訴 Portlet 它會(huì)映射 視圖 portlet 模式到 XWork 配置中的 /view 命名空間, 我們?cè)诮?building)我們的 XWork action 的時(shí)候必須牢記它. 還有, 它告訴 portlet, 如果在 portlet 請(qǐng)求中沒(méi)有找到一個(gè)action 參數(shù), 被調(diào)用的默認(rèn) action 是 "index" action, 它應(yīng)該被放在 xwork 配置的 /view 命名空間里.
web.xml
WebWork Portlet 還需要你在 web.xml 描述中建立一些特殊的 servlet 和 filter 來(lái)打開(kāi)對(duì) WebWork 標(biāo)簽庫(kù)和模版語(yǔ)言的支持, 因?yàn)樗蕾?lài)于一些 Servlet API 的接口和類(lèi). 所以在WEB-INF 目錄中創(chuàng)建 web.xml 文件, 并添加如下內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "- "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>webwork</filter-name>
<filter-class>
com.opensymphony.webwork.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
com.opensymphony.webwork.portlet.context.ServletContextHolderListener
</listener-class>
</listener>
<servlet>
<servlet-name>preparator</servlet-name>
<servlet-class>
com.opensymphony.webwork.portlet.context.PreparatorServlet
</servlet-class>
</servlet>
<taglib>
<taglib-uri>/webwork</taglib-uri>
<taglib-location>/WEB-INF/lib/webwork-2.2.1.jar</taglib-location>
</taglib>
</web-app>
HttpServletRequest/Response, and other Servlet API classes in the ServletActionContext that is used in many of the JSPs and templates.
FilterDispacher 保證 webwork jar 包中的風(fēng)格樣式表和 js 文件的URL可以被正確解析. ServletContextHolderListener 是一個(gè)Servlet context listener(上下文監(jiān)聽(tīng)器), 它存放了 servlet context (上下文) 的一個(gè)引用, 在派發(fā)(dispatch)到視圖(例如JSP/ftl或velocity)之前初始化包括 HttpServletRequest/Response 和其它很多在JSP和模版引擎中會(huì)用到的ServletActionContext中的 Servlet API 類(lèi).
Hello World!
With these basic project structure, portlet.xml and web.xml in place, it's time to do the mandatory "Hello World" example, so let's create a place to store our JSP files. Create a WEB-INF/pages/view folder, and within this folder, create the file "helloWorld.jsp". In this file, we simply put:
擁有了基本的項(xiàng)目結(jié)構(gòu), portlet.xml 和 web.xml 都有了, 現(xiàn)在可以開(kāi)始實(shí)現(xiàn) "Hello World" 這個(gè)例子了, 我們先建立一個(gè)存放 JSP 文件的目錄. 建立一個(gè) WEB-INF/pages/view 目錄, 然后在這個(gè)目錄里, 建立一個(gè) "helloWorld.jsp" 文件. 在這個(gè)文件中, 我們簡(jiǎn)單寫(xiě)下:
xwork.xml
At this point, it's time to prepare the xwork configuration file, xwork.xml. Create an empty file named xwork.xml in the root of the 'src' folder. In this file we put:
到了這里, 是準(zhǔn)備 xwork 配置文件的時(shí)候了. 創(chuàng)建一個(gè)叫做 xwork.xml 的空文件, 放在 'src' 的根目錄下.
在這個(gè)文件中, 我們放如下內(nèi)容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xwork PUBLIC
"-
"http:>
<xwork>
<include file="webwork-default.xml" />
<package name="view" extends="webwork-portlet-default"
namespace="/view">
<action name="index"
class="com.opensymphony.xwork.ActionSupport">
<result name="success">/WEB-INF/pages/view/helloWorld.jsp</result>
</action>
</package>
</xwork>
這里要明確一下, 我們創(chuàng)建了一個(gè)命名空間為 view 的包(package), 我們的包繼承自 webwork-portlet-default 包. 這個(gè) webwork-portlet-default 包中包含了一些可以允許在 portlet 容器中運(yùn)行 WebWork/XWork 的特殊結(jié)果類(lèi)型(result type).
JBoss Portal 描述文件
除了常規(guī)的 portlet.xml 和 web.xml 表述文件, JBoss Portal 2.2 需要我們添加幾個(gè) JBoss 的特定描述文件. 這些描述文件的名稱(chēng)將根據(jù)我們的應(yīng)用程序的上下文的根(context root) 的名字來(lái)命名, 它一般也是我們導(dǎo)出的 war 包的名字. 我們稍候?qū)?huì)創(chuàng)建一個(gè)叫做 MyPortlet.war 的 war 包, 所以 JBoss 描述文件被命名為 'MyPortlet-object.xml'. 我們?cè)?WEB-INF目錄中創(chuàng)建這個(gè)文件, 然后添加如下內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<deployments>
<deployment>
<if-exists>overwrite</if-exists>
<parent-ref>default</parent-ref>
<properties />
<page>
<page-name>MyPortlet Tutorial</page-name>
<properties />
<window>
<window-name>MyPortletWindow</window-name>
<instance-ref>MyPortletInstance</instance-ref>
<region>center</region>
<height>0</height>
</window>
</page>
</deployment>
<deployment>
<if-exists>overwrite</if-exists>
<instance>
<instance-name>MyPortletInstance</instance-name>
<component-ref>MyPortlet.MyPortlet</component-ref>
</instance>
</deployment>
</deployments>
然后, 我們需要另外兩個(gè)文件, jboss-app.xml 和 jboss-portlet.xml 它們內(nèi)容如下:
<jboss-app>
<app-name>MyPortlet</app-name>
</jboss-app>
<portlet-app>
<portlet>
<portlet-name>MyPortlet</portlet-name>
<security>
</security>
</portlet>
</portlet-app>
部署
現(xiàn)在我們的項(xiàng)目結(jié)構(gòu)看起來(lái)是這樣的:
項(xiàng)目結(jié)構(gòu)

現(xiàn)在可以試驗(yàn)一下我們的不可思議的 HelloWorld portlet 了. 在Windows的一個(gè)瀏覽器窗口中, 我們選擇 WEB-INF 目錄然后將它以 zip 格式壓縮為叫做 'MyPortlet.war' 的文件. 將這個(gè) war 文件放到JBoss Portal的 server/default/deploy 目錄中, 然后啟動(dòng)服務(wù)器. 默認(rèn)情況下, JBoss Portal 的 URL 是 http://localhost:8080/portal
, 所以我們用瀏覽器訪問(wèn)這個(gè)地址, 我們將會(huì)看到這個(gè) portal 的首頁(yè), 這里你應(yīng)該會(huì)看到一個(gè) "MyPortlet Tutorial" 菜單項(xiàng), 與下面的截圖中的一相同. 當(dāng)按下菜單鏈接, 你會(huì)得到一個(gè)奇妙的 "Hello World" 頁(yè)面!
JBoss Portal 首頁(yè)

MyPortlet portlet 頁(yè)面

下一步
Next, let's do something a bit more interesting, namely create a simple form and display a result page. Let's start by creating our JSP that displays our form. Create a new file, 'helloForm.jsp' in the WEB-INF/pages/view/ folder. We will use the WebWork tag library to build the form on our page. The form itself will ask the user for a first name and last name, something like this:
接著, 我們來(lái)做一些有趣的事, 也就是創(chuàng)建一個(gè)簡(jiǎn)單的 form 并顯示一個(gè)結(jié)果頁(yè)面. 我們先來(lái)創(chuàng)建一個(gè) JSP 頁(yè)面來(lái)顯示這個(gè) form. 創(chuàng)建一個(gè)新的文件 'helloForm.jsp', 放在 WEB-INF/pages/view/ 目錄下. 我們將會(huì)使用 WebWork 標(biāo)簽庫(kù)在我們的頁(yè)面上創(chuàng)建這個(gè) form. 這個(gè) form 會(huì)詢(xún)問(wèn)用戶(hù)的名字和姓, 就像這樣:
<%@ taglib uri="/webwork" prefix="ww" %>
<H2>Hi there! Please enter your name</H2>
<ww:form action="helloWorld" method="POST">
<ww:textfield label="First name" name="firstName" value="%{firstName}"/>
<ww:textfield label="Last name" name="lastName" value="%{lastName}"/>
<ww:submit value="Say hello!"/>
</ww:form>
現(xiàn)在我們準(zhǔn)備寫(xiě)一些 Java 代碼, 不多, 就一點(diǎn)點(diǎn). 我們?cè)谖覀兊?src 目錄創(chuàng)建一個(gè)新的包, 我們命名它為 com.opensymphony.webwork.portlet.tutorial. 在這個(gè)包中, 創(chuàng)建一個(gè) HelloWorldAction 類(lèi). 遵循一般的 WebWork 習(xí)慣, 這個(gè)類(lèi)擴(kuò)展自XWork框架的 ActionSupport 類(lèi), 我們還會(huì)添加一些屬性來(lái)映射我們剛才創(chuàng)建的 JSP 中的 form 的屬性:
package com.opensymphony.webwork.portlet.tutorial;
import com.opensymphony.xwork.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
We also need a JSP to display the processed input. We'll just use the old helloWorld.jsp and modify it a bit. As with helloForm.jsp, we import the WebWork tag library, and we use the ww:property tags to display the input from the form:
我們還需要一個(gè) JSP 來(lái)顯示 input 的處理結(jié)果. 我們還使用 helloWorld.jsp 然后修改一下. 與 helloForm.jsp 一樣, 我們引入 WebWork 標(biāo)簽庫(kù), 然后我們使用 ww:property 標(biāo)簽來(lái)顯示 form 中輸入的內(nèi)容:
<%@ taglib prefix="ww" uri="/webwork" %>
<H2>Hello <ww:property value="firstName"/> <ww:property value="lastName"/></H2>
<p/>
<a xhref="<ww:url action="helloWorldInput"/>">Back to form</a>
重新部署
現(xiàn)在我們準(zhǔn)備好重新部署我們的應(yīng)用程序, 所以重新用 zip 格式壓縮好一個(gè) war 包并放到 server/default/deploy 目錄. 現(xiàn)在 'MyPortlet Tutorial' 頁(yè)面將會(huì)是這個(gè)樣子:
Hello World form

輸入一些信息, 然后點(diǎn)擊 "Say hello!" 按鈕, 然后你將會(huì)看到不錯(cuò)的個(gè)性化的 "hello" 信息:
個(gè)性化的 Hello World
