﻿<?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-  当风雨再一次来临,  你还记得我吗</title><link>http://www.blogjava.net/aden1314/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 21 Jun 2026 13:20:22 GMT</lastBuildDate><pubDate>Sun, 21 Jun 2026 13:20:22 GMT</pubDate><ttl>60</ttl><item><title>[网络收藏]Struts2教程9：实现自已的拦截器 </title><link>http://www.blogjava.net/aden1314/articles/199683.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199683.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199683.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199683.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">&nbsp;<span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
&nbsp;&nbsp; 在上一篇中介绍了</span>Struts2<span style="font-family: 宋体">拦截器的原理，在这一篇中我们将学习一下如何编写自己的拦截器。</span></p>
<p style="margin-left: 21pt; text-indent: -21pt"><strong><span style="font-family: 宋体">一、拦截器的实现</span></strong></p>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体">实现一个拦截器非常简单。实际上，一个拦截器就是一个普通的类，只是这个类必须实现</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">com.opensymphony.xwork2.interceptor.Interceptor</span><span style="font-size: 10.5pt; font-family: 宋体">接口。</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Interceptor</span><span style="font-size: 10.5pt; font-family: 宋体">接口有如下三个方法：<br />
<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Interceptor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Serializable&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;intercept(ActionInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception;<br />
}<br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">其中</span>init<span style="font-family: 宋体">和</span>destroy<span style="font-family: 宋体">方法只在拦截器加载和释放（都由</span>Struts2<span style="font-family: 宋体">自身处理）时执行一次。而</span>intercept<span style="font-family: 宋体">方法在每次访问动作时都会被调用。</span>Struts2<span style="font-family: 宋体">在调用拦截器时，每个拦截器类只有一个对象实例，而所有引用这个拦截器的动作都共享这一个拦截器类的对象实例，因此，在实现</span>Interceptor<span style="font-family: 宋体">接口的类中如果使用类变量，要注意同步问题。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面我们来实现一个简单的拦截器，这个拦截器通过请求参数</span>action<span style="font-family: 宋体">指定一个拦截器类中的方法，并调用这个方法（我们可以使用这个拦截器对某一特定的动作进行预处理）。如果方法不存在，或是</span>action<span style="font-family: 宋体">参数不存在，则继续执行下面的代码。如下面的</span>URL<span style="font-family: 宋体">：</span></p>
<p style="text-indent: 21.75pt">http://localhost:8080/struts2/test/interceptor.action?action=test</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">访问上面的</span>url<span style="font-family: 宋体">后，拦截器会就会调用拦截器中的</span>test<span style="font-family: 宋体">方法，如果这个方法不存在，则调用</span>invocation.invoke<span style="font-family: 宋体">方法，</span>invoke<span style="font-family: 宋体">方法和</span>Servlet<span style="font-family: 宋体">过滤器中调用</span>FilterChain.doFilter<span style="font-family: 宋体">方法类似，如果在当前拦截器后面还有其他的拦截器，则</span>invoke<span style="font-family: 宋体">方法就是调用后面拦截器的</span>intercept<span style="font-family: 宋体">方法，否则，</span>invoke<span style="font-family: 宋体">会调用</span>Action<span style="font-family: 宋体">类的</span>execute<span style="font-family: 宋体">方法（或其他的执行方法）。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面我们先来实现一个拦截器的父类</span>ActionInterceptor<span style="font-family: 宋体">。这个类主要实现了根据</span>action<span style="font-family: 宋体">参数值来调用方法的功能，代码如下：</span><span><br />
<br />
</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;interceptor;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionInvocation;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.interceptor.Interceptor;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ActionInterceptor&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Interceptor<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;String&nbsp;INVOKE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">##invoke</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">destroy</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">init</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;intercept(ActionInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getParameter(</span><span style="color: #000000">"</span><span style="color: #000000">action</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">this</span><span style="color: #000000">.hashCode());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(action&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.lang.reflect.Method&nbsp;method&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getMethod(action);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)method.invoke(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(result&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">result.equals(INVOKE))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;invocation.invoke();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">从上面代码中的</span>intercept<span style="font-family: 宋体">方法可以看出，在调用</span>action<span style="font-family: 宋体">所指定的方法后，来判断返回值。可能发生的情况有三种：</span></p>
<p style="margin-left: 41.25pt; text-indent: -19.5pt"><span><span>1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体">返回值为</span>null<span style="font-family: 宋体">，执行</span>return null<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 41.25pt; text-indent: -19.5pt"><span><span>2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体">返回值为</span>INVOKE<span style="font-family: 宋体">，执行</span><span>return invockation.invoke()</span><span style="font-family: 宋体">。</span></p>
<p style="margin-left: 41.25pt; text-indent: -19.5pt"><span><span>3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体">其他情况，执行</span>return result<span style="font-family: 宋体">。</span>&nbsp;result<span style="font-family: 宋体">表示指定方法的返回值，如上面代码所示。</span></p>
&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体">在实现完上面的拦截器父类后，任何继承于</span>ActionInterceptor<span style="font-size: 10.5pt; font-family: 宋体">类的拦截器都可以自动根据</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">action</span><span style="font-size: 10.5pt; font-family: 宋体">的参数值调用自身的相应方法。下面我们来实现一个拥有两个动作方法</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">test</span><span style="font-size: 10.5pt; font-family: 宋体">和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">print</span><span style="font-size: 10.5pt; font-family: 宋体">的拦截器类。代码如下：<br />
<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;interceptor;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletResponse;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.ServletActionContext;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MultiMethodInterceptor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionInterceptor<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;test()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(</span><span style="color: #000000">"</span><span style="color: #000000">invoke&nbsp;test</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.INVOKE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;print()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(</span><span style="color: #000000">"</span><span style="color: #000000">invoke&nbsp;print</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p style="text-indent: 21.75pt">test<span style="font-family: 宋体">方法返回了</span>INVOKE<span style="font-family: 宋体">，因此，在执行完这个方法后，</span>Struts2<span style="font-family: 宋体">会接着调用其他拦截器的</span>intercept<span style="font-family: 宋体">方法或</span>Action<span style="font-family: 宋体">类的</span>execute<span style="font-family: 宋体">方法。而</span>print<span style="font-family: 宋体">方法在执行完后，只是返回了</span>null<span style="font-family: 宋体">，而不再调用其他的方法了，也就是访问如下的</span>url<span style="font-family: 宋体">时，动作的</span>execute<span style="font-family: 宋体">方法将不会执行：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; http://localhost:8080/struts2/test/ddd.action?action=print</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">下面我们来实现一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类，代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;InterceptorAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;abcd()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletActionContext.getResponse().getWriter()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.println(</span><span style="color: #000000">"</span><span style="color: #000000">invoke&nbsp;abcd</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在这个</span>Action<span style="font-family: 宋体">类中，只有一个</span>abcd<span style="font-family: 宋体">方法，实际上，这个方法相当于</span>execute<span style="font-family: 宋体">方法，在下面会设置动作的</span>method<span style="font-family: 宋体">属性为</span>abcd<span style="font-family: 宋体">。下面我们来在</span>struts.xml<span style="font-family: 宋体">中定义拦截器类和动作，代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="method"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="interceptor.MultiMethodInterceptor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-stack&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="methodStack"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="method"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-stack</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptor"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.InterceptorAction"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="abcd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="methodStack"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在配置上面的</span>methodStack<span style="font-family: 宋体">拦截器时要注意，最好在后面引用</span>defaultStack<span style="font-family: 宋体">，否则很多通过拦截器提供的功能将失去。</span></p>
<p style="text-indent: 21.75pt">OK<span style="font-family: 宋体">，现在访问如下的</span>URL<span style="font-family: 宋体">：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; http://localhost:8080/struts2/test/ddd.action?action=test</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在浏览器中将会出现如下的字符串：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; invoke test</span></p>
<p style="text-indent: 21.75pt">invoke abcd</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">而如果访问</span>http://localhost:8080/struts2/test/ddd.action?action=print<span style="font-family: 宋体">，将会只出现如下的字符串：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; invoke print</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">大家可以看出，访问这个</span>url<span style="font-family: 宋体">时并没有调用</span>abcd<span style="font-family: 宋体">方法。如果随便指定的</span>action<span style="font-family: 宋体">值的话，则只调用</span>abcd<span style="font-family: 宋体">方法，如访问</span>http://localhost:8080/struts2/test/ddd.action?action=aaa<span style="font-family: 宋体">，就只会输出</span>invoke abcd<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21.75pt"><span><br />
</span><strong><span style="font-family: 宋体">二、拦截器的参数</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: 宋体">我们在使用很多</span>Struts2<span style="font-family: 宋体">内置的拦截器时会发现有很多拦截器都带参数，当然。我们自己做的拦截器也可以加上同样的参数。有两个参数比较常用，这两个参数是</span>includeMethods<span style="font-family: 宋体">和</span>excludeMethods<span style="font-family: 宋体">，其中</span>includeMethods<span style="font-family: 宋体">指定了拦截器要调用的</span>Action<span style="font-family: 宋体">类的执行方法（默认是</span>execute<span style="font-family: 宋体">），也就是说，只有在</span>includeMethods<span style="font-family: 宋体">中指定的方法才会被</span>Struts2<span style="font-family: 宋体">调用，而</span>excludeMethods<span style="font-family: 宋体">恰恰相反，在这个参数中指定的执行方法不会被</span>Struts2<span style="font-family: 宋体">调用。如果有多个方法，中间用逗号</span>(,)<span style="font-family: 宋体">分隔。在</span>Struts2<span style="font-family: 宋体">中提供了一个抽象类来处理这两个参数。这个类如下：</span><span><br />
<br />
</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">com.opensymphony.xwork2.interceptor.MethodFilterInterceptor<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">如有继承于这个类的拦截器类都会自动处理</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">includeMethods</span><span style="font-size: 10.5pt; font-family: 宋体">和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">excludeMethods</span><span style="font-size: 10.5pt; font-family: 宋体">参数，如下面的拦截器类所示：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;interceptor;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionInvocation;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.interceptor.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyFilterInterceptor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;MethodFilterInterceptor<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setName(String&nbsp;name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;doIntercept(ActionInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">doIntercept</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;invocation.invoke();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; MethodFilterInterceptor</span><span style="font-size: 10.5pt; font-family: 宋体">的子类需要实现</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">doIntercept</span><span style="font-size: 10.5pt; font-family: 宋体">方法（相当于</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Interceptor</span><span style="font-size: 10.5pt; font-family: 宋体">的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">intercept</span><span style="font-size: 10.5pt; font-family: 宋体">方法），如上面代码所示。在上面的代码中还有一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">属性，是为了读取拦截器的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">属性而设置的，如下面的配置代码所示：<br />
<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="method"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="interceptor.MultiMethodInterceptor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="filter"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="interceptor.MyFilterInterceptor"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="includeMethods"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">abcd</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">中国</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-stack&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="methodStack"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="method"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="filter"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-stack</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptor"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.InterceptorAction"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="abcd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="methodStack"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 再次访问</span><span>http://localhost:8080/struts2/test/ddd.action?action=test, Struts2</span><span style="font-family: 宋体">就会调用</span>MyFilterInterceptor<span style="font-family: 宋体">的</span>doIntercept<span style="font-family: 宋体">方法来输出</span>name<span style="font-family: 宋体">属性值。如果将上面的</span>includeMethods<span style="font-family: 宋体">参数值中的</span>abcd<span style="font-family: 宋体">去掉，则</span>Action<span style="font-family: 宋体">类的</span>abcd<span style="font-family: 宋体">方法不会被执行。<br />
</span></p>
<img src ="http://www.blogjava.net/aden1314/aggbug/199683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:44 <a href="http://www.blogjava.net/aden1314/articles/199683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程8：拦截器概述 </title><link>http://www.blogjava.net/aden1314/articles/199682.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199682.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199682.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199682.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt">&nbsp; <span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span>
<p style="text-indent: 21.75pt">Struts2<span style="font-family: 宋体">的拦截器和</span>Servlet<span style="font-family: 宋体">过滤器类似。在执行</span>Action<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法之前，</span>Struts2<span style="font-family: 宋体">会首先执行在</span>struts.xml<span style="font-family: 宋体">中引用的拦截器，在执行完所有引用的拦截器的intercept方法后，会执行</span>Action<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法。</span></p>
<p style="text-indent: 21.75pt">Struts2<span style="font-family: 宋体">拦截器类必须从</span>com.opensymphony.xwork2.interceptor.Interceptor<span style="font-family: 宋体">接口继承，在</span>Intercepter<span style="font-family: 宋体">接口中有如下三个方法需要实现：<br />
</span><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--></p>
</span><br />
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy();<br />
</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init();<br />
String&nbsp;intercept(ActionInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception;<br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-size: 12pt">
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">其中</span>intercept<span style="font-family: 宋体">方法是拦截器的核心方法，所有安装的拦截器都会调用之个方法。在</span>Struts2<span style="font-family: 宋体">中已经在</span>struts-default.xml<span style="font-family: 宋体">中预定义了一些自带的拦截器，如</span>timer<span style="font-family: 宋体">、</span>params<span style="font-family: 宋体">等。如果在</span>&lt;package&gt;<span style="font-family: 宋体">标签中继承</span>struts-default<span style="font-family: 宋体">，则当前</span>package<span style="font-family: 宋体">就会自动拥有</span>struts-default.xml<span style="font-family: 宋体">中的所有配置。代码如下：</span></p>
<p><span>&lt;package name="demo" extends="struts-default" &gt; ... &lt;/package&gt;</span></p>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts-default.xml</span><span style="font-size: 10.5pt; font-family: 宋体">中有一个默认的引用，在默认情况下（也就是</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;action&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">中未引用拦截器时）会自动引用一些拦截器。这个默认的拦截器引用如下：</span></span>
<p>&nbsp;</p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">default-interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-stack&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #0000ff">&gt;</span>&nbsp;&nbsp; <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="exception"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="alias"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="servletConfig"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="prepare"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="i18n"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="chain"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="debugging"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="profiling"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="scopedModelDriven"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="modelDriven"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="fileUpload"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="checkbox"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="staticParams"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="params"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="excludeParams"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">dojo\..*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="conversionError"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="excludeMethods"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">input,back,cancel,browse</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="workflow"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="excludeMethods"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">input,back,cancel,browse</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-stack</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">上面在</span>defaultStack<span style="font-family: 宋体">中引用的拦截器都可以在</span>&lt;action&gt;<span style="font-family: 宋体">中不经过引用就可以使用（如果在</span>&lt;action&gt;<span style="font-family: 宋体">中引用了任何拦截器后，要使用在</span>defaultStack<span style="font-family: 宋体">中定义的拦截器，也需要在</span>&lt;action&gt;<span style="font-family: 宋体">中重新引用，在后面将详细讲解）。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面我们来看几个简单的拦截器的使用方法。</span></p>
<p><strong><span style="font-family: 宋体">一、记录拦截器和</span>execute</strong><strong><span style="font-family: 宋体">方法的执行时间</span>(timer)</strong></p>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 'Times New Roman'">timer</span><span style="font-size: 10.5pt; font-family: 宋体">是</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">中最简单的拦截器，这个拦截器对应的类是</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">com.opensymphony.xwork2.interceptor.TimerInterceptor</span><span style="font-size: 10.5pt; font-family: 宋体">。它的功能是记录</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">execute</span><span style="font-size: 10.5pt; font-family: 宋体">方法和其他拦截器（在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">timer</span><span style="font-size: 10.5pt; font-family: 宋体">后面定义的拦截器）的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">intercept</span><span style="font-size: 10.5pt; font-family: 宋体">方法执行的时间总和。如下面的配置代码所示：<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="first"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.FirstAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="logger"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">由于在</span>timer<span style="font-family: 宋体">后面没有其他的拦截器定义，因此，</span>timer<span style="font-family: 宋体">只能记录</span>execute<span style="font-family: 宋体">方法的执行时间，在访问</span>first<span style="font-family: 宋体">动作时，会在控制台输出类似下面的一条信息：</span><span><br />
<br />
</span><span style="color: red; font-family: 宋体">信息</span><span style="color: red">: Executed action [/test/first!execute] took 16 ms.<br />
<br />
</span></p>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体">在使用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">timer</span><span style="font-size: 10.5pt; font-family: 宋体">拦截器时，需要</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">commons-logging.jar</span><span style="font-size: 10.5pt; font-family: 宋体">的支持。将</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">logger</span><span style="font-size: 10.5pt; font-family: 宋体">引用放到</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">timer</span><span style="font-size: 10.5pt; font-family: 宋体">的后面，就可以记录</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">logger</span><span style="font-size: 10.5pt; font-family: 宋体">拦截器的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">intercept</span><span style="font-size: 10.5pt; font-family: 宋体">方法和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">execute</span><span style="font-size: 10.5pt; font-family: 宋体">方法的执行时间总和，代码如下：<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="first"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.FirstAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="logger"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 宋体">大家可以使用如下的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类来测试一下</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">timer</span><span style="font-size: 10.5pt; font-family: 宋体">拦截器：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FirstAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(</span><span style="color: #000000">1000</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;延迟1秒</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">如果只记录</span>execute<span style="font-family: 宋体">方法的执行时间，一般会输出如下的信息：</span></p>
<p><span style="color: red; font-family: 宋体">信息</span><span style="color: red">: Executed action [/test/first!execute] took 1000 ms.</span></p>
<p><strong><span style="font-family: 宋体">二、通过请求调用</span>Action</strong><strong><span style="font-family: 宋体">的</span>setter</strong><strong><span style="font-family: 宋体">方法</span>(params)</strong></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">当客户端的一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">form</span><span style="font-size: 10.5pt; font-family: 宋体">向服务端提交请求时，如有一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">textfield</span><span style="font-size: 10.5pt; font-family: 宋体">，代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="first"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在提交后，</span>Struts2<span style="font-family: 宋体">将会自动调用</span>first<span style="font-family: 宋体">动作类中的</span>setName<span style="font-family: 宋体">方法，并将</span>name<span style="font-family: 宋体">文本框中的值通过</span>setName<span style="font-family: 宋体">方法的参数传入。实际上，这个操作是由</span>params<span style="font-family: 宋体">拦截器完成的，</span>params<span style="font-family: 宋体">对应的类是</span>com.opensymphony.xwork2.interceptor.ParametersInterceptor<span style="font-family: 宋体">。由于</span>params<span style="font-family: 宋体">已经在</span>defaultStack<span style="font-family: 宋体">中定义，因此，在未引用拦截器的</span>&lt;action&gt;<span style="font-family: 宋体">中是会自动引用</span>params<span style="font-family: 宋体">的，如下面的配置代码，在访问</span>first<span style="font-family: 宋体">动作时，</span>Struts2<span style="font-family: 宋体">是会自动执行相应的</span>setter<span style="font-family: 宋体">方法的。</span></p>
<p><span>&lt;action name="first" class="action.FirstAction"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>... ...</span></p>
<p>&lt;/action&gt;</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">但如果在</span>&lt;action&gt;<span style="font-family: 宋体">中引用了其他的拦截器，就必须再次引用</span>params<span style="font-family: 宋体">拦截器，</span>Struts2<span style="font-family: 宋体">才能调用相应的</span>setter<span style="font-family: 宋体">方法。如下面的配置代码所示：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="first"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.FirstAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="params"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p><strong><span style="font-family: 宋体">三、通过配置参数调用</span>Action</strong><strong><span style="font-family: 宋体">的</span>setter</strong><strong><span style="font-family: 宋体">方法</span>(static-params)</strong></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">static-params</span><span style="font-size: 10.5pt; font-family: 宋体">拦截器可以通过配置&lt;params&gt;标签来调用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类的相应的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">setter</span><span style="font-size: 10.5pt; font-family: 宋体">方法，static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。<br />
&nbsp;&nbsp;&nbsp; 下面配置代码演示了如何使用static-params拦截器：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="first"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.FirstAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="who"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">比尔</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="params"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="static-params"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">如果</span>first<span style="font-family: 宋体">动作使用上面的配置，在访问</span>first<span style="font-family: 宋体">动作时，</span>Struts2<span style="font-family: 宋体">会自动调用</span>setWho<span style="font-family: 宋体">方法将&#8220;比尔&#8221;作为参数值传入</span>setWho<span style="font-family: 宋体">方法。</span></p>
<p><strong><span style="font-family: 宋体">四、使用拦截器栈</span></strong></p>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体">为了能在多个动作中方便地引用同一个或几个拦截器，可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;package&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">标签中使用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;interceptors&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">和子标签</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;interceptor-stack&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">来定义。代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-stack&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="mystack"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="logger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="params"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="static-params"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-stack</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="first"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.FirstAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="who"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">比尔</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="mystack"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 可以象使用拦截器一样使用拦截器栈，如上面代码所示。</span></p>
<img src ="http://www.blogjava.net/aden1314/aggbug/199682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:44 <a href="http://www.blogjava.net/aden1314/articles/199682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程7：上传任意多个文件 </title><link>http://www.blogjava.net/aden1314/articles/199681.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199681.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199681.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199681.html</trackback:ping><description><![CDATA[<p><strong><span style="font-family: 宋体"><br />
<span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
一、上传单个文件</span></strong></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">上传文件是很多</span>Web<span style="font-family: 宋体">程序都具有的功能。在</span>Struts1.x<span style="font-family: 宋体">中已经提供了用于上传文件的组件。而在</span>Struts2<span style="font-family: 宋体">中提供了一个更为容易操作的上传文件组件。所不同的是，</span>Struts1.x<span style="font-family: 宋体">的上传组件需要一个</span>ActionForm<span style="font-family: 宋体">来传递文件，而</span>Struts2<span style="font-family: 宋体">的上传组件是一个拦截器（这个拦截器不用配置，是自动装载的）。在本文中先介绍一下如何用</span>struts2<span style="font-family: 宋体">上传单个文件，最后介绍一下用</span>struts2<span style="font-family: 宋体">上传任意多个文件。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">要用</span>Struts2<span style="font-family: 宋体">实现上传单个文件的功能非常容易实现，只要使用普通的</span>Action<span style="font-family: 宋体">即可。但为了获得一些上传文件的信息，如上传文件名、上传文件类型以及上传文件的</span>Stream<span style="font-family: 宋体">对象，就需要按着一定规则来为</span>Action<span style="font-family: 宋体">类增加一些</span>getter<span style="font-family: 宋体">和</span>setter<span style="font-family: 宋体">方法。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在</span>Struts2<span style="font-family: 宋体">中，</span><span style="font-family: 宋体">用于获得和设置</span>java.io.File<span style="font-family: 宋体">对象（</span>Struts2<span style="font-family: 宋体">将文件上传到临时路径，并使用</span>java.io.File<span style="font-family: 宋体">打开这个临时文件）的方法是</span>getUpload<span style="font-family: 宋体">和</span>setUpload<span style="font-family: 宋体">。获得和设置文件名的方法是</span>getUploadFileName<span style="font-family: 宋体">和</span>setUploadFileName<span style="font-family: 宋体">，获得和设置上传文件内容类型的方法是</span>getUploadContentType<span style="font-family: 宋体">和</span>setUploadContentType<span style="font-family: 宋体">。下面是用于上传的动作类的完整代码：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UploadAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;File&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;uploadContentType;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getUploadFileName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUploadFileName(String&nbsp;fileName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.fileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;File&nbsp;getUpload()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUpload(File&nbsp;upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.upload&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUploadContentType(String&nbsp;contentType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.uploadContentType</span><span style="color: #000000">=</span><span style="color: #000000">contentType;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getUploadContentType()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.uploadContentType;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.InputStream&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.io.FileInputStream(upload);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.OutputStream&nbsp;os&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.io.FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">d:\\upload\\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;buffer[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">8192</span><span style="color: #000000">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">((count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;is.read(buffer))&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 14pt"><span style="font-size: 12pt"><strong style="color: red"><br />
</strong></span></span>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 在</span>execute<span style="font-family: 宋体">方法中的实现代码就很简单了，只是从临时文件复制到指定的路径（在这里是</span>d:\upload<span style="font-family: 宋体">）中。上传文件的临时目录的默认值是</span>javax.servlet.context.tempdir<span style="font-family: 宋体">的值，但可以通过</span>struts.properties<span style="font-family: 宋体">（和</span>struts.xml<span style="font-family: 宋体">在同一个目录下）的</span>struts.multipart.saveDir<span style="font-family: 宋体">属性设置。</span>Struts2<span style="font-family: 宋体">上传文件的默认大小限制是</span>2M<span style="font-family: 宋体">（</span>2097152<span style="font-family: 宋体">字节），也可以通过</span>struts.properties<span style="font-family: 宋体">文件中的</span>struts.multipart.maxSize<span style="font-family: 宋体">修改，如</span>struts.multipart.maxSize=2048 <span style="font-family: 宋体">表示一次上传文件的总大小不能超过</span>2K<span style="font-family: 宋体">字节。</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">下面的代码是上传文件的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">JSP</span><span style="font-size: 10.5pt; font-family: 宋体">页面代码</span><span style="font-size: 10.5pt; font-family: 宋体">：<br />
<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java.util.*</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">上传单个文件</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="upload"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enctype</span><span style="color: #0000ff">="multipart/form-data"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:file&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="upload"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="输入要上传的文件名"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="上传"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p><span style="font-family: 宋体">也可以在</span>success.jsp<span style="font-family: 宋体">页中通过</span>&lt;s:property&gt;<span style="font-family: 宋体">获得文件的属性</span><span style="font-family: 宋体">（</span><span style="font-family: 宋体">文件名和文件内容类型</span><span style="font-family: 宋体">），</span><span style="font-family: 宋体">代码如下</span><span style="font-family: 宋体">：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; &lt;s:property value="uploadFileName"/&gt;</span></p>
<strong><span style="font-size: 10.5pt; font-family: 宋体">二、上传任意多个文件</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span></strong><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">中，上传任意多个文件也非常容易实现。首先，要想上传任意多个文件，需要在客户端使用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">DOM</span><span style="font-size: 10.5pt; font-family: 宋体">技术生成任意多个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;input type=&#8221;file&#8221; /&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">标签。</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">属性值都相同。代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="javascript"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;addComponent()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">var</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uploadHTML&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;document.createElement(&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&lt;input&nbsp;type='file'&nbsp;&nbsp;name='upload'/&gt;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">files</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">).appendChild(uploadHTML);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uploadHTML&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;document.createElement(&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&lt;p/&gt;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">files</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">).appendChild(uploadHTML);<br />
}<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000">&nbsp;onclick</span><span style="color: #0000ff">="addComponent();"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="添加文件"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form&nbsp;</span><span style="color: #ff0000">onsubmit</span><span style="color: #0000ff">="return&nbsp;true;"</span><span style="color: #ff0000">&nbsp;action</span><span style="color: #0000ff">="/struts2/test/upload.action"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method</span><span style="color: #0000ff">="post"</span><span style="color: #ff0000">&nbsp;enctype</span><span style="color: #0000ff">="multipart/form-data"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">span&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="files"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">='file'&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">='upload'&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="上传"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">上面的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">javascript</span><span style="font-size: 10.5pt; font-family: 宋体">代码可以生成任意多个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;input type=&#8217;file&#8217;&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">标签，</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">的值都为</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">file（要注意的是，上面的javascript代码只适合于IE浏览器，firefox等其他浏览器需要使用他的代码）</span><span style="font-size: 10.5pt; font-family: 宋体">。至于</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类，和上传单个文件的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类基本一至，只需要将三个属性的类型改为</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">List</span><span style="font-size: 10.5pt; font-family: 宋体">即可。代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UploadMoreAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">File</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;uploads;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;fileNames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;uploadContentTypes;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getUploadFileName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fileNames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUploadFileName(java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;fileNames)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.fileNames&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fileNames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">File</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getUpload()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;uploads;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUpload(java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">File</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;uploads)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.uploads&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;uploads;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUploadContentType(java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;contentTypes)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.uploadContentTypes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;contentTypes;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.util.List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getUploadContentType()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.uploadContentTypes;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(uploads&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;uploads.size();&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.InputStream&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.io.FileInputStream(uploads.get(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.OutputStream&nbsp;os&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.io.FileOutputStream(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">d:\\upload\\</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fileNames.get(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;buffer[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">8192</span><span style="color: #000000">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;is.read(buffer))&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; 在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">execute</span><span style="font-size: 10.5pt; font-family: 宋体">方法中，只是对</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">List</span><span style="font-size: 10.5pt; font-family: 宋体">对象进行枚举，在循环中的代码和上传单个文件时的代码基本相同。如果读者使用过</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">的上传组件，是不是感觉</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">的上传功能更容易实现呢？</span><span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">中上传多个文件时，可是需要建立带索引的属性的。而在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">中，就是这么简单就搞定了。</span><span style="font-size: 10.5pt; font-family: 宋体">图</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">1</span><span style="font-size: 10.5pt; font-family: 宋体">是上传任意多个文件的界面。</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span><img height="438" alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/7_01.jpg" width="492" /><br />
<br />
<p style="text-indent: 178.5pt"><span style="font-family: 宋体">图</span>1</p>
<p><span style="color: #000ff0">&nbsp;<span style="color: #000ff0"><span style="color: #000ff0">&nbsp;<span style="color: #000ff0"><span style="color: #000000">&nbsp; <span style="font-family: 宋体">在本文中给出了用</span>Struts2<span style="font-family: 宋体">上传任意多个文件的一个方法，如果哪位读者有更好的方法，请跟贴！</span></span></span></span></span></span><span><br />
</span></p>
<img src ="http://www.blogjava.net/aden1314/aggbug/199681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:43 <a href="http://www.blogjava.net/aden1314/articles/199681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 </title><link>http://www.blogjava.net/aden1314/articles/199680.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199680.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199680.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199680.html</trackback:ping><description><![CDATA[&nbsp;<span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
<br />
&nbsp; 在<span>struts1.x Action</span><span style="font-family: 宋体">类的</span>execute<span style="font-family: 宋体">方法中，有四个参数，其中两个就是</span>response<span style="font-family: 宋体">和</span>request<span style="font-family: 宋体">。而在</span>Struts2<span style="font-family: 宋体">中，并没有任何参数，因此，就不能简单地从</span>execute<span style="font-family: 宋体">方法获得</span>HttpServletResponse<span style="font-family: 宋体">或</span>HttpServletRequest<span style="font-family: 宋体">对象了。</span>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">但在</span>Struts2 Action<span style="font-family: 宋体">类中仍然有很多方法可以获得这些对象。下面就列出四种获得这些对象的方法。</span></p>
<p><strong><span style="font-family: 宋体">【方法</span>1</strong><strong><span style="font-family: 宋体">】使用</span>Struts2 Aware</strong><strong><span style="font-family: 宋体">拦截器</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong><span style="font-family: 宋体">这种方法需要</span>Action<span style="font-family: 宋体">类实现相应的拦截器接口。如我们要获得</span>HttpServletResponse<span style="font-family: 宋体">对象，需要实现</span>org.apache.struts2.interceptor.ServletResponseAware<span style="font-family: 宋体">接口，</span><span style="font-family: 宋体">代码如下：<br />
<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.interceptor.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletResponseAware<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletResponse&nbsp;response;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获得HttpServletResponse对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setServletResponse(HttpServletResponse&nbsp;response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().write(</span><span style="color: #000000">"</span><span style="color: #000000">实现ServletResponseAware接口</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在上面的代码中，</span>MyAction<span style="font-family: 宋体">实现了一个</span>ServletResponseAware<span style="font-family: 宋体">接口，并且实现了</span>setServletResponse<span style="font-family: 宋体">方法。如果一个动作类实现了</span>ServletResponseAware<span style="font-family: 宋体">接口，</span>Struts2<span style="font-family: 宋体">在调用</span>execute<span style="font-family: 宋体">方法之前，就会先调用</span>setServletResponse<span style="font-family: 宋体">方法，并将</span>response<span style="font-family: 宋体">参数传入这个方法。如果想获得</span>HttpServletRequest<span style="font-family: 宋体">、</span>HttpSession<span style="font-family: 宋体">和</span>Cookie<span style="font-family: 宋体">等对象，动作类可以分别实现</span>ServletRequestAware<span style="font-family: 宋体">、</span>SessionAware<span style="font-family: 宋体">和</span>CookiesAware<span style="font-family: 宋体">等接口。这些接口都在</span>org.apache.struts2.interceptor<span style="font-family: 宋体">包中。</span> </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">如果要获得请求参数，动作类可以实现</span><span>org.apache.struts2.interceptor. ParameterAware</span><span style="font-family: 宋体">接口，但如果只想判断某个参数是否存在，也可以实现</span>com.opensymphony.xwork2.interceptor. ParameterNameAware<span style="font-family: 宋体">接口。这个接口有一个</span>acceptableParameterName<span style="font-family: 宋体">方法，当</span>Struts2<span style="font-family: 宋体">获得一个请求参数时，就会调用一次。读者可以在这个方法中将所有的请求参数记录下来，以便以后使用。这个方法的定义如下：</span></p>
<p style="text-indent: 21pt">boolean acceptableParameterName(String parameterName);</p>
<p><strong><span style="font-family: 宋体">【方法</span>2</strong><strong><span style="font-family: 宋体">】使用</span>RequestAware</strong><strong><span style="font-family: 宋体">拦截器</span></strong></p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong><span style="font-family: 宋体">这种方法和第</span>1<span style="font-family: 宋体">种方法类似。动作类需要实现一个</span>org.apache.struts2.interceptor.RequestAware<span style="font-family: 宋体">接口。所不同的是</span>RequestAware<span style="font-family: 宋体">将获得一个</span>com.opensymphony.xwork2.util.OgnlValueStack<span style="font-family: 宋体">对象，这个对象可以获得</span>response<span style="font-family: 宋体">、</span>request<span style="font-family: 宋体">及其他的一些信息。代码如下所示：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.util.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.interceptor.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FirstAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;RequestAware<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Map&nbsp;request;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletResponse&nbsp;response;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setRequest(Map&nbsp;request)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.util.Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;keys&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.keySet();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;枚举所有的key值。实际上只有一个key：struts.valueStack</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(String&nbsp;key:&nbsp;keys)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获得OgnlValueStack&nbsp;对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OgnlValueStack&nbsp;stack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(OgnlValueStack)myRequest.get(</span><span style="color: #000000">"</span><span style="color: #000000">struts.valueStack</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获得HttpServletResponse对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"> (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().write(</span><span style="color: #000000">"</span><span style="color: #000000">实现RequestAware&nbsp;接口</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 我们也可以使用</span>StrutsStatics.HTTP_REQUEST<span style="font-family: 宋体">、</span>StrutsStatics.PAGE_CONTEXT<span style="font-family: 宋体">来获得</span>HttpServletRequest<span style="font-family: 宋体">和</span>PageContext<span style="font-family: 宋体">对象。这种方法有些麻烦，一般很少用，读者可以作为一个参考。</span></p>
<p><strong><span style="font-family: 宋体">【方法</span>3</strong><strong><span style="font-family: 宋体">】使用</span>ActionContext</strong><strong><span style="font-family: 宋体">类</span></strong></p>
<strong><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></strong><span style="font-size: 10.5pt; font-family: 宋体">这种方法比较简单，我们可以通过</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">org.apache.struts2.ActionContext</span><span style="font-size: 10.5pt; font-family: 宋体">类的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">get</span><span style="font-size: 10.5pt; font-family: 宋体">方法获得相应的对象。代码如下：<br />
<br />
</span>
<p><span>&nbsp;&nbsp;&nbsp; HttpServletResponse response(HttpServletResponse) =</span></p>
<p style="text-indent: 21pt">ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);</p>
<p style="text-indent: 21pt">HttpServletRequest request(HttpServletRequest) = </p>
<p style="text-indent: 21pt">ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);<br />
<br />
</p>
<p><strong><span style="font-family: 宋体">【方法</span>4</strong><strong><span style="font-family: 宋体">】使用</span>ServletActionContext</strong><strong><span style="font-family: 宋体">类</span></strong></p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>Struts2<span style="font-family: 宋体">为我们提供了一种最简单的方法获得</span>HttpServletResponse<span style="font-family: 宋体">及其他对象。这就是</span>org.apache.struts2.ServletActionContext<span style="font-family: 宋体">类。我们可以直接使用</span>ServletActionContext<span style="font-family: 宋体">类的</span>getRequest<span style="font-family: 宋体">、</span>getResponse<span style="font-family: 宋体">方法来获得</span>HttpServletRequest<span style="font-family: 宋体">、</span>HttpServletResponse<span style="font-family: 宋体">对象。代码如下：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; HttpServletResponse response = ServletActionContext.getResponse()</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>response.getWriter().write("hello world");</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">从这四种方法来看，最后一种是最简单的，读者可以根据自己的需要和要求来选择使用哪一种方法来获得这些对象。</span></p>
<br />
下一篇：<a href="http://www.blogjava.net/nokiaguy/archive/2008/04/27/196646.html" target="_blank">Struts2教程7：上传任意多个文件</a><br />
<p class="postfoot">posted on 2008-04-22 18:06 <a href="http://www.blogjava.net/nokiaguy/">银河使者</a> 阅读(1225) <a href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#Post">评论(8)</a> &nbsp;<a href="http://www.blogjava.net/nokiaguy/admin/EditPosts.aspx?postid=194846">编辑</a> &nbsp;<a href="http://www.blogjava.net/nokiaguy/AddToFavorite.aspx?id=194846">收藏</a> 所属分类: <a href="http://www.blogjava.net/nokiaguy/category/30832.html">Struts2</a> </p>
<img height="1" src="http://www.blogjava.net/nokiaguy/aggbug/194846.html?webview=1" width="1"  alt="" /> <!-- <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://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html" dc:identifier="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html" dc:title="Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" trackback:ping="http://www.blogjava.net/nokiaguy/services/trackbacks/194846.aspx"  />
</rdf:RDF>
--><script type="text/javascript">
//<![cdata[ Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script>
<div id="AjaxHolder_UpdatePanel1"><a name="pagedcomment"></a><a name="评论">
<div id="comments">
<h3>评论</h3>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195184">#</a>&nbsp;<a name="195184"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 <span>2008-04-23 17:40 </span><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.blogjava.net/anlqs/" target="_blank">懒人</a> </h4>
<p>好像真比struts1.0麻烦&nbsp;&nbsp;<a onclick='return SetReplyAuhor("懒人")' href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=%e6%87%92%e4%ba%ba" target="_blank">更多评论</a> <a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a> </p>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195222">#</a>&nbsp;<a name="195222"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 <span>2008-04-23 18:58 </span><a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> </h4>
<p>那要看如何用了。一般情况下，在action类中不需要使用request和response。而只是做一跳转的动作。这样一来。就显得struts1.x的execute的四个参数有些多余。因为大多数时候用不着。&nbsp;&nbsp;<a onclick='return SetReplyAuhor("银河使者")' href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=%e9%93%b6%e6%b2%b3%e4%bd%bf%e8%80%85" target="_blank">更多评论</a> <a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a> </p>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195422">#</a>&nbsp;<a name="195422"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 <span>2008-04-24 10:28 </span><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="http://www.blogjava.net/anlqs/" target="_blank">懒人</a> </h4>
<p>现在市场上主流的java开发技术是什么？struts1.0还是2.0,虽然2.0刚起步，但是我总觉得还是1.0用起来比较稳定。&nbsp;&nbsp;<a onclick='return SetReplyAuhor("懒人")' href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=%e6%87%92%e4%ba%ba" target="_blank">更多评论</a> <a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a> </p>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195580">#</a>&nbsp;<a name="195580"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 <span>2008-04-24 14:38 </span><a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" target="_blank">皮蛋</a> </h4>
<p>to: 懒人 <br />
没实际开发过就别乱说struts2不好,好不.麻烦是因为切面切的. 这样解耦解的多好. <br />
<br />
现在我们自己的项目里面struts和struts2一起用,除了获取request和response麻烦些之外起码都要比1要好用的多,尤其标签. <br />
<br />
ps:struts2里不要的地方有2处. <br />
1:2.09以上的版本标签和资源文件不支持EL表达式了. <br />
2:struts的标签有地方支持ognl表达式有的地方就不支持,就抵换成EL表达式了.&nbsp;&nbsp;<a onclick='return SetReplyAuhor("皮蛋")' href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=%e7%9a%ae%e8%9b%8b" target="_blank">更多评论</a> <a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a> </p>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195601">#</a>&nbsp;<a name="195601"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 <span>2008-04-24 15:36 </span><a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" href="http://www.blogjava.net/anlqs/" target="_blank">懒人</a> </h4>
<p>我就是感觉标签太多记不太住，可能我没经常用习惯吧。用习惯了自然就好了&nbsp;&nbsp;<a onclick='return SetReplyAuhor("懒人")' href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=%e6%87%92%e4%ba%ba" target="_blank">更多评论</a> <a id="AjaxHolder_Comments_CommentList_ctl04_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl04$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl04_EditLink"></a> </p>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法[未登录]" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195628">#</a>&nbsp;<a name="195628"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法[未登录] <span>2008-04-24 16:19 </span><a id="AjaxHolder_Comments_CommentList_ctl05_NameLink" target="_blank">jarry</a> </h4>
<p>用多了就好了，其实2比1在配置一些东西时简单一些。 <br />
标签就不说了，2比1好太多了，而其就一个，不像1有3个&nbsp;&nbsp;<a onclick='return SetReplyAuhor("jarry")' href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=jarry" target="_blank">更多评论</a> <a id="AjaxHolder_Comments_CommentList_ctl05_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl05$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl05_EditLink"></a> </p>
<h4><a title="permalink: re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法" href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html#195687">#</a>&nbsp;<a name="195687"></a>re: Struts2教程6：在Action类中获得HttpServletResponse对象的四种方法 <span>2008-04-24 20:21 </span><a id="AjaxHolder_Comments_CommentList_ctl06_NameLink" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> </h4>
<p>实际上，struts1或struts2的标签根本不用记，只要知道大概有什么样的标签就可以了，有很多IDE（如MyEclipse）都会将这些了标签自动列出来的，包括它们的属性。你要知道的就是这些属性和标签都起什么作用就可以了，至于它们的名子，基本上不用记，顶多知道前几个字母就可以了。<br />
<br />
哈哈，我想没人用记事本来编写java程序吧（练习除外）。</p>
</div>
</div>
<img src ="http://www.blogjava.net/aden1314/aggbug/199680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:42 <a href="http://www.blogjava.net/aden1314/articles/199680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程5：使用Validation框架验证数据 </title><link>http://www.blogjava.net/aden1314/articles/199679.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199679.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199679.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199679.html</trackback:ping><description><![CDATA[<p style="text-indent: 21.75pt"><span style="font-family: 宋体"><span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
<br />
在《</span>Struts2<span style="font-family: 宋体">教程</span>4<span style="font-family: 宋体">：使用</span>validate<span style="font-family: 宋体">方法验证数据》中曾讲到使用</span>validate<span style="font-family: 宋体">方法来验证客户端提交的数据，但如果使用</span>validate<span style="font-family: 宋体">方法就会将验证代码和正常的逻辑代码混在一起，但这样做并不利于代码维护，而且也很难将过些代码用于其他程序的验证。在</span>Struts2<span style="font-family: 宋体">中为我们提供了一个</span>Validation<span style="font-family: 宋体">框架，这个框架和</span>Struts1.x<span style="font-family: 宋体">提供的</span>Validation<span style="font-family: 宋体">框架类似，也是通过</span>XML<span style="font-family: 宋体">文件进行配置。</span></p>
<p><strong><span style="font-family: 宋体">一、服务端验证</span></strong></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面将给出一个例子来演示如何使用</span>Struts2<span style="font-family: 宋体">的</span>validation<span style="font-family: 宋体">框架来进行服务端验证。我们可以按着如下四步来编写这个程序：</span></p>
<p><strong><span style="font-family: 宋体">【第</span>1</strong><strong><span style="font-family: 宋体">步】</span></strong><span style="font-family: 宋体">建立</span>Action<span style="font-family: 宋体">类（</span>NewValidateAction.java<span style="font-family: 宋体">）<br />
<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;NewValidateAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;msg;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;必须输入</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;在13和20之间</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMsg()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMsg(String&nbsp;msg)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面我们来验证</span>msg<span style="font-family: 宋体">和</span>age<span style="font-family: 宋体">属性。</span></p>
<p><strong><span style="font-family: 宋体">【第</span>2</strong><strong><span style="font-family: 宋体">步】</span></strong><span style="font-family: 宋体">配置</span>Action<span style="font-family: 宋体">类，</span>struts.xml<span style="font-family: 宋体">的代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="new_validate"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.NewValidateAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="input"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/validate_form.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/validate_form.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p><strong><span style="font-family: 宋体">【第</span>3</strong><strong><span style="font-family: 宋体">步】</span></strong><span style="font-family: 宋体">编写验证规则配置文件</span></p>
<p><span><br />
&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这是一个基于</span>XML<span style="font-family: 宋体">的配置文件，和</span>struts1.x<span style="font-family: 宋体">中的</span>validator<span style="font-family: 宋体">框架的验证规则配置文件类似。但一般放到和要验证的</span>.class<span style="font-family: 宋体">文件在同一目录下，而且配置文件名要使用如下两个规则中的一个来命名：</span></p>
<p style="margin-left: 39.75pt; text-indent: -18pt">&lt;ActionClassName&gt;-validation.xml</p>
<p style="margin-left: 39.75pt; text-indent: -18pt">&lt;ActionClassName&gt;-&lt;ActionAliasName&gt;-validation.xml</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">其中</span>&lt;ActionAliasName&gt;<span style="font-family: 宋体">就是</span>struts.xml<span style="font-family: 宋体">中</span>&lt;ation&gt;<span style="font-family: 宋体">的</span>name<span style="font-family: 宋体">属性值。在本例中我们使用第一种命名规则，所以文件名是</span>NewValidateAction-validation.xml<span style="font-family: 宋体">。文件的内容如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;validators&nbsp;PUBLIC&nbsp;"-//OpenSymphony&nbsp;Group//XWork&nbsp;Validator&nbsp;1.0.2//EN" <br />
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">validators</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="msg"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field-validator&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="requiredstring"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">请输入信息</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field-validator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="age"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field-validator&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="int"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="min"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">13</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="max"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">20</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;必须在&nbsp;13至20之间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field-validator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">validators</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">这个文件使用了两个规则：</span>requiredstring<span style="font-family: 宋体">（必须输入）和</span>int<span style="font-family: 宋体">（确定整型范围）。关于其他更详细的验证规则，请读者访问</span><a title="http://struts.apache.org/2.0.11.1/docs/validation.html" href="http://struts.apache.org/2.0.11.1/docs/validation.html" target="_blank">http://struts.apache.org/2.0.11.1/docs/validation.html</a><span style="font-family: 宋体">来查看。</span></p>
<p><strong><span style="font-family: 宋体">【第</span>4</strong><strong><span style="font-family: 宋体">步】</span></strong><span style="font-family: 宋体">编写数据录入</span>JSP<span style="font-family: 宋体">页。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在</span>Web<span style="font-family: 宋体">根目录中建立一个</span>validate_form.jsp<span style="font-family: 宋体">文件，代码如下：<br />
<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@&nbsp;page&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="java"</span><span style="color: #ff0000">&nbsp;import</span><span style="color: #0000ff">="java.util.*"</span><span style="color: #ff0000">&nbsp;pageEncoding</span><span style="color: #0000ff">="GBK"</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@&nbsp;taglib&nbsp;</span><span style="color: #ff0000">prefix</span><span style="color: #0000ff">="s"</span><span style="color: #ff0000">&nbsp;uri</span><span style="color: #0000ff">="/struts-tags"</span><span style="color: #ff0000">&nbsp;%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">link&nbsp;</span><span style="color: #ff0000">rel</span><span style="color: #0000ff">="stylesheet"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text/css"</span><span style="color: #ff0000">&nbsp;href</span><span style="color: #0000ff">="&lt;s:url&nbsp;value="</span><span style="color: #ff0000">/styles/styles.css"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">"&gt;<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">验证数据</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="new_validate"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="msg"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="姓名"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="age"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="年龄"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">大家要注意一下，如果在</span>struts.xml<span style="font-family: 宋体">的</span>&lt;package&gt;<span style="font-family: 宋体">标签中指定</span>namespace<span style="font-family: 宋体">属性，需要在</span>&lt;s:form&gt;<span style="font-family: 宋体">中也将</span>namespace<span style="font-family: 宋体">和</span>action<span style="font-family: 宋体">分开写，如上面代码所示。不能将其连在一起，</span>Struts2<span style="font-family: 宋体">需要分开的</span>action<span style="font-family: 宋体">和</span>namespace<span style="font-family: 宋体">。如下面的代码是错误的：</span><span><br />
<br />
&lt;s:form action="/test/new_validate" &gt;</span></p>
<p><span><span>&nbsp;&nbsp; </span>... ...</span></p>
<p>&lt;/s:form&gt; </p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在上面的程序中还使用了一个</span>styles.css<span style="font-family: 宋体">来定制错误信息的风格。代码如下：</span></p>
<p style="text-indent: 21.75pt"><span>.label {font-style:italic; }</span></p>
<p style="text-indent: 21.75pt"><span>.errorLabel {font-style:italic;&nbsp;color:red; }</span></p>
<p style="text-indent: 21.75pt"><span>.errorMessage {font-weight:bold; color:red; }</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">需要在</span>Web<span style="font-family: 宋体">根目录中建立一个</span>styles<span style="font-family: 宋体">目录，并将</span>styles.css&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">假设</span>Web<span style="font-family: 宋体">工程的上下文路径是</span>validation<span style="font-family: 宋体">，可以使用如下的</span>URL<span style="font-family: 宋体">来测试这个程序：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; http://localhost:8080/validation/validate_form.jsp</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">显示结果如图</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">1</span><span style="font-size: 10.5pt; font-family: 宋体">所示。</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/01.jpg" /><br />
<br />
</span>
<p style="text-align: center" align="center"><span style="font-family: 宋体">图</span>1</p>
<p><strong><span style="font-family: 宋体">二、客户端验证</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在</span>Struts2<span style="font-family: 宋体">中实现客户端验证非常简单，只需要在</span>&lt;s:form&gt;<span style="font-family: 宋体">中加入一个</span>validate<span style="font-family: 宋体">属性，值为</span>true<span style="font-family: 宋体">。如</span><span>&lt;s:form validate="true" ... &gt; ... &lt;/form&gt;</span><span style="font-family: 宋体">即可。</span></p>
<strong><span style="font-size: 10.5pt; font-family: 宋体">三、验证嵌套属性</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span></strong><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">有一类特殊的属性，即这个属性的类型是另外一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">JavaBean</span><span style="font-size: 10.5pt; font-family: 宋体">，如有一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">User</span><span style="font-size: 10.5pt; font-family: 宋体">类，代码如下：<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;data;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;User<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setName(String&nbsp;name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">NewValidateAction</span><span style="font-size: 10.5pt; font-family: 宋体">类中加一个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">user</span><span style="font-size: 10.5pt; font-family: 宋体">属性，代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;data.User;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;NewValidateAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;User&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMsg()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMsg(String&nbsp;msg)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;User&nbsp;getUser()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUser(User&nbsp;user)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">如果要验证</span>NewValidateAction<span style="font-family: 宋体">中的</span>user<span style="font-family: 宋体">属性，可以使用</span>visitor<span style="font-family: 宋体">验证器。操作过程如下：</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">首先在</span>NewValidateAction-validation.xml<span style="font-family: 宋体">中加入一个</span>&lt;field&gt;<span style="font-family: 宋体">标签，代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;validators&nbsp;PUBLIC&nbsp;"-//OpenSymphony&nbsp;Group//XWork&nbsp;Validator&nbsp;1.0.2//EN" <br />
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">validators</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="user"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field-validator&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="visitor"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="context"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">abc</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="appendPrefix"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">User:</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field-validator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">validators</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">其中</span>context<span style="font-family: 宋体">参数将作为验证</span>User<span style="font-family: 宋体">类属性的文件名的一部分，如</span>user<span style="font-family: 宋体">属性返回一个</span>User<span style="font-family: 宋体">对象，那么用于验证</span>User<span style="font-family: 宋体">对象属性的文件名为</span>User-abc-validation.xml<span style="font-family: 宋体">。这个文件要和</span>User.class<span style="font-family: 宋体">文件在同一个目录中。</span>appendPrefix<span style="font-family: 宋体">表示是否在字段里加</span>user<span style="font-family: 宋体">，如果为</span>true<span style="font-family: 宋体">，</span>Struts2<span style="font-family: 宋体">就会使用</span>user.name<span style="font-family: 宋体">在</span>form<span style="font-family: 宋体">提交的数据中查找要验证的数据。这个属性的默认值是</span>true<span style="font-family: 宋体">。如果出错，</span>Struts2<span style="font-family: 宋体">会将</span>&lt;message&gt;<span style="font-family: 宋体">标签中的信息加到</span>User-abc-validation.xml<span style="font-family: 宋体">文件中的相应错误信息前面。</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">User-abc-validation.xml</span><span style="font-size: 10.5pt; font-family: 宋体">文件的内容如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;validators&nbsp;PUBLIC&nbsp;"-//OpenSymphony&nbsp;Group//XWork&nbsp;Validator&nbsp;1.0.2//EN"<br />
&nbsp;"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">validators</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field-validator&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="requiredstring"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">请输入name</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field-validator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="age"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field-validator&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="int"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="min"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">5</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="max"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">20</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;必须在&nbsp;5至20之间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">message</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field-validator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">validators</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p><span style="font-family: 宋体">下面修改</span>validate_form.jsp<span style="font-family: 宋体">，代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">validate</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;action</span><span style="color: #0000ff">="new_validate"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/test"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="msg"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="姓名"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="age"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="年龄"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="user.name"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="姓名1"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="user.age"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="年龄1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 52.5pt"><span style="font-family: 宋体"><span style="font-size: 12pt">
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">大家可以看到，最后两个</span>&lt;s:textfield&gt;<span style="font-family: 宋体">的</span>name<span style="font-family: 宋体">属性是</span>user.name<span style="font-family: 宋体">和</span>user.age<span style="font-family: 宋体">，正好是加了前缀的。</span></p>
<span style="font-size: 10.5pt; font-family: 宋体">现在重新访问</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;http://localhost:8080/validation/validate_form.jsp</span><span style="font-size: 10.5pt; font-family: 宋体">，验证界面如图</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">2</span><span style="font-size: 10.5pt; font-family: 宋体">所示。<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/03.jpg" border="0" /><br />
</span></span></span>&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; <br />
<p>&nbsp;</p>
<p style="text-indent: 52.5pt">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">图</span>2<br />
</p>
<p style="text-indent: 52.5pt"><br />
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">经笔者测试，使用</span>visitor<span style="font-family: 宋体">无法以客户端验证的方式来验证</span>user<span style="font-family: 宋体">属性，但</span>NewValidateAction<span style="font-family: 宋体">中其他的属性可以使用客户端测试。<br />
<br />
</span></p>
<img src ="http://www.blogjava.net/aden1314/aggbug/199679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:41 <a href="http://www.blogjava.net/aden1314/articles/199679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程4：使用validate方法验证数据 </title><link>http://www.blogjava.net/aden1314/articles/199678.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199678.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199678.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199678.html</trackback:ping><description><![CDATA[<p style="text-indent: 21.75pt"><span style="font-family: 宋体"><span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
<br />
在</span>Struts2<span style="font-family: 宋体">中最简单的验证数据的方法是使用</span>validate<span style="font-family: 宋体">。我们从</span>ActionSupport<span style="font-family: 宋体">类的源代码中可以看到，</span>ActionSupport<span style="font-family: 宋体">类实现了一个</span>Validateable<span style="font-family: 宋体">接口。这个接口只有一个</span>validate<span style="font-family: 宋体">方法。如果</span>Action<span style="font-family: 宋体">类实现了这个接口，</span>Struts2<span style="font-family: 宋体">在调用</span>execute<span style="font-family: 宋体">方法之前首先会调用这个方法，我们可以在</span>validate<span style="font-family: 宋体">方法中验证，如果发生错误，可以根据错误的</span>level<span style="font-family: 宋体">选择字段级错误，还是动作级错误。并且可使用</span>addFieldError<span style="font-family: 宋体">或</span>addActionError<span style="font-family: 宋体">加入相应的错误信息，如果存在</span>Action<span style="font-family: 宋体">或</span>Field<span style="font-family: 宋体">错误，</span>Struts2<span style="font-family: 宋体">会返回&#8220;</span>input<span style="font-family: 宋体">&#8221;（这个并不用开发人员写，由</span>Struts2<span style="font-family: 宋体">自动返回），如果返回了&#8220;</span>input<span style="font-family: 宋体">&#8221;，</span>Struts2<span style="font-family: 宋体">就不会再调用</span>execute<span style="font-family: 宋体">方法了。如果不存在错误信息，</span>Struts2<span style="font-family: 宋体">在最后会调用</span>execute<span style="font-family: 宋体">方法。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">这两个</span>add<span style="font-family: 宋体">方法和</span>ActionErrors<span style="font-family: 宋体">类中的</span>add<span style="font-family: 宋体">方法类似，只是</span>add<span style="font-family: 宋体">方法的错误信息需要一个</span>ActionMessage<span style="font-family: 宋体">对象，比较麻烦。除了加入错误信息外，还可以使用</span>addActionMessage<span style="font-family: 宋体">方法加入成功提交后的信息。当提交成功后，可以显示这些信息。</span></p>
<span style="font-size: 10.5pt; font-family: 宋体">以上三个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">add</span><span style="font-size: 10.5pt; font-family: 宋体">方法都在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">ValidationAware</span><span style="font-size: 10.5pt; font-family: 宋体">接口中定义，并且在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">ActionSupport</span><span style="font-size: 10.5pt; font-family: 宋体">类中有一个默认的实现。其实，在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">ActionSupport</span><span style="font-size: 10.5pt; font-family: 宋体">类中的实现实际上是调用了</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">ValidationAwareSupport</span><span style="font-size: 10.5pt; font-family: 宋体">中的相应的方法，也就是这三个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">add</span><span style="font-size: 10.5pt; font-family: 宋体">方法是在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">ValidationAwareSupport</span><span style="font-size: 10.5pt; font-family: 宋体">类中实现的，代码如下：<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;ValidationAwareSupport&nbsp;validationAware&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ValidationAwareSupport();<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addActionError(String&nbsp;anErrorMessage)&nbsp;<br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validationAware.addActionError(anErrorMessage);<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addActionMessage(String&nbsp;aMessage)&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;validationAware.addActionMessage(aMessage);<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addFieldError(String&nbsp;fieldName,&nbsp;String&nbsp;errorMessage)&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;validationAware.addFieldError(fieldName,&nbsp;errorMessage);<br />
}<br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面我们来实现一个简单的验证程序，来体验一个</span>validate<span style="font-family: 宋体">方法的使用。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">先来在</span>Web<span style="font-family: 宋体">根目录建立一个主页面（</span>validate.jsp<span style="font-family: 宋体">），代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@&nbsp;page&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="java"</span><span style="color: #ff0000">&nbsp;import</span><span style="color: #0000ff">="java.util.*"</span><span style="color: #ff0000">&nbsp;pageEncoding</span><span style="color: #0000ff">="GBK"</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">%@&nbsp;taglib&nbsp;</span><span style="color: #ff0000">prefix</span><span style="color: #0000ff">="s"</span><span style="color: #ff0000">&nbsp;uri</span><span style="color: #0000ff">="/struts-tags"</span><span style="color: #ff0000">&nbsp;%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">验证数据</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:actionerror</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:actionmessage</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="validate.action"</span><span style="color: #ff0000">&nbsp;&nbsp;theme</span><span style="color: #0000ff">="simple"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入内容：</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="msg"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:fielderror&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="msg.hello"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在上面的代码中，使用了</span>Struts2<span style="font-family: 宋体">的</span>tag<span style="font-family: 宋体">：</span>&lt;s:actionerror&gt;<span style="font-family: 宋体">、</span>&lt;s:fielderror&gt;<span style="font-family: 宋体">和</span>&lt;s:actionmessage&gt;<span style="font-family: 宋体">，分别用来显示动作错误信息，字段错误信息，和动作信息。如果信息为空，则不显示。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">现在我们来实现一个动作类，代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.interceptor.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ValidateAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(SUCCESS);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;validate()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">msg.equalsIgnoreCase(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(INPUT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.addFieldError(</span><span style="color: #000000">"</span><span style="color: #000000">msg.hello</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">必须输入hello!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.addActionError(</span><span style="color: #000000">"</span><span style="color: #000000">处理动作失败!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.addActionMessage(</span><span style="color: #000000">"</span><span style="color: #000000">提交成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMsg()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMsg(String&nbsp;msg)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10.5pt; font-family: 宋体"><br />
</span></span></span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">大家从上面的代码可以看出，</span>Field<span style="font-family: 宋体">错误需要一个</span>key<span style="font-family: 宋体">（一般用来表示是哪一个属性出的错误），而</span>Action<span style="font-family: 宋体">错误和</span>Action<span style="font-family: 宋体">消息只要提供一个信息字符串就可以了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">最后来配置一下这个</span>Action<span style="font-family: 宋体">，代码如下：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validate"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.ValidateAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/error/validate.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="input"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/error/validate.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">假设应用程序的上下文路径为</span>demo<span style="font-family: 宋体">，则可通过如下的</span>URL<span style="font-family: 宋体">来测试程序：</span></p>
<p>http://localhost:8080/demo/validate.jsp</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">我们还可以使用</span>ValidationAware<span style="font-family: 宋体">接口的其他方法（由</span>ValidationAwareSupport<span style="font-family: 宋体">类实现）获得或设置字段错误信息、动作错误信息以及动作消息。如</span>hasActionErrors<span style="font-family: 宋体">方法判断是否存在动作层的错误，</span>getFieldErrors<span style="font-family: 宋体">获得字段错误信息（一个</span>Map<span style="font-family: 宋体">对象）。下面是</span>ValidationAware<span style="font-family: 宋体">接口提供的所有的方法：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Collection;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ValidationAware<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setActionErrors(Collection&nbsp;errorMessages);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Collection&nbsp;getActionErrors();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setActionMessages(Collection&nbsp;messages);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Collection&nbsp;getActionMessages();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setFieldErrors(Map&nbsp;errorMap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;getFieldErrors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addActionError(String&nbsp;anErrorMessage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addActionMessage(String&nbsp;aMessage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addFieldError(String&nbsp;fieldName,&nbsp;String&nbsp;errorMessage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;hasActionErrors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;hasActionMessages();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;hasErrors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;hasFieldErrors();<br />
}<br />
</span></div>
<span style="font-size: 14pt"><span style="font-size: 12pt"><br />
</span></span>
<img src ="http://www.blogjava.net/aden1314/aggbug/199678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:39 <a href="http://www.blogjava.net/aden1314/articles/199678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程3：struts.xml常用配置解析 </title><link>http://www.blogjava.net/aden1314/articles/199677.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199677.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199677.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199677.html</trackback:ping><description><![CDATA[<p style="text-indent: 21.75pt"><span style="font-family: 宋体"><span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
<br />
在本文中将详细讲述</span>struts.xml<span style="font-family: 宋体">文件的常用配置及注意事项。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt"><strong><span><span>1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-family: 宋体">使用</span>&lt;include&gt;</strong><strong><span style="font-family: 宋体">标签重用配置文件</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在Struts2中提供了一个默认的struts.xml文件，但如果package、action、interceptors等配置比较多时，都放到一个struts.xml文件不太容易维护。因此，就需要将struts.xml文件分成多个配置文件，然后在struts.xml文件中使用&lt;include&gt;标签引用这些配置文件。这样做的优点如下：<br />
</span></p>
<p style="margin-left: 44.25pt; text-indent: -23.25pt"><span style="font-family: 宋体">结构更清晰，更容易维护配置信息。</span></p>
<p style="margin-left: 44.25pt; text-indent: -23.25pt"><span style="font-family: 宋体">配置文件可以复用。如果在多个</span>Web<span style="font-family: 宋体">程序中都使用类似或相同的配置文件，那么可以使用</span>&lt;include&gt;<span style="font-family: 宋体">标签来引用这些配置文件，这样可以减少工作量。</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">假设有一个配置文件，文件名为</span>newstruts.xml<span style="font-family: 宋体">，代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;&nbsp;class</span><span style="color: #0000ff">="action.MoreSubmitAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="save"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/result.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="print"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/result.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;</span><span style="font-size: 10.5pt; font-family: 宋体">则</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">引用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">newstruts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">文件的代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">file</span><span style="color: #0000ff">="newstruts.xml"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="test"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">大家要注意一下，用</span>&lt;include&gt;<span style="font-family: 宋体">引用的</span>xml<span style="font-family: 宋体">文件也必须是完成的</span>struts2<span style="font-family: 宋体">的配置。实际上</span>&lt;include&gt;<span style="font-family: 宋体">在引用时是单独解析的</span>xml<span style="font-family: 宋体">文件，而不是将被引用的文件插入到</span>struts.xml<span style="font-family: 宋体">文件中。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt"><strong><span><span>2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong>action</strong><strong><span style="font-family: 宋体">的别名</span></strong></p>
<p><strong>&nbsp;</strong></p>
&nbsp;&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体">在默认情况下，</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">会调用动作类的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">execute</span><span style="font-size: 10.5pt; font-family: 宋体">方法。但有些时候，我们需要在一个动作类中处理不同的动作。也就是用户请求不同的动作时，执行动作类中的不同的方法。为了达到这个目的，可以在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;action&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">标签中通过</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">method</span><span style="font-size: 10.5pt; font-family: 宋体">方法指定要指行的动作类的方法名，并且需要为不同的动作起不同的名子（也称为别名）。如下面代码所示：<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="test"</span><span style="color: #ff0000">&nbsp;&nbsp;class</span><span style="color: #0000ff">="action.MyAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="my"</span><span style="color: #ff0000">&nbsp;&nbsp;class</span><span style="color: #0000ff">="action.&nbsp;MyAction"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="my"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">上面代码的两个动作的</span>class<span style="font-family: 宋体">属性都指向同一个类，</span>name<span style="font-family: 宋体">为这个类起了两个动作别名：</span>test<span style="font-family: 宋体">和</span>my<span style="font-family: 宋体">。在动作</span>my<span style="font-family: 宋体">中，使用了</span>method<span style="font-family: 宋体">属性指定要要运行的方法名为</span>my<span style="font-family: 宋体">。</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">MyAction</span><span style="font-size: 10.5pt; font-family: 宋体">类中必须要有</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">my</span><span style="font-size: 10.5pt; font-family: 宋体">方法，代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;处理test动作的代码</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;my()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;处理my动作的代码</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">除了在</span>struts.xml<span style="font-family: 宋体">中配置别名，还可以通过请求参数来描述指定动作（并不需要在</span>struts.xml<span style="font-family: 宋体">中配置）。请求参数的格式如下：</span></p>
<p style="text-indent: 21.75pt">http://localhost:8080/contextPath/actionName!method.action</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">关于通过请求指定动作的详细内容，请参阅笔者写的<a href="http://www.blogjava.net/nokiaguy/archive/2008/04/16/193287.html" target="_blank"><span style="font-family: 宋体">《</span>Struts2<span style="font-family: 宋体">教程</span>2<span style="font-family: 宋体">：处理一个</span>form<span style="font-family: 宋体">多个</span>submit<span style="font-family: 宋体">》</span></a></span><span style="font-family: 宋体">。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt"><strong><span><span>3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-family: 宋体">为</span>action</strong><strong><span style="font-family: 宋体">指定参数</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在</span>struts2<span style="font-family: 宋体">中还可以为</span>action<span style="font-family: 宋体">指定一个或多个参数。大家还记着</span>struts1.x<span style="font-family: 宋体">是如何设置的</span>action<span style="font-family: 宋体">参数不？</span> <span style="font-family: 宋体">在</span>struts1.x<span style="font-family: 宋体">中可以使用</span>&lt;action&gt;<span style="font-family: 宋体">标签的</span>parameter<span style="font-family: 宋体">属性为其指定一个</span>action<span style="font-family: 宋体">参数，如果要指定多个，就只能通过逗号（</span>,<span style="font-family: 宋体">）或其他的分隔符将不同的参数隔开。而在</span>struts2<span style="font-family: 宋体">中可以通过</span>&lt;param&gt;<span style="font-family: 宋体">标签指定任意多个参数。代码如下：<br />
<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;&nbsp;class</span><span style="color: #0000ff">="action.MyAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="param1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">value1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="param2"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">value2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="save"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/result.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; 当然，在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">action</span><span style="font-size: 10.5pt; font-family: 宋体">中读这些参数也非常简单，只需要象获取请求参数一样在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">action</span><span style="font-size: 10.5pt; font-family: 宋体">类中定义相应的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">setter</span><span style="font-size: 10.5pt; font-family: 宋体">方法即可（一般不用定义</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">getter</span><span style="font-size: 10.5pt; font-family: 宋体">方法）。如下面的代码将读取</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">param1</span><span style="font-size: 10.5pt; font-family: 宋体">和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">param2</span><span style="font-size: 10.5pt; font-family: 宋体">参数的值：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;param1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;param2;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(param1&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;param2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setParam1(String&nbsp;param1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.param1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;param1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setParam2(String&nbsp;param2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.param2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;param2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
</span></div>
<br />
<p><span style="font-family: 宋体">当</span>struts2<span style="font-family: 宋体">在调用</span>execute<span style="font-family: 宋体">之前，</span>param1<span style="font-family: 宋体">和</span>param2<span style="font-family: 宋体">的值就已经是相应参数的值了，因此，在</span>execute<span style="font-family: 宋体">方法中可以直接使用</span>param1<span style="font-family: 宋体">和</span>param2<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt"><strong><span><span>4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-family: 宋体">选择</span>result</strong><strong><span style="font-family: 宋体">类型</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在默认时，</span>&lt;result&gt;<span style="font-family: 宋体">标签的</span>type<span style="font-family: 宋体">属性值是&#8220;</span>dispatcher<span style="font-family: 宋体">&#8221;（实际上就是转发，</span>forward<span style="font-family: 宋体">）。开发人员可以根据自己的需要指定不同的类型，如</span>redirect<span style="font-family: 宋体">、</span>stream<span style="font-family: 宋体">等。如下面代码所示：</span><span><br />
<br />
</span></p>
<p>&lt;result name="save"&nbsp;type="redirect"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /result.jsp</p>
<p>&lt;/result&gt;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这此</span>result-type<span style="font-family: 宋体">可以在</span>struts2-core-2.0.11.1.jar<span style="font-family: 宋体">包或</span>struts2<span style="font-family: 宋体">源代码中的</span>struts-default.xml<span style="font-family: 宋体">文件中找到，在这个文件中找到</span>&lt;result-types&gt;<span style="font-family: 宋体">标签，所有的</span>result-type<span style="font-family: 宋体">都在里面定义了。代码如下：<br />
<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-types</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="chain"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.opensymphony.xwork2.ActionChainResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dispatcher"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.ServletDispatcherResult"</span><span style="color: #ff0000">&nbsp;default</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="freemarker"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.views.freemarker.FreemarkerResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="httpheader"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.HttpHeaderResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="redirect"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.ServletRedirectResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="redirectAction"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.ServletActionRedirectResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="stream"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.StreamResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="velocity"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.VelocityResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="xslt"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.views.xslt.XSLTResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="plainText"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.PlainTextResult"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Deprecated&nbsp;name&nbsp;form&nbsp;scheduled&nbsp;for&nbsp;removal&nbsp;in&nbsp;Struts&nbsp;2.1.0.&nbsp;The&nbsp;camelCase&nbsp;versions&nbsp;are&nbsp;preferred.&nbsp;See&nbsp;ww-1707&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="redirect-action"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.ServletActionRedirectResult"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result-type&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="plaintext"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.struts2.dispatcher.PlainTextResult"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result-types</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21pt"><br />
</p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt"><strong><span><span>5.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-family: 宋体">全局</span>result</strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">有很多时候一个</span>&lt;result&gt;<span style="font-family: 宋体">初很多</span>&lt;action&gt;<span style="font-family: 宋体">使用，这时可以使用</span>&lt;global-results&gt;<span style="font-family: 宋体">标签来定义全局的</span>&lt;result&gt;<span style="font-family: 宋体">，代码如下：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">global-results</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="print"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/result.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">global-results</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.MoreSubmitAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="my"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.MoreSubmitAction"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="my"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<span style="font-size: 10.5pt; font-family: 宋体"><br />
&nbsp;&nbsp; 如果</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;action&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">中没有相应的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;result&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">，</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">就会使用全局的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;result&gt;。<br />
</span>
<img src ="http://www.blogjava.net/aden1314/aggbug/199677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:38 <a href="http://www.blogjava.net/aden1314/articles/199677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程2：处理一个form多个submit </title><link>http://www.blogjava.net/aden1314/articles/199675.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199675.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199675.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199675.html</trackback:ping><description><![CDATA[<span style="color: #008000">(原作者:<a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )&nbsp;</span><br />
<br />
<span style="font-size: 10.5pt; font-family: 宋体">在很多</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'">Web</span><span style="font-size: 10.5pt; font-family: 宋体">应用中，为了完成不同的工作，一个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'">HTML form</span><span style="font-size: 10.5pt; font-family: 宋体">标签中可能有两个或多个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'">submit</span><span style="font-size: 10.5pt; font-family: 宋体">按钮，如下面的代码所示：</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">html&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="<img alt="" src="http://www.blogjava.net/Images/dot.gif" />"</span><span style="color: #ff0000">&nbsp;&nbsp;method</span><span style="color: #0000ff">="post"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="保存"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="打印"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">由于在</span>&lt;form&gt;<span style="font-family: 宋体">中的多个提交按钮都向一个</span>action<span style="font-family: 宋体">提交，使用</span>Struts2 Action<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法就无法判断用户点击了哪一个提交按钮。如果大家使用过</span>Struts1.x<span style="font-family: 宋体">就会知道在</span>Struts1.2.9<span style="font-family: 宋体">之前的版本需要使用一个</span>LookupDispatchAction<span style="font-family: 宋体">动作来处理含有多个</span>submit<span style="font-family: 宋体">的</span>form<span style="font-family: 宋体">。但使用</span>LookupDispatchAction<span style="font-family: 宋体">动作需要访问属性文件，还需要映射，比较麻烦。从</span>Struts1.2.9<span style="font-family: 宋体">开始，加入了一个</span>EventDispatchAction<span style="font-family: 宋体">动作。这个类可以通过</span>java<span style="font-family: 宋体">反射来调用通过</span>request<span style="font-family: 宋体">参数指定的动作（实际上只是判断某个请求参数是不存在，如果存在，就调用在</span>action<span style="font-family: 宋体">类中和这个参数同名的方法）。使用</span>EventDispatchAction<span style="font-family: 宋体">必须将</span>submit<span style="font-family: 宋体">的</span>name<span style="font-family: 宋体">属性指定不同的值以区分每个</span>submit<span style="font-family: 宋体">。而在</span>Struts2<span style="font-family: 宋体">中将更容易实现这个功能。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">当然，我们也可以模拟</span>EventDispatchAction<span style="font-family: 宋体">的方法通过</span>request<span style="font-family: 宋体">获得和处理参数信息。但这样比较麻烦。在</span>Struts2<span style="font-family: 宋体">中提供了另外一种方法，使得无需要配置可以在同一个</span>action<span style="font-family: 宋体">类中执行不同的方法（默认执行的是</span>execute<span style="font-family: 宋体">方法）。使用这种方式也需要通过请求参来来指定要执行的动作。请求参数名的格式为</span></p>
<p style="text-indent: 21.75pt">action!method.action</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">注：由于</span>Struts2<span style="font-family: 宋体">只需要参数名，因此，参数值是什么都可以。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">下面我就给出一个实例程序来演示如何处理有多个</span>submit<span style="font-family: 宋体">的</span>form<span style="font-family: 宋体">：</span></p>
<p><span style="font-family: 宋体">【第</span>1<span style="font-family: 宋体">步】实现主页面</span>(more_submit.jsp)</p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java.util.*</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">My&nbsp;JSP&nbsp;'hello.jsp'&nbsp;starting&nbsp;page</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="submit.action"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="msg"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="输入内容"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="save"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="保存"</span><span style="color: #ff0000">&nbsp;align</span><span style="color: #0000ff">="left"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="save"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="print"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="打印"</span><span style="color: #ff0000">&nbsp;align</span><span style="color: #0000ff">="left"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="print"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在</span>more_submit.jsp<span style="font-family: 宋体">中有两个</span>submit<span style="font-family: 宋体">：保存和打印。其中分别通过</span>method<span style="font-family: 宋体">属性指定了要调用的方法：</span>save<span style="font-family: 宋体">和</span>print<span style="font-family: 宋体">。因此，在</span>Action<span style="font-family: 宋体">类中必须要有</span>save<span style="font-family: 宋体">和</span>print<span style="font-family: 宋体">方法。</span></p>
<p><span style="font-family: 宋体">【第</span>2<span style="font-family: 宋体">步】实现</span>Action<span style="font-family: 宋体">类（</span>MoreSubmitAction<span style="font-family: 宋体">）</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.interceptor.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MoreSubmitAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletRequestAware<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获得HttpServletRequest对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setServletRequest(HttpServletRequest&nbsp;request)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;处理save&nbsp;submit按钮的动作</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;save()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">result</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">成功保存[</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;msg&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">]</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">save</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;处理print&nbsp;submit按钮的动作</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;print()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">result</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">成功打印[</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;msg&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">]</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">print</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMsg()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMsg(String&nbsp;msg)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">上面的代码需要注意如下两点：</span></p>
<p style="margin-left: 40.5pt; text-indent: -18.75pt">save<span style="font-family: 宋体">和</span>print<span style="font-family: 宋体">方法必须存在，否则会抛出</span>java.lang.NoSuchMethodException<span style="font-family: 宋体">异常。</span></p>
<p style="margin-left: 40.5pt; text-indent: -18.75pt">Struts2 Action<span style="font-family: 宋体">动作中的方法和</span>Struts1.x Action<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">不同，只使用</span>Struts2 Action<span style="font-family: 宋体">动作的</span>execute<span style="font-family: 宋体">方法无法访问</span>request<span style="font-family: 宋体">对象，因此，</span>Struts2 Action<span style="font-family: 宋体">类需要实现一个</span>Struts2<span style="font-family: 宋体">自带的拦截器来获得</span>request<span style="font-family: 宋体">对象，拦截器如下：</span><span><br />
<br />
org.apache.struts2.interceptor. ServletRequestAware</span></p>
<p><span style="font-family: 宋体">【第</span>3<span style="font-family: 宋体">步】配置</span>Struts2 Action</p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">的代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demo"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;&nbsp;class</span><span style="color: #0000ff">="action.MoreSubmitAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="save"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/result.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="print"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/result.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;<br />
</span></div>

<p><span style="font-family: 宋体">【第</span>4<span style="font-family: 宋体">步】编写结果页（</span>result.jsp<span style="font-family: 宋体">）</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">提交结果</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h1</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${result}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h1</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">在</span>result.jsp<span style="font-family: 宋体">中将在</span>save<span style="font-family: 宋体">和</span>print<span style="font-family: 宋体">方法中写到</span>request<span style="font-family: 宋体">属性中的执行结果信息取出来，并输出到客户端。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">启动</span>Tomcat<span style="font-family: 宋体">后，在</span>IE<span style="font-family: 宋体">中执行如下的</span>URL<span style="font-family: 宋体">来测试程序：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; http://localhost:8080/moresubmit/more_submit.jsp</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">大家也可以直接使用如下的</span>URL<span style="font-family: 宋体">来调用</span>save<span style="font-family: 宋体">和</span>print<span style="font-family: 宋体">方法：</span><span><br />
<br />
</span><span style="font-family: 宋体">调用</span>save<span style="font-family: 宋体">方法：</span>http://localhost:8080/moresubmit/submit!save.action</p>
<p><span style="font-family: 宋体">调用</span>print<span style="font-family: 宋体">方法：</span>http://localhost:8080/moresubmit/submit!print.action<br />
<br />
源代码：<a href="http://www.itpub.net/attachment.php?aid=520773" target="_blank">http://www.itpub.net/attachment.php?aid=520773<br />
</a></p>
<img src ="http://www.blogjava.net/aden1314/aggbug/199675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:37 <a href="http://www.blogjava.net/aden1314/articles/199675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络收藏]Struts2教程1：第一个Struts2程序 </title><link>http://www.blogjava.net/aden1314/articles/199674.html</link><dc:creator>恋窝的蚂蚁</dc:creator><author>恋窝的蚂蚁</author><pubDate>Sat, 10 May 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/aden1314/articles/199674.html</guid><wfw:comment>http://www.blogjava.net/aden1314/comments/199674.html</wfw:comment><comments>http://www.blogjava.net/aden1314/articles/199674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aden1314/comments/commentRss/199674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aden1314/services/trackbacks/199674.html</trackback:ping><description><![CDATA[&nbsp;<span style="font-family: 宋体"><br />
<span style="color: #008000">(原作者: <a href="http://www.blogjava.net/nokiaguy/">银河使者</a> )<br />
</span>在本系列教程中我们将学习到</span>Struts2<span style="font-family: 宋体">的各种技术。在本教程中使用的工具和程序库的版本如下：</span>
<p><span style="font-family: 宋体">开发工具：</span>MyEclipse6</p>
<p>Web<span style="font-family: 宋体">服务器：</span>Tomcat6</p>
<p>Struts<span style="font-family: 宋体">版本：</span>Struts2.0.11.1</p>
<p>JDK<span style="font-family: 宋体">版本：</span>JDK1.5.0_12</p>
<p>J2EE<span style="font-family: 宋体">版本：</span>Java EE5.0</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在本系列教程中</span>Web<span style="font-family: 宋体">工程的上下文路径都是</span>struts2<span style="font-family: 宋体">，如果在</span>Web<span style="font-family: 宋体">根目录有一个</span>index.jsp<span style="font-family: 宋体">文件，则访问路径如下：</span><br />
<br />
http://localhost:8080/struts2/index.jsp</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">由于</span>MyEclipse6<span style="font-family: 宋体">目前并不支持</span>Struts2<span style="font-family: 宋体">，所以我们需要到</span>struts.apache.org<span style="font-family: 宋体">去下载</span>Struts2<span style="font-family: 宋体">安装包。要想正常使用</span>Struts2<span style="font-family: 宋体">，至少需要如下五个包（可能会因为</span>Struts2<span style="font-family: 宋体">的版本不同，包名略有差异，但包名的前半部是一样的）。</span></p>
<p>struts2-core-2.0.11.1.jar</p>
<p>xwork-2.0.4.jar</p>
<p>commons-logging-1.0.4.jar</p>
<p>freemarker-2.3.8.jar</p>
<p>ognl-2.6.11.jar</p>
<p>&nbsp;&nbsp;&nbsp; Struts2<span style="font-family: 宋体">虽然在大版本号上是第二个版本，但基本上在配置和使用上已经完全颠覆了</span>Struts1.x<span style="font-family: 宋体">的方式（当然，</span>Struts2<span style="font-family: 宋体">仍然是基于</span>MVC<span style="font-family: 宋体">模式的，也是动作驱动的，可能这是唯一没变的东西）。</span>Struts2<span style="font-family: 宋体">实际上是在</span>Webwork<span style="font-family: 宋体">基础上构建起来的</span>MVC<span style="font-family: 宋体">框架。我们从</span>Struts2<span style="font-family: 宋体">的源代码中可以看到，有很多都是直接使用的</span>xwork(Webwork<span style="font-family: 宋体">的核心技术</span>)<span style="font-family: 宋体">的包。既然从技术上来说</span>Struts2<span style="font-family: 宋体">是全新的框架，那么就让我们来学习一下这个新的框架的使用方法。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">如果大家使用过</span>Struts1.x<span style="font-family: 宋体">，应该对建立基于</span>Struts1.x<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">程序的基本步骤非常清楚。让我们先来回顾一下建立基于</span>Struts1.x<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">程序的基本步骤。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt">1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">安装</span>Struts<span style="font-family: 宋体">。由于</span>Struts<span style="font-family: 宋体">的入口点是</span>ActionServlet<span style="font-family: 宋体">，所以得在</span>web.xml<span style="font-family: 宋体">中配置一下这个</span>Servlet<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt">2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">编写</span>Action<span style="font-family: 宋体">类（一般从</span>org.apache.struts.action.Action<span style="font-family: 宋体">类继承）。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt">3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">编写</span>ActionForm<span style="font-family: 宋体">类（一般从</span>org.apache.struts.action.ActionForm<span style="font-family: 宋体">类继承），这一步不是必须的，如果要接收客户端提交的数据，需要执行这一步。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt">4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">在</span>struts-config.xml<span style="font-family: 宋体">文件中配置</span>Action<span style="font-family: 宋体">和</span>ActionForm<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 19.5pt; text-indent: -19.5pt">5.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">如果要</span><span style="font-family: 宋体">采集用户录入的数据，一般需要编写若干</span>JSP<span style="font-family: 宋体">页面，并通过这些</span>JSP<span style="font-family: 宋体">页面中的</span>form<span style="font-family: 宋体">将数据提交给</span>Action<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">下面我们就按着编写</span>struts1.x<span style="font-family: 宋体">程序的</span><span style="font-family: 宋体">这五步和</span>struts2.x<span style="font-family: 宋体">程序的编写过程一一对应，看看它们谁更&#8220;酷&#8221;。下面我们来编写一个基于</span>Struts2<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">程序。这个程序的功能是让用户录入两个整数，并提交给一个</span>Struts Action<span style="font-family: 宋体">，并计算这两个数的代数和，如果代码和为非负数，则跳转到</span>positive.jsp<span style="font-family: 宋体">页面，否则跳转到</span>negative.jsp<span style="font-family: 宋体">页面。<br />
<br />
&nbsp; </span></p>
<p><strong><span style="font-family: 宋体">【第</span>1</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">安装</span>Struts2</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">这一步对于</span>Struts1.x<span style="font-family: 宋体">和</span>Struts2<span style="font-family: 宋体">都是必须的，只是安装的方法不同。</span>Struts1<span style="font-family: 宋体">的入口点是一个</span>Servlet<span style="font-family: 宋体">，而</span>Struts2<span style="font-family: 宋体">的入口点是一个过滤器</span>(Filter)<span style="font-family: 宋体">。因此，</span>Struts2<span style="font-family: 宋体">要按过滤器的方式配置。下面是在</span>web.xml<span style="font-family: 宋体">中配置</span>Struts2<span style="font-family: 宋体">的代码：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.FilterDispatcher&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
&nbsp;
<p><strong><span style="font-family: 宋体">【第</span>2</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">编写</span>Action<span style="font-family: 宋体">类</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">这一步和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">也必须进行。只是</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">中的动作类必须从</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类中继承，而</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2.x</span><span style="font-size: 10.5pt; font-family: 宋体">的动作类需要从</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">com.opensymphony.xwork2.ActionSupport</span><span style="font-size: 10.5pt; font-family: 宋体">类继承。下面是计算两个整数代码和的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类，代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;action;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FirstAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;operand1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;operand2;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(getSum()&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果代码数和是非负整数，跳到positive.jsp页面</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">positive</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果代码数和是负整数，跳到negative.jsp页面</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">negative</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getOperand1()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setOperand1(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;operand1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(operand1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.operand1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;operand1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getOperand2()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setOperand2(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;operand2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(operand2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.operand2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;operand2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getSum()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand1&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;operand2;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;计算两个整数的代码数和</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
&nbsp;
<p><span style="font-family: 宋体">从上面的代码可以看出，动作类的一个特征就是要覆盖</span>execute<span style="font-family: 宋体">方法，只是</span>Struts2<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法没有参数了，而</span>Struts1.x<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法有四个参数。而且</span>execute<span style="font-family: 宋体">方法的返回值也不同的。</span>Struts2<span style="font-family: 宋体">只返回一个</span>String<span style="font-family: 宋体">，用于表述执行结果（就是一个标志）。上面代码的其他部分将在下面讲解。</span><br />
<br />
</p>
<p><strong><span style="font-family: 宋体">【第</span>3</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">编写</span>ActionForm<span style="font-family: 宋体">类</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在本例中当然需要使用</span>ActionForm<span style="font-family: 宋体">了。在</span>Struts1.x<span style="font-family: 宋体">中，必须要单独建立一个</span>ActionForm<span style="font-family: 宋体">类（或是定义一个动作</span>Form<span style="font-family: 宋体">），而在</span>Struts2<span style="font-family: 宋体">中</span>ActionForm<span style="font-family: 宋体">和</span>Action<span style="font-family: 宋体">已经二合一了。从第二步的代码可以看出，后面的部分就是应该写在</span>ActionForm<span style="font-family: 宋体">类中的内容。所以在第</span>2<span style="font-family: 宋体">步，本例的</span>ActionForm<span style="font-family: 宋体">类已经编写完成（就是</span>Action<span style="font-family: 宋体">类的后半部分）。</span></p>
<p><strong><span style="font-family: 宋体">【第</span>4</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">配置</span>Action<span style="font-family: 宋体">类</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">这一步</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">和</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts2.x</span><span style="font-size: 10.5pt; font-family: 宋体">都是必须的，只是在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">中的配置文件一般叫</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts-config.xml</span><span style="font-size: 10.5pt; font-family: 宋体">（当然也可以是其他的文件名），而且一般放到</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">WEB-INF</span><span style="font-size: 10.5pt; font-family: 宋体">目录中。而在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts2.x</span><span style="font-size: 10.5pt; font-family: 宋体">中的配置文件一般为</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">，放到</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">WEB-INF"classes</span><span style="font-size: 10.5pt; font-family: 宋体">目录中。下面是在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts.xml</span><span style="font-size: 10.5pt; font-family: 宋体">中配置动作类的代码：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="struts2"</span><span style="color: #ff0000">&nbsp;namespace</span><span style="color: #0000ff">="/mystruts"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sum"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="action.FirstAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="positive"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/positive.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="negative"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/negative.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
&nbsp;
<p><span style="font-family: 宋体">在</span>&lt;struts&gt;<span style="font-family: 宋体">标签中可以有多个</span>&lt;package&gt;<span style="font-family: 宋体">，第一个</span>&lt;package&gt;<span style="font-family: 宋体">可以指定一个</span>Servlet<span style="font-family: 宋体">访问路径（不包括动作名），如&#8220;</span>/mystruts<span style="font-family: 宋体">&#8221;。</span>extends<span style="font-family: 宋体">属性继承一个默认的配置文件&#8220;</span>struts-default<span style="font-family: 宋体">&#8221;，一般都继承于它，大家可以先不去管它。</span>&lt;action&gt;<span style="font-family: 宋体">标签中的</span>name<span style="font-family: 宋体">属性表示动作名，</span>class<span style="font-family: 宋体">表示动作类名。</span></p>
<p>&nbsp;&nbsp;&nbsp; &lt;result&gt;<span style="font-family: 宋体">标签的</span>name<span style="font-family: 宋体">实际上就是</span>execute<span style="font-family: 宋体">方法返回的字符串，如果返回的是&#8220;</span>positive<span style="font-family: 宋体">&#8221;，就跳转到</span>positive.jsp<span style="font-family: 宋体">页面，如果是&#8220;</span>negative<span style="font-family: 宋体">&#8221;，就跳转到</span>negative.jsp<span style="font-family: 宋体">页面。在</span>&lt;struts&gt;<span style="font-family: 宋体">中可以有多个</span>&lt;package&gt;<span style="font-family: 宋体">，在</span>&lt;package&gt;<span style="font-family: 宋体">中可以有多个</span>&lt;action&gt;<span style="font-family: 宋体">。我们可以用如下的</span>URL<span style="font-family: 宋体">来访问这个动作：</span><br />
<br />
http://localhost:8080/struts2/mystruts/sum.action</p>
<p><span style="font-family: 宋体">注</span><span style="font-family: 宋体">：</span>Struts1.x<span style="font-family: 宋体">的动作一般都以</span>.do<span style="font-family: 宋体">结尾，而</span>Struts2<span style="font-family: 宋体">是以</span>.action<span style="font-family: 宋体">结尾。</span></p>
<p><strong><span style="font-family: 宋体">【第</span>5</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">编写用户录入接口（</span>JSP<span style="font-family: 宋体">页面）</span></p>
<p style="margin-left: 39.75pt; text-indent: -18pt"><strong>1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="font-family: 宋体">主界面（</span>sum.jsp</strong><strong><span style="font-family: 宋体">）</span></strong></p>
<p style="margin-left: 21.75pt"><span style="font-family: 宋体">在</span>Web<span style="font-family: 宋体">根目录建立一个</span>sum.jsp<span style="font-family: 宋体">，代码如下：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java.util.*</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">输入操作数</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;求代数和<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="mystruts/sum.action"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="operand1"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="&nbsp;操作数1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="operand2"</span><span style="color: #ff0000">&nbsp;&nbsp;label</span><span style="color: #0000ff">="&nbsp;操作数2"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="代数和"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
&nbsp;
<p><span style="font-family: 宋体">在</span>sum.jsp<span style="font-family: 宋体">中使用了</span>Struts2<span style="font-family: 宋体">带的</span>tag<span style="font-family: 宋体">。在</span>Struts2<span style="font-family: 宋体">中已经将</span>Struts1.x<span style="font-family: 宋体">的好几个标签库都统一了，在</span>Struts2<span style="font-family: 宋体">中只有一个标签库</span>/struts-tags<span style="font-family: 宋体">。这里面包含了所有的</span>Struts2<span style="font-family: 宋体">标签。但使用</span>Struts2<span style="font-family: 宋体">的标签大家要注意一下。在</span>&lt;s:form&gt;<span style="font-family: 宋体">中最好都使用</span>Struts2<span style="font-family: 宋体">标签，尽量不要用</span>HTML<span style="font-family: 宋体">或普通文本，大家可以将</span>sum.jsp<span style="font-family: 宋体">的代码改为如下的形式，看看会出现什么效果：</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... ...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">求代数和</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:form action="mystruts/sum.action" &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 73.5pt"><span style="font-family: 宋体">操作数</span>1<span style="font-family: 宋体">：</span>&lt;s:textfield name="operand1" /&gt;&lt;br/&gt;</p>
<p style="text-indent: 73.5pt"><span style="font-family: 宋体">操作数</span>2<span style="font-family: 宋体">：</span>&lt;s:textfield name="operand1" /&gt;&lt;br/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:submit value="<span style="font-family: 宋体">代数和</span>" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:form&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... ...</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">提示一下，在</span>&lt;s:form&gt;<span style="font-family: 宋体">中</span>Struts2<span style="font-family: 宋体">使用</span>&lt;table&gt;<span style="font-family: 宋体">定位。</span></p>
<p style="margin-left: 39.75pt; text-indent: -18pt"><strong>2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>positive.jsp</strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java.util.*</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">显示代数和</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代数和为非负整数</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h1</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:property&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="sum"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h1</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span></div>
&nbsp;
<p style="margin-left: 39.75pt; text-indent: -18pt"><strong>3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>negative.jsp</strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java.util.*</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">显示代数和</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代数和为负整数</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h1</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:property&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="sum"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h1</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span></div>
<br />
&nbsp;
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 这两个</span>jsp<span style="font-family: 宋体">页面的实现代码基本一样，只使用了一个</span>&lt;s:property&gt;<span style="font-family: 宋体">标签来显示</span>Action<span style="font-family: 宋体">类中的</span>sum<span style="font-family: 宋体">属性值。</span>&lt;s:property&gt;<span style="font-family: 宋体">标签是从</span>request<span style="font-family: 宋体">对象中获得了一个对象中得到的</span>sum<span style="font-family: 宋体">属性，如我们可以使用如下的代码来代替</span>&lt;s:property value=&#8221;sum&#8221;/&gt;<span style="font-family: 宋体">：</span></p>
&nbsp;
<p>&lt;%</p>
<p>&nbsp;com.opensymphony.xwork2.util.OgnlValueStack ovs = </p>
<p style="text-indent: 5.25pt">(com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("struts.valueStack");&nbsp;</p>
<p>&nbsp;out.println(ovs.findString("sum"));&nbsp;</p>
<p>%&gt;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">启动</span>Tomcat<span style="font-family: 宋体">后，在</span>IE<span style="font-family: 宋体">中输入如下的</span>URL<span style="font-family: 宋体">来测试这个例子：</span><br />
<br />
http://localhost:8080/struts2/sum.jsp</p>
</span>
<img src ="http://www.blogjava.net/aden1314/aggbug/199674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aden1314/" target="_blank">恋窝的蚂蚁</a> 2008-05-10 11:33 <a href="http://www.blogjava.net/aden1314/articles/199674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>