﻿<?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-用手做事，用心做事，用生命做事-随笔分类-webWork</title><link>http://www.blogjava.net/wyxdeniro/category/27589.html</link><description>舍我其谁</description><language>zh-cn</language><lastBuildDate>Mon, 26 Nov 2007 14:47:27 GMT</lastBuildDate><pubDate>Mon, 26 Nov 2007 14:47:27 GMT</pubDate><ttl>60</ttl><item><title>webwork学习笔记(八)-----xwork详述 </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163289.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163289.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163289.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163289.html</trackback:ping><description><![CDATA[<span style="color: #993300">xwork配置文件必需放在类路径(classPass)的根目录下，必需遵循DTD规范&nbsp; <br />
&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "</span><a href="http://www.opensymphony.com/xwork/xwork-1.0.dtd"><span style="color: #993300">http://www.opensymphony.com/xwork/xwork-1.0.dtd</span></a><span style="color: #993300">"&gt;<br />
xwork.xml文件的标签元素<br />
1、xwork:xwork配置文件的内容，都是定义在&lt;xwork&gt;标签中，它的直接子标签有&lt;package&gt;和&lt;include&gt;<br />
2、Package:我们的Action,Interceptor,Result-type都是在此标签中定义，&lt;package&gt;标签有个必需的属性"name",它用来标识唯一的一个package.属性"extends"是可选的，它用来继承前面定义的一个或一个以上Package配置信息。<br />
3、Result-type:用来定义输出结果类型的Class:&lt;result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/&gt;,default="true"表示如果在Action的result中不指定result-type,就使用这个默认的result-type.<br />
4、Interceptors:它是一个简单的&lt;interceptors&gt;&lt;/interceptors&gt;标签，我们的interceptor和interceptor-stack都在这里定义。<br />
5、Interceptor:用来定义我们的拦截器：<br />
&lt;interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/&gt;,在Action中，可以通过&lt;interceptor-ref/&gt;来直接引用前面定义的拦截器。<br />
6、Interceptor-satack:用来将上面定义的Interceptor组织成堆栈的形式，这样我们就可以创建一组标准的interceptor,让他按照顺序执行，在我们的action中直接引用这个interceptor堆栈就可以了。<br />
<span style="color: #800080">&lt;interceptor-stack name="validationWorkflowStack"&gt;<br />
&lt;interceptor-ref name="defaultStack"/&gt;<br />
&lt;interceptor-ref name="validation"/&gt;<br />
&lt;interceptor-ref name="workflow"/&gt;<br />
&lt;/interceptor-stack&gt;</span><br />
7、Global-results:它允许我们定义全局的输出结果(global result)。<br />
<span style="color: #800080">&lt;global-results&gt;<br />
&lt;result name="login" type="dispacher"&gt;<br />
&lt;param name="location"&gt;/login.jsp&lt;/param&gt;<br />
&lt;/result&gt;<br />
&lt;result name="error" type="dispatcher"&gt;<br />
&lt;param name="location"&gt;/error.jsp&lt;/param&gt;<br />
&lt;/result&gt;<br />
&lt;/global-results&gt;</span><br />
</span>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:47 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork学习笔记(七)-----验证框架的使用 </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163288.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163288.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163288.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163288.html</trackback:ping><description><![CDATA[<span style="color: #993300">1、注册我们的验证类型：<br />
webwork验证是通过验证类型来实现的，验证类型是通过类(该类必需实现com.opensymphony.xwork.validator.Validator接口，或者继承ValidatorSoupport,FieldValidatorSupport等)来实现的，在使用验证类型之前，必需要在validatorFactory中注册，一般使用配置文件validators.xml进行注册，要求把文件validators.xml放到ClassPath的根目录中。<br />
<span style="color: #800080">&lt;validators&gt;<br />
&lt;validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/&gt;<br />
&lt;validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/<br />
&lt;validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/&gt;<br />
&lt;validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/&gt;<br />
&lt;validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/&gt;<br />
&lt;validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/&gt;<br />
&lt;validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/&gt;<br />
&lt;validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/&gt;<br />
&lt;validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/&gt;<br />
&lt;validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/&gt;<br />
&lt;validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/&gt;<br />
&lt;/validators&gt;</span><br />
2、开启Action的验证功能：<br />
在xwork.xml中加入&lt;interceptor class="com.opensymphony.xwork.validator.ValidationInterceptor"/&gt;<br />
3、实现我们的验证文件(也就是规则)：<br />
我们的验证文件必需以ActionName-validation.xml格式命名，他必需被放置到与这个Action相同的包中。<br />
格式：<br />
<span style="color: #800080">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span><br />
<span style="color: #800080">&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"</span>&nbsp;&nbsp; "</span><a style="color: #800080" href="http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd</a><span style="color: #993300">"&gt;<br />
<span style="color: #800080">&lt;validators&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;field name="count"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field-validator type="required"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;You must enter a value for count.&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field-validator type="int"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="min"&gt;0&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="max"&gt;5&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;<br />
&nbsp;&nbsp;&nbsp; count must be between ${min} and ${max}, current value is ${count}.<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br />
&lt;/validators&gt;<br />
</span>(1)、&lt;field&gt;标签代表一个字段，属性"name"和页面输入框的"name"属性必需完全一致。<br />
(2)、&lt;field-validator&gt;标签定义我们的验证规则，type属性的值就是我们前面定义的验证类型。<br />
(3)、验证文件中，字段数据是通过表达式语言从我们的值堆栈中取得，一般是Action对象。<br />
(4)、不管验证是否通过，我们的Action都会执行，但是如果验证没有通过，他不会调用Action的execute()方法。</span> <br />
<span style="color: #993300">4、验证Action的写法：<br />
<span style="color: #800080">import com.opensymphony.xwork.ActionSupport;<br />
import com.opensymphony.xwork.ValidationAware;<br />
public class SimpleAction extends ActionSupport implements ValidationAware {<br />
&nbsp;&nbsp;&nbsp; private int count;<br />
&nbsp;&nbsp;&nbsp; public void setCount(int count) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.count = count;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public int getCount() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return count;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String execute(){<br />
&nbsp;&nbsp;<span style="color: #008080">//在这里调用用户注册的业务逻辑，比如：将注册信息存储到数据库<br />
</span>&nbsp;&nbsp;return SUCCESS;<br />
&nbsp;}<br />
}<br />
</span>5、xwork.xml中需要注意的地方：<br />
<span style="color: #800080">&lt;action name="validation" class="com.wyq.login.action.SimpleAction"&gt;<br />
&nbsp;&nbsp; &lt;result name="success" type="dispatcher"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="location"&gt;/login/simple_result.jsp&lt;/param&gt;<br />
&nbsp;&nbsp; &lt;/result&gt;<br />
&nbsp;&nbsp; &lt;result name="error" type="dispatcher"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="location"&gt;/login/simple.jsp&lt;/param&gt;<br />
&nbsp;&nbsp; &lt;/result&gt;<br />
</span><span style="color: #008000">这里是最重要的，不符合条件的都从下面输出，这里也是必需声明的<br />
&nbsp;&nbsp; &lt;!-- If you don't override execute(), you must do this: --&gt;<br />
</span>&nbsp;&nbsp; <span style="color: #800080">&lt;result name="input" type="dispatcher"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="location"&gt;/login/simple.jsp&lt;/param&gt;<br />
&nbsp;&nbsp; &lt;/result&gt;<br />
&nbsp;&nbsp; &lt;interceptor-ref name="validator" /&gt;<br />
&nbsp;&nbsp; &lt;interceptor-ref name="debugStack" /&gt;<br />
&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack" /&gt;<br />
&nbsp; &lt;/action&gt;</span></span> 
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:46 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork学习笔记(五) </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163285.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163285.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163285.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163285.html</trackback:ping><description><![CDATA[<span style="color: #800080"><span style="color: #800080">&lt;action name="register" class="example.register.RegisterAction" &gt;<br />
</span>&nbsp;</span><span style="color: #800080"><span style="color: #800080">&lt;result name="success" type="dispatcher"&gt;<br />
</span>&nbsp;</span><span style="color: #800080"><span style="color: #800080">&lt;param name="location"&gt;register-result.jsp&lt;/param&gt;<br />
</span>&nbsp;</span><span style="color: #800080"><span style="color: #800080">&lt;/result&gt;<br />
</span>&nbsp;</span><span style="color: #800080"><span style="color: #800080">&lt;interceptor-ref name="params"/&gt;<br />
</span>&nbsp;</span><span style="color: #800080"><span style="color: #800080">&lt;/action&gt;<br />
</span>result标签里面的"name"值表示action根据名字进行视图输出。<br />
type决定采用那一种视图技术，将执行结果展现给用户，下面是Type的类型：<br />
(1)、dispatcher:通过javax.servlet.RequestDispatcher的forward()或include()方法调度到页面展现，这样的页面一般是Jsp页面。location是必需的参数，表示执行完成之后转向的位置。<br />
(2)、redirect:将响应重新定向到浏览器指定的位置，它将会导致Action执行完成的数据丢失或不再可用，将响应定向到参数location指定的，新的url中，location是必需的，执行完成之后转向的位置。<br />
(3)、chaining:将Action执行完成之后连接到另一个Action中继续执行，新的Action使用上一个Action的上下文，actionName是必需的，将要被连接的Action名字。<br />
(4)、velocity:它类似Jsp的执行环境(使用JavaServlet容器)，将Velocity模板转化成数据流的形式，直接通过JavaServlet输出，location是必需的执行完成之后转向的位置(一般是.vm页面).<br />
</span><span style="color: #800080"><span style="color: #800080">&lt;result name="success" type="velocity"&gt;<br />
&lt;param name="location"&gt;foo.vm&lt;/param&gt;<br />
&lt;/result&gt;<br />
</span><span style="color: #993300">(5)、FreeMarker:是一个纯Java模板引擎，一个普通的基于模板生成文本的工具。location是必需的，执行完成之后转向的位置。</span> </span>
<p style="color: #993300"><span style="color: #800080"><span style="color: #800080">&lt;result name="success" type="freemarker"&gt;foo.ftl&lt;/result&gt;</span></span></p>
<p style="color: #993300"><span style="color: #800080">(6)、JasperReports:将Action执行的结果通过JasperReports报表形式输出，可以指定JasperReports支持的输出格式(PDF,HTML,XLS,CVS,XML等)，默认的是PDF格式。<br />
&nbsp; </span>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="color: #993300" valign="top" width="127">
            <p style="color: #993300"><span style="color: #800080">location</span></p>
            </td>
            <td style="color: #993300" valign="top" width="72">
            <p style="color: #993300"><span style="color: #800080">是</span></p>
            </td>
            <td style="color: #993300" valign="top" width="369">
            <p style="color: #993300"><span style="color: #800080">执行完成之后转向的位置</span></p>
            </td>
        </tr>
        <tr>
            <td style="color: #993300" valign="top" width="127">
            <p style="color: #993300"><span style="color: #800080">parse</span></p>
            </td>
            <td style="color: #993300" valign="top" width="72">
            <p style="color: #993300"><span style="color: #800080">否</span></p>
            </td>
            <td style="color: #993300" valign="top" width="369">
            <p style="color: #993300"><span style="color: #800080">默认的是&#8220;true&#8221;，如果设置为&#8220;false&#8221;，location参数将不会被OGNL表达式语言解析</span></p>
            </td>
        </tr>
        <tr>
            <td style="color: #993300" valign="top" width="127">
            <p style="color: #993300"><span style="color: #800080">dataSource</span></p>
            </td>
            <td style="color: #993300" valign="top" width="72">
            <p style="color: #993300"><span style="color: #800080">是</span></p>
            </td>
            <td style="color: #993300" valign="top" width="369">
            <p style="color: #993300"><span style="color: #800080">它是Action的一个字段（通常是一个List），OGNL表达式被用来去value stack（OgnlValueStack）重新找回这个dataSource</span></p>
            </td>
        </tr>
        <tr>
            <td style="color: #993300" valign="top" width="127">
            <p style="color: #993300"><span style="color: #800080">format</span></p>
            </td>
            <td style="color: #993300" valign="top" width="72">
            <p style="color: #993300"><span style="color: #800080">否</span></p>
            </td>
            <td style="color: #993300" valign="top" width="369">
            <p style="color: #993300"><span style="color: #800080">报表生成的数据格式，默认的是pdf</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="color: #993300"><span style="color: #800080"><span style="color: #800080">&lt;result name="success" type="jasper"&gt;<br />
&lt;param name="location"&gt;foo.jasper&lt;/param&gt;<br />
&lt;param name="dataSource"&gt;mySource&lt;/param&gt;<br />
&lt;param name="format"&gt;CSV&lt;/param&gt;<br />
&lt;/result&gt;</span></span></p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:45 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork学习笔记(六) </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163287.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163287.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163287.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163287.html</trackback:ping><description><![CDATA[<span style="color: #993300">Interceptor(拦截器)框架:Interceptor(拦截器)将Action共用的行为独立出来，在Action执行前后运行，这也就是我们所说的AOP(面向切面编程)。<br />
在webwork中如何创建自己的拦截器，并使用它。<br />
1、&nbsp;创建一个自己需要的Interceptor类，它必需实现<br />
com.opensymphony.xwork.interceptor.Interceptor接口，具体的开发见下面的Interceptor的原理。<br />
2、&nbsp;在配置文件（xwork..xml）中申明这个Interceptor类，它放在标签&lt;interceptor /&gt;中，同是&lt;interceptor /&gt;标签嵌入在&lt;interceptors /&gt;标签内部。<br />
3、&nbsp;创建Interceptor栈，使用标签：&lt;interceptor-stack&nbsp;/&gt;，让一组Interceptor可以按次序调用。（可选）<br />
4、&nbsp;指定Action所要用到的Interceptor（前面申明过的），可以用&lt;interceptor-ref /&gt;或&lt;default-interceptor-ref /&gt;标签。前面的标签指定某个Action所用到的Interceptor，如果Action没有被用&lt;interceptor-ref /&gt;指定Interceptor，它将使用&lt;default-interceptor-ref /&gt;指定的Interceptor。<br />
</span>&nbsp;
<p style="color: #993300">(1)、imer：记录Action执行的时间，并做为日志信息输出；</p>
<p style="color: #993300">(2)、logger：在日志信息中输出要执行的Action信息；</p>
<p style="color: #993300">(3)、chain：将前一个执行结束的Action属性设置到当前的Action中。它被用在ResultType为&#8220;chain&#8221;指定结果的Action中，该结果Action对象会从OgnlValueStack中获得前一个Action对应的属性，它实现Action链之间的数据传递；</p>
<p style="color: #993300">(4)、static-params：将xwork.xml配置文件里定义的Action参数，设置到对应的Action中。Action参数使用&lt;param /&gt;标签，是&lt;action /&gt;标签的直接子元素。我们这里定义的Action类必需实现com.opensymphony.xwork.config.entities. Parameterizable接口；</p>
<p style="color: #993300">(5)、params：将Request请求的参数设置到相应Action对象的属性中，用户注册例子用到过这个拦截器；</p>
<p style="color: #993300">(6)、model-driven：如果Action实现ModelDriven接口，它将getModel()取得的模型对象存入OgnlValueStack中；</p>
<p style="color: #993300">(7)、component：激活组件功能支持，让注册过的组件在当前Action中可用，即为Action提供IoC（依赖倒转控制）框架的支持；</p>
<p style="color: #993300">(8)、token：核对当前Action请求（request）的有效标识，防止重复提交Action请求(request)。</p>
<p style="color: #993300">(9)、token-session：功能同上，但是当提交无效的Action请求标识时，它会将请求数据保存到session中。</p>
<p style="color: #993300">(10)、validation：实现使用xml配置文件（{Action}-validation.xml）对Action属性值进行验证，详细请看后面介绍的验证框架。</p>
<p style="color: #993300">(11)、workflow：调用Action类的验证功能，假设Action使用ValidationAware实现验证（ActionSupport提供此功能），如果验证没有通过，workflow会将请求返回到input视图（Action的&lt;result /&gt;中定义的）。</p>
<p style="color: #993300">(12)、servlet-config：提供Action直接对HttpServletRequest或HttpServletResponse等JavaServlet api的访问，Action要实现相应的接口，例如：ServletRequestAware或ServletResponseAware等。如果必需要提供对JavaServlet api的访问，我们建议使用ServletActionContext，在前面ActionContext章节中有介绍。</p>
<p style="color: #993300">(13)、prepare：在Action执行之前调用Action的prepare()方法，这个方法是用来准备Action执行之前要做的工作。它要求我们的Action必需实现com.opensymphony.xwork. Preparable接口</p>
<p style="color: #993300">(14)、conversionError：用来处理框架进行类型转化(Type Conversion)时的出错信息。它将存储在ActionContext中的类型转化（Type Conversion）错误信息转化成相应的Action字段的错误信息，保存在堆栈中。根据需要，可以将这些错误信息在视图中显示出来。<br />
<span style="color: #800080">public String intercept(ActionInvocation invocation) throws Exception {<br />
&nbsp;String result = null;<br />
&nbsp;before(invocation);<br />
&nbsp;result = invocation.invoke();<br />
&nbsp;after(invocation, result);<br />
&nbsp;return result;<br />
&nbsp;}</span></p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:45 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork学习笔记(四) </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163284.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163284.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163284.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163284.html</trackback:ping><description><![CDATA[<span style="color: #993300">在Web应用程序开发中，除了将请求参数自动设置到Action的字段中，我们往往也需要在Action里直接获取请求(Request)或会话（Session）的一些信息，甚至需要直接对JavaServlet Http的请求（HttpServletRequest）、响应(HttpServletResponse)操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例子：我们需要在Action中取得request请求参数username的值：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContext context=ActionContext.getContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map params=context.getParameters();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String username=(String)params.get("username");<br />
(1)、ActionContext是Action执行时的上下文，上下文可以看作是一个容器，它存放的是Action在执行时需要用到的对象，使用webwork时，我们的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContex)、本地化(Locale)信息等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContext的创建都是通过：ActionContext context=(ActionContext)actionContext.get();来获取的，actionContext对象的创建：static ThreadLocal actionContext=new ActionContextThreadLocal();这样设计的好处是线程安全的。<br />
(2) ServletActionContext,这个类直接继承了ActionContext.它提供了直接与JavaServlet相关对象访问的功能，它可以取得的对象有：</span><br />
<p style="color: #993300">1、&nbsp; javax.servlet.http.HttpServletRequest：HTTPservlet请求对象</p>
<p style="color: #993300">2、&nbsp; javax.servlet.http.HttpServletResponse;：HTTPservlet相应对象</p>
<p style="color: #993300">3、&nbsp; javax.servlet.ServletContext：Servlet 上下文信息</p>
<p style="color: #993300">4、&nbsp; javax.servlet.ServletConfig：Servlet配置对象</p>
<p style="color: #993300">5、&nbsp; javax.servlet.jsp.PageContext：Http页面上下文<br />
</p>
<p style="color: #993300">1、 取得HttpServletRequest对象：</p>
<p style="color: #993300">HttpServletRequest request = ServletActionContext. getRequest();</p>
<p style="color: #993300">2、 取得HttpSession对象：</p>
<p style="color: #993300">HttpSession session = ServletActionContext. getRequest().getSession();</p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:44 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork学习笔记(三) </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163283.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163283.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163283.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163283.html</trackback:ping><description><![CDATA[<span style="color: #993300">webwork中的Action在MVC模式中担任控制部分的角色，每个请求的动作都对应于一个相应的Action,一个Action是一个独立的工作单元和控制命令，它需要实现Xwork里的Action接口，实现Action接口的execute()方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action的主要功能是提供从请求中取得参数的值，转化成相应的模型，在将模型传递给执行业务操作的对象。</span><br />
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;action name="register" class="example.register.RegisterAction" &gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;result name="success" type="dispatcher"&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;param name="location"&gt;/register-result.jsp&lt;/param&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;/result&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;interceptor-ref name="params"/&gt;<O:P></O:P></span></p>
<p style="color: #993300"><span style="color: #800080">&lt;/action&gt;<br />
</span>&lt;interceptor-refname="params"/&gt;,interceptor-ref标签设置这个Action用到的拦截器，"params"引用的是配置文件中的&lt;interceptor name="params" class="com.opensymphony.xworkinterceptor.ParametersInterceptor"/&gt;这个拦截器将在Action调用execute()方法执行之前调用，作用是将request请求的参数通过表达式语言设置到相应Action的模型里。<br />
Action根据FormBean的不同可以分为二类：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一类是Field-Driven(字段驱动的)Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action将直接用自己的字段来充当FormBean的功能，可以直接用域对象作为Action的字段。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二类是Model-Driven(模型驱动的)Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他很想Struts的FormBean,但在webwork中，只要通过Java对象就可以充当模型部分。Model-Driven(模型驱动的)Action要求我们的Action实现com.opensymphony.xwork.ModelDriven接口，它有一个方法：Object getModel();我们用这个方法返回我们的模型对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;采用模型对象比较重要的一点是在Action的配置文件Xwork.xml中要配置模型拦截器model-driven,他的作用是将模型对象保存到值堆栈中。<br />
</p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;action name="registerModel" class="example.register.RegisterActionModel"&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;result name="success" type="dispatcher"&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;param name="location"&gt;/register-result-model.jsp&lt;/param&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;/result&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;interceptor-ref name="model-driven"/&gt;<O:P></O:P></span></p>
<p style="color: #993300" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;interceptor-ref name="params"/&gt;<O:P></O:P></span></p>
<p style="color: #993300">&nbsp;&nbsp;&nbsp; <span style="color: #800080">&lt;/action&gt;</span></p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:43 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork学习笔记(二)</title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163282.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163282.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163282.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163282.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163282.html</trackback:ping><description><![CDATA[<span style="color: #993300">webwork目前最新版本是2.2，现在webwork已经被拆分成了<span style="color: #339966">Xwork1和webwork2</span>两个项目。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xwork简洁，灵活功能强大，它是一个标准的<span style="color: #339966">Command模式实现</span>，完全从web层脱离出来。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webwork2建立在Xwork之上，处理http的响应和请求。<span style="color: #339966">webwork2使用ServletDispatcher将http请求的变成Action(业务层Action类)，Session(会话)，application(应用程序)范围的映射，request请求参数映射。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webwork安装</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #993300">首先从</span><a href="https://webwork.dev.java.net/servlets/ProjectDocumentList">https://webwork.dev.java.net/servlets/ProjectDocumentList</a>&nbsp; <span style="color: #993300">下载最新的webwork压缩包，并解压。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webwork-2.x.jar就是webwork最新发布的jar包<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webwork-example.war是webwork自带的功能演示例子。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docs目录是webwork的使用文档，包括api文档，clover文档，单元测试文档等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib是webwork在运行或编译时用到的所有的jar包<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966">一般的web框架都是通过一个JavaServlet控制器提供统一的请求入口，解析请求的url,在去调用相应的Action进行业务处理。webwork也不例外，它要求你在web.xml文件里配置一个派遣器ServletDispatcher,它初始化webwork的一些配置信息，解析XWork的Action配置信息，根据请求去组装和调用执行相应的拦截器(Interceptor),Action,ActionResult等，具体配置如下：<br />
</span><br />
&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;servlet&gt;</span></span>
<p style="color: #993300">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;servlet-name&gt;webwork&lt;/servlet-name&gt;</span></p>
<p style="color: #993300">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;servlet-class&gt;com.opensymphony.webwork.dispatcher.ServletDispatcher&lt;/servlet-class&gt;</span></p>
<p style="color: #993300">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;/servlet&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;servlet-mapping&gt;</span></p>
<p style="color: #993300">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;servlet-name&gt;webwork&lt;/servlet-name&gt;</span></p>
<p style="color: #993300">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;</span></p>
<p style="color: #993300">&nbsp;&nbsp;&nbsp;<span style="color: #800080">&lt;/servlet-mapping&gt;</span></p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:42 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webWok学习笔记(一) </title><link>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163281.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 26 Nov 2007 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163281.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/163281.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/163281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/163281.html</trackback:ping><description><![CDATA[<span style="color: #800080">Webwork发行包中的文档并不是很全面，如果开发中遇到什么问题，登录Webwork Wiki<br />
站点查看在线文档是个不错的选择：<br />
<a href="http://www.opensymphony.com/webwork/wikidocs">http://www.opensymphony.com/webwork/wikidocs</a><br />
&nbsp;&nbsp;&nbsp;WebWork2 发行包中的\lib\core 目录下包含了WebWork2 用到的核心类库。将<br />
\webwork-2.1.1.jar 以及\lib\core\*.jar 复制到Web 应用的WEB-INF\lib 目录。<br />
&nbsp;&nbsp;&nbsp;开发webwork最主要的是编写配置文件web.xml和xwork.xml这两个比较重要。<br />
web.xml:<br />
<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;webwork&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
com.opensymphony.webwork.dispatcher.ServletDispatcher<br />
&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;webwork&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
<br />
此后，所有以.action结尾的服务请求将由ServletDispatcher接管。页面提交到ServletDispatcher之后，ServletDispatcher在xwork.xml中查找与之相对应的action,并进行处理。<br />
<br />
xwork.xml:<br />
<br />
&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"<br />
&nbsp;"<a href="http://www.opensymphony.com/xwork/xwork-1.0.dtd">http://www.opensymphony.com/xwork/xwork-1.0.dtd</a>"&gt;<br />
&lt;xwork&gt;<br />
&lt;include file="webwork-default.xml" /&gt; ⑴<br />
&lt;package name="default" extends="webwork-default"&gt; ⑵<br />
&lt;action name="login" ⑶<br />
class="net.xiaxin.webwork.action.LoginAction"&gt;<br />
&lt;result name="success" type="dispatcher"&gt; ⑷<br />
&lt;param name="location"&gt;/main.jsp&lt;/param&gt;<br />
&lt;/result&gt;<br />
&lt;result name="loginfail" type="dispatcher"&gt;<br />
&lt;param name="location"&gt;/index.jsp&lt;/param&gt;<br />
&lt;/result&gt;<br />
&lt;interceptor-ref name="params" /&gt; ⑸<br />
&lt;interceptor-ref name="model-driven"/&gt; ⑹<br />
&lt;/action&gt;<br />
&lt;/package&gt;<br />
&lt;/xwork&gt;<br />
<br />
⑴ include<br />
通过include 节点，我们可以将其他配置文件导入到默认配置文件xwork.xml 中。<br />
从而实现良好的配置划分。<br />
⑵ package<br />
XWork中，可以通过package对action进行分组。类似Java 中package和class的<br />
关系。为可能出现的同名Action提供了命名空间上的隔离。<br />
同时，package还支持继承关系。在这里的定义中，我们可以看到：<br />
extends="webwork-default"<br />
"webwork-default"是webwork-default.xml文件中定义的package，这里通<br />
过继承，"default" package 自动拥有"webwork-default" package 中的所有<br />
定义关系。<br />
⑶ action<br />
Action配置节点，这里可以设定Action的名称和对应实现类。<br />
⑷ result<br />
通过result 节点，可以定义Action 返回语义，即根据返回值，决定处理模式以及<br />
响应界面。<br />
这里，返回值"success"（Action 调用返回值为String 类型）对应的处理模式为<br />
"dispatcher"。<br />
可选的处理模式还有：<br />
1. dispatcher<br />
本系统页面间转向。类似forward。<br />
2. redirect<br />
浏览器跳转。可转向其他系统页面。<br />
3. chain<br />
将处理结果转交给另外一个Action处理，以实现Action的链式处理。<br />
4. velocity<br />
将指定的velocity模板作为结果呈现界面。<br />
5. xslt<br />
将指定的XSLT 作为结果呈现界面。<br />
(5)&nbsp;&nbsp;interceptor-ref<br />
设定了施加于此Action的拦截器（interceptor）。<br />
</span>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/163281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2007-11-26 17:40 <a href="http://www.blogjava.net/wyxdeniro/archive/2007/11/26/163281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>