﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小舒的java世界-文章分类-struts 学习笔记</title><link>http://www.blogjava.net/zhengshuli-j2ee/category/38038.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2009 19:48:27 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2009 19:48:27 GMT</pubDate><ttl>60</ttl><item><title>struts之JSTL-core库学习笔记</title><link>http://www.blogjava.net/zhengshuli-j2ee/articles/264311.html</link><dc:creator>郑舒力</dc:creator><author>郑舒力</author><pubDate>Tue, 07 Apr 2009 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhengshuli-j2ee/articles/264311.html</guid><wfw:comment>http://www.blogjava.net/zhengshuli-j2ee/comments/264311.html</wfw:comment><comments>http://www.blogjava.net/zhengshuli-j2ee/articles/264311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhengshuli-j2ee/comments/commentRss/264311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhengshuli-j2ee/services/trackbacks/264311.html</trackback:ping><description><![CDATA[<p><span style="color: red">JSTL标签库的配置</span><br />
需要在web程序的lib目录下粘贴jstl.jar和standard.jar(如果只使用el表达式，不用拷贝这两个jar)<br />
注意：jstl必须在能够支持j2ee1.4/servlet2.4/jsp2.0版本上的容器才能运行。<br />
c开头的核心库，fmt开头的为格式化库，fn开头的为函数库，sql开头的为操作SQL库，x开头的操纵XML</p>
<p>核心库<br />
<span style="color: red">&lt;c:out/&gt;输出标签</span><br />
examples:<br />
&lt;c:out value="${hello}"/&gt;<br />
如果需要再scope里取值,在value内必须是el表达式或jsp脚本,否则将把引号内容按字符串输出<br />
&lt;c:out value="abc"/&gt;将输出abc。<br />
如果只是以上业务的话，推荐使用el表达式取值，更加简洁。<br />
&lt;c:out value="${abc}" default="123"/&gt;<br />
如果abc在scope内并不存在的话，可以加入default属性规定默认值.<br />
&lt;c:out value="${cz}" escapeXml="false"/&gt;<br />
如果想把字符串按HTML格式输出，需加入escapeXml="false"。<br />
此处推荐使用el表达式，el自动按HTML格式输出。</p>
<p><span style="color: red">&lt;c:set&gt;&lt;c:remove&gt;设值，移除标签</span><br />
examples:<br />
&lt;c:set value="123" var="temp"/&gt;<br />
temp:${temp}<br />
&lt;c:remove var="temp"/&gt;<br />
temp:${temp}<br />
var指定变量名。</p>
<p><span style="color: red">&lt;c:if&gt;&lt;c:if/&gt;判断标签</span><br />
examples:<br />
&lt;c:if test="${v1 lt v2}" var="v"&gt;<br />
&nbsp;v1小于v2<br />
&nbsp;${v }<br />
&lt;/c:if&gt;<br />
var标签指定变量并接收test内判断的值</p>
<p><span style="color: red">&lt;c:choose&gt;条件分支标签</span><br />
examples:<br />
&lt;c:choose&gt;<br />
&nbsp;&lt;c:when test="${v1&lt;v2}"&gt;<br />
&nbsp;&nbsp;v1小于v2<br />
&nbsp;&lt;/c:when&gt;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&lt;c:otherwise&gt;<br />
&nbsp;&nbsp;v1大于v2<br />
&nbsp;&lt;/c:otherwise&gt;<br />
&lt;/c:choose&gt;<br />
<span style="color: #0000ff">使用choose标签有两点需要注意<br />
</span>1、&lt;c:choose&gt;标签不能单独出现<br />
2、&lt;c:otherwise&gt;标签不能出现在&lt;c:when&gt;标签之前,&lt;/c:when&gt;可以有多对</p>
<p><span style="color: red">&lt;c:forEach&gt;循环标签</span><br />
examples:<br />
&lt;c:forEach items="${userList}" var="user"&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp; &nbsp;&lt;td&gt;${user.name}&lt;/td&gt;<br />
&nbsp;&nbsp;&lt;td&gt;${user.age}&lt;/td&gt;<br />
&nbsp;&nbsp;&lt;td&gt;${user.group.name}&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&lt;/c:forEach&gt;<br />
items属性指定集合数组，var属性指定循环取出的每一项的变量名,变量var是存放在scope范围内的<br />
所以需要使用el表达式取出。</p>
<p>&lt;c:forEach&gt;循环标签各项属性说明<br />
varStatus属性:获取循环中var的状态。<br />
&lt;c:forEach items="${userList}" var="user" varStatus="vs"&gt;<br />
vs.count取出当前是循环的第几次,vs.step获取循环的步长.<br />
&lt;c:forEach items="${userList}" var="user" begin="2" end="8" step=2&gt;<br />
循环从集合的第二项开始，循环到第八项，循环步长为2</p>
<p><span style="color: #ff0000">循环取出map</span><br />
example:<br />
&lt;c:forEach items="${map}" var="m"&gt;<br />
${m.key }=${m.value }&lt;br&gt;<br />
&lt;/c:forEach&gt;<br />
${m.key }输出键，${m.value }输出值</p>
<p><span style="color: #ff0000">&lt;c:forTokens&gt;支持分隔符的循环标签</span><br />
example:<br />
&lt;c:forTokens items="${tok}" delims="," var="v"&gt;<br />
&nbsp;${v }&lt;br&gt;<br />
&lt;/c:forTokens&gt;<br />
其他属性与&lt;c:forEach&gt;标签功能相同,需要注意的是delims=","，它指定了以什么做为分隔符进行分割。<br />
request内设置"1,2,3,4,5",此循环的输出效果如下:<br />
1<br />
2<br />
3<br />
4<br />
5</p>
<p><span style="color: #ff0000">&lt;c:import&gt;导入标签</span><br />
example:<br />
&lt;c:import url="http://127.0.0.1/struts_taglib"&gt;&lt;/c:import&gt;<br />
此标签作用相当于jsp:include标签的作用，当前页面包含url里的页面。</p>
<p><span style="color: #ff0000">&lt;c:redirect&gt;重定向标签</span><br />
example:<br />
&lt;c:redirect url="http://127.0.0.1/struts_taglib"&gt;&lt;/c:redirect&gt;<br />
直接重定向至url指定地址</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/zhengshuli-j2ee/aggbug/264311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhengshuli-j2ee/" target="_blank">郑舒力</a> 2009-04-07 18:59 <a href="http://www.blogjava.net/zhengshuli-j2ee/articles/264311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts之el表达式简单学习笔记</title><link>http://www.blogjava.net/zhengshuli-j2ee/articles/264309.html</link><dc:creator>郑舒力</dc:creator><author>郑舒力</author><pubDate>Tue, 07 Apr 2009 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhengshuli-j2ee/articles/264309.html</guid><wfw:comment>http://www.blogjava.net/zhengshuli-j2ee/comments/264309.html</wfw:comment><comments>http://www.blogjava.net/zhengshuli-j2ee/articles/264309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhengshuli-j2ee/comments/commentRss/264309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhengshuli-j2ee/services/trackbacks/264309.html</trackback:ping><description><![CDATA[<p>JSTL简介<br />
SUN的标准Taglib库，JSTL不依赖于任何框架。JSTL由两部分组成标签库以及el表达式。<br />
JSTL标签库有以下几部分组成<br />
核心库<br />
国际化库<br />
格式化库<br />
XML库<br />
数据库<br />
函数标签库</p>
<p>EL表达式<br />
el表达式的使用方法$和{}<br />
examples:<br />
取出普通字符串<br />
${hello} 在request范围内寻找属性名为hello的属性，并打印输出在页面上<br />
作用等同于&lt;bean:write&gt;标签<br />
如果为在表达式中制定scope,它的搜索顺序为pageScope~applicationScope.</p>
<p>取出结构<br />
${user.name }<br />
用.进行导航，也叫存取器。和struts中&lt;bean:write&gt;标签的使用方式非常类似</p>
<p>取出map<br />
${mapValue.key1 }<br />
mapValue为scope中的属性名,key1为map中的Key值。</p>
<p>取出字符串数组<br />
${strArray[1] }<br />
取出数组用[]和下标进行导航</p>
<p>取出对象数组<br />
${users[2].name }<br />
取出数组用[]和下标进行导航</p>
<p>取出List<br />
userList[3]:${userList[3].name }<br />
取出数组用[]和下标进行导航</p>
<p>el对运算符的支持<br />
1+2=${1+2 }<br />
+-*/%类似</p>
<p>el判断是否为空<br />
${empty value}<br />
empty为关键字 value为key</p>
<p>在el表达式中制定scope的使用方法<br />
example:<br />
${requestScope.hello } 在request范围内寻找hello</p>
<img src ="http://www.blogjava.net/zhengshuli-j2ee/aggbug/264309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhengshuli-j2ee/" target="_blank">郑舒力</a> 2009-04-07 18:58 <a href="http://www.blogjava.net/zhengshuli-j2ee/articles/264309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts ModuleConfig类加载初始化的过程以及RequestProcessor类源码分析</title><link>http://www.blogjava.net/zhengshuli-j2ee/articles/264263.html</link><dc:creator>郑舒力</dc:creator><author>郑舒力</author><pubDate>Tue, 07 Apr 2009 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhengshuli-j2ee/articles/264263.html</guid><wfw:comment>http://www.blogjava.net/zhengshuli-j2ee/comments/264263.html</wfw:comment><comments>http://www.blogjava.net/zhengshuli-j2ee/articles/264263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhengshuli-j2ee/comments/commentRss/264263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhengshuli-j2ee/services/trackbacks/264263.html</trackback:ping><description><![CDATA[<p>简要的对struts ActionServlet init()方法以及 struts RequestProcessor类做源码分析</p>
<p>首先要确定的是Servlet至始至终只有一个对象以及init()方法会在Servlet第一次加载时被执行一次也是唯</p>
<p>一的一次，所以Servlet的初始化工作一般在init()方法进行</p>
<p><span style="color: red">一、解析ModuleConfig</span><br />
ModuleConfig封装了struts-config的所有配置信息<br />
actionConfigs(ActionMapping)/actionConfigList 、exceptions 、formBeans(ActionForm)、forwards</p>
<p>(ActionForward)、messageResources、plugIns等<br />
// 初始化ModuleConfig配置工厂 <br />
initModuleConfigFactory(); <br />
// 由配置工厂实例化一个ModuleConfig的对象 <br />
ModuleConfig moduleConfig = initModuleConfig("", config); <br />
initModuleConfig(String prefix, String paths)方法做了一下事情<br />
1、 ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();<br />
由生成的配置工厂生成一个工厂实例<br />
2、ModuleConfig config = factoryObject.createModuleConfig(prefix);<br />
创建ModuleConfig实例createModuleConfig()方法会有DefaultModuleConfigFactory 执行<br />
这是在配置文件中指定的工厂类<br />
方法内部new 出ModuleConfig对象<br />
在ModuleConfig构造方法内对以下参数进行了初始化<br />
&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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">this</span><span style="color: #000000">.prefix&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;prefix;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.actionConfigs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ActionMapping集合</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.actionConfigIds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.actionConfigList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.actionFormBeanClass&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">org.apache.struts.action.ActionFormBean</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.actionMappingClass&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">org.apache.struts.action.ActionMapping</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.actionForwardClass&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">org.apache.struts.action.ActionForward</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.configured&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.controllerConfig&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.exceptions&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.formBeans&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ActionForm集合</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.forwards&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ActionForward集合</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.messageResources&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.plugIns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();</span></div>
<p>&nbsp;</p>
<p>到此config构造完成<br />
Digester digester = initConfigDigester(); <br />
initConfigDigester()方法添加解析struts文件的解析规则</p>
<p>3、循环struts配置文件并把所有标签封装为相应对象填充到config对象相应的map集合中中<br />
List urls = splitAndResolvePaths(paths);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator i = urls.iterator(); i.hasNext();) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = (URL) i.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.push(config);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.parseModuleConfigFile(digester, url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
最后getServletContext().setAttribute(Globals.MODULE_KEY<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + config.getPrefix(), config);<br />
把ModuleConfig设入ServletContext中<br />
至此config初始化工作全部完成</p>
<p>struts每个模块都对应一个ModuleConfig对象个，在init方法内被初始化，内部封装了模块xml文</p>
<p>件中的配置</p>
<p><br />
<span style="color: red">二、struts核心类RequestProcessor类解析</span><br />
ActionServlet做为前端控制器当有请求被接收时，会调用process(request, response)方法<br />
1、ModuleConfig config = getModuleConfig(request);<br />
通过Servlet上下文找到ModuleConfig对象<br />
2、RequestProcessor processor = getProcessorForModule(config);<br />
通过Servlet上下文找到RequestProcessor对象&nbsp;&nbsp;--所以RequestProcessor类也是单例的<br />
if (processor == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processor = getRequestProcessor(config);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
如果为空 也就说明是服务器端第一次接收客户端的接收请求<br />
那么执行getRequestProcessor(config)方法生成RequestProcessor并设入ServletContext里<br />
此方法为同步方法，借此我猜测此方法为生成RequestProcessor的唯一方法<br />
方法内部对RequestProcessor调用了init()方法，进行了RequestProcessor的初始化并设入ServletContext</p>
<p>里。<br />
为什么RequestProcessor要做成单例，原因就是RequestProcessor类内部有<br />
HashMap actions = new HashMap();<br />
这样一个集合封装了所有的控制器。<br />
这样的设计是面向对象的。当ActionServlet接收到请求时它需要对请求分发到相应控制器中<br />
此时它获取中央控制器，而这个中央控制器内部拥有所有控制器的引用。<br />
/*<br />
这里我的疑惑是为什么要通过反射生成RequestProcessor，此类并没有继承实现任何接口或类。<br />
process方法最后调用了RequestProcessor的process()方法。此方法为RequestProcessor的核心方法<br />
*/原因经过学习发现RequestProcessor并不是单例的，而实际因为struts的多模块应用模式，导致</p>
<p>RequestProcessor类是多例的</p>
<p>三、解析RequestProcessor类核心方法process<br />
1、 String path = processPath(request, response);<br />
截取客户端请求字符串相当于&lt;action&gt;标签的path属性<br />
2、ActionMapping mapping = processMapping(request, response, path);<br />
获取控制器相对的ActionMapping 对象<br />
&nbsp;processMapping(request, response, path)<br />
&nbsp;1、ActionMapping mapping =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ActionMapping) moduleConfig.findActionConfig(path);<br />
&nbsp;方法内部调用了moduleConfig.findActionConfig(path);<br />
&nbsp;ModuleConfig对象前面已做过解析，在findActionConfig方法内部已path属性做为Key值，直接&nbsp;</p>
<p>&nbsp;到ActionConfigHashMap集合内寻找ActionMapping，原因见一.3<br />
&nbsp;2.if (mapping != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute(Globals.MAPPING_KEY, mapping);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (mapping);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;如果找到mapping那么放入request中，并返回<br />
&nbsp;3、 ActionConfig[] configs = moduleConfig.findActionConfigs();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; configs.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (configs[i].getUnknown()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapping = (ActionMapping) configs[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute(Globals.MAPPING_KEY, mapping);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (mapping);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;//ActionMapping说明，和Action的unknow属性有关<br />
3、if (mapping == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
容错处理，说明客户端请求的path路径并没有被配置<br />
4、ActionForm form = processActionForm(request, response, mapping);<br />
&nbsp;processActionForm(request, response, mapping);<br />
&nbsp;1、ActionForm instance =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestUtils.createActionForm(request, mapping, moduleConfig,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlet);<br />
&nbsp;&nbsp;1、String name = mapping.getName();<br />
&nbsp;&nbsp;获得mapping name属性也就是映射的相对ActionForm的name<br />
&nbsp;&nbsp;2、FormBeanConfig config = moduleConfig.findFormBeanConfig(name);<br />
&nbsp;&nbsp;已name做为Key值在缓存的HashMap内获取相对(FormBeanConfig)对象<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;!--对这里的一些继承关系做下说明<br />
&nbsp;&nbsp;struts Config类的基类 BaseConfig<br />
&nbsp;&nbsp;ForwardConfig从BaseConfig继承<br />
&nbsp;&nbsp;FormBeanConfig从BaseConfig继承<br />
&nbsp;&nbsp;ActionConfig从BaseConfig继承<br />
&nbsp;&nbsp;ActionMapping从ActionConfig继承<br />
&nbsp;&nbsp;--&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;3、if (config == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;log.warn("No FormBeanConfig found under '" + name + "'");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return (null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;如果为空也就说明并没有配置相对ActionForm，而这是合法的所以返回空<br />
&nbsp;&nbsp;4、ActionForm instance =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;lookupActionForm(request, attribute, mapping.getScope());<br />
&nbsp;&nbsp;此方法试图在request,session内寻找ActionForm<br />
&nbsp;&nbsp;5、if ((instance != null) &amp;&amp; config.canReuse(instance)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return (instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;如果找到那么返回<br />
&nbsp;&nbsp;6、return createActionForm(config, servlet);<br />
&nbsp;&nbsp;如果没有找到则进行创建,方法传递了config，因为config内封装了formbean标签的所&nbsp;</p>
<p>&nbsp;有配置信息。方法可以根据类名进行反射生成对象。<br />
&nbsp;2、if ("request".equals(mapping.getScope())) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute(mapping.getAttribute(), instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute(mapping.getAttribute(), instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;根据配置信息，把ActionForm设入相应作用域内<br />
此方法作用就是获取ActionForm<br />
5、processPopulate(request, response, form, mapping);<br />
此方法用于做ActionForm的数据收集工作<br />
&nbsp;1、form.reset(mapping, request);<br />
&nbsp;此方法用于做数据重置，程序员可以重写此方法<br />
&nbsp;2、RequestUtils.populate(form, mapping.getPrefix(), mapping.getSuffix(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request);<br />
&nbsp;调用工具类进行数据收集<br />
&nbsp;&nbsp;1、if ((contentType != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&amp;&amp; (contentType.startsWith("multipart/form-data"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&amp;&amp; (method.equalsIgnoreCase("POST"))) {&nbsp;<br />
&nbsp;&nbsp;判断是否是数据上传<br />
&nbsp;&nbsp;2、if (!isMultipart) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;names = request.getParameterNames();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;如果不是获取request里所有参数参数名。<br />
&nbsp;&nbsp;3、 while (names.hasMoreElements()) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String name = (String) names.nextElement();&nbsp;//循环获取参数名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String stripped = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Object parameterValue = null;<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if (isMultipart) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameterValue = multipartParameters.get(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameterValue = rationalizeMultipleFileProperty(bean, name, &nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;parameterValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;} else {&nbsp;&nbsp;//不是上传 则获取此参数名的所有参数值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameterValue = request.getParameterValues(name);<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;if (!(stripped.startsWith("org.apache.struts."))) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties.put(stripped, parameterValue);&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;方法最后把参数名做为Key,所对应的所有参数值做为键值放入hashmap内<br />
&nbsp;&nbsp;5、BeanUtils.populate(bean, properties);<br />
&nbsp;&nbsp;由第三方工具类根据ActionForm以及所有参数名参数值进行数据收集<br />
&nbsp;3、if (!processValidate(request, response, form, mapping)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;进行数据验证，方法内部会调用ActionForm的validate方法，程序员可以重写此方法<br />
&nbsp;<br />
6、Action action = processActionCreate(request, response, mapping);<br />
获取控制器<br />
&nbsp;1、方法首先获取Action的类名<br />
&nbsp;2、然后此方法对actions进行了同步处理，原因RequestProcessor是多例的，actions是一个成&nbsp;</p>
<p>员变量，缓存了所有action。<br />
&nbsp;3、instance = (Action) actions.get(className);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (instance != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (log.isTraceEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.trace("&nbsp; Returning existing Action instance");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;试图在集合内取出action,如果不为空 则返回。此时说明此Action已被执行过。<br />
&nbsp;4、instance = (Action) RequestUtils.applicationInstance(className);<br />
&nbsp;如果没有反射创建Action引用。<br />
&nbsp;5、actions.put(className, instance);<br />
&nbsp;最后把action放入集合，并返回。<br />
7、ActionForward forward =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processActionPerform(request, response, action, form, mapping);<br />
此方法内部调用Action的execte方法，获取转向类。</p>
<p>&nbsp;&lt;!--说明类组织关系<br />
&nbsp;在他的父类里有 HashMap forwards = new HashMap();这样一个集合<br />
&nbsp;这里的类组织关系是这样的，ActionMapping从ActionConfig继承，<br />
&nbsp;ActionConfig拥有forwards 集合，<br />
&nbsp;而ModuleConfig内部拥有ActionConfig集合,<br />
&nbsp;这和struts-config标签的组织关系是完全类似的.<br />
&nbsp;ModuleConfig模块配置类对应一个struts配置文件，<br />
&nbsp;ActionConfig控制器配置类对应一个Action标签，<br />
&nbsp;ForwardConfig转向配置类对应Forward标签，<br />
&nbsp;而ModuleConfig在ActionServlet初始化时被加载。<br />
&nbsp;这里可以看出大师对类的组织的合理，每个标签都有相应的类。<br />
&nbsp;--&gt;</p>
<p>综上所述，由于forward标签属于ActionMapping标签所以在程序里，能用findForward()方法找到</p>
<p>ActionForward.<br />
而在ActionConfig内部有这样一个方法addForwardConfig(ForwardConfig config)；它已ForwardConfig 的</p>
<p>name属性做为Key,ForwardConfig 类实例做为值添加入缓存中。<br />
这也就是为什么我们可以在findForward()方法内通过传name属性获取相应的ActionForward实例。</p>
<p>8、processForwardConfig(request, response, forward);<br />
在process方法的最后调用了processForwardConfig()方法。完成转向操作。<br />
在这个方法内部，他根据Redirect()是否设置为true选择是进行转发还是重定向。如果没有设置，默认是进</p>
<p>行转发。<br />
<br />
说明：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此篇学习笔记算是阅读尚学堂王勇老师struts视频的读后感吧，当时小弟刚学习struts，也算是个j2ee的新人就斗胆写了这篇源码的分析，今天发上来并未做任何删减，错误是难免的，还希望各位大虾阅读时，多多指正，不吝赐教！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后感谢由衷的感谢王勇老师，感谢尚学堂！！</p>
<img src ="http://www.blogjava.net/zhengshuli-j2ee/aggbug/264263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhengshuli-j2ee/" target="_blank">郑舒力</a> 2009-04-07 15:33 <a href="http://www.blogjava.net/zhengshuli-j2ee/articles/264263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts Taglib简单标签介绍</title><link>http://www.blogjava.net/zhengshuli-j2ee/articles/257867.html</link><dc:creator>郑舒力</dc:creator><author>郑舒力</author><pubDate>Wed, 04 Mar 2009 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhengshuli-j2ee/articles/257867.html</guid><wfw:comment>http://www.blogjava.net/zhengshuli-j2ee/comments/257867.html</wfw:comment><comments>http://www.blogjava.net/zhengshuli-j2ee/articles/257867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhengshuli-j2ee/comments/commentRss/257867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhengshuli-j2ee/services/trackbacks/257867.html</trackback:ping><description><![CDATA[<p>struts Taglib属于视图端的技术<br />
使用标签有如下优点<br />
一、易于使用，能直接代替在页面上写java脚本<br />
二、便于重用<br />
<span style="color: #ff0000">struts 标签的配置<br />
</span>1、在struts-config配置文件中加入标签 &lt;message-resources parameter="MessageResources" /&gt;<br />
2、引入taglib标签库<br />
&nbsp;&nbsp; 加入&lt;%@ taglib prefix="bean" uri="在struts-taglib.jar包下的META-INF文件夹的tld文件夹下找&nbsp;&nbsp; 到相应标签库的tld文件打开，把uri标签中的值复制到此处" %&gt;</p>
<p>&lt;bean:write&gt;标签<br />
相当于jsp标签 &lt;%= %&gt; jsp内置对象out.println()方法 做输出使用<br />
在相应scope内设置值,用&lt;bean:write&gt;标签取出。<br />
examples:<br />
取出普通字符串<br />
&lt;bean:write name="hello"/&gt;&nbsp;<br />
name属性也就是在上一页面setAttribute()的key。</p>
<p>以HTML文本形式做输出<br />
&lt;bean:write name="hello" filter="false"/&gt;&nbsp;<br />
filter="false"文本按HTML形式取出</p>
<p>格式化日期形式输出<br />
&lt;bean:write name="date" format="yyyy-mm-dd HH:mm:ss"/&gt; <br />
format属性内设置日期显示的格式</p>
<p>格式化数字<br />
&lt;bean:write name="num" format="###,###.0000"/&gt;&nbsp;<br />
format属性内设置数字显示的格式&nbsp;&nbsp;&nbsp;数字显示格式API在java.text.DecimalFormat中</p>
<p>对象结构输出<br />
对象普通属性输出<br />
&lt;bean:write name="user" property="name"/&gt;<br />
property="name",引号内设置属性名，需要符合javaBean规范<br />
对象结构属性输出<br />
&lt;bean:write name="user" property="group.name"/&gt;<br />
property="group.name"，使用.进行导航找到结构相应属性.</p>
<p>&lt;logic:empty&gt;&lt;logic:notEmpty&gt;&lt;logic:present&gt;&lt;logic:notPresent&gt;标签<br />
这些标签主要用于进行属性状态的判断<br />
examples:<br />
</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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">logic:empty&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="att1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;att1为空</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">logic:empty</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">logic:notEmpty&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="att1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;att1不为空</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">logic:notEmpty</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">logic:present&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="att1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;att1存在</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">logic:present</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">logic:notPresent&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="att1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;att1不存在</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">logic:notPresent</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
null值判断为不存在<br />
不存在同样判断为为空<br />
空字符串判断为空，空集合判断为空</p>
<p>&lt;logic:terate&gt;迭代标签<br />
&lt;logic:iterate id="u" name="userList"&gt;<br />
&lt;/logic:iterate&gt;<br />
对集合进行迭代，循环取出值放在变量u内<br />
examples:<br />
</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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">logic:iterate&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="u"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="userList"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">bean:write&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="u"</span><span style="color: #ff0000">&nbsp;property</span><span style="color: #0000ff">="name"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">bean:write</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">bean:write&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="u"</span><span style="color: #ff0000">&nbsp;property</span><span style="color: #0000ff">="age"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">bean:write</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">bean:write&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="u"</span><span style="color: #ff0000">&nbsp;property</span><span style="color: #0000ff">="group.name"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">bean:write</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">logic:iterate</span><span style="color: #0000ff">&gt;</span></div>
<img src ="http://www.blogjava.net/zhengshuli-j2ee/aggbug/257867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhengshuli-j2ee/" target="_blank">郑舒力</a> 2009-03-04 19:51 <a href="http://www.blogjava.net/zhengshuli-j2ee/articles/257867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>