索引
- 介绍
- 安装Eclipse
- 安装 JBoss Portal 2.2
- 创建项目
- Classpath 设置
- portlet.xml
- web.xml
- Hello World!
- xwork.xml
- JBoss Portal 描述文件
- 部署
- 下一步
- 重新部署
Step-by-Step 教程
介绍
这篇教程带你经历建立简单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.
创建项目
一个Portlet应用与一般的web应用程序的打包方式基本相同, 但是需要附加描述文件; portlet.xml. 本教程的第一步是在eclipse里面建立项目结构. 首先, 我们创建这个 Java 项目本身, 使用新建项目的向导. 我们命名项目为 'MyPortlet'. 确定选择了 "Create separate source and output folders (创建单独的源文件和输出目录)"选项, 下一步, 设置 'src' 源文件目录的输出目录(output folder)为'MyPortlet/webapp/WEB-INF/classes'. 讲讲方便我们在完成项目的时候导出本项目为 WAR 包.
New project wizard (新建项目向导)
New project wizard, cont (新建项目向导, 续)
Classpath 设置
在 build 应用程序之前, 我们需要添加一些需要的jar包到 build classpath 和 WEB-INF/lib 目录中. 首先, 创建 WEB-INF/lib 目录, 然后下载 WebWork 2.2.1 发布包并将起解压缩到本地硬盘. 找到下面屏幕截图中的jar包并将它们放到新创建的 WEB-INF/lib 目录中. 选择所有的jar包, 点鼠标右键选择 "Build Path(Build路径) -> Add to Build Path(添加Build路径)". 现在你的本地项目应该看起来和屏幕截图中相同.
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 目录中创建一个 portlet.xml 文件. 在这个文件中, 写下如下内容:
<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>
<!-- 在视图模式中调用的默认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 文件设定这个 portlet 使用 com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher Portlet 实现. 它还告诉 Portlet 它会映射 视图 portlet 模式到 XWork 配置中的 /view 命名空间, 我们在建立(building)我们的 XWork action 的时候必须牢记它. 还有, 它告诉 portlet, 如果在 portlet 请求中没有找到一个action 参数, 被调用的默认 action 是 "index" action, 它应该被放在 xwork 配置的 /view 命名空间里.
web.xml
WebWork Portlet 还需要你在 web.xml 描述中建立一些特殊的 servlet 和 filter 来打开对 WebWork 标签库和模版语言的支持, 因为它依赖于一些 Servlet API 的接口和类. 所以在WEB-INF 目录中创建 web.xml 文件, 并添加如下内容:
<?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(上下文监听器), 它存放了 servlet context (上下文) 的一个引用, 在派发(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:
拥有了基本的项目结构, portlet.xml 和 web.xml 都有了, 现在可以开始实现 "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 配置文件的时候了. 创建一个叫做 xwork.xml 的空文件, 放在 'src' 的根目录下.
在这个文件中, 我们放如下内容:
<?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>
这里要明确一下, 我们创建了一个命名空间为 view 的包(package), 我们的包继承自 webwork-portlet-default 包. 这个 webwork-portlet-default 包中包含了一些可以允许在 portlet 容器中运行 WebWork/XWork 的特殊结果类型(result type).
JBoss Portal 描述文件
除了常规的 portlet.xml 和 web.xml 表述文件, JBoss Portal 2.2 需要我们添加几个 JBoss 的特定描述文件. 这些描述文件的名称将根据我们的应用程序的上下文的根(context root) 的名字来命名, 它一般也是我们导出的 war 包的名字. 我们稍候将会创建一个叫做 MyPortlet.war 的 war 包, 所以 JBoss 描述文件被命名为 'MyPortlet-object.xml'. 我们在 WEB-INF目录中创建这个文件, 然后添加如下内容:
<?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 它们内容如下:
<jboss-app>
<app-name>MyPortlet</app-name>
</jboss-app>
<portlet-app>
<portlet>
<portlet-name>MyPortlet</portlet-name>
<security>
</security>
</portlet>
</portlet-app>
部署
现在我们的项目结构看起来是这样的:
项目结构
现在可以试验一下我们的不可思议的 HelloWorld portlet 了. 在Windows的一个浏览器窗口中, 我们选择 WEB-INF 目录然后将它以 zip 格式压缩为叫做 'MyPortlet.war' 的文件. 将这个 war 文件放到JBoss Portal的 server/default/deploy 目录中, 然后启动服务器. 默认情况下, 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:
接着, 我们来做一些有趣的事, 也就是创建一个简单的 form 并显示一个结果页面. 我们先来创建一个 JSP 页面来显示这个 form. 创建一个新的文件 'helloForm.jsp', 放在 WEB-INF/pages/view/ 目录下. 我们将会使用 WebWork 标签库在我们的页面上创建这个 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>
现在我们准备写一些 Java 代码, 不多, 就一点点. 我们在我们的 src 目录创建一个新的包, 我们命名它为 com.opensymphony.webwork.portlet.tutorial. 在这个包中, 创建一个 HelloWorldAction 类. 遵循一般的 WebWork 习惯, 这个类扩展自XWork框架的 ActionSupport 类, 我们还会添加一些属性来映射我们刚才创建的 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 的处理结果. 我们还使用 helloWorld.jsp 然后修改一下. 与 helloForm.jsp 一样, 我们引入 WebWork 标签库, 然后我们使用 ww:property 标签来显示 form 中输入的内容:
<%@ 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>
重新部署
现在我们准备好重新部署我们的应用程序, 所以重新用 zip 格式压缩好一个 war 包并放到 server/default/deploy 目录. 现在 'MyPortlet Tutorial' 页面将会是这个样子:
Hello World form
输入一些信息, 然后点击 "Say hello!" 按钮, 然后你将会看到不错的个性化的 "hello" 信息:
个性化的 Hello World