﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JAVA流通桥-文章分类-webwork文章</title><link>http://www.blogjava.net/zhuyan/category/21564.html</link><description>JAVA启发者</description><language>zh-cn</language><lastBuildDate>Wed, 22 Aug 2007 15:51:11 GMT</lastBuildDate><pubDate>Wed, 22 Aug 2007 15:51:11 GMT</pubDate><ttl>60</ttl><item><title>WebWork深入浅出</title><link>http://www.blogjava.net/zhuyan/articles/138528.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Wed, 22 Aug 2007 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/138528.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/138528.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/138528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/138528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/138528.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文发表于《开源大本营》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：钱...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhuyan/articles/138528.html'>阅读全文</a><img src ="http://www.blogjava.net/zhuyan/aggbug/138528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-08-22 10:16 <a href="http://www.blogjava.net/zhuyan/articles/138528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xwork.xml配置说明</title><link>http://www.blogjava.net/zhuyan/articles/110632.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Sat, 14 Apr 2007 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/110632.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/110632.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/110632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/110632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/110632.html</trackback:ping><description><![CDATA[<h2 class=heading2 style="MARGIN: 4px 0px"><a name=xwork.xml-Example>示例</a></h2>
<p>&#160;</p>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;?xml version=<span class=xml-quote>"1.0"</span> encoding=<span class=xml-quote>"ISO-8859-1"</span>?&gt;</span>
<span class=xml-tag>&lt;!DOCTYPE xwork
PUBLIC
<span class=xml-quote>"-//OpenSymphony Group//XWork 1.0//EN"</span>
<span class=xml-quote>"http://www.opensymphony.com/xwork/xwork-1.0.dtd"</span>&gt;</span>
<span class=xml-tag>&lt;xwork&gt;</span>
<span class=xml-tag>&lt;include file=<span class=xml-quote>"webwork-default.xml"</span>/&gt;</span>
<span class=xml-tag>&lt;package name=<span class=xml-quote>"default"</span> extends=<span class=xml-quote>"webwork-default"</span>&gt;</span>
<span class=xml-tag>&lt;interceptors&gt;</span>
<span class=xml-tag>&lt;interceptor-stack name=<span class=xml-quote>"defaultComponentStack"</span>&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"component"</span>/&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"defaultStack"</span>/&gt;</span>
<span class=xml-tag>&lt;/interceptor-stack&gt;</span>
<span class=xml-tag>&lt;/interceptors&gt;</span>
<span class=xml-tag>&lt;default-interceptor-ref name=<span class=xml-quote>"defaultStack"</span>/&gt;</span>
<span class=xml-tag>&lt;action name=<span class=xml-quote>"SimpleCounter"</span> class=<span class=xml-quote>"com.opensymphony.webwork.example.counter.SimpleCounter"</span>&gt;</span>
<span class=xml-tag>&lt;result name=<span class=xml-quote>"success"</span> type=<span class=xml-quote>"dispatcher"</span>&gt;</span>/success.jsp<span class=xml-tag>&lt;/result&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"defaultComponentStack"</span>/&gt;</span>
<span class=xml-tag>&lt;/action&gt;</span>
<span class=xml-tag><span class=xml-comment>&lt;!--
- Velocity implementation of the SimpleCounter.  Also demonstrate a more verbose version of result element
--&gt;</span></span>
<span class=xml-tag>&lt;action name=<span class=xml-quote>"VelocityCounter"</span> class=<span class=xml-quote>"com.opensymphony.webwork.example.counter.SimpleCounter"</span>&gt;</span>
<span class=xml-tag>&lt;result name=<span class=xml-quote>"success"</span> type=<span class=xml-quote>"velocity"</span>&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"location"</span>&gt;</span>/success.vm<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;/result&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"defaultComponentStack"</span>/&gt;</span>
<span class=xml-tag>&lt;/action&gt;</span>
<span class=xml-tag><span class=xml-comment>&lt;!--
- Different method can be used (processForm).
--&gt;</span></span>
<span class=xml-tag>&lt;action name=<span class=xml-quote>"formTest"</span> class=<span class=xml-quote>"com.opensymphony.webwork.example.FormAction"</span> method=<span class=xml-quote>"processForm"</span> &gt;</span>
<span class=xml-tag>&lt;result name=<span class=xml-quote>"success"</span> type=<span class=xml-quote>"dispatcher"</span>&gt;</span>/formSuccess.jsp<span class=xml-tag>&lt;/result&gt;</span>
<span class=xml-tag>&lt;result name=<span class=xml-quote>"invalid.token"</span> type=<span class=xml-quote>"dispatcher"</span>&gt;</span>/form.jsp<span class=xml-tag>&lt;/result&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"defaultStack"</span>/&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"token"</span>/&gt;</span>
<span class=xml-tag>&lt;/action&gt;</span>
<span class=xml-tag>&lt;/package&gt;</span>
<span class=xml-tag>&lt;/xwork&gt;</span></pre>
</div>
</div>
<p class=paragraph></p>
<h2 class=heading2><a name=xwork.xml-Actions>活动</a></h2>
<p>&#160;</p>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;action name=<span class=xml-quote>"formTest"</span> class=<span class=xml-quote>"com.opensymphony.webwork.example.FormAction"</span> method=<span class=xml-quote>"processForm"</span>&gt;</span></pre>
</div>
</div>
<p class=paragraph>活动是WebWork的基本工作单元, 它正是定义了活动. 活动通常有一个请求(通常是点击按钮, 或提交表单). 主要的action元素有两部分, 友好的名字(在URL中引用, 如saveForm.action)和对应的"处理(handler)"类.</p>
可选的"<strong class=strong>method</strong>"属性告诉WebWork应当调用活动的哪个方法. 如果你不填写method属性, WebWork缺省调用<strong class=strong>execute()</strong>. 如果活动没有execute()方法, 也没有在xml中指定method属性, WebWork将抛出异常.
<p class=paragraph>同样, 你也可以在表单中指定"<strong class=strong>actionName!something</strong>"来告诉WebWork调用"<strong class=strong>doSomething</strong>"方法. 例如, "<strong class=strong>formTest!save.action</strong>"将调用FormAction的"<strong class=strong>save</strong>"方法. 该方法必须是public且没有参数:</p>
<div class=code>
<div class=codeContent>
<pre><span class=java-keyword>public</span>&nbsp;<span class=java-object>String</span> save() <span class=java-keyword>throws</span> Exception
{
...
<span class=java-keyword>return</span> SUCCESS;
}</pre>
</div>
</div>
<p class=paragraph>活动的所有配置都可以用在"actionName!something"中(截取器, 结果类型等)</p>
<h2 class=heading2><a name=xwork.xml-Results>结果</a></h2>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;result name=<span class=xml-quote>"missing-data"</span> type=<span class=xml-quote>"dispatcher"</span>&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"location"</span>&gt;</span>/form.jsp<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"parameterA"</span>&gt;</span>A<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"parameterB"</span>&gt;</span>B<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;/result&gt;</span></pre>
</div>
</div>
<p class=paragraph>Result元素告诉WebWork活动执行后下一步该做什么. "name"属性对应活动execute() 方法返回的结果代码. "type"属性表示使用哪个结果类型(参见<a title="Result Types" href="file:///D:/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6/webwork/webwork-2.2.4/docs/chinese/wikidocs/Result%20Types.html"><u><font color=#0000ff>结果类型</font></u></a>). 可以使用"param"元素向视图传递参数: <br></p>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;result-types&gt;</span>
....
<span class=xml-tag>&lt;result-type name=<span class=xml-quote>"header"</span>
class=<span class=xml-quote>"com.opensymphony.webwork.dispatcher.HttpHeaderResult"</span>/&gt;</span>
<span class=xml-tag>&lt;/result-types&gt;</span>
<span class=xml-tag>&lt;result name=<span class=xml-quote>"no-content"</span> type=<span class=xml-quote>"header"</span>&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"status"</span>&gt;</span>204<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"headers.customHeaderA"</span>&gt;</span>A<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;param name=<span class=xml-quote>"headers.customHeaderB"</span>&gt;</span>B<span class=xml-tag>&lt;/param&gt;</span>
<span class=xml-tag>&lt;/result&gt;</span></pre>
</div>
</div>
<p>&#160;</p>
下面是WebWork内置的标准结果代码(定义在Action接口中), 包括:
<div class=code>
<div class=codeContent>
<pre>Action.SUCCESS = <span class=java-quote>"success"</span>;
Action.NONE    = <span class=java-quote>"none"</span>;
Action.ERROR   = <span class=java-quote>"error"</span>;
Action.INPUT   = <span class=java-quote>"input"</span>;
Action.LOGIN   = <span class=java-quote>"login"</span>;</pre>
</div>
</div>
<p class=paragraph>你可以扩充你认为适合的结果代码(如"missing-data"). 大多数情况下你只需使用SUCCESS和ERROR, SUCCESS将前进到下一个页面.</p>
如果你只需要指定"location"属性, 可以使用简写形式:
<div class=code>
<div class=codeContent>
<pre>&lt;result name=<span class=java-quote>"missing-data"</span> type=<span class=java-quote>"dispatcher"</span>&gt;/form.jsp&lt;/result&gt;</pre>
</div>
</div>
<p class=paragraph>参阅<a title=webwork-default.xml href="file:///D:/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6/webwork/webwork-2.2.4/docs/chinese/wikidocs/webwork-default.xml.html"><u><font color=#0000ff>webwork-default.xml</font></u></a>或<a title="Result Types" href="file:///D:/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6/webwork/webwork-2.2.4/docs/chinese/wikidocs/Result%20Types.html"><u><font color=#0000ff>Result Types</font></u></a>以了解标准结果类型</p>
<h2 class=heading2><a name=xwork.xml-Interceptors>截取器</a></h2>
<p class=paragraph>截取器允许定义活动执行前后的代码. 截取器是编写Web应用的强大工具. 一些最常用的实现是: </p>
<ul class=star>
    <li>安全检查(确保用户已登陆)</li>
    <li>跟踪纪录 (记录每一个活动)</li>
    <li>检查执行瓶颈 (在活动前后启动计时器, 以检查应用瓶颈)<br>也可以将截取器连接起来创建一个截取器<strong class=strong>栈</strong>. 如果你想完成登陆检查, 安全检查, 并记录每个活动调用, 使用截取器栈会十分容易. </li>
</ul>
<br>必须先定义截取器(给它命名)然后才能联接成栈:
<p>&#160;</p>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;interceptors&gt;</span>
<span class=xml-tag>&lt;interceptor name=<span class=xml-quote>"security"</span> class=<span class=xml-quote>"com.mycompany.security.SecurityInterceptor"</span>/&gt;</span>
<span class=xml-tag>&lt;interceptor-stack name=<span class=xml-quote>"defaultComponentStack"</span>&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"component"</span>/&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"defaultStack"</span>/&gt;</span>
<span class=xml-tag>&lt;/interceptor-stack&gt;</span>
<span class=xml-tag>&lt;/interceptors&gt;</span></pre>
</div>
</div>
<p class=paragraph>要在活动中使用它们: </p>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;action name=<span class=xml-quote>"VelocityCounter"</span> class=<span class=xml-quote>"com.opensymphony.webwork.example.counter.SimpleCounter"</span>&gt;</span>
<span class=xml-tag>&lt;result name=<span class=xml-quote>"success"</span>&gt;</span>...<span class=xml-tag>&lt;/result&gt;</span>
<span class=xml-tag>&lt;interceptor-ref name=<span class=xml-quote>"defaultComponentStack"</span>/&gt;</span>
<span class=xml-tag>&lt;/action&gt;</span></pre>
</div>
</div>
<p>&#160;</p>
注意: 可以引用拦截器或栈的名字
<p class=paragraph>更多细节参见<a title=Interceptors href="file:///D:/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6/webwork/webwork-2.2.4/docs/chinese/wikidocs/Interceptors.html"><u><font color=#0000ff>截取器</font></u></a>.</p>
<h2 class=heading2><a name=xwork.xml-Views>视图</a></h2>
<p class=paragraph>WebWork支持JSP和Velocity作为应用表示层. 本例使用JSP文件. Webwork附带了标签库(taglibs). 你可以在JSP中项组件一样使用标签库.下面是form.jsp的片断:</p>
<div class=code>
<div class=codeContent>
<pre>&lt;%@ taglib prefix=<span class=java-quote>"ww"</span> uri=<span class=java-quote>"webwork"</span> %&gt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;Webwork Form Example&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;ww:form name=<span class=java-quote>"myForm"</span> action=<span class=java-quote>"'formTest'"</span> namespace=<span class=java-quote>"/"</span> method=<span class=java-quote>"POST"</span>&gt;
&lt;table&gt;
&lt;ww:textfield label=<span class=java-quote>"First Name"</span> name=<span class=java-quote>"'formBean.firstName'"</span> value=<span class=java-quote>"formBean.firstName"</span>/&gt;
&lt;ww:textfield label=<span class=java-quote>"Last Name"</span> name=<span class=java-quote>"'formBean.lastName'"</span> value=<span class=java-quote>"formBean.lastName"</span>/&gt;
&lt;ww:submit value=<span class=java-quote>"Save Form"</span>/&gt;
&lt;/table&gt;
&lt;/ww:form&gt;
&lt;/body&gt;</pre>
</div>
</div>
<p class=paragraph>处理经过如下:</p>
<ol>
    <li>WebWork监控以<strong class=strong>.action</strong>结尾的URI(定义在<strong class=strong>web.xml</strong>中)</li>
    <li>WebWork在活动定义中查找活动<strong class=strong>formTest</strong>.</li>
    <li>WebWork创建<strong class=strong>formTest</strong>并调用<strong class=strong>com.opensymphony.webwork.example.FormAction</strong>的方法<strong class=strong>processForm</strong>(定义在<strong class=strong>xwork.xml</strong>中).</li>
    <li>该方法处理成功并返回<strong class=strong>SUCCESS</strong></li>
    <li>WebWork将返回值<strong class=strong>SUCCESS</strong>转换成地址<strong class=strong>formSuccess.jsp</strong>(定义在b class="strong"&gt;xwork.xml中)并执行重定向.</li>
</ol>
<h2 class=heading2><a name=xwork.xml-Include>包含</a></h2>
<p class=paragraph>为了易于管理大规模开发活动(包含大量活动和配置), WebWork允许在xwork.xml中包含其他配置文件 :</p>
<div class=code>
<div class=codeContent>
<pre><span class=xml-tag>&lt;xwork&gt;</span>
<span class=xml-tag>&lt;include file=<span class=xml-quote>"webwork-default.xml"</span>/&gt;</span>
<span class=xml-tag>&lt;include file=<span class=xml-quote>"user.xml"</span>/&gt;</span>
<span class=xml-tag>&lt;include file=<span class=xml-quote>"shoppingcart.xml"</span>/&gt;</span>
<span class=xml-tag>&lt;include file=<span class=xml-quote>"product.xml"</span>/&gt;</span>
....
<span class=xml-tag>&lt;/xwork&gt;</span></pre>
</div>
</div>
<p class=paragraph>被包含文件必须与xwork.xml的格式相同(具有相同的doctype及其它)并放置在类路径中(通常位于/WEB-INF/classes或/WEB-INF/lib的jar文件中).</p>
<img src ="http://www.blogjava.net/zhuyan/aggbug/110632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-04-14 14:26 <a href="http://www.blogjava.net/zhuyan/articles/110632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Portlet Configuration </title><link>http://www.blogjava.net/zhuyan/articles/110363.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Fri, 13 Apr 2007 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/110363.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/110363.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/110363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/110363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/110363.html</trackback:ping><description><![CDATA[<h1><a name=PortletConfiguration-XWork%E9%85%8D%E7%BD%AE></a>XWork配置</h1>
<p>你的应用程序的基本包(base package)应该扩展自 <em>webwork-portlet-default</em> 包, 例如:</p>
<div class=code>
<div class=codeHeader><strong>xwork.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;include file=<span class=code-quote>"webwork-<span class=code-keyword>default</span>.xml"</span> /&gt;
&lt;<span class=code-keyword>package</span> name=<span class=code-quote>"view"</span> <span class=code-keyword>extends</span>=<span class=code-quote>"webwork-portlet-<span class=code-keyword>default</span>"</span> namespace=<span class=code-quote>"/view"</span>&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1><a name=PortletConfiguration-Portlet%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%82%E6%95%B0></a>Portlet初始化参数</h1>
<p>下面是在 <em>portlet.xml</em> 中为portlet配置portlet模式(mode) -&gt; xwork命名空间(namespace)影射的 init-param 元素. 简单的讲, 你可以把portlet模式理解为不同的子应用程序, 这样它可以为不同的portlet和portlet模式在 xowrk.xml 中配置不同的命名空间(namespace): </p>
<table class=confluenceTable>
    <tbody>
        <tr>
            <th class=confluenceTh>Key </th>
            <th class=confluenceTh>描述 </th>
            <th class=confluenceTh>默认值 </th>
        </tr>
        <tr>
            <td class=confluenceTd>portletNamespace </td>
            <td class=confluenceTd>这个portlet在xwork配置中的命名空间(namespace). 命名空间(namespace)将在查找action时被优先考虑, 从而允许在同一个portlet应用程序中建立(host)多个portlet. 如果设定了这个参数, 完整的命名空间(namespace)将会是 <em>/portletNamespace/modeNamespace/actionName</em> </td>
            <td class=confluenceTd>默认命名空间. </td>
        </tr>
        <tr>
            <td class=confluenceTd>viewNamespace </td>
            <td class=confluenceTd>xwork配置中视图portlet模式(view portlet mode)的命名空间(namespace). </td>
            <td class=confluenceTd>The default namespace. </td>
        </tr>
        <tr>
            <td class=confluenceTd>editNamespace </td>
            <td class=confluenceTd>xwork配置中编辑portlet模式(edit portlet mode)的命名空间(namespace). The namespace in the xwork config for the edit portlet mode. </td>
            <td class=confluenceTd>默认命名空间. </td>
        </tr>
        <tr>
            <td class=confluenceTd>helpNamespace </td>
            <td class=confluenceTd>xwork配置中帮助portlet模式(help portlet mode)的命名空间(namespace). </td>
            <td class=confluenceTd>默认命名空间. </td>
        </tr>
        <tr>
            <td class=confluenceTd>defaultViewAction </td>
            <td class=confluenceTd>在没有指定action名称时, 视图portlet模式(view portlet mode)使用的默认action名称. </td>
            <td class=confluenceTd>默认值 </td>
        </tr>
        <tr>
            <td class=confluenceTd>defaultEditAction </td>
            <td class=confluenceTd>在没有指定action名称时, 编辑portlet模式(edit portlet mode)使用的默认action名称. </td>
            <td class=confluenceTd>默认值 </td>
        </tr>
        <tr>
            <td class=confluenceTd>defaultHelpAction </td>
            <td class=confluenceTd>在没有指定action名称时, 帮助portlet模式(help portlet mode)使用的默认action名称. </td>
            <td class=confluenceTd>默认值 </td>
        </tr>
    </tbody>
</table>
<p>例子</p>
<div class=code>
<div class=codeHeader><strong>portlet.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;init-param&gt;
&lt;!-- Portlet 命名空间 --&gt;
&lt;name&gt;portletNamespace&lt;/name&gt;
&lt;value&gt;/portletA&lt;/value&gt;
&lt;/init-param&gt;
&lt;init-param&gt;
&lt;!-- view portlet 的基本命名空间 --&gt;
&lt;name&gt;viewNamespace&lt;/name&gt;
&lt;value&gt;/view&lt;/value&gt;
&lt;/init-param&gt;
&lt;init-param&gt;
&lt;!-- 在view portlet 模式下调用的默认action名称 --&gt;
&lt;name&gt;defaultViewAction&lt;/name&gt;
&lt;value&gt;index&lt;/value&gt;
&lt;/init-param&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这个 <em>portlet.xml</em> 的片断将会建立一个命名空间为 <em>/portletA/ 的portlet. 这意味着所有对该portlet的请求将优先在此命名空间中寻找action. 进一步说, _视图(view)</em> portlet 模式将会影射到 <em>/view</em> 命名空间, 这样一个对叫 <em>myAction</em> 的action的请求将会被转发到一个 <em>/portletA/view/myAction</em> 命名空间下的action上. 这也意味着如果没有请求一个action, 那么对这个请求将会调用默认的action <em>index</em>. </p>
<h1><a name=PortletConfiguration-Portlet%E9%98%B6%E6%AE%B5%28phases%29></a>Portlet 阶段(phases)</h1>
<p>Portlet规范描述一个portlet请求周期将持续为两个阶段, <em>event(活动)</em> 阶段 和 <em>render(渲染)</em> 阶段. 假设这个portlet中有 <em>event(活动)</em> 阶段, 那么它将肯定先于 <em>render(渲染)</em> 阶段执行. <em>Event(活动)</em> 阶段一般用来改变应用程序的状态. 在一个portlet中, 典型情况是在form提交的时候. <em>Render(渲染)</em> 阶段将会准备和分派到视图(view). 推荐你将一个在 <em>event(活动)</em> 阶段执行的action的结果(result)指向到另外一个在 <em>render(渲染)</em> 阶段执行的action上, 后者用来负责派发到真正的视图.</p>
<h1><a name=PortletConfiguration-Portlet%E7%BB%93%E6%9E%9C%E6%B4%BE%E5%8F%91%28resultdispatching%29></a>Portlet 结果派发(result dispatching)</h1>
<p><em>webwork-portlet-default</em> 包定义了一个特殊的默认结果类型(result type), 它负责执行一个Action执行的结果逻辑(result logic). 一般, 这包括include一个jsp进行渲染, 或者为当前的活动 action准备一个渲染 action.</p>
<p>这个结果类型有三种主要执行模式.</p>
<ul>
    <li>如果这个Action在渲染阶段执行, 它会对配置在 <em>location</em> 属性下的资源执行 PortletRequestDispatcher.include(req, res) 方法.
    <li>如果这个Action在活动阶段执行, 并且结果是一个action影射(action mapping), 它会给ActionResponse设置一个渲染参数指定哪个Action将会在接下来的渲染阶段执行. 这符合良好的web应用程序设计, 着提促进了活动后重定向(redirect)的使用, 这样意味着一个在活动阶段执行的Action将会紧接着被重定向到一个在渲染阶段执行的Action.
    <li>如果这个Action在活动阶段被执行, 并且结果不是一个action影射(action mapping), 结果将会作为一种特殊的Action准备, 它被叫做 "renderDirect(直接渲染)" (在 <em>webwork-portlet-default</em> 包中指定), 它的唯一职责就是渲染特定的web资源 (一般是一个JSP). </li>
</ul>
<p>在活动模式执行的action可以通过result配置中的query string给渲染模式执行的action传递渲染参数:</p>
<div class=code>
<div class=codeHeader><strong>xwork.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;result name=<span class=code-quote>"success"</span>&gt;/displayCart.action?userId=${userId}&lt;/result&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这会将一个叫做 <em>userId</em> 的 <em>渲染参数</em> 值传递给将要派发到的action的 <em>userId</em> 属性.</p>
<!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://wiki.javascud.org/display/ww2cndoc/Portlet+Configuration"
dc:identifier="http://wiki.javascud.org/display/ww2cndoc/Portlet+Configuration"
dc:title="Portlet Configuration"
trackback:ping="http://wiki.javascud.org/rpc/trackback/2356"/>
</rdf:rdf>
--><!--
Root decorator: all decisions about how a page is to be decorated via the
inline decoration begins here.
--><!--
Switch based upon the context. However, for now, just delegate to a decorator
identified directly by the context.
-->
<div class=wiki-content style="MARGIN-RIGHT: 10px">
<p style="CLEAR: both"><!-- comments should always display underneath the content. we should have a 'clear:both' here just in case there are floats or aligned images in the content -->
<div class=tabletitle style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"><a name=comments>Comments</a> <span class=smalltext>&nbsp;(<a href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Configuration?showComments=false"><u><font color=#0000ff>Hide</font></u></a>)</span> </div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"><a name=comment-4376></a>
<div class=commentBox>
<div class=commentblock>
<p>renderDirect(直接着色,直接生成),实际上是把结果放到特定的WEB资源中..</p>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/zhuyan/aggbug/110363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-04-13 10:02 <a href="http://www.blogjava.net/zhuyan/articles/110363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork+Portlet</title><link>http://www.blogjava.net/zhuyan/articles/110362.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Fri, 13 Apr 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/110362.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/110362.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/110362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/110362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/110362.html</trackback:ping><description><![CDATA[<h1><a name=PortletTutorial-%E7%B4%A2%E5%BC%95></a>索引</h1>
<ol>
    <li><a title="intro on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-intro"><u><font color=#800080>介绍</font></u></a>
    <li><a title="install_eclipse on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-installeclipse"><u><font color=#800080>安装Eclipse</font></u></a>
    <li><a title="install_jboss on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-installjboss"><u><font color=#800080>安装 JBoss Portal 2.2</font></u></a>
    <li><a title="create_project on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-createproject"><u><font color=#800080>创建项目</font></u></a>
    <li><a title="classpath on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-classpath"><u><font color=#800080>Classpath 设置</font></u></a>
    <li><a title="portlet.xml on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-portlet.xml"><u><font color=#800080>portlet.xml</font></u></a>
    <li><a title="web.xml on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-web.xml"><u><font color=#800080>web.xml</font></u></a>
    <li><a title="hello_world on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-helloworld"><u><font color=#800080>Hello World!</font></u></a>
    <li><a title="xwork.xml on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-xwork.xml"><u><font color=#800080>xwork.xml</font></u></a>
    <li><a title="jboss_descriptors on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-jbossdescriptors"><u><font color=#800080>JBoss Portal 描述文件</font></u></a>
    <li><a title="deployment on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-deployment"><u><font color=#800080>部署</font></u></a>
    <li><a title="next on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-next"><u><font color=#800080>下一步</font></u></a>
    <li><a title="redeploy on Portlet Tutorial" href="http://wiki.javascud.org/display/ww2cndoc/Portlet+Tutorial#PortletTutorial-redeploy"><u><font color=#800080>重新部署</font></u></a> </li>
</ol>
<h1><a name=PortletTutorial-StepbyStep%E6%95%99%E7%A8%8B></a>Step-by-Step 教程</h1>
<h2><a name=PortletTutorial-%E4%BB%8B%E7%BB%8D></a>介绍 <a name=PortletTutorial-intro></a></h2>
<p>这篇教程带你经历建立简单portlet应用的流程, 使用Eclipse, JBoss Portal 2.2 和 WebWork Portlet框架.</p>
<h2><a name=PortletTutorial-%E5%AE%89%E8%A3%85Eclipse></a>安装Eclipse <a name=PortletTutorial-installeclipse></a></h2>
<p>这篇教程中, 我们将会使用 Eclipse 3.1.1, 可以从此处下载 <span class=nobr><a title="Visit page outside Confluence" href="http://www.eclipse.org/" rel=nofollow><u><font color=#0000ff>http://www.eclipse.org<sup><img class=rendericon height=7 alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" width=7 align=absMiddle border=0></sup></font></u></a></span></p>
<h2><a name=PortletTutorial-%E5%AE%89%E8%A3%85JBossPortal2.2></a>安装 JBoss Portal 2.2 <a name=PortletTutorial-installjboss></a></h2>
<p>JBoss Portal 2.2 可以在这里下载 <span class=nobr><a title="Visit page outside Confluence" href="http://www.jboss.com/products/jbossportal/downloads" rel=nofollow><u><font color=#800080>http://www.jboss.com/products/jbossportal/downloads<sup><img class=rendericon height=7 alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" width=7 align=absMiddle border=0></sup></font></u></a></span>.</p>
<h2><a name=PortletTutorial-%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE></a>创建项目 <a name=PortletTutorial-createproject></a></h2>
<p>一个Portlet应用与一般的web应用程序的打包方式基本相同, 但是需要附加描述文件; portlet.xml. 本教程的第一步是在eclipse里面建立项目结构. 首先, 我们创建这个 Java 项目本身, 使用新建项目的向导. 我们命名项目为 'MyPortlet'. 确定选择了 "Create separate source and output folders (创建单独的源文件和输出目录)"选项, 下一步, 设置 'src' 源文件目录的输出目录(output folder)为'MyPortlet/webapp/WEB-INF/classes'. 讲讲方便我们在完成项目的时候导出本项目为 WAR 包. </p>
<p><em>New project wizard (新建项目向导)</em></p>
<p><img src="http://wiki.javascud.org/download/attachments/2144/new-project-1.jpg" align=absMiddle border=0></p>
<p><em>New project wizard, cont (新建项目向导, 续)</em></p>
<p><img src="http://wiki.javascud.org/download/attachments/2144/new-project-2.jpg" align=absMiddle border=0></p>
<h2><a name=PortletTutorial-Classpath%E8%AE%BE%E7%BD%AE></a>Classpath 设置 <a name=PortletTutorial-classpath></a></h2>
<p>在 build 应用程序之前, 我们需要添加一些需要的jar包到 build classpath 和 WEB-INF/lib 目录中. 首先, 创建 WEB-INF/lib 目录, 然后下载 WebWork 2.2.1 发布包并将起解压缩到本地硬盘. 找到下面屏幕截图中的jar包并将它们放到新创建的 WEB-INF/lib 目录中. 选择所有的jar包, 点鼠标右键选择 "Build Path(Build路径) -&gt; Add to Build Path(添加Build路径)". 现在你的本地项目应该看起来和屏幕截图中相同.</p>
<p><img src="http://wiki.javascud.org/download/attachments/2144/buildpath.jpg" align=absMiddle border=0></p>
<h2><a name=PortletTutorial-portlet.xml></a>portlet.xml <a name=PortletTutorial-portlet.xml></a></h2>
<p>Next thing we do is create a portlet.xml file in the WEB-INF folder. In this file, write the following:<br>我们下面要做的是在 WEB-INF 目录中创建一个 portlet.xml 文件. 在这个文件中, 写下如下内容:</p>
<div class=code>
<div class=codeHeader><strong>portlet.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;portlet-app version=<span class=code-quote>"1.0"</span> xmlns=<span class=code-quote>"http:<span class=code-comment>//java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"</span>
</span>         xmlns:xsi=<span class=code-quote>"http:<span class=code-comment>//www.w3.org/2001/XMLSchema-instance"</span>
</span>xsi:schemaLocation=<span class=code-quote>"http:<span class=code-comment>//java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"</span>&gt;
</span>  &lt;portlet&gt;
&lt;description xml:lang=<span class=code-quote>"EN"</span>&gt;My very first WebWork Portlet&lt;/description&gt;
&lt;portlet-name&gt;MyPortlet&lt;/portlet-name&gt;
&lt;display-name xml:lang=<span class=code-quote>"EN"</span>&gt;My first WebWork Portlet&lt;/display-name&gt;
&lt;portlet-class&gt;com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher&lt;/portlet-class&gt;
&lt;init-param&gt;
&lt;!-- 视图模式(view mode)的命名空间(namespace). 映射到xwork配置中的命名空间 --&gt;
&lt;name&gt;viewNamespace&lt;/name&gt;
&lt;value&gt;/view&lt;/value&gt;
&lt;/init-param&gt;
&lt;init-param&gt;
&lt;!-- 在视图模式中调用的默认action名称 --&gt;
&lt;name&gt;defaultViewAction&lt;/name&gt;
&lt;value&gt;index&lt;/value&gt;
&lt;/init-param&gt;
&lt;expiration-cache&gt;0&lt;/expiration-cache&gt;
&lt;supports&gt;
&lt;mime-type&gt;text/html&lt;/mime-type&gt;
&lt;/supports&gt;
&lt;supported-locale&gt;en&lt;/supported-locale&gt;
&lt;portlet-info&gt;
&lt;title&gt;My very own WebWork Portlet&lt;/title&gt;
&lt;<span class=code-object>short</span>-title&gt;WWPortlet&lt;/<span class=code-object>short</span>-title&gt;
&lt;keywords&gt;webwork,portlet&lt;/keywords&gt;
&lt;/portlet-info&gt;
&lt;/portlet&gt;
&lt;/portlet-app&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>本 portlet.xml 文件设定这个 portlet 使用 <em>com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher</em> Portlet 实现. 它还告诉 Portlet 它会映射 <em>视图</em> portlet 模式到 XWork 配置中的 <em>/view</em> 命名空间, 我们在建立(building)我们的 XWork action 的时候必须牢记它. 还有, 它告诉 portlet, 如果在 portlet 请求中没有找到一个action 参数, 被调用的默认 action 是 "index" action, 它应该被放在 xwork 配置的 <em>/view</em> 命名空间里.</p>
<h2><a name=PortletTutorial-web.xml></a>web.xml <a name=PortletTutorial-web.xml></a></h2>
<p>WebWork Portlet 还需要你在 web.xml 描述中建立一些特殊的 servlet 和 filter 来打开对 WebWork 标签库和模版语言的支持, 因为它依赖于一些 Servlet API 的接口和类. 所以在WEB-INF 目录中创建 web.xml 文件, 并添加如下内容:</p>
<div class=code>
<div class=codeHeader><strong>web.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;?xml version=<span class=code-quote>"1.0"</span> encoding=<span class=code-quote>"UTF-8"</span>?&gt;
&lt;!DOCTYPE web-app PUBLIC <span class=code-quote>"-<span class=code-comment>//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</span> <span class=code-quote>"http://java.sun.com/dtd/web-app_2_3.dtd"</span>&gt;
</span>&lt;web-app&gt;
&lt;filter&gt;
&lt;filter-name&gt;webwork&lt;/filter-name&gt;
&lt;filter-class&gt;
com.opensymphony.webwork.dispatcher.FilterDispatcher
&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;webwork&lt;/filter-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;listener&gt;
&lt;listener-class&gt;
com.opensymphony.webwork.portlet.context.ServletContextHolderListener
&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;preparator&lt;/servlet-name&gt;
&lt;servlet-class&gt;
com.opensymphony.webwork.portlet.context.PreparatorServlet
&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;taglib&gt;
&lt;taglib-uri&gt;/webwork&lt;/taglib-uri&gt;
&lt;taglib-location&gt;/WEB-INF/lib/webwork-2.2.1.jar&lt;/taglib-location&gt;
&lt;/taglib&gt;
&lt;/web-app&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>HttpServletRequest/Response, and other Servlet API classes in the ServletActionContext that is used in many of the JSPs and templates.<br>FilterDispacher 保证 webwork jar 包中的风格样式表和 js 文件的URL可以被正确解析. ServletContextHolderListener 是一个Servlet context listener(上下文监听器), 它存放了 servlet context (上下文) 的一个引用, 在派发(dispatch)到视图(例如JSP/ftl或velocity)之前初始化包括 HttpServletRequest/Response 和其它很多在JSP和模版引擎中会用到的ServletActionContext中的 Servlet API 类.</p>
<h2><a name=PortletTutorial-HelloWorld%5C%21></a>Hello World! <a name=PortletTutorial-helloworld></a></h2>
<p>With these basic project structure, <em>portlet.xml</em> and <em>web.xml</em> 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 <em>WEB-INF/pages/view</em> folder, and within this folder, create the file "helloWorld.jsp". In this file, we simply put:<br>拥有了基本的项目结构, <em>portlet.xml</em> 和 <em>web.xml</em> 都有了, 现在可以开始实现 "Hello World" 这个例子了, 我们先建立一个存放 JSP 文件的目录. 建立一个 <em>WEB-INF/pages/view</em> 目录, 然后在这个目录里, 建立一个 "helloWorld.jsp" 文件. 在这个文件中, 我们简单写下:</p>
<div class=code>
<div class=codeHeader><strong>helloWorld.jsp</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;H2&gt;Hello world!&lt;/H2&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<h2><a name=PortletTutorial-xwork.xml></a>xwork.xml <a name=PortletTutorial-xwork.xml></a></h2>
<p>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:<br>到了这里, 是准备 xwork 配置文件的时候了. 创建一个叫做 xwork.xml 的空文件, 放在 'src' 的根目录下.<br>在这个文件中, 我们放如下内容:</p>
<div class=code>
<div class=codeHeader><strong>xwork.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;?xml version=<span class=code-quote>"1.0"</span> encoding=<span class=code-quote>"ISO-8859-1"</span>?&gt;
&lt;!DOCTYPE xwork PUBLIC
<span class=code-quote>"-<span class=code-comment>//OpenSymphony Group//XWork 1.0//EN"</span>
</span>    <span class=code-quote>"http:<span class=code-comment>//www.opensymphony.com/xwork/xwork-1.0.dtd"</span>&gt;
</span>&lt;xwork&gt;
&lt;include file=<span class=code-quote>"webwork-<span class=code-keyword>default</span>.xml"</span> /&gt;
&lt;<span class=code-keyword>package</span> name=<span class=code-quote>"view"</span> <span class=code-keyword>extends</span>=<span class=code-quote>"webwork-portlet-<span class=code-keyword>default</span>"</span>
namespace=<span class=code-quote>"/view"</span>&gt;
&lt;action name=<span class=code-quote>"index"</span>
class=<span class=code-quote>"com.opensymphony.xwork.ActionSupport"</span>&gt;
&lt;result name=<span class=code-quote>"success"</span>&gt;/WEB-INF/pages/view/helloWorld.jsp&lt;/result&gt;
&lt;/action&gt;
&lt;/<span class=code-keyword>package</span>&gt;
&lt;/xwork&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>这里要明确一下, 我们创建了一个命名空间为 <em>view</em> 的包(package), 我们的包继承自 <em>webwork-portlet-default</em> 包. 这个 <em>webwork-portlet-default</em> 包中包含了一些可以允许在 portlet 容器中运行 WebWork/XWork 的特殊结果类型(result type).</p>
<h2><a name=PortletTutorial-JBossPortal%E6%8F%8F%E8%BF%B0%E6%96%87%E4%BB%B6></a>JBoss Portal 描述文件 <a name=PortletTutorial-jbossdescriptors></a></h2>
<p>除了常规的 <em>portlet.xml</em> 和 <em>web.xml</em> 表述文件, JBoss Portal 2.2 需要我们添加几个 JBoss 的特定描述文件. 这些描述文件的名称将根据我们的应用程序的上下文的根(context root) 的名字来命名, 它一般也是我们导出的 war 包的名字. 我们稍候将会创建一个叫做 MyPortlet.war 的 war 包, 所以 JBoss 描述文件被命名为 'MyPortlet-object.xml'. 我们在 WEB-INF目录中创建这个文件, 然后添加如下内容:</p>
<div class=code>
<div class=codeHeader><strong>MyPortlet-object.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;?xml version=<span class=code-quote>"1.0"</span> encoding=<span class=code-quote>"UTF-8"</span>?&gt;
&lt;deployments&gt;
&lt;deployment&gt;
&lt;<span class=code-keyword>if</span>-exists&gt;overwrite&lt;/<span class=code-keyword>if</span>-exists&gt;
&lt;parent-ref&gt;<span class=code-keyword>default</span>&lt;/parent-ref&gt;
&lt;properties /&gt;
&lt;page&gt;
&lt;page-name&gt;MyPortlet Tutorial&lt;/page-name&gt;
&lt;properties /&gt;
&lt;window&gt;
&lt;window-name&gt;MyPortletWindow&lt;/window-name&gt;
&lt;instance-ref&gt;MyPortletInstance&lt;/instance-ref&gt;
&lt;region&gt;center&lt;/region&gt;
&lt;height&gt;0&lt;/height&gt;
&lt;/window&gt;
&lt;/page&gt;
&lt;/deployment&gt;
&lt;deployment&gt;
&lt;<span class=code-keyword>if</span>-exists&gt;overwrite&lt;/<span class=code-keyword>if</span>-exists&gt;
&lt;instance&gt;
&lt;instance-name&gt;MyPortletInstance&lt;/instance-name&gt;
&lt;component-ref&gt;MyPortlet.MyPortlet&lt;/component-ref&gt;
&lt;/instance&gt;
&lt;/deployment&gt;
&lt;/deployments&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>然后, 我们需要另外两个文件, <em>jboss-app.xml</em> 和 <em>jboss-portlet.xml</em> 它们内容如下:</p>
<div class=code>
<div class=codeHeader><strong>jboss-app.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;jboss-app&gt;
&lt;app-name&gt;MyPortlet&lt;/app-name&gt;
&lt;/jboss-app&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<div class=code>
<div class=codeHeader><strong>jboss-portlet.xml</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;portlet-app&gt;
&lt;portlet&gt;
&lt;portlet-name&gt;MyPortlet&lt;/portlet-name&gt;
&lt;security&gt;
&lt;/security&gt;
&lt;/portlet&gt;
&lt;/portlet-app&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<h2><a name=PortletTutorial-%E9%83%A8%E7%BD%B2></a>部署</h2>
<p>现在我们的项目结构看起来是这样的:</p>
<p><em>项目结构</em><br><img src="http://wiki.javascud.org/download/attachments/2144/project-structure-hello-world-1.jpg" align=absMiddle border=0></p>
<p>现在可以试验一下我们的不可思议的 HelloWorld portlet 了. 在Windows的一个浏览器窗口中, 我们选择 WEB-INF 目录然后将它以 zip 格式压缩为叫做 'MyPortlet.war' 的文件. 将这个 war 文件放到JBoss Portal的 server/default/deploy 目录中, 然后启动服务器. 默认情况下, JBoss Portal 的 URL 是 <span class=nobr><a title="Visit page outside Confluence" href="http://localhost:8080/portal" rel=nofollow><u><font color=#0000ff>http://localhost:8080/portal<sup><img class=rendericon height=7 alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" width=7 align=absMiddle border=0></sup></font></u></a></span>, 所以我们用浏览器访问这个地址, 我们将会看到这个 portal 的首页, 这里你应该会看到一个 "MyPortlet Tutorial" 菜单项, 与下面的截图中的一相同. 当按下菜单链接, 你会得到一个奇妙的 "Hello World" 页面!</p>
<p><em>JBoss Portal 首页</em><br><img src="http://wiki.javascud.org/download/attachments/2144/jboss-portal-frontpage.jpg" align=absMiddle border=0></p>
<p><em>MyPortlet portlet 页面</em><br><img src="http://wiki.javascud.org/download/attachments/2144/jboss-portal-portlet-page.jpg" align=absMiddle border=0></p>
<h2><a name=PortletTutorial-%E4%B8%8B%E4%B8%80%E6%AD%A5></a>下一步 <a name=PortletTutorial-next></a></h2>
<p>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:<br>接着, 我们来做一些有趣的事, 也就是创建一个简单的 form 并显示一个结果页面. 我们先来创建一个 JSP 页面来显示这个 form. 创建一个新的文件 'helloForm.jsp', 放在 WEB-INF/pages/view/ 目录下. 我们将会使用 WebWork 标签库在我们的页面上创建这个 form. 这个 form 会询问用户的名字和姓, 就像这样:</p>
<div class=code>
<div class=codeHeader><strong>helloForm.jsp</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;%@ taglib uri=<span class=code-quote>"/webwork"</span> prefix=<span class=code-quote>"ww"</span> %&gt;
&lt;H2&gt;Hi there! Please enter your name&lt;/H2&gt;
&lt;ww:form action=<span class=code-quote>"helloWorld"</span> method=<span class=code-quote>"POST"</span>&gt;
&lt;ww:textfield label=<span class=code-quote>"First name"</span> name=<span class=code-quote>"firstName"</span> value=<span class=code-quote>"%{firstName}"</span>/&gt;
&lt;ww:textfield label=<span class=code-quote>"Last name"</span> name=<span class=code-quote>"lastName"</span> value=<span class=code-quote>"%{lastName}"</span>/&gt;
&lt;ww:submit value=<span class=code-quote>"Say hello!"</span>/&gt;
&lt;/ww:form&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<p>现在我们准备写一些 Java 代码, 不多, 就一点点. 我们在我们的 <em>src</em> 目录创建一个新的包, 我们命名它为 <em>com.opensymphony.webwork.portlet.tutorial</em>. 在这个包中, 创建一个 <em>HelloWorldAction</em> 类. 遵循一般的 WebWork 习惯, 这个类扩展自XWork框架的 ActionSupport 类, 我们还会添加一些属性来映射我们刚才创建的 JSP 中的 form 的属性:</p>
<div class=code>
<div class=codeHeader><strong>HelloWorldAction.java</strong></div>
<div class=codeContent>
<pre class=code-java><span class=code-keyword>package</span> com.opensymphony.webwork.portlet.tutorial;
<span class=code-keyword>import</span> com.opensymphony.xwork.ActionSupport;
<span class=code-keyword>public</span> class HelloWorldAction <span class=code-keyword>extends</span> ActionSupport {
<span class=code-keyword>private</span> <span class=code-object>String</span> firstName;
<span class=code-keyword>private</span> <span class=code-object>String</span> lastName;
<span class=code-keyword>public</span> <span class=code-object>String</span> getFirstName() {
<span class=code-keyword>return</span> firstName;
}
<span class=code-keyword>public</span> void setFirstName(<span class=code-object>String</span> firstName) {
<span class=code-keyword>this</span>.firstName = firstName;
}
<span class=code-keyword>public</span> <span class=code-object>String</span> getLastName() {
<span class=code-keyword>return</span> lastName;
}
<span class=code-keyword>public</span> void setLastName(<span class=code-object>String</span> lastName) {
<span class=code-keyword>this</span>.lastName = lastName;
}
}</pre>
</div>
</div>
<p>&nbsp;</p>
<p>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 <em>helloForm.jsp</em>, we import the WebWork tag library, and we use the <em>ww:property</em> tags to display the input from the form:<br>我们还需要一个 JSP 来显示 input 的处理结果. 我们还使用 helloWorld.jsp 然后修改一下. 与 <em>helloForm.jsp</em> 一样, 我们引入 WebWork 标签库, 然后我们使用 <em>ww:property</em> 标签来显示 form 中输入的内容:</p>
<div class=code>
<div class=codeHeader><strong>helloWorld.jsp</strong></div>
<div class=codeContent>
<pre class=code-java>&lt;%@ taglib prefix=<span class=code-quote>"ww"</span> uri=<span class=code-quote>"/webwork"</span> %&gt;
&lt;H2&gt;Hello &lt;ww:property value=<span class=code-quote>"firstName"</span>/&gt; &lt;ww:property value=<span class=code-quote>"lastName"</span>/&gt;&lt;/H2&gt;
&lt;p/&gt;
&lt;a xhref=<span class=code-quote>"&lt;ww:url action="</span>helloWorldInput<span class=code-quote>"/&gt;"</span>&gt;Back to form&lt;/a&gt;</pre>
</div>
</div>
<p>&nbsp;</p>
<h2><a name=PortletTutorial-%E9%87%8D%E6%96%B0%E9%83%A8%E7%BD%B2></a>重新部署 <a name=PortletTutorial-redeploy></a></h2>
<p>现在我们准备好重新部署我们的应用程序, 所以重新用 zip 格式压缩好一个 war 包并放到 <em>server/default/deploy</em> 目录. 现在 'MyPortlet Tutorial' 页面将会是这个样子:</p>
<p><em>Hello World form</em><br><img src="http://wiki.javascud.org/download/attachments/2144/hello-world-form-1.jpg" align=absMiddle border=0></p>
<p>输入一些信息, 然后点击 "Say hello!" 按钮, 然后你将会看到不错的个性化的 "hello" 信息:</p>
<p><em>个性化的 Hello World</em></p>
<p><img src="http://wiki.javascud.org/download/attachments/2144/hello-world-result-1.jpg" align=absMiddle border=0></p>
<p style="CLEAR: both">&nbsp;</p>
<img src ="http://www.blogjava.net/zhuyan/aggbug/110362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-04-13 10:01 <a href="http://www.blogjava.net/zhuyan/articles/110362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>验证框架</title><link>http://www.blogjava.net/zhuyan/articles/110227.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Thu, 12 Apr 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/110227.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/110227.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/110227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/110227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/110227.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 验证框架WebWork提供了在Action执行之前，对输入数据的验证功能，它使用了其核心XWork的验证框架。提供了如下功能：1、 可配置的验证文件。它的验证文件是一个独立的XML配置文件，对验证的添加、修改只需更改配置文件，无需编译任何的Class。2、 验证文件和被验证的对象完全解藕。验证对象是普通的JavaBean就可以了（可以是FormBean、域对象等），它们不需实现任何额外...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhuyan/articles/110227.html'>阅读全文</a><img src ="http://www.blogjava.net/zhuyan/aggbug/110227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-04-12 17:29 <a href="http://www.blogjava.net/zhuyan/articles/110227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XWork配置详述</title><link>http://www.blogjava.net/zhuyan/articles/110226.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Thu, 12 Apr 2007 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/110226.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/110226.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/110226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/110226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/110226.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: XWork配置详述XWork配置文件是以&#8220;xwork&#8221;命名的.xml文件，它必需放到类路径（classPath）的根目录， Web应用一般放在classes目录中，它需要遵守DTD的规范（现在是xwork-1.0.dtd）。这个文件定义了我们的Action，Interceptor，Result的配置和相互之间的映射。下面我们看看用户注册的完整XWork配置文件：&l...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhuyan/articles/110226.html'>阅读全文</a><img src ="http://www.blogjava.net/zhuyan/aggbug/110226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-04-12 17:28 <a href="http://www.blogjava.net/zhuyan/articles/110226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>