索引
- 介紹
- 安裝Eclipse
- 安裝 JBoss Portal 2.2
- 創(chuàng)建項目
- Classpath 設(shè)置
- portlet.xml
- web.xml
- Hello World!
- xwork.xml
- JBoss Portal 描述文件
- 部署
- 下一步
- 重新部署
Step-by-Step 教程
介紹
這篇教程帶你經(jīng)歷建立簡單portlet應用的流程, 使用Eclipse, JBoss Portal 2.2 和 WebWork Portlet框架.
安裝Eclipse
這篇教程中, 我們將會使用 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)建項目
一個Portlet應用與一般的web應用程序的打包方式基本相同, 但是需要附加描述文件; portlet.xml. 本教程的第一步是在eclipse里面建立項目結(jié)構(gòu). 首先, 我們創(chuàng)建這個 Java 項目本身, 使用新建項目的向?qū)? 我們命名項目為 'MyPortlet'. 確定選擇了 "Create separate source and output folders (創(chuàng)建單獨的源文件和輸出目錄)"選項, 下一步, 設(shè)置 'src' 源文件目錄的輸出目錄(output folder)為'MyPortlet/webapp/WEB-INF/classes'. 講講方便我們在完成項目的時候?qū)С霰卷椖繛?WAR 包.
New project wizard (新建項目向?qū)?

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

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

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)建一個 portlet.xml 文件. 在這個文件中, 寫下如下內(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)用的默認action名稱 -->
<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è)定這個 portlet 使用 com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher Portlet 實現(xiàn). 它還告訴 Portlet 它會映射 視圖 portlet 模式到 XWork 配置中的 /view 命名空間, 我們在建立(building)我們的 XWork action 的時候必須牢記它. 還有, 它告訴 portlet, 如果在 portlet 請求中沒有找到一個action 參數(shù), 被調(diào)用的默認 action 是 "index" action, 它應該被放在 xwork 配置的 /view 命名空間里.
web.xml
WebWork Portlet 還需要你在 web.xml 描述中建立一些特殊的 servlet 和 filter 來打開對 WebWork 標簽庫和模版語言的支持, 因為它依賴于一些 Servlet API 的接口和類. 所以在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 包中的風格樣式表和 js 文件的URL可以被正確解析. ServletContextHolderListener 是一個Servlet context listener(上下文監(jiān)聽器), 它存放了 servlet context (上下文) 的一個引用, 在派發(fā)(dispatch)到視圖(例如JSP/ftl或velocity)之前初始化包括 HttpServletRequest/Response 和其它很多在JSP和模版引擎中會用到的ServletActionContext中的 Servlet API 類.
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:
擁有了基本的項目結(jié)構(gòu), portlet.xml 和 web.xml 都有了, 現(xiàn)在可以開始實現(xiàn) "Hello World" 這個例子了, 我們先建立一個存放 JSP 文件的目錄. 建立一個 WEB-INF/pages/view 目錄, 然后在這個目錄里, 建立一個 "helloWorld.jsp" 文件. 在這個文件中, 我們簡單寫下:
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:
到了這里, 是準備 xwork 配置文件的時候了. 創(chuàng)建一個叫做 xwork.xml 的空文件, 放在 'src' 的根目錄下.
在這個文件中, 我們放如下內(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)建了一個命名空間為 view 的包(package), 我們的包繼承自 webwork-portlet-default 包. 這個 webwork-portlet-default 包中包含了一些可以允許在 portlet 容器中運行 WebWork/XWork 的特殊結(jié)果類型(result type).
JBoss Portal 描述文件
除了常規(guī)的 portlet.xml 和 web.xml 表述文件, JBoss Portal 2.2 需要我們添加幾個 JBoss 的特定描述文件. 這些描述文件的名稱將根據(jù)我們的應用程序的上下文的根(context root) 的名字來命名, 它一般也是我們導出的 war 包的名字. 我們稍候?qū)?chuàng)建一個叫做 MyPortlet.war 的 war 包, 所以 JBoss 描述文件被命名為 'MyPortlet-object.xml'. 我們在 WEB-INF目錄中創(chuàng)建這個文件, 然后添加如下內(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>
然后, 我們需要另外兩個文件, 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)在我們的項目結(jié)構(gòu)看起來是這樣的:
項目結(jié)構(gòu)

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

MyPortlet portlet 頁面

下一步
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:
接著, 我們來做一些有趣的事, 也就是創(chuàng)建一個簡單的 form 并顯示一個結(jié)果頁面. 我們先來創(chuàng)建一個 JSP 頁面來顯示這個 form. 創(chuàng)建一個新的文件 'helloForm.jsp', 放在 WEB-INF/pages/view/ 目錄下. 我們將會使用 WebWork 標簽庫在我們的頁面上創(chuàng)建這個 form. 這個 form 會詢問用戶的名字和姓, 就像這樣:
<%@ 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)在我們準備寫一些 Java 代碼, 不多, 就一點點. 我們在我們的 src 目錄創(chuàng)建一個新的包, 我們命名它為 com.opensymphony.webwork.portlet.tutorial. 在這個包中, 創(chuàng)建一個 HelloWorldAction 類. 遵循一般的 WebWork 習慣, 這個類擴展自XWork框架的 ActionSupport 類, 我們還會添加一些屬性來映射我們剛才創(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:
我們還需要一個 JSP 來顯示 input 的處理結(jié)果. 我們還使用 helloWorld.jsp 然后修改一下. 與 helloForm.jsp 一樣, 我們引入 WebWork 標簽庫, 然后我們使用 ww:property 標簽來顯示 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)在我們準備好重新部署我們的應用程序, 所以重新用 zip 格式壓縮好一個 war 包并放到 server/default/deploy 目錄. 現(xiàn)在 'MyPortlet Tutorial' 頁面將會是這個樣子:
Hello World form

輸入一些信息, 然后點擊 "Say hello!" 按鈕, 然后你將會看到不錯的個性化的 "hello" 信息:
個性化的 Hello World
