﻿<?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-Angel Xia-文章分类-struts2.1.6</title><link>http://www.blogjava.net/ZouYonghui/category/51173.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Mar 2012 22:58:56 GMT</lastBuildDate><pubDate>Tue, 27 Mar 2012 22:58:56 GMT</pubDate><ttl>60</ttl><item><title>struts自定义标签</title><link>http://www.blogjava.net/ZouYonghui/articles/372730.html</link><dc:creator>Terry Zou</dc:creator><author>Terry Zou</author><pubDate>Mon, 26 Mar 2012 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/ZouYonghui/articles/372730.html</guid><wfw:comment>http://www.blogjava.net/ZouYonghui/comments/372730.html</wfw:comment><comments>http://www.blogjava.net/ZouYonghui/articles/372730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ZouYonghui/comments/commentRss/372730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ZouYonghui/services/trackbacks/372730.html</trackback:ping><description><![CDATA[<p><span style="font-size: x-small; color: #4b4b4b; line-height: 18px"><font size="1">首先标签是一个java类，它是运行一个或两个接口的javabean,然后再配合标签描述文件(以.tld为扩展名)，两者结合就可以作出自己的自定义标签库了。</font></span></p>
<p><span style="color: #6d6d6d; line-height: 26px">自定义标签必须实现下面三个接口中的一个：Tag、IterationTag、BodyTag&nbsp;</span></p>
<p>&nbsp;</p>
<p><span style="color: #6d6d6d; line-height: 26px"><strong>Tag接口中的返回常数意义：</strong></span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">EVAL_BODY_INCLUDE：告诉服务器正文的内容，并把这些内容送入输出流</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">SKIP_BODY：告诉服务器不要处理正文内容</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">EVAL_PAGE：让服务器继续执行页面</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">SKIP_PAGE：让服务器不要处理剩余的页面</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">EVAL_BODY_AGAIN：让服务器继续处理正文内容，只有doAfterBody方法可以返回</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">EVAL_BODY_BUFFERED：BodyTag接口的字段，在doStartTag()返回</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回，而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。</span> </p>
<p>&nbsp;</p>
<p><span style="color: #6d6d6d; line-height: 26px"><strong>一个扩展BodyTagSupport的自定义标记的生命周期如下：</strong></span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">1.创建标记</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">2.调用Setter方法</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">3.调用doStartTag()方法</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">4.调用setBodyContent()方法</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">5.调用InitBody()方法</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">6.处理标记的Body</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">7.doAfterBody()；根据返回值，如果为EVAL_BODY_AGAIN，继续执行6，如果不是，执行8</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">8.调用doEndTag()方法</span><br style="color: #6d6d6d; line-height: 26px" /><span style="color: #6d6d6d; line-height: 26px">9.判断标记是否需要重用，如果要，执行4；否则执行release()方法。</span></p>
<p>&nbsp;</p>
<p><strong>标签类代码：</strong></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://huangronaldo.iteye.com/blog/1433149#"><img alt="复制代码" src="http://huangronaldo.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://huangronaldo.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://huangronaldo.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">package</span><span>&nbsp;test.jsp.tags;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.jsp.tagext.BodyTagSupport;&nbsp; &nbsp;&nbsp;</span></span></li><li><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.jsp.tagext.BodyContent;&nbsp; &nbsp;&nbsp;</span></span></li><li><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.jsp.JspTagException;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BodyTagExample&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BodyTagSupport&nbsp; &nbsp;&nbsp;</span></span></li><li><span>{&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;counts; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;BodyTagExample()&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>(); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCounts(</span><span class="keyword">int</span><span>&nbsp;counts) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.counts&nbsp;=&nbsp;counts; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;doStartTag()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JspTagException &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"doStartTag..."</span><span>); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(counts&nbsp;&gt;&nbsp;</span><span class="number"><font color="#c00000">0</font></span><span>) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;EVAL_BODY_TAG; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SKIP_BODY; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setBodyContent(BodyContent&nbsp;bodyContent) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"setBodyContent..."</span><span>); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.bodyContent&nbsp;=&nbsp;bodyContent; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doInitBody()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JspTagException &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"doInitBody...."</span><span>); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;doAfterBody()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JspTagException &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"do&nbsp;After&nbsp;body..."</span><span>&nbsp;+&nbsp;counts); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(counts&nbsp;&gt;&nbsp;</span><span class="number"><font color="#c00000">1</font></span><span>) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counts--; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;EVAL_BODY_TAG; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SKIP_BODY; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;doEndTag()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JspTagException &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"do&nbsp;end&nbsp;Tag..."</span><span>); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(bodyContent&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bodyContent.writeOut(bodyContent.getEnclosingWriter()); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(java.io.IOException&nbsp;e)&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;JspTagException(</span><span class="string">"IO&nbsp;Error:&nbsp;"</span><span>&nbsp;+&nbsp;e.getMessage());&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;EVAL_PAGE;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;&nbsp;</span></li></ol></div>
<p><span style="font-size: x-small; line-height: 18px"><strong><font size="1">tld描述文件源码：</font></strong></span></p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://huangronaldo.iteye.com/blog/1433149#"><img alt="复制代码" src="http://huangronaldo.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://huangronaldo.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://huangronaldo.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"ISO-8859-1"</span><span>&nbsp;?&gt; &nbsp;&nbsp;</span></li><li><span>&lt;!DOCTYPE&nbsp;taglib &nbsp;&nbsp;</span></li><li><span>PUBLIC&nbsp;</span><span class="string">"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;JSP&nbsp;Tag&nbsp;Library&nbsp;1.1//EN"</span><span>&nbsp;&nbsp;</span></span></li><li><span>" &nbsp;&nbsp;</span></li><li><span>http:</span><span class="comment">//java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"&gt; </span><span>&nbsp;&nbsp;</span></span></li><li><span>&lt;taglib&gt; &nbsp;&nbsp;</span></li><li><span>&lt;tlibversion&gt;</span><span class="number"><font color="#c00000">1.0</font></span><span>&lt;/tlibversion&gt; &nbsp;&nbsp;</span></span></li><li><span>&lt;jspversion&gt;</span><span class="number"><font color="#c00000">1.1</font></span><span>&lt;/jspversion&gt; &nbsp;&nbsp;</span></span></li><li><span>&lt;shortname&gt;Application&nbsp;Tag&nbsp;Library&lt;/shortname&gt; &nbsp;&nbsp;</span></li><li><span>&lt;uri&gt;http:</span><span class="comment">//jakarta.apache.org/taglibs/struts-example-1.0&lt;/uri&gt; </span><span>&nbsp;&nbsp;</span></span></li><li><span>&lt;info&gt;tag&nbsp;loop&lt;/info&gt; &nbsp;&nbsp;</span></li><li><span>&lt;tag&gt; &nbsp;&nbsp;</span></li><li><span>&lt;name&gt;loop&lt;/name&gt; &nbsp;&nbsp;</span></li><li><span>&lt;tagclass&gt;test.jsp.tags.BodyTagExample&lt;/tagclass&gt; &nbsp;&nbsp;</span></li><li><span>&lt;bodycontent&gt;JSP&lt;/bodycontent&gt; &nbsp;&nbsp;</span></li><li><span>&lt;attribute&gt; &nbsp;&nbsp;</span></li><li><span>&lt;name&gt;counts&lt;/name&gt; &nbsp;&nbsp;</span></li><li><span>&lt;required&gt;</span><span class="keyword">true</span><span>&lt;/required&gt; &nbsp;&nbsp;</span></span></li><li><span>&lt;rtexprvalue&gt;</span><span class="keyword">true</span><span>&lt;/rtexprvalue&gt; &nbsp;&nbsp;</span></span></li><li><span>&lt;/attribute&gt; &nbsp;&nbsp;</span></li><li><span>&lt;/tag&gt; &nbsp;&nbsp;</span></li><li><span>&lt;/taglib&gt;&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Struts 自定义标签" style="display: none" pre_index="1" source_url="http://huangronaldo.iteye.com/blog/1433149" codeable_type="Blog" codeable_id="1433149" name="code">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;
&lt;!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"
http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"&gt;
&lt;taglib&gt;
&lt;tlibversion&gt;1.0&lt;/tlibversion&gt;
&lt;jspversion&gt;1.1&lt;/jspversion&gt;
&lt;shortname&gt;Application Tag Library&lt;/shortname&gt;
&lt;uri&gt;http://jakarta.apache.org/taglibs/struts-example-1.0&lt;/uri&gt;
&lt;info&gt;tag loop&lt;/info&gt;
&lt;tag&gt;
&lt;name&gt;loop&lt;/name&gt;
&lt;tagclass&gt;test.jsp.tags.BodyTagExample&lt;/tagclass&gt;
&lt;bodycontent&gt;JSP&lt;/bodycontent&gt;
&lt;attribute&gt;
&lt;name&gt;counts&lt;/name&gt;
&lt;required&gt;true&lt;/required&gt;
&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
&lt;/attribute&gt;
&lt;/tag&gt;
&lt;/taglib&gt;</pre>
<p>&nbsp;</p>
<p><strong>其中：</strong></p>
<p><font size="1"><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">tag中的name属性：定义了我们的tag名称，在后面会用到。</span><br style="font-size: x-small; color: #4b4b4b; line-height: 18px" /><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">tag中的tagclass属性：指定了我们这个tag的实现类。</span><br style="font-size: x-small; color: #4b4b4b; line-height: 18px" /><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">tage中的bodycontent属性：指定我们的页面内容是什么性质的。(注意：在jsp开发中这里必须写JSP)</span><br style="font-size: x-small; color: #4b4b4b; line-height: 18px" /><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">tage中的attribute属性：定义了我们的这个tag可能有的属性。</span><br style="font-size: x-small; color: #4b4b4b; line-height: 18px" /><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">attribute中的name属性：指定了属性的名称。它和我们类中定义的&#8220;int counts;&#8221;必须一样，并且在类中还必须包含一个setCounts(int counts)方法，否则这个属性就不能设置。</span><br style="font-size: x-small; color: #4b4b4b; line-height: 18px" /><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">attribute中的required属性：表示这个属性是否是必须的。</span><br style="font-size: x-small; color: #4b4b4b; line-height: 18px" /><span style="font-size: x-small; color: #4b4b4b; line-height: 18px">attribute中的rtexprvalue属性：表示这个属性是否可以用JSP的程序段的结果输出。</span></font></p>
<p><strong><br /><font size="1"></font></strong></p>
<p><strong>tag写完自后要在web.xml中声明这个tag</strong></p>
<p><strong>web.xml代码如下：</strong></p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://huangronaldo.iteye.com/blog/1433149#"><img alt="复制代码" src="http://huangronaldo.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://huangronaldo.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://huangronaldo.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;</span><span class="string">"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN"</span><span>&nbsp;</span><span class="string">"http://java.sun.com/dtd/web-app_2_3.dtd"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&lt;web-app&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;taglib&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;taglib-uri&gt;demotag&lt;/taglib-uri&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;taglib-location&gt;/WEB-INF/tld/mytag.tld&lt;/taglib-location&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;/taglib&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;/web-app&gt;&nbsp;&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Struts 自定义标签" style="display: none" pre_index="2" source_url="http://huangronaldo.iteye.com/blog/1433149" codeable_type="Blog" codeable_id="1433149" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt; 
&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"&gt; 
&lt;web-app&gt; 
&lt;taglib&gt; 
&lt;taglib-uri&gt;demotag&lt;/taglib-uri&gt; 
&lt;taglib-location&gt;/WEB-INF/tld/mytag.tld&lt;/taglib-location&gt; 
&lt;/taglib&gt; 
&lt;/web-app&gt; </pre>
<p>&nbsp;</p>
<p><strong>Jsp引用代码：</strong></p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://huangronaldo.iteye.com/blog/1433149#"><img alt="复制代码" src="http://huangronaldo.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://huangronaldo.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://huangronaldo.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span>&lt;%@&nbsp;page&nbsp;contentType=</span><span class="string">"text/html;&nbsp;charset=GBK"</span><span>&nbsp;language=</span><span class="string">"java"</span><span>%&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;%@&nbsp;taglib&nbsp;uri=</span><span class="string">"demotag"</span><span>&nbsp;prefix=</span><span class="string">"demo"</span><span>&nbsp;%&gt;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&lt;html&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;body&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;br&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;demo:loop&nbsp;counts=</span><span class="string">"5"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>现在时间是：&lt;%=</span><span class="keyword">new</span><span>&nbsp;java.util.Date().toString()%&gt;&lt;br&gt;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&lt;/demo:loop&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;br&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;/body&gt;&nbsp; &nbsp;&nbsp;</span></li><li><span>&lt;/html&gt;&nbsp;&nbsp;&nbsp;</span></li></ol></div><br /> <img src ="http://www.blogjava.net/ZouYonghui/aggbug/372730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ZouYonghui/" target="_blank">Terry Zou</a> 2012-03-26 17:44 <a href="http://www.blogjava.net/ZouYonghui/articles/372730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置文件默认的打开方式</title><link>http://www.blogjava.net/ZouYonghui/articles/372530.html</link><dc:creator>Terry Zou</dc:creator><author>Terry Zou</author><pubDate>Fri, 23 Mar 2012 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/ZouYonghui/articles/372530.html</guid><wfw:comment>http://www.blogjava.net/ZouYonghui/comments/372530.html</wfw:comment><comments>http://www.blogjava.net/ZouYonghui/articles/372530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ZouYonghui/comments/commentRss/372530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ZouYonghui/services/trackbacks/372530.html</trackback:ping><description><![CDATA[<img height="768" alt="" src="http://www.blogjava.net/images/blogjava_net/zouyonghui/默认打开方式.jpg" width="1024" border="0" longdesc="" /><img src ="http://www.blogjava.net/ZouYonghui/aggbug/372530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ZouYonghui/" target="_blank">Terry Zou</a> 2012-03-23 11:55 <a href="http://www.blogjava.net/ZouYonghui/articles/372530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGNL表达式struts2标签“%，#，$”</title><link>http://www.blogjava.net/ZouYonghui/articles/372290.html</link><dc:creator>Terry Zou</dc:creator><author>Terry Zou</author><pubDate>Tue, 20 Mar 2012 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/ZouYonghui/articles/372290.html</guid><wfw:comment>http://www.blogjava.net/ZouYonghui/comments/372290.html</wfw:comment><comments>http://www.blogjava.net/ZouYonghui/articles/372290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ZouYonghui/comments/commentRss/372290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ZouYonghui/services/trackbacks/372290.html</trackback:ping><description><![CDATA[<strong>
<div>
<div class="postTitle">OGNL表达式struts2标签&#8220;%，#，$&#8221;</div>
<ol><li><span>一、什么是OGNL，有什么特点？ &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>OGNL（Object-Graph&nbsp;<wbr>Navigation&nbsp;<wbr>Language），大概可以理解为：对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点：&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">1</font></span><span>、支持对象方法调用，形式如：objName.methodName()； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">2</font></span><span>、支持类静态的方法调用和值访问，表达式的格式为@[类全名（包括包路）]@[方法名&nbsp;<wbr>|&nbsp;<wbr>&nbsp;<wbr>值名]，例如： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#646464">@java</font></span><span>.lang.String</span><span><font color="#646464">@format</font></span><span>(</span><span><font color="#0000ff">'foo&nbsp;<wbr>%s'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'bar'</font></span><span>)或</span><span><font color="#646464">@tutorial</font></span><span>.MyConstant</span><span><font color="#646464">@APP_NAME</font></span><span>； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">3</font></span><span>、支持赋值操作和表达式串联，例如： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>price=</span><span><font color="#c00000">100</font></span><span>,&nbsp;<wbr>discount=</span><span><font color="#c00000">0.8</font></span><span>,&nbsp;<wbr>calculatePrice()，这个表达式会返回</span><span><font color="#c00000">80</font></span><span>； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">4</font></span><span>、访问OGNL上下文（OGNL&nbsp;<wbr>context）和ActionContext； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">5</font></span><span>、操作集合对象。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>二、使用OGNL表达式 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>OGNL要结合struts标签来使用。由于比较灵活，也容易把人给弄晕，尤其是&#8220;%&#8221;、&#8220;#&#8221;、&#8220;$&#8221;这三个符号的使用。由于$广泛应用于EL中，这里重点写%和#符号的用法。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">1</font></span><span>、&#8220;#&#8221;符号有三种用途： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">1</font></span><span>)、访问非根对象（struts中值栈为根对象）如OGNL上下文和Action上下文，#相当于ActionContext.getContext()；下表有几个ActionContext中有用的属性： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>名称 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>作用 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>例子 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>parameters &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前HTTP请求参数的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#parameters.id[</span><span><font color="#c00000">0</font></span><span>]作用相当于request.getParameter(</span><span><font color="#0000ff">"id"</font></span><span>)&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>request &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前HttpServletRequest的属性（attribute)的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#request.userName相当于request.getAttribute(</span><span><font color="#0000ff">"userName"</font></span><span>)&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>session &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前HttpSession的属性（attribute）的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#session.userName相当于session.getAttribute(</span><span><font color="#0000ff">"userName"</font></span><span>)&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>application &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前应用的ServletContext的属性（attribute）的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#application.userName相当于application.getAttribute(</span><span><font color="#0000ff">"userName"</font></span><span>)&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>注：attr&nbsp;<wbr>用于按request&nbsp;<wbr>&gt;&nbsp;<wbr>session&nbsp;<wbr>&gt;&nbsp;<wbr>application顺序访问其属性（attribute），#attr.userName相当于按顺序在以上三个范围（scope）内读取userName属性，直到找到为止。用于过滤和投影（projecting)集合，如books.{?#</span><span><strong><font color="#7f0055">this</font></strong></span><span>.price&lt;</span><span><font color="#c00000">100</font></span><span>}；构造Map，如#{</span><span><font color="#0000ff">'foo1'</font></span><span>:</span><span><font color="#0000ff">'bar1'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'foo2'</font></span><span>:</span><span><font color="#0000ff">'bar2'</font></span><span>}。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">2</font></span><span>)、用于过滤和投影（projecting)集合，如:&nbsp;<wbr>books.{?#</span><span><strong><font color="#7f0055">this</font></strong></span><span>.price&gt;</span><span><font color="#c00000">35</font></span><span>}&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>books.{?#</span><span><strong><font color="#7f0055">this</font></strong></span><span>.price&gt;</span><span><font color="#c00000">35</font></span><span>} &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">3</font></span><span>)、构造Map，如:&nbsp;<wbr>#{</span><span><font color="#0000ff">'foo1'</font></span><span>:</span><span><font color="#0000ff">'bar1'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'foo2'</font></span><span>:</span><span><font color="#0000ff">'bar2'</font></span><span>}&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>#{</span><span><font color="#0000ff">'foo1'</font></span><span>:</span><span><font color="#0000ff">'bar1'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'foo2'</font></span><span>:</span><span><font color="#0000ff">'bar2'</font></span><span>}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写：&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['foo1']"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['foo1']"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">2</font></span><span>、&#8220;%&#8221;符号的用途是在标签的属性值被理解为字符串类型时，告诉执行环境%{}里的是OGNL表达式。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>这是一开始最让我不能理解的符号，原因是一些相关资源在表述时不太准备，经过一翻痛苦的探索，终于明白了它的用途。实际上就是让被理解为字符串的表达式，被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能，例如&nbsp;<wbr>： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>eval_r(</span><span><font color="#0000ff">"document.all.div"</font></span><span>+index)&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>eval_r(</span><span><font color="#0000ff">"document.all.div"</font></span><span>+index) &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>当index变量为</span><span><font color="#c00000">1</font></span><span>时，语句就会被当作var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>document.all.div1&nbsp;<wbr>&nbsp;<wbr>var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>document.all.div1来执行。%{}就是起这个作用。举例：&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:set&nbsp;<wbr>name=</span><span><font color="#0000ff">"myMap"</font></span><span>&nbsp;<wbr>value=</span><span><font color="#0000ff">"#{'key1':'value1','key2':'value2'}"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>&nbsp;<wbr>/&gt;&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:set&nbsp;<wbr>name=</span><span><font color="#0000ff">"myMap"</font></span><span>&nbsp;<wbr>value=</span><span><font color="#0000ff">"#{'key1':'value1','key2':'value2'}"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>上面的代码第</span><span><font color="#c00000">2</font></span><span>行会在页面上输出&#8220;value1&#8221;，而第</span><span><font color="#c00000">3</font></span><span>行则会输出</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>这么一个字符串。&nbsp;<wbr>如果将第</span><span><font color="#c00000">3</font></span><span>行改写成这样：&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"%{#myMap['key1']}"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"%{#myMap['key1']}"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>则输出为&#8220;value1&#8221;。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签&#8220;看不懂&#8221;类似&#8220;#myMap[</span><span><font color="#0000ff">'key1'</font></span><span>]&#8221;的语句时，就要用%{}来把这括进去，&#8220;翻译&#8221;一下了。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">3</font></span><span>、&#8220;$&#8221;有两种用途 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">1</font></span><span>)、在国际化资源文件中，引用OGNL表达式。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">2</font></span><span>)、在Struts&nbsp;<wbr></span><span><font color="#c00000">2</font></span><span>配置文件中，引用OGNL表达式：&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;action&nbsp;<wbr>name=</span><span><font color="#0000ff">"saveUser"</font></span><span>&nbsp;<wbr></span><span><strong><font color="#7f0055">class</font></strong></span><span>=</span><span><font color="#0000ff">"userAction"</font></span><span>&nbsp;<wbr>method=</span><span><font color="#0000ff">"save"</font></span><span>&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;result&nbsp;<wbr>type=</span><span><font color="#0000ff">"redirect"</font></span><span>&gt;listUser.action?msg=${msg}&lt;/result&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;/action&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;action&nbsp;<wbr>name=</span><span><font color="#0000ff">"saveUser"</font></span><span>&nbsp;<wbr></span><span><strong><font color="#7f0055">class</font></strong></span><span>=</span><span><font color="#0000ff">"userAction"</font></span><span>&nbsp;<wbr>method=</span><span><font color="#0000ff">"save"</font></span><span>&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;result&nbsp;<wbr>type=</span><span><font color="#0000ff">"redirect"</font></span><span>&gt;listUser.action?msg=${msg}&lt;/result&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;/action&gt;&nbsp;<wbr> <br /></span></li></ol></strong></div> <img src ="http://www.blogjava.net/ZouYonghui/aggbug/372290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ZouYonghui/" target="_blank">Terry Zou</a> 2012-03-20 17:07 <a href="http://www.blogjava.net/ZouYonghui/articles/372290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>