﻿<?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/Spring</title><link>http://www.blogjava.net/zhaozhenlin1224/category/43793.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 05 Mar 2011 19:05:29 GMT</lastBuildDate><pubDate>Sat, 05 Mar 2011 19:05:29 GMT</pubDate><ttl>60</ttl><item><title>jstl  笔记</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/04/345751.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Fri, 04 Mar 2011 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/04/345751.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/345751.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/04/345751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/345751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/345751.html</trackback:ping><description><![CDATA[el是jsp2.0默认的。常见用法${userName} ${user.user} ${sessionScope.user.userName]<br />
范围有pageScope\requestScope\sessionScope<br />
&lt;c:out value="${user.userName}" default="jason" escapexml="false"/&gt;<br />
&lt;c:if test="${not empty user}" <span class="docEmphasis">[var] [scope]</span>&gt;用户存在&lt;/c:if&gt;<br />
&nbsp; <br />
&nbsp;&lt;c:choose&gt; <br />
&nbsp;&lt;c:when test='<span class="docEmphasis">boolean expression</span>'&gt;
&lt;/c:when&gt; <br />
&nbsp;&lt;c:otherwise&gt;<br />
&nbsp;&lt;/c:otherwise&gt;<br />
&nbsp;&lt;/c:choose&gt;
<br />
<br />
&lt;c:forEach var='item' begin='5' end='10' step='2'&gt;
&lt;c:out value='${item}'/&gt;
&lt;/c:forEach&gt;
<span class="docEmphStrong">&lt;c:forEach items='${primitiveValues}' var='item'&gt;</span>
<span class="docEmphStrong">&lt;c:out value='${item}'/&gt;</span>
<span class="docEmphStrong">&lt;/c:forEach&gt;</span>
<br />
<br />
<span class="docEmphStrong">&lt;c:forEach varStatus='status'</span>
<span class="docEmphStrong">begin='${param.begin}'</span>
<span class="docEmphStrong">end='${param.end}'</span>
<span class="docEmphStrong">step='${param.step}'&gt;</span><br />
&nbsp;&lt;c:out value='${status.current}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.index}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.count}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.first}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.last}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.begin}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.end}'/&gt;&lt;/td&gt;
&lt;td&gt;&lt;c:out value='${status.step}'/&gt;&lt;/td&gt;
&lt;/tr&gt;
<span class="docEmphStrong"><br />
&lt;/c:forEach&gt;</span>
<br />
<br />
&lt;c:forTokens items='ONE | TWO | THREE | FOUR'
delims='|' var='item'&gt;
&lt;c:out value='${item}'/&gt;
&lt;/c:forTokens&gt;
<br />
<br />
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/345751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-03-04 23:22 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/04/345751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2笔记</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/03/345659.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Thu, 03 Mar 2011 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/03/345659.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/345659.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/03/345659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/345659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/345659.html</trackback:ping><description><![CDATA[在jsp里，从session里取数据:#session.userName或者#session['userName'],从parameter里取数据#parameters.userName[0]或者#parameters.userName[0]，从parameter里取数据一定要加[0]，因为不确定parameters里有几个userName<br />
<br />
jsp里调用action里的方法，如果方法没有参数，struts就当做获取action的属性，就可以省略get.<br />
&lt;s:if test="ifHasPermission"&gt;&lt;/s:if&gt; action里的方法:public boolean getIfHasPermission(){return false}在这里 struts认为是获取action里的属性。<br />
如果调用action的方法（带参数），代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:set var="thisResource" value="createTask" scope="request"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:if test="ifHasPermission(#request.thisResource)"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;a href="taskAction!inputTask.action"&gt;增加新任务&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/s:if&gt;<br />
public boolean iffHasPermission(String resourceName) {}<br />
注意，这里需要先把字符串中的值设置到request里。没有办法，这里应该是struts的bug吧。<br />
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/345659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-03-03 21:08 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/03/03/345659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2文件上传功能的怪事</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/26/345253.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sat, 26 Feb 2011 13:05:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/26/345253.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/345253.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/26/345253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/345253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/345253.html</trackback:ping><description><![CDATA[我用的事common-fileupload.jar，文件上传呢的时候，页面form里用&lt;s:file name="upload" label="只能上传小于3兆的压缩文件"/&gt;则没有问题。如果用html标签，那么文件类型不匹配的错误信息页面上就显示不出来。<br />
好怪啊，即使用s:file标签生成的html代码，也不行。<br />
谁能告诉我为什么？<br />
<br />
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/345253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-02-26 21:05 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/26/345253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring3.0.5 jquery乱码解决了</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/28/343723.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Fri, 28 Jan 2011 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/28/343723.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/343723.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/28/343723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/343723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/343723.html</trackback:ping><description><![CDATA[项目的所有文件的编码格式都是utf-8，在web.xml里设置了spring的encoding filter。<br />
jquery默认utf8<br />
在application-context.xml的配置如下：<br />
&nbsp;&nbsp;&nbsp; &lt;mvc:annotation-driven/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="messageConverters"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean&nbsp; class="org.springframework.http.converter.StringHttpMessageConverter"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="supportedMediaTypes"&gt;&nbsp; <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; &lt;list&gt;&nbsp; <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;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;text/html;charset=UTF-8&lt;/value&gt;&nbsp; <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; &lt;/list&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;&nbsp; <br />
<br />
注意messageAdapter一定放在 &lt;mvc:annotation-driven/&gt;后面，否则bindingresult就会失效<br />
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/343723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-01-28 18:37 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/28/343723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring json解决乱码</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/26/343594.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Wed, 26 Jan 2011 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/26/343594.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/343594.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/26/343594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/343594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/343594.html</trackback:ping><description><![CDATA[<ol class="dp-j" start="1">
    <li><span><span class="annotation">@RequestMapping</span><span>(params&nbsp;=&nbsp;</span><span class="string">"method=login"</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">public</span><span>&nbsp;ResponseEntity&lt;String&gt;&nbsp;doFirst(</span><span class="annotation">@RequestParam</span><span>(</span><span class="string">"u"</span><span>)&nbsp;String&nbsp;u,</span><span class="annotation">@RequestParam</span><span>(</span><span class="string">"p"</span><span>)&nbsp;String&nbsp;p,HttpSession&nbsp;session,ModelMap&nbsp;model){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;HttpHeaders&nbsp;headers&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HttpHeaders();&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;MediaType&nbsp;mt=<span class="keyword">new</span><span>&nbsp;MediaType(</span><span class="string">"text"</span><span>,</span><span class="string">"html"</span><span>,Charset.forName(</span><span class="string">"gbk"</span><span>));&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;headers.setContentType(mt);&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;ResponseEntity&lt;String&gt;&nbsp;re=<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;<span class="keyword">return</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(</span><span class="string">"test"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;re=<span class="keyword">new</span><span>&nbsp;ResponseEntity&lt;String&gt;(</span><span class="keyword">return</span><span>,headers,&nbsp;HttpStatus.OK);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;re;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
    </span></li>
</ol>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/343594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-01-26 19:09 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/26/343594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springmvc validator</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/15/343019.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sat, 15 Jan 2011 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/15/343019.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/343019.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/15/343019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/343019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/343019.html</trackback:ping><description><![CDATA[<h3><a href="http://hahalzb.javaeye.com/blog/269930">关于Spring中Commons Validator的使用说明</a></h3>
spring的validate验证需要两个bean（ValidatorFactory、BeanValidator）及两xml文件
（validator-rules.xml、validation.xml）的支持，ValidatorFactory用于制造
BeanValidator，后者则是在程序中执行校验的控制bean。Validatorrules.xml中定义了各种验证的规则，如字段不为空，字
段输入值必须为整数等等。Validation.xml中则定义了那些bean及bean中的哪些属性字段需要验证，使用哪些验证规则。validate
分为两级验证，客户端验证（javascript）和服务器端验证。以下是使用validate的步骤：
<br />
<br />
1. 在配置文件中声明ValidatorFactory 和 BeanValidator：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">&lt;bean&nbsp; id="validatorFactory" class="org.springmodules.commons.validator.DefaultValidatorFactory"&gt; -----①
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="validationConfigLocations"&gt; -----②
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;/WEB-INF/validator-rules.xml&lt;/value&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;/WEB-INF/validation.xml&lt;/value&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="beanValidator"
<br />
<br />
class="org.springmodules.commons.validator.DefaultBeanValidator"&gt; -------③
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="validatorFactory"&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="validatorFactory" /&gt;&nbsp; --------④
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;
<br />
<br />
&lt;/bean&gt;
<br />
<br />
<br />
①&nbsp;&nbsp;&nbsp;&nbsp; 声明validatoFactory 这里我们使用spring 的DefaultValidatorFactory
<br />
<br />
②&nbsp;&nbsp;&nbsp;&nbsp; 定义其validationConfigLocations 属性，将validator-rules.xml和validation.xml传入
<br />
<br />
③&nbsp;&nbsp;&nbsp;&nbsp; 声明beanValidator 这里我们使用spring的DefaultBeanValidator
<br />
<br />
④&nbsp;&nbsp;&nbsp;&nbsp; 在其属性中指明要使用的validatorFactory 。这里我们使用刚刚定义的validatorFactory</div>
<br />
2.在需要进行验证的controller（即要使用form表单或者command的controller）中声明validate。
<br />
<div class="quote_title">引用</div>
<div class="quote_div">&lt;bean id="xxxxController" &#8230;&#8230;&gt;
<br />
<br />
&lt;property name="commandName" value="userCommand"/&gt;&nbsp; -----①
<br />
<br />
&lt;property name="commandClass" value="com.resoft.User"/&gt;&nbsp;&nbsp; -----②
<br />
<br />
&lt;property name="validator" ref="beanValidator"/&gt;&nbsp;&nbsp; -------③
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;
<br />
<br />
&lt;/bean&gt;
<br />
<br />
<br />
①commandName 用于指明需要验证的 command的名字，这个名字必须和 validation.xml中&lt;form name=" xxxxx "&gt; 所写的名字保持一致。
<br />
<br />
②&nbsp;&nbsp;&nbsp;&nbsp; commandClass用于指定这个command的类型。其必须与你jsp提交的form最后形成的command类型相一致。
<br />
<br />
③&nbsp;&nbsp;&nbsp;&nbsp; 声明该controller使用validator，这里将我们刚刚定义的beanValidator传入进去。</div>
<br />
3.在validation.xml文件中，定义你要校验的formbean（或者说是command）
，定义这个bean中有哪几个field需要验证，使用何种规则验证。（注意：这里定义的form name
必须和前面controller中定义的commandName保持一致）以下是几种常用的验证示例：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">&lt;form-validation&gt;
<br />
<br />
&lt;formset&gt;
<br />
<br />
&lt;form name=" userCommand "&gt; -----①
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="userId" depends="required"&gt; -----②&nbsp;&nbsp;&nbsp;&nbsp;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 key="用户代码" /&gt; -------③&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;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;&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;&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 />
<br />
①&nbsp;&nbsp;&nbsp; 这里是定义要验证的bean的名字，要求去上面定义的 commandName 相同
<br />
<br />
②&nbsp;&nbsp;&nbsp; 这里定义要验证的bean属性为 userId ，使用规则为 required(不为空)
<br />
<br />
③&nbsp;&nbsp;&nbsp; 这里定义的是显示信息，arg0 表示位置 0 的显示信息，显示key 所标明的信息 （如果你还有多个信息就用 arg1，arg2 等）出错信息将会显示为：&nbsp; 用户代码 不能为空
<br />
<br />
&lt;field property="age" depends="required,integer,mask"&gt; -----①
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 key="年龄" /&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;msg name="mask" key="errors.negative"/&gt; -----②
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;mask&lt;/var-name&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;^[1-9]&lt;/var-value&gt; -------③
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;
<br />
<br />
<br />
①&nbsp;&nbsp; mask 标记验证，使用正则表达式来约束表单输入值。（如：只能输入数字，字母或指定的字符）
<br />
<br />
②&nbsp;&nbsp; msg 标签用来定义 验证规则和出错信息的关联，这里表示当出现 mask 校验失败时，显示 errors.negative指明的信息。
<br />
<br />
③&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
整个&lt;var&gt;标签就是用来定义具体的规则的，如&lt;var-name&gt;mask&lt;/var-name&gt;指明是用于
mask的规则，&lt;var-value&gt;^[1-9]&lt;/var-value&gt; 表示只允许1-9这几个数字开头。
<br />
<br />
所以上面验证信息是年龄字段不可以为空，必须为整数，而且必须为1-9开头 也就杜绝了负数和零的情况。
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="birthday" depends="required,date"&gt; -----①
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 key="生日" /&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;datePatternStrict&lt;/var-name&gt; -----②
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;yyyy-MM-dd&lt;/var-value&gt;&nbsp; -----③
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/formset&gt;
<br />
<br />
①&nbsp;&nbsp; 使用&#8220;date&#8221;加入对日期的格式的校验
<br />
<br />
②&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开始定义日期格式，var-name 必须写为 datePatternStrict
<br />
<br />
③&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义你希望的日期格式如：yyyy-mm-dd&nbsp; yy/mm/dd 等等都可以。
<br />
<br />
&lt;field property="startDate" depends="required,date"&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 key="开始日期" /&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;datePatternStrict&lt;/var-name&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;yyyy-MM-dd&lt;/var-value&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="endDate" depends="required,date,compareTwoField"&gt; -----①
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 key="结束日期" /&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg1 key="开始日期" /&gt;&nbsp; -----②
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;datePatternStrict&lt;/var-name&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;yyyy-MM-dd&lt;/var-value&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;secondField&lt;/var-name&gt;&nbsp; -------③
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;startDate&lt;/var-value&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;
<br />
<br />
<br />
①&nbsp; 这里演示的是两个日期的验证，要达到开始日期不能晚于结束日期，加入compareTwoField 验证规则
<br />
<br />
②&nbsp; 定义第2个显示参数agr1 &#8220;开始日期&#8221;
<br />
<br />
③&nbsp; 加入一个var 其var-name 为secondField（这个是在程序中写死的，必须写为secondField）
<br />
<br />
④ var-value 定义为开始日期的属性名，如在本例中为 startDate
<br />
<br />
注：compareTwoField 是我们自己编写的一个校验规则，用于比较两个字段值大小。</div>
<br />
<br />
4.在jsp页面中定义错误信息显示语句：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">&lt;spring:bind path="tableCrashDO.*"&gt;&nbsp;&nbsp; -----①
<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;c:if test="${not empty status.errorMessages}"&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;div class="error"&gt;&nbsp;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:forEach var="error" items="${status.errorMessages}"&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:out value="${error}" escapeXml="false"/&gt;&lt;br /&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:forEach&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;/div&gt;
<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;/c:if&gt;
<br />
<br />
&lt;/spring:bind&gt;
<br />
<br />
<br />
① 这里的path 必须要与传入该 jsp 的bean的名字一样。如传入该jsp的数据bean 叫tableCrashDO，path就应该写为tableCrashDO.*。</div>
<br />
<br />
5． 使客户端产生javascript代码：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">
<br />
&lt;v:javascript formName="tableCrashDO"&nbsp;&nbsp;&nbsp; -----①
<br />
<br />
staticJavascript="false" xhtml="true" cdata="false"/&gt;
<br />
<br />
&lt;script type="text/javascript" src="&lt;c:url value="scripts/validator.jsp"/&gt;"&gt;&lt;/script&gt;
<br />
<br />
① v:javascript 标签是spring的标签，定义在spring-commons-validator.tld 。其中formName必须与validation.xml中form的name保持一致。</div>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/343019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-01-15 15:20 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/15/343019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 ONGL表达式</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/03/342180.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sun, 02 Jan 2011 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/03/342180.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/342180.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/03/342180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/342180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/342180.html</trackback:ping><description><![CDATA[OGNL表达相当于JSP+Servlet模式中JSTL的地位,但是它的功能要比JSTL强大,在学习OGNL表达式时,你需要忘掉JSTL.
<p><font size="3">OGNL能够访问系统中OgnlContext中的对象, OgnlContext对象是OGNL表达式的下上文对象,即所有通过OGNL表达式取出的数据都是从上下文对象取出来的, OGNL的上下文环境是一个Map结构，称之为OgnlContext。</font></p>
<p><font size="3">OgnlContext中包括以下几个内置对象<br />
ValueStack: <br />
存放在OgnlContext的第一位,是根对象,访问这里面的内容有点特殊,不用指定范围, Struts2框架总是把Action实例放在栈顶。因为Action在值栈中，而值栈又是OGNL中的根，所以引用Action的属性可以省略&#8220;#&#8221;标记，这也是为什么我们在结果页面中可以直接访问Action的属性的原因。<br />
request:<br />
模拟了HttpServletRequest对象,取这里面的值就相当于调用了request.getAttribute(&#8220;key&#8221;),访问这里面的属性形式: #request['user']或#request.user<br />
session:<br />
模拟了HttpServletSession对象,取这里面的值就相当于调用了session.getAttribute(&#8220;key&#8221;),<br />
访问这里面的属性形式: #session['user']或#session.user<br />
application:<br />
模拟了HttpServletApplication对象,取这里面的值就相当于调用了servletContext.getAttribute(&#8220;key&#8221;),访问这里面的属性形式: #application['user']或#application.user<br />
attr:<br />
如果PageContext可用，则访问PageContext，否则依次搜索request、session和application对象。访问形式: #attr['user']或#attr.user<br />
parameters:<br />
&nbsp;&nbsp; 用于访问请求参数,相当于调用了HttpServletRequest对象的getParameter()方法。也相当于JSTL中的 ${ param.id },访问形式: ：#parameters['id']或#parameters.id</font></p>
<p><font size="3">记住一点,不要和EL表达式混用,如果你用了EL表达式,就全用EL表达式,如果用了OGNL,就全用OGNL.</font></p>
<p><font size="3">按道理来说,EL表达式只能访问request/session/page/application中的数据,但是我们现在又说了,Action中的属性值都是放在ValueStack中的,那为什么我们在先前的示例中,EL表达式能够访问ValueStack中的数据呢? <br />
原因是:Struts2对request对象进行装饰,所用的类是org.apache.struts2.dispatcher.StrutsRequestWrapper <br />
查看该类源码，发现它重写了getAttribute()方法：<br />
通过查看源代码我们找到了原因:<br />
会先前reuqest中查找属性值:<br />
ActionContext ctx = ActionContext.getContext();<br />
Object attribute = super.getAttribute(s);<br />
如果没有找到,再从 ValueStack中查找<br />
if (attribute == null) {<br />
&#8230;.<br />
attribute = stack.findValue(s); //从ValueStack查找<br />
&#8230;.<br />
}<br />
这里就说明了为什么Struts2中EL表达式能够取出Action中的值了,但是一定要记住Action中的值是存储在ValueStack中的</font></p>
<p><font size="3">首先我们来看看怎么用OGNL表达式取值<br />
取ValueStack中的值<br />
Action中:<br />
public String method1(){<br />
setMessage("取ValueStack中的值");<br />
return "method1";<br />
}</font></p>
<p><font size="3">JSP页面:<br />
&lt;s:property value="message"/&gt;</font></p>
<p><font size="3">XML配置:<br />
&lt;action name="method1" class="chapter10.action.Chapter10Action" method="method1"&gt;<br />
&lt;result name="method1"&gt;/WEB-INF/JspPage/chapter10/success.jsp&lt;/result&gt;<br />
&lt;/action&gt; </font></p>
<p><font size="3">取request其它对象中的值<br />
Action:<br />
public String method1(){<br />
request.setAttribute("message", "request中的值");<br />
session.put("message", "session中的值");<br />
request.getSession().getServletContext().setAttribute("message", "ServletContext中的值");<br />
&nbsp;&nbsp; return "method1";<br />
}</font></p>
<p><font size="3">JSP页面:<br />
&lt;s:property value="#request.message"/&gt; | &lt;s:property value="#request['message']"/&gt;&lt;br /&gt;<br />
&lt;s:property value="#session.message"/&gt; | &lt;s:property value="#session['message']"/&gt;&lt;br /&gt;<br />
&lt;s:property value="#application.message"/&gt; | &lt;s:property value="#application['message']"/&gt;&lt;br /&gt;<br />
&lt;s:property value="#attr.message"/&gt; <br />
可以看到attr对象是用来取值用的,它取出的值是顺着pagerequestsessionapplication</font></p>
<p><font size="3">取parameters中的值<br />
Action<br />
public String method1() {<br />
setMessage("parameters");<br />
return "method1";<br />
}</font></p>
<p><font size="3">XML:<br />
&lt;action name="method1" class="chapter10.action.Chapter10Action" method="method1"&gt;<br />
&lt;result name="method1" type="redirect"&gt;/success.jsp?message=${message}&lt;/result&gt;<br />
&lt;/action&gt;</font></p>
<p><font size="3">JSP:<br />
&lt;s:property value="#parameters.message"/&gt; | &lt;s:property value="#parameters['message']"/&gt;&lt;br /&gt; <br />
注意type="redirect"时,JSP页面不能放在web-inf下</font></p>
<p><font size="3">访问Action的中的方法<br />
在Action中增加一个方法<br />
public String test() {<br />
return "Action Method";<br />
} </font></p>
<p><font size="3">JSP页面:<br />
&lt;s:property value="test()" /&gt;&lt;br /&gt; </font></p>
<p><font size="3">XML:<br />
&lt;action name="method1" class="chapter10.action.Chapter10Action" method="method1"&gt;<br />
&lt;result name="method1"&gt;/WEB-INF/JspPage/chapter10/success.jsp&lt;/result&gt;<br />
&lt;/action&gt; </font></p>
<p><font size="3">访问Action中属性的方法<br />
增加一个User Model<br />
public class User {<br />
private String userName;</font></p>
<p><font size="3">public User() {<br />
&nbsp;&nbsp; super();<br />
}</font></p>
<p><font size="3">public User(String userName) {<br />
&nbsp;&nbsp; super();<br />
&nbsp;&nbsp; this.userName = userName;<br />
}<br />
<br />
@Override<br />
public String toString() {<br />
&nbsp;&nbsp; return "姓名:" + getUserName();<br />
}</font></p>
<p><font size="3">public String getUserName() {<br />
&nbsp;&nbsp; return userName;<br />
}</font></p>
<p><font size="3">public void setUserName(String userName) {<br />
&nbsp;&nbsp; this.userName = userName;<br />
}<br />
} <br />
修改Action,增加一个构造:<br />
public Chapter10Action() {<br />
user = new User("wdpc");<br />
}<br />
public String method1() {&nbsp;&nbsp;<br />
return "method1";<br />
} <br />
XML<br />
&lt;action name="method1" class="chapter10.action.Chapter10Action" method="method1"&gt;<br />
&lt;result name="method1"&gt;/WEB-INF/JspPage/chapter10/success.jsp&lt;/result&gt;<br />
&lt;/action&gt; <br />
JSP<br />
&lt;s:property value="user.toString()" /&gt;&lt;br /&gt; </font></p>
<p><font size="3">访问属性的内置方法<br />
Action:<br />
public String method1() { <br />
setMessage("调用字符串的length方法");<br />
return "method1";<br />
}<br />
JSP:<br />
&lt;s:property value="message" /&gt;的长度是:&lt;s:property value="message.length()" /&gt; </font></p>
<p><font size="3">OGNL表达式访问静态属性和方法<br />
首先加入一个开关<br />
&lt;constant name="struts.ognl.allowStaticMethodAccess" value="true" /&gt; <br />
修改Model,添加一个静态方法,一个静态常量<br />
public static final String CLASSNAME= "wdpc0801";</font></p>
<p><font size="3">public static String staticMethod() {<br />
return "Static Method";<br />
} <br />
JSP:<br />
访问静态方法:<br />
&lt;s:property value="@chapter10.model.User@staticMethod()" /&gt;<br />
&lt;br /&gt;<br />
访问静态属性或常量:<br />
&lt;s:property value="@chapter10.model.User@CLASSNAME" /&gt;<br />
&lt;br /&gt;<br />
访问静态方法（默认为Math类）：@@floor(1.32342):<br />
&lt;s:property value="@@floor(1.32342)" /&gt;<br />
&lt;br /&gt;<br />
访问System类的静态currentTimeMillis()方法:<br />
&lt;s:property value="@java.lang.System@currentTimeMillis()" /&gt;<br />
&lt;br /&gt; <br />
就算访问lang包下面类的静态方法都得带包名,除了Math类可以@@floor这样用,其它的类都得带包名.</font></p>
<p><font size="3">访问Model类的构造方法<br />
&lt;s:property value="new chapter10.model.User('ZHD')" /&gt;<br />
它会自动调用toString()方法来显示model的信息,所以model中最好重写toString()方法 </font></p>
<p><font size="3">使用OGNL表达式访问集合<br />
修改model:<br />
public class User {<br />
private String userName;<br />
public static final String CLASSNAME = "wdpc0801";</font></p>
<p><font size="3">public User() {<br />
&nbsp;&nbsp; super();<br />
}</font></p>
<p><font size="3">public User(String userName) {<br />
&nbsp;&nbsp; super();<br />
&nbsp;&nbsp; this.userName = userName;<br />
}</font></p>
<p><font size="3">@Override<br />
public boolean equals(Object obj) {<br />
&nbsp;&nbsp; return this.getUserName().equals(((User) obj).getUserName());<br />
}<br />
<br />
@Override<br />
public int hashCode() {<br />
&nbsp;&nbsp; return this.getUserName().hashCode();<br />
}</font></p>
<p><font size="3">@Override<br />
public String toString() {<br />
&nbsp;&nbsp; return "姓名:" + getUserName();<br />
}</font></p>
<p><font size="3">public static String staticMethod() {<br />
&nbsp;&nbsp; return "Static Method";<br />
}</font></p>
<p><font size="3">public String getUserName() {<br />
&nbsp;&nbsp; return userName;<br />
}</font></p>
<p><font size="3">public void setUserName(String userName) {<br />
&nbsp;&nbsp; this.userName = userName;<br />
}<br />
} <br />
注意,set集合中要判断两个自定义对象是否是相同的,需要重写两个方法hashCode, equals两个方法</font></p>
<p><font size="3">Action:<br />
public class Chapter10Action extends BaseAction {<br />
private String message;<br />
private User user;<br />
private List&lt;User&gt; users = new ArrayList&lt;User&gt;();<br />
private Set&lt;User&gt; usersSet = new HashSet&lt;User&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Map&lt;String, User&gt; usersMap = new HashMap&lt;String, User&gt;();</font></p>
<p><font size="3">public Chapter10Action() {<br />
&nbsp;&nbsp; user = new User("wdpc");<br />
&nbsp;&nbsp; users.add(new User("张三"));<br />
&nbsp;&nbsp; users.add(new User("李四"));<br />
&nbsp;&nbsp; users.add(new User("王五"));<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; usersSet.add(new User("zhang"));<br />
&nbsp;&nbsp; usersSet.add(new User("hai"));<br />
&nbsp;&nbsp; usersSet.add(new User("hai"));<br />
&nbsp;&nbsp; usersSet.add(new User("dang"));<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; usersMap.put("u1", new User("赵六"));<br />
&nbsp;&nbsp; usersMap.put("u2", new User("林七"));<br />
&nbsp;&nbsp; usersMap.put("u3", new User("魏八"));<br />
}</font></p>
<p><font size="3">public String method1() { <br />
&nbsp;&nbsp; return "method1";<br />
}</font></p>
<p><font size="3">public String test() {<br />
&nbsp;&nbsp; return "Action Method";<br />
}</font></p>
<p><font size="3">public String getMessage() {<br />
&nbsp;&nbsp; return message;<br />
}</font></p>
<p><font size="3">public void setMessage(String message) {<br />
&nbsp;&nbsp; this.message = message;<br />
}</font></p>
<p><font size="3">public User getUser() {<br />
&nbsp;&nbsp; return user;<br />
}</font></p>
<p><font size="3">public void setUser(User user) {<br />
&nbsp;&nbsp; this.user = user;<br />
}</font></p>
<p><font size="3">public List&lt;User&gt; getUsers() {<br />
&nbsp;&nbsp; return users;<br />
}</font></p>
<p><font size="3">public void setUsers(List&lt;User&gt; users) {<br />
&nbsp;&nbsp; this.users = users;<br />
}</font></p>
<p><font size="3">public Set&lt;User&gt; getUsersSet() {<br />
&nbsp;&nbsp; return usersSet;<br />
}</font></p>
<p><font size="3">public void setUsersSet(Set&lt;User&gt; usersSet) {<br />
&nbsp;&nbsp; this.usersSet = usersSet;<br />
}</font></p>
<p><font size="3">public Map&lt;String, User&gt; getUsersMap() {<br />
&nbsp;&nbsp; return usersMap;<br />
}</font></p>
<p><font size="3">public void setUsersMap(Map&lt;String, User&gt; usersMap) {<br />
&nbsp;&nbsp; this.usersMap = usersMap;<br />
}<br />
} <br />
JSP:<br />
&lt;body&gt;<br />
&nbsp;&nbsp; 访问User Model的构造方法 访问users：<br />
&nbsp;&nbsp; &lt;s:property value="users" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问指定的元素users[0]：<br />
&nbsp;&nbsp; &lt;s:property value="users[0]" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问users属性的userName集合users.{userName}:<br />
&nbsp;&nbsp; &lt;s:property value="users.{userName}" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问users中指定元素的属性：<br />
&nbsp;&nbsp; &lt;s:property value="users[0].userName" /&gt;<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; &lt;s:property value="users.{userName}[0]" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问usersSet:<br />
&nbsp;&nbsp; &lt;s:property value="usersSet" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问usersMap:<br />
&nbsp;&nbsp; &lt;s:property value="usersMap" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问Map中指定的元素usersMap.u1 | usersMap['u1']（key与变量命名规则一致）:<br />
&nbsp;&nbsp; &lt;s:property value="usersMap.u1" /&gt;<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; &lt;s:property value="usersMap['u1']" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问Map中所有的(usersMap.keys)key：<br />
&nbsp;&nbsp; &lt;s:property value="usersMap.keys" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&nbsp;&nbsp; 访问Map中所有的(usersMap.values)values:<br />
&nbsp;&nbsp; &lt;s:property value="usersMap.values" /&gt;<br />
&nbsp;&nbsp; &lt;br /&gt;<br />
&lt;/body&gt; <br />
如果要访问key集合中的某一个元素,可以这样访问:<br />
&lt;s:property value="usersMap.keys.{#this}[0]" /&gt; </font></p>
<p><font size="3">使用OGNL表达式投影（过滤）集合<br />
&#8220;?&#8221;：投影（过滤）所有符合条件的集合，如：users.{?#this.age &gt; 19}；<br />
&#8220;^&#8221;：投影（过滤）第一个符合条件的元素，如：users.{^#this.age &gt; 19}；<br />
&#8220;$&#8221;：投影（过滤）最后一个符合条件的元素，如：users.{$#this.age &gt; 19} 。<br />
#this代表users集合自己本身<br />
Action:<br />
public class Chapter10Action extends BaseAction {<br />
private List&lt;User&gt; users = null;<br />
<br />
public Chapter10Action() {<br />
&nbsp;&nbsp; users = new ArrayList&lt;User&gt;();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; users.add(new User("张三", 22));<br />
&nbsp;&nbsp; users.add(new User("李四", 23));<br />
&nbsp;&nbsp; users.add(new User("王五", 24));<br />
&nbsp;&nbsp; users.add(new User("赵六", 22));<br />
&nbsp;&nbsp; users.add(new User("林七", 23));<br />
&nbsp;&nbsp; users.add(new User("魏八", 24));<br />
&nbsp;&nbsp;<br />
}</font></p>
<p><font size="3">public String index() {<br />
&nbsp;&nbsp; return "index";<br />
}</font></p>
<p><font size="3">public List&lt;User&gt; getUsers() {<br />
&nbsp;&nbsp; return users;<br />
}</font></p>
<p><font size="3">public void setUsers(List&lt;User&gt; users) {<br />
&nbsp;&nbsp; this.users = users;<br />
}<br />
}</font></p>
<p><font size="3">JSP:<br />
&lt;body&gt;<br />
所有符合条件的集合:&lt;s:property value="users.{?#this.age &gt; 22}" /&gt;&lt;br /&gt;<br />
所有符合条件的集合中指定的元素:&lt;s:property value="users.{?#this.age &gt; 22}[0]" /&gt;&lt;br /&gt;<br />
第一个符合条件的元素集合：&lt;s:property value="users.{^#this.age &gt; 22}" /&gt;&lt;br /&gt;<br />
最后一个符合条件的元素集合：&lt;s:property value="users.{$#this.age &gt; 22}" /&gt;&lt;br /&gt; <br />
&lt;/body&gt; <br />
</font></p>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/342180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-01-03 00:33 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/03/342180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>传智播客Spring2.5观看笔记</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/02/342158.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sun, 02 Jan 2011 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/02/342158.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/342158.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/02/342158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/342158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/342158.html</trackback:ping><description><![CDATA[http://taeky.javaeye.com/category/90049
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/342158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-01-02 12:23 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/01/02/342158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 标签</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/29/336501.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Fri, 29 Oct 2010 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/29/336501.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/336501.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/29/336501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/336501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/336501.html</trackback:ping><description><![CDATA[<h4>
<div class="d_left">&nbsp;a&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC0" class="tagList">
<p>a标签创建一个HTML超链接，等价于HTML 的&lt;a&nbsp; href=""....</p>
<p>示范代码：</p>
<p>&lt;s:a href="login.action"&gt;登陆&lt;/s:a&gt;</p>
<p><a href="http://www.web-tag.net/24f6d1ca6d06b63d.htm">更多&nbsp;a&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;action&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC1" class="tagList">
<p>使用action标签 可以允许在JSP页面中直接调用Action。</p>
<p>范例如下：</p>
<p>&lt;s: action&nbsp;&nbsp; name="tag2"&nbsp; executeResult="false"&nbsp;/&gt;</p>
<p><a href="http://www.web-tag.net/bef79accea021937.htm">更多&nbsp;action&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;actionerror&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC2" class="tagList">
<p>这个标签负责输出错误信息到客户端。<br />
示范代码：</p>
<p>Action代码如下：<br />
public String execute()<br />
{<br />
&nbsp;&nbsp; addActionError("第一条错误消息！");&nbsp;<br />
&nbsp;&nbsp; addActionError("第二条错误消息！");&nbsp;</p>
<p>&nbsp;&nbsp; return SUCCESS;<br />
}....<br />
JSP中：&lt;s:actionerror/&gt;</p>
<p><a href="http://www.web-tag.net/a5fb2e111c1b59c8.htm">更多&nbsp;actionerror&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;actionmessage&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC3" class="tagList">这个标签负责输出提示信息到客户端，例子如下：
<p>Action代码如下：<br />
public String execute()<br />
{<br />
&nbsp;&nbsp; addActionMessage("第一条普通消息！");&nbsp;<br />
&nbsp;&nbsp; addActionMessage("第二条普通消息！");&nbsp;<br />
&nbsp;&nbsp; return SUCCESS;<br />
}<br />
JSP：&lt;s:actionmessage /&gt;</p>
<p><a href="http://www.web-tag.net/9495a7d1200023fb.htm">更多&nbsp;actionmessage&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;append&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC4" class="tagList">
<p>用来做iterator标签的辅助，将不同iterator中的内容合在一个iterator中。<br />
例子：<br />
&lt;s:append id="myAppendIterator"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param value="%{myList1}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param value="%{myList2}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param value="%{myList3}" /&gt;<br />
&lt;/s:append&gt;<br />
&lt;s:iterator value="%{#myAppendIterator}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property /&gt;<br />
&lt;/s:iterator&gt;</p>
<p><a href="http://www.web-tag.net/eef1746692dd51ab.htm">更多&nbsp;append&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;bean&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC5" class="tagList">
<p>bean标签&nbsp;用于创建一个JavaBean的实例。</p>
<p>示范样例：</p>
<p>&lt;s:bean&nbsp;&nbsp; name="lee.Person"&nbsp; id=&#8220;p&#8221;&gt;<br />
&lt;!--使用Param标签为lee。Person类的实例传入参数--&gt;<br />
&lt;s:param&nbsp;&nbsp; name="name"&nbsp; value="'yeeku'"/&gt;<br />
&lt;s:param&nbsp;&nbsp; name="age"&nbsp;&nbsp; value="29"/&gt;<br />
&lt;/s:bean&gt;</p>
<p><a href="http://www.web-tag.net/483ca2801b061221.htm">更多&nbsp;bean&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;checkbox&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC6" class="tagList">
<p><span style="font-size: 14px;">checkbox标签输出一个HTML复选框，等价于HTML代码：&lt;input type="checkbox" .../&gt;。</span></p>
<p><span style="font-size: 14px;">示范代码：</span></p>
<p><span style="font-size: 14px;">&lt;s:checkbox&nbsp;label=</span><span style="font-size: 14px;">"性别"</span><span style="font-size: 14px;">&nbsp;name=</span><span style="font-size: 14px;">"user.sex"</span><span style="font-size: 14px;">&nbsp;value=</span><span style="font-size: 14px;">"true"</span><span style="font-size: 14px;">&nbsp;fieldValue=</span><span style="font-size: 14px;">"dddd"</span><span style="font-size: 14px;">/&gt;&nbsp;</span></p>
<p><a href="http://www.web-tag.net/fc13fa3d6d9bf13f.htm">更多&nbsp;checkbox&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">
<img src="http://www.javaeye.com/forums/39/topics/files/icon_2.gif" alt="" />&nbsp;checkboxlist&nbsp;</div>
<div class="d_right"><img id="dicttoggle_PWDECMEC7" src="http://www.javaeye.com/forums/39/topics/files/von.gif" alt="" /></div>
</h4>
<div id="dictc_PWDECMEC7" class="tagList">
<p><span style="font-size: 14px;">标签输出一个</span><span style="font-size: 14px;">复选框。</span></p>
<p><span style="font-size: 14px;">示范代码:</span><br />
<span style="font-size: 14px;">&lt;s:form&gt;</span><br />
<span style="font-size: 14px;">&nbsp;&nbsp;&nbsp; &lt;s:checkboxlist name="interest" list="{'足球','篮球','排球','游泳'}" label="兴趣爱好"/&gt;</span><br />
<span style="font-size: 14px;">&lt;/s:form&gt;</span></p>
<p><a href="http://www.web-tag.net/73b59452c0d9533e.htm">更多&nbsp;checkboxlist&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;combobox&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC8" class="tagList">
<p>combobox标签生成一个单行文本框和下拉列表框的结合。</p>
<p>示范代码：<br />
&lt;s:combobox label="请选择您喜欢的图书" theme="css_xhtml" labelposition="top"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list="{'Spring2.0' , 'J2EE' , 'Ajax'}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size="20" maxlength="20" name="book"/&gt;</p>
<p><a href="http://www.web-tag.net/09b55592ec5de5d1.htm">更多&nbsp;combobox&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;conponent&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC9" class="tagList">
<p>&nbsp;</p>
<p>conponent标签用于使用自定义标签。因为使用自定义组件还是基于主题，模板管理的，因此在使用component标签，常常需要指定如下3个属性：<br />
theme：自定义组件所使用的主题，默认使用xhtml主题。<br />
templateDir：指定自定义组件的主题目录，默认使用系统的主题目录，即template目录。<br />
template：指定自定义组件所使用的模板。</p>
<p>&nbsp;</p>
<p>示范代码：<br />
&lt;s:component template="mytemplate.jsp"&gt;<br />
&lt;s:param name="list" value="{'Spring2.0' , 'J2EE' , 'Ajax'}" /&gt;<br />
&lt;/s:component&gt;</p>
<p><a href="http://www.web-tag.net/6ea1575d8af4e026.htm">更多&nbsp;conponent&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;date&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC10" class="tagList">
<p>date标签 用于格式化输入一个日期，还可以计算指定日期和当前时刻之间的时差。<br />
示范代码：</p>
<p>&lt;s:date&nbsp;&nbsp;name="#attr.now"&nbsp;&nbsp; format="dd/MM/yyyy"&nbsp; nice=&#8220;true&#8221;/&gt;</p>
<p><a href="http://www.web-tag.net/d8b7156543f5f64f.htm">更多&nbsp;date&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;datetimepicker&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC11" class="tagList">
<p>datetimepicker标签就是生成一个有日期控件的文本输入框。它有一个前提就是要在&lt;head&gt;&lt;/head&gt;内加一个"&lt;s:head theme="ajax" /&gt;"，然后可以在form内加上该标签。&nbsp;</p>
<p>示范代码：</p>
<p>&lt;s:datetimepicker&nbsp;name="user.birthday"&nbsp;label="出生日期"&nbsp;value="%{'2008-9-20'}"/&gt;</p>
<p><a href="http://www.web-tag.net/ac17707b1c190497.htm">更多&nbsp;datetimepicker&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;debug&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC12" class="tagList"><span class="Apple-style-span"><span class="Apple-style-span" style="text-align: left; line-height: 21px; font-family: verdana,sans-serif; font-size: 14px;"><span class="Apple-style-span"><span class="Apple-style-span" style="text-align: left; line-height: 18px; font-family: Arial,sans-serif,Helvetica,Tahoma; font-size: 12px;">
<p style="margin: 0px; padding: 0px;"><span style="font-size: 14px;">debug标签主要用于辅助测试，它在页面上生成一个超链接，通过该链接可以查看ValueStack和Stack Context 中的所有值信息。</span></p>
<p><span style="font-size: 14px;">使用debug标签只有一个id属性，这个属性仅仅是该元素一个引用id。</span></p>
<p><span style="font-size: 14px;">在页面上增加&lt;s:debug/&gt;标签，通过debug标签，可以看的系统中ValueStack离得全部信息，并可以看到Stack Context中的属性。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 14px;">&lt;s:debug&gt;&lt;/s:debug&gt;</span><br />
<span style="font-size: 14px;">//直接在jsp页面上面添加这样的标签，就可以生产一个查看debug信息的链接</span></p>
<p><a href="http://www.web-tag.net/70fdb137510f40a2.htm">更多&nbsp;debug&nbsp;信息</a></p>
</span></span>示范代码：</span></span></div>
<h4>
<div class="d_left">&nbsp;div&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC13" class="tagList">div是struts2 ajax中最基础的标签，其他的标签均和div有关系。div的最大的用途就是可以异步的更新div中的内容。这里写一些div基本的应用，其他的等写别的标签的时候再写。<br />
示范代码：<br />
&lt;s:div href="%{url}"&gt;Initial Content&lt;/sx:div&gt; <br />
&lt;!--最简单的例子，从指定的url获取信息更新自己的内容--&gt;
<p><a href="http://www.web-tag.net/7ac348a0e611bd70.htm">更多&nbsp;div&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;doubleselect&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC14" class="tagList">doubleselect标签输出关联的两个HTML列表框，产生联动效果。<br />
&lt;s:doubleselect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label="请选择所在省市" name="province" list="provinces" listKey="id"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listValue="name" doubleList="cities"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doubleListKey="id" doubleListValue="name"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doubleName="city" headerKey="-1"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; headerValue="--- 请选择 ---"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emptyOption="true" /&gt;
<p><a href="http://www.web-tag.net/6dc49ca511d70918.htm">更多&nbsp;doubleselect&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;else&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC15" class="tagList">
<p>else标签用来控制基本的条件处理流程，通常和if、elseif标签连用。</p>
<p align="left">例子<br />
&lt;s:if test="%{false}"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div&gt;Will Not Be Executed&lt;/div&gt;<br />
&lt;/s:if&gt;<br />
&lt;s:elseif test="%{true}"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div&gt;Will Be Executed&lt;/div&gt;<br />
&lt;/s:elseif&gt;<br />
&lt;s:else&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div&gt;Will Not Be Executed&lt;/div&gt;<br />
&lt;/s:else&gt;&nbsp;</p>
<p><a href="http://www.web-tag.net/3c7f9bd1e2e893e1.htm">更多&nbsp;else&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;elseif&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC16" class="tagList">
<p>elseif标签用来控制基本的条件处理流程，通常和if标签连用。</p>
<p align="left">例子</p>
<p align="left">&lt;s:if test="%{false}"&gt;</p>
<p align="left">...&lt;/s:if&gt;</p>
<p align="left">&lt;s:elseif test="%{true}"&gt;</p>
<p align="left">&nbsp;&nbsp;&nbsp; &lt;div&gt;Will Be Executed&lt;/div&gt;</p>
<p align="left">&lt;/s:elseif&gt;</p>
<p align="left">&lt;s:else&gt;</p>
<p align="left">...&lt;/s:else&gt;</p>
<p><a href="http://www.web-tag.net/5d19898824019bc9.htm">更多&nbsp;elseif&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;fielderror&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC17" class="tagList">
<p>fielderror标签输出action的fieldErrors属性保存的字段错误，fieldErrors是一个map类型的属性。</p>
<p>示范代码：</p>
<p>&lt;s:fielderror/&gt;</p>
<p><a href="http://www.web-tag.net/0c16be80bdeeaac6.htm">更多&nbsp;fielderror&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;file&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC18" class="tagList">
<p>file标签输出一个HTML文件选择框，等价于html代码：&lt;input type="file" .../&gt;。</p>
<p>示范代码：<br />
&lt;s:file name="uploadfile" accept="text/*" /&gt;<br />
&lt;s:file name="uploadfile" accept="text/html,text/plain" /&gt;</p>
<p>&nbsp;</p>
<p><a href="http://www.web-tag.net/ce9c59c7461d23ff.htm">更多&nbsp;file&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;form&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC19" class="tagList">
<span style="font-size: 14px;">form</span><span style="font-size: 14px;">标签输出一个</span><span style="font-size: 14px;">HTML</span><span style="font-size: 14px;"> from</span>
<p><span style="font-size: 14px;">例子：</span></p>
<p><span style="font-size: 14px;">&lt;s:form action="exampleSubmit" method="post" enctype="multipart/form-data"&gt;</span><span style="font-size: 14px;">&nbsp;</span><br />
<span style="font-size: 14px;">&lt;s:submit&nbsp;&nbsp; /&gt;</span><span style="font-size: 14px;">&nbsp;</span><br />
<span style="font-size: 14px;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:reset&nbsp;&nbsp; /&gt;</span><span style="font-size: 14px;">&nbsp;</span><br />
<span style="font-size: 14px;">&lt;/s:form&gt;</span></p>
<p><span style="font-size: 14px;">可以上传文件的form。</span><span style="font-size: 14px;">&nbsp;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://www.web-tag.net/f901cecbc131289e.htm">更多&nbsp;form&nbsp;信息</a></p>
<p>&nbsp;</p>
<h4>
<div class="d_left">&nbsp;generator&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC0" class="tagList">
<p>使用generator标签可以将指定字符串按指定分隔符分成多个子串，临时生成的多个子串可以使用iterator标签来迭代输出。可以这样理
解：generator将一个字符串转化成一个集合。在该标签的标签体内，整个临时生成的集合将位于ValueStack的顶端，蛋一旦该标签结束，该集
合将被移出ValueStack。</p>
<p><a href="http://www.web-tag.net/8272b3170abe7722.htm">更多&nbsp;generator&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;head&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC1" class="tagList">
<p style="padding: 0px; margin: 0px;"><span style="font-size: 14px;">head标签主要用于成生HTML主要页面的HEAD部分。国为有些主题需要包含特定的CSS和javascript代码，而该标签则用于生成对这此CSS和javaScript代码的引用。</span></p>
<p><span style="font-size: 14px;">示范代码：</span></p>
<p><span style="font-size: 14px;">&lt;head&gt;<br />
</span><span style="font-size: 14px;">&lt;title&gt;page 1&lt;/title&gt;<br />
</span><span style="font-size: 14px;">&lt;s:head/&gt;<br />
</span><span style="font-size: 14px;">&lt;/head&gt;</span></p>
<p><a href="http://www.web-tag.net/d3f524a09aea175c.htm">更多&nbsp;head&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;hidden&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC2" class="tagList">
<p>hidden标签输出一个HTML隐藏表单元素，等价于HTML代码：&lt;input type="hidden" .../&gt;。</p>
<p>在xhtml主题下，hidden标签与其他的标签不一样，hidden标签并不输出表行。xhtml主题直接从simple主题继承了</p>
<p>hidden.ftl模板。</p>
<p>示范代码：</p>
<p>&lt;s:hidden name="id" value="s"/&gt;</p>
<p><a href="http://www.web-tag.net/3c9851a08b3c9ac1.htm">更多&nbsp;hidden&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;i18n&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC3" class="tagList">
<p>该标签用于加载资源包到值堆栈。它可以允许text标志访问任何资源包的信息，而不只当前action相关联的资源包。</p>
<p>示范代码：</p>
<p>&lt;s:i18n name="ApplicationMessages"&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:text name="HelloWorld" /&gt;&nbsp;<br />
&lt;/s:i18n&gt;&nbsp;</p>
<p><a href="http://www.web-tag.net/b5d985cf2f39219e.htm">更多&nbsp;i18n&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;if&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC4" class="tagList">
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt;" align="left">If标签用来控制基本的条件处理流程，通常和else标签或者elseif标签连用。</p>
<p align="left">例子：</p>
<p align="left">&lt;s:if test="%{false}"&gt;</p>
<p align="left">&nbsp;&nbsp;&nbsp; &lt;div&gt;Will Not Be Executed&lt;/div&gt;</p>
<p align="left">&lt;/s:if&gt;</p>
<p><a href="http://www.web-tag.net/e3b604e664a5568e.htm">更多&nbsp;if&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;include&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC5" class="tagList">
<p>include标签&nbsp;用于将一个JSP页面，或者一个Servlet包含到本页面中。</p>
<p>示范代码：</p>
<p>&lt;h2&gt;使用s:include标签来包含目标页面&lt;/h2&gt;</p>
<p>&lt;s:include&nbsp;&nbsp; value="include-file.jsp"/&gt;</p>
<p>&lt;!--使用include标签来包含其他页面，并且传入参数--&gt;</p>
<p>&lt;s:include&nbsp;&nbsp; value="include-file.jsp"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;s:param&nbsp;&nbsp;name="author"&nbsp; value="'yeeku'"&nbsp;/&gt;</p>
<p>&lt;/s:include&gt;</p>
<p><a href="http://www.web-tag.net/a2d95a47bf24ad1a.htm">更多&nbsp;include&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;inputtransferselect&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC6" class="tagList">获取form的一个输入
<p><a href="http://www.web-tag.net/4ab8317621bc1861.htm">更多&nbsp;inputtransferselect&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;iterator&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC7" class="tagList">
<p>迭代处理一个java.util.Connection或者java.util.Iterator对象</p>
<p>例子：</p>
<p align="left">&lt;s:iterator value="users" status="userStatus"&gt;<br />
&nbsp;&lt;s:property value="fullName" /&gt;<br />
&nbsp;&lt;s:if test="!#userStatus.last"&gt;,&lt;/s:if&gt;<br />
&lt;/s:iterator&gt;</p>
<p align="left">&nbsp;</p>
<p><a href="http://www.web-tag.net/b7c6f34c21dde28a.htm">更多&nbsp;iterator&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;label&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC8" class="tagList">
<p>xhtml主题下的label 标签输出两个 HTML的label标签（simple主题下的label标签只输出一个HTML label标签）。分别位于一行的两列，左列的label标签器提示作用，右列的label标签用于显示只读的action属性数据。</p>
<p>示范代码：</p>
<p>&lt;s:label label="用户名" name="user.username"/&gt;</p>
<p><a href="http://www.web-tag.net/255f43af0cceb8e0.htm">更多&nbsp;label&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;merge&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC9" class="tagList">
<p>合并遍历集合出来的值,与&lt;s:append&gt;标签用法相似。</p>
<p>例子：</p>
<p>&lt;s:merge id="list"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:param value="#request.list1"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:param value="#request.list2"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:param value="#request.list3"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:param value="#request.list4"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/s:merge&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;s:iterator value="%{list}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:property/&gt;&lt;br&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;/s:iterator&gt;</p>
<p><a href="http://www.web-tag.net/c0b68d68cbd803d8.htm">更多&nbsp;merge&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;optgroup&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC10" class="tagList">
<p>optgroup标签用于生成一个下拉列表框的选项组，因此，该标签必须放在&lt;s:select&gt;标签中使用，一个下拉列表框中可以包含多个选项组，因此可以在一个&lt;s:select&gt;标签中使用多个&lt;s:optgroup&gt;标签。</p>
<p>&lt;s:select label="选择您喜欢的图书" name="book" list="#{'Spring2.0':'李刚','J2EE':'李','Ajax宝典':'李'}"<br />
&nbsp;&nbsp;&nbsp;&nbsp; listKey="value" &nbsp;listValue="key"&gt;<br />
&nbsp;&nbsp; &lt;s:optgroup label="Rod Johnson"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list="#{'Expert One-on-One J2EE Design and Development':'Johnson'}"<br />
&nbsp;&nbsp;&nbsp;&nbsp; listKey="value"<br />
&nbsp;&nbsp;&nbsp;&nbsp; listValue="key"/&gt;<br />
&nbsp;&nbsp; &lt;s:optgroup label="David Flanagan"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list="#{'JavaScript: The Definitive Guide':'David'}"<br />
&nbsp;&nbsp;&nbsp;&nbsp; listKey="value"<br />
&nbsp;&nbsp;&nbsp;&nbsp; listValue="key"/&gt;<br />
&lt;/s:select&gt;</p>
<p><a href="http://www.web-tag.net/983747c240d02810.htm">更多&nbsp;optgroup&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;optiontransferselect&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC11" class="tagList">optiontransferselect标签创建一个选项转移列表组建，它由两个&lt;select&gt;标签以及它们之间的用于将选项在两个&lt;select&gt;之间相互移动的按钮组成。表单提交时，将提交两个列表框中选中的选项。<br />
示范代码：<br />
&lt;s:optiontransferselect<br />
&nbsp;&nbsp;&nbsp; label="最喜爱的图书"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="javaBook"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list="{'《Java Web开发详解》', '《Struts 2深入详解》', '《Java快速入门》'}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doubleName="cBook"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doubleList="{'《VC++深入详解》', '《C++ Primer》', '《C++程序设计语言》'}"/&gt;
<p><a href="http://www.web-tag.net/7f6f662481e5a597.htm">更多&nbsp;optiontransferselect&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;param&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC12" class="tagList">
<p>param标签 主要用于为其他标签提供参数</p>
<p>用法：<br />
&lt;param&nbsp; name="color"&nbsp; value="blue" /&gt;<br />
这里color参数的值是，blue对象的值----如果blue对象不存在，则color为null。</p>
<p><a href="http://www.web-tag.net/9234e9aa7f8f9dce.htm">更多&nbsp;param&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;password&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC13" class="tagList">
<p>&lt;s:password&gt;标签类同于HTML的&lt;input type=&#8221;password&#8221; &#8230;&gt;，其name和label类同于&lt;s:textfield&gt;</p>
<p>例子：</p>
<p>&lt;s:<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(&quot;/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif&quot;);" name="baidusnap3"></a>password&nbsp;name="password" label="密码"/&gt;&nbsp;</p>
<p><a href="http://www.web-tag.net/9a4e497350f759db.htm">更多&nbsp;password&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;property &nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC14" class="tagList">property标签用于输出值栈中的对象的属性值，使用value属性来指定要输出的对象属性，如果没有指定value属性，那么默认输出栈顶对象。
<p>例子：</p>
<p>&lt;s:property value="username" default="游客"/&gt;</p>
<p>取出栈顶对象（通常是action）的username 属性并输出，如果没有找到username属性，那么输出&#8220;游客&#8221;。</p>
<p><a href="http://www.web-tag.net/325532b4f526900b.htm">更多&nbsp;property &nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;push&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC15" class="tagList">
<p>push标签用于将某个值放到ValueStack的栈顶，可以跟简单的访问该值。<br />
示范样例：<br />
&lt;s:bean&nbsp; name="lee.Person"&nbsp; id="p"&gt;<br />
&nbsp;&nbsp; &lt;s:param&nbsp;&nbsp; name="age"&nbsp; value="29"/&gt;<br />
&lt;/s:bean&gt;<br />
&lt;s:push&nbsp;&nbsp; value="#p"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:property&nbsp;&nbsp; value="name"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:propery&nbsp;&nbsp; value="age"/&gt;<br />
&lt;/s:push&gt;</p>
<p><a href="http://www.web-tag.net/d4b1bfa40be94892.htm">更多&nbsp;push&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;radio &nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC16" class="tagList">
<p>radio标签的用法与checkboxlist的用法几乎完全相同，一样可以指定label, list, listKey, listValue等属性。</p>
<p>示范代码：<br />
&lt;s:radio name="c" label="请选择您喜欢的图书" labelposition="top"<br />
list="#bs.books"<br />
listKey="author"<br />
listValue="name"/&gt;</p>
<p><a href="http://www.web-tag.net/7e363611f338de38.htm">更多&nbsp;radio &nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;reset&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC17" class="tagList">reset标签输出一个重置按钮。<br />
<br />
示范代码：<br />
&lt;s:reset value="重置"&gt;&lt;/s:reset&gt;
<p>&lt;s:reset type="button"&nbsp;label="重置"&gt;&lt;/s:reset&gt;</p>
<p><a href="http://www.web-tag.net/2a4fbc30a6ed8585.htm">更多&nbsp;reset&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;select&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC18" class="tagList">
<p>s:select 标签输出一个下拉列表框，相当于HTML代码中的&lt;select/&gt;</p>
<p>示范代码：<br />
&lt;s:form&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:select label="最高学历" name="education" list="{'高中','大学','硕士','博士'}"/&gt;<br />
&lt;/s:form&gt;</p>
<p><a href="http://www.web-tag.net/a5addeafacdc36d8.htm">更多&nbsp;select&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;set&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC19" class="tagList">
<p>set标签是将某个值放到指定范围内， 比如说 student.teacher.parent.age 每次访问这个属性不仅性能低，而且代码可读性很差，为了解决这个问题，可以将这个值设置为一个新值，并且放入指定范围内。<br />
使用示范：<br />
&lt;s:set value="#p" name="test"/&gt; <br />
&lt;s:property value="#test.name"/&gt; &lt;br&gt; <br />
&lt;s:property value="#test.age"/&gt; &lt;br&gt; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h4>
<div class="d_left">&nbsp;sort&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC0" class="tagList">
<p>对一个可以迭代的对象进行排序操作。</p>
<p align="left">&lt;s:sort comparator="myComparator" source="myList"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:iterator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- do something with each sorted elements --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property value="..." /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:iterator&gt;<br />
&lt;/s:sort&gt;</p>
<p><a href="http://www.web-tag.net/9cd830c72eb7ad39.htm">更多&nbsp;sort&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;submit&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC1" class="tagList">
<span style="font-size: 14px;">Submit</span><span style="font-size: 14px;">标签输出一个按钮，</span><span style="font-size: 14px;">submit</span><span style="font-size: 14px;">标签和</span><span style="font-size: 14px;">form</span><span style="font-size: 14px;">标签使用可以提供异步表单提交功能。</span><span style="font-size: 14px;">Submit</span><span style="font-size: 14px;">标签可以输出以下三种类型的提交按钮：</span><br />
<span style="font-size: 14px;">Input</span><span style="font-size: 14px;">：</span><span style="font-size: 14px;">&nbsp;</span><span style="font-size: 14px;">等价于</span><span style="font-size: 14px;">&nbsp;</span><span style="font-size: 14px;">HTML</span><span style="font-size: 14px;">代码</span><span style="font-size: 14px;">&lt;input type=</span><span style="font-size: 14px;">&#8221;</span><span style="font-size: 14px;">submit</span><span style="font-size: 14px;">&#8221;</span><span style="font-size: 14px;">&gt;</span><br />
<span style="font-size: 14px;">Image</span><span style="font-size: 14px;">：</span><span style="font-size: 14px;">&nbsp;</span><span style="font-size: 14px;">等价于</span><span style="font-size: 14px;">&nbsp;</span><span style="font-size: 14px;">HTML</span><span style="font-size: 14px;">代码</span><span style="font-size: 14px;">&nbsp;</span><span style="font-size: 14px;">&lt;input type="image"&gt;</span><br />
<span style="font-size: 14px;">Button</span><span style="font-size: 14px;">：</span><span style="font-size: 14px;">&lt;button type="submit"&gt;&lt;/button&gt;<br />
</span><br />
<span style="font-size: 14px;">示范代码</span><span style="font-size: 14px;">：</span><br />
<span style="font-size: 14px;">&lt;s:submit value="登陆"&gt;&lt;/s:submit&gt;</span><br />
<p><a href="http://www.web-tag.net/7d7ac66c3072cb6d.htm">更多&nbsp;submit&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;subset&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC2" class="tagList">
<p>递归iterator的一部分。<br />
例子：</p>
<p align="left">&lt;s:subset source="myList"&gt;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:iterator&gt;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property /&gt;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:iterator&gt;</p>
<p align="left">&lt;/s:subset&gt;</p>
<p>&nbsp;</p>
<p><a href="http://www.web-tag.net/ecbd0c77b6fedae3.htm">更多&nbsp;subset&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;tabbedPanel&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC3" class="tagList">&lt;s:tabbedPanel&gt;标签，用来在HTML页面中生成类似于Windows程序的Tab页，从而可以在有限的空间中放置更多的内容。tabbedPanel标签生成的Tab页的内容可以是静态的，也可以是动态的。<br />
示范代码：<br />
&lt;s:tabbedPanel id="tp1" closeButton="pane" theme="ajax" doLayout="true" selectedTab="second"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelposition="left"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;s:div id="first" label="第一个div" theme="ajax"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;静态的DIV<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/s:div&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;s:div name="second" label="第二个div" theme="ajax" href="%{T}" updateFreq="6000" delay="3000"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3:每六秒钟刷新一次，但有三秒延迟<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/s:div&gt;<br />
&lt;/s:tabbedPanel&gt;
<p><a href="http://www.web-tag.net/cdea8a202fd2c949.htm">更多&nbsp;tabbedPanel&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;text&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC4" class="tagList">用于输出国际化消息，和i18n结合使用。<br />
<p>示范代码：</p>
<p>&lt;s:i18n name="ApplicationMessages"&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:text name="HelloWorld" /&gt;&nbsp;<br />
&lt;/s:i18n&gt;&nbsp;</p>
<p><a href="http://www.web-tag.net/f958cd72cfe8a173.htm">更多&nbsp;text&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;textarea&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC5" class="tagList">Textarea标签输出一个HTML多行文本输入控件，等价于HTML代码：&lt;textarea /&gt;<br />
<br />
示范代码：<br />
&lt;s:textarea name="personal"&nbsp;cols="10"&nbsp;rows="5"&nbsp;label="个人简历"&gt;&lt;/s:textarea&gt;
<p><a href="http://www.web-tag.net/fa02acf2a8f73715.htm">更多&nbsp;textarea&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;textfield&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC6" class="tagList">
<p><span style="line-height: 19px; font-size: small;"><span style="line-height: 19px; color: #000000;"><span style="line-height: 19px; font-size: 14px;" lang="EN-US">Textfield</span><span>标签输出一个</span><span style="line-height: 19px; font-size: 14px;" lang="EN-US">HTML</span><span>单行文本输入控件，等价于</span><span style="line-height: 19px; font-size: 14px;" lang="EN-US">HTML</span><span>代码</span><span style="line-height: 19px; font-size: 14px;" lang="EN-US">&lt;input type=</span><span>"</span><span style="line-height: 19px; font-size: 14px;" lang="EN-US">text"</span><span style="line-height: 19px; font-size: 14px;" lang="EN-US">&gt;<br />
</span></span></span><span style="line-height: 19px; font-size: small;"><span style="line-height: 19px; color: #000000;">
<p><span style="line-height: 19px; font-size: 14px;" lang="EN-US"><span style="font-size: 14px;"><br />
示范代码：</span><span style="line-height: 19px; font-family: 'Courier New'; color: #000000; font-size: 14px;"><br />
<span style="font-family: Tahoma;"><span style="font-size: 14px;">&lt;s:form action="register" method="post"&gt;</span><br />
<span style="font-size: 14px;">&nbsp;&nbsp;&nbsp; &lt;s:textfield name="username" label="用户名"&gt;&lt;/s:textfield&gt;</span><br />
<span style="font-size: 14px;">&lt;/s:form&gt;</span></span>
<p class="MsoNormal" style="padding: 0.9em 0px; margin: 0cm 0cm 0pt;">&nbsp;</p>
</span></span></p>
</span></span></p>
<p><a href="http://www.web-tag.net/8a883587c83b50d7.htm">更多&nbsp;textfield&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;token&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC7" class="tagList">
<p>token标签是用于防止多次提交的标签。避免了刷新页面时多次提交，如果需要该标签起作用，则应该在Struts2的配置文件中启用TokenInterceptor拦截器或TokenSessionStoreInterceptor拦截器。</p>
<p>示范代码：<br />
&lt;s:form&gt;<br />
&lt;s:token/&gt;<br />
&lt;/s:form&gt; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://www.web-tag.net/d159984d5daf4682.htm">更多&nbsp;token&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;tree&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC8" class="tagList">
<p><span style="font-size: 14px;">tree和treenode标签可以在页面生成一个树形结构，其中tree生成一个树形结构，treenode生成一个树节点。</span><br />
<span style="font-size: 14px;">示范代码：</span></p>
<p><span style="font-size: 14px;">&lt;s:tree label="图书" id="book" theme="ajax" </span><br />
<span style="font-size: 14px;">showRootGrid="true" showGrid="true" treeSelectedTopic="treeSelected"&gt;</span><br />
<span style="font-size: 14px;">&nbsp;&nbsp;&nbsp; &lt;s:treenode theme="ajax" label="David" id="David"&gt;</span><br />
<span style="font-size: 14px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:treenode theme="ajax" label="JavaScript: The Definitive Guide" id="javascript"/&gt;</span><br />
<span style="font-size: 14px;">&nbsp;&nbsp;&nbsp; &lt;/s:treenode&gt;</span><br />
<span style="font-size: 14px;">&lt;/s:tree&gt;</span></p>
<p><a href="http://www.web-tag.net/bbdae9485d634c8a.htm">更多&nbsp;tree&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;treenode&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC9" class="tagList">
<p>tree和treenode标签可以在页面生成一个树形结构，其中tree生成一个树形结构，treenode生成一个树节点。<br />
示范代码：</p>
<p>&lt;s:tree label="图书" id="book" theme="ajax" <br />
showRootGrid="true" showGrid="true" treeSelectedTopic="treeSelected"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:treenode theme="ajax" label="David" id="David"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:treenode theme="ajax" label="JavaScript: The Definitive Guide" id="javascript"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/s:treenode&gt;<br />
&lt;/s:tree&gt;</p>
<p><a href="http://www.web-tag.net/11a2df3bf881bc64.htm">更多&nbsp;treenode&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;updownselect&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC10" class="tagList">updownselect标签创建一个带有上下移动的按钮的列表框，可以通过上下移动按钮来调整列表框的选项的位置。<br />
示范代码：<br />
&lt;s:updownselect name="a" label="请选择您喜欢的图书" labelposition="top"<br />
&nbsp;&nbsp;&nbsp; moveUpLabel="向上移动"<br />
&nbsp;&nbsp;&nbsp; list="{'Spring2.0宝典' , '轻量级J2EE企业应用实战' , 'JavaScript: The Definitive Guide'}"/&gt;
<p><a href="http://www.web-tag.net/be4c6b4e875c6dfb.htm">更多&nbsp;updownselect&nbsp;信息</a></p>
</div>
<h4>
<div class="d_left">&nbsp;url&nbsp;</div>
<div class="d_right">&nbsp;</div>
</h4>
<div id="dictc_PWDECMEC11" class="tagList">url标签 用于生成一个URL地址，可以通过param向url标签指定参数，从而指定URL发送请求参数。
<p>示范代码：</p>
<p>指定action属性，且使用param传入参数的形式<br />
&lt;s:url&nbsp;&nbsp;action="showbook"&gt;<br />
&lt;s:param&nbsp; name="author"&nbsp; value="'yeeku'"&gt;<br />
&lt;/s:url&gt;</p>
<p><a href="http://www.web-tag.net/73e7d15947f73ed0.htm">更多&nbsp;url&nbsp;信息</a></p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/336501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-10-29 17:21 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/29/336501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jeecms2.4.2的ehcache应用</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/11/334450.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 11 Oct 2010 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/11/334450.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/334450.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/11/334450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/334450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/334450.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: jeecms2.4.2的dao层用的是hibernate,hibernate用ehcache实现了二级缓存.jeecms应用级的ehcache分为两部分:IdCacheSvcImpl、HomepageCacheSvcImpl和ChannelCacheSvcImplIdCacheSvcImpl弥补了hibernate缓存的不足(由于hibernate只支持通过ID查找缓存对象，对于通过唯一属...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/11/334450.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/334450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-10-11 16:49 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/10/11/334450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring3 学习日记</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/28/333260.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Tue, 28 Sep 2010 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/28/333260.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/333260.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/28/333260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/333260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/333260.html</trackback:ping><description><![CDATA[使用springMVC,第一步要配置DispatcherServlet（load-on-startup设置为1），可以灵活匹配url-patter(例如*.do/*.html)。<br />
注解如果没有指定bean的名字，默认为小写开头的类名，就是jpaMovieFinder(类名JpaMovieFinder)，如果你要指定名字，可以这样写@Repository("myMovieFinder")。<br />
<p>&lt;mvc:annotation-driven /&gt;功能很强大，根据Spring参考文档，mvc:annotation-driven提供的功能有：</p>
<p>将org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping和org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter在WebApplicationContext中进行注册，而正是这两个bean完成了把request分配给标注有@Controller的控制器。 <br />
支持数据绑定过程中的类型转换服务 <br />
支持数字、日期、时间等数据的格式化 <br />
支持使用JSR-303的数据验证功能 <br />
支持XML和JSON的读写 <br />
mvc:view-controller的是在WebApplicationContext中注册org.springframework.web.servlet.mvc.ParameterizableViewController，该bean的功能是直接将请求导向到指定的view，而不需要控制器的参与。例如本例直接把用户对&#8220;/&#8221;的请求导向到名字为welcome的view，由该view产生response</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/333260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-09-28 17:09 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/28/333260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EHCache的使用</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/27/333052.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 27 Sep 2010 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/27/333052.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/333052.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/27/333052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/333052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/333052.html</trackback:ping><description><![CDATA[<p><span style="font-size: 14px">在开发高并发量，高性能的网站应用系统时，缓存Cache起到了非常重要的作用。本文主要介绍EHCache的使用，以及使用EHCache的实践经验。<br />
</span><wbr><wbr><wbr><span style="font-size: 14px">笔者使用过多种基于Java的开源Cache组件，其中包括OSCache、JBossCache、EHCache。OSCache功能强大，使用灵活，可用于对象缓存、Filter缓存以及在JSP中直接使用cache标签。笔者在最近的使用过程中发现，在并发量较高时，OSCache会出现线程阻塞和数据错误，通过分析源代码发现是其内部实现的缺陷。JBossCache最大的优点是支持基于对象属性的集群同步，不过JBossCache的配置使用都较复杂，在并发量较高的情况下，对象属性数据在集群中同步也会加大系统的开销。以上两种Cache本文仅作简单介绍，不做深入探讨。</span><br />
<wbr><wbr><wbr>EHCache是来自sourceforge（<a href="http://ehcache.sourceforge.net/"><font color="#008050" size="3">http://ehcache.sourceforge.net/</font></a><font size="3">）的开源项目，也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存，支持LRU、LFU和FIFO多种淘汰算法，支持分布式的Cache，可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache，该Filter可以缓存响应的内容并采用Gzip压缩提高响应速度。</font></p>
<p><font size="3"> <wbr></font><wbr><wbr>EHCache API的基本用法<br />
<wbr><wbr><wbr>首先介绍CacheManager类。它主要负责读取配置文件，默认读取CLASSPATH下的ehcache.xml，根据配置文件创建并管理Cache对象。<br />
<wbr><wbr><wbr>// 使用默认配置文件创建CacheManager<br />
<wbr><wbr><wbr>CacheManager manager = CacheManager.create();<br />
<wbr><wbr><wbr>// 通过manager可以生成指定名称的Cache对象<br />
<wbr><wbr><wbr>Cache cache = cache = manager.getCache("demoCache");<br />
<wbr><wbr><wbr>// 使用manager移除指定名称的Cache对象<br />
<wbr><wbr><wbr>manager.removeCache("demoCache");<br />
可以通过调用manager.removalAll()来移除所有的Cache。通过调用manager的shutdown()方法可以关闭CacheManager。<br />
<wbr><wbr><wbr>有了Cache对象之后就可以进行一些基本的Cache操作，例如：<br />
<wbr><wbr><wbr>//往cache中添加元素<br />
Element element = new Element("key", "value");<br />
cache.put(element);<br />
//从cache中取回元素<br />
Element element = cache.get("key");<br />
element.getValue();<br />
//从Cache中移除一个元素<br />
cache.remove("key");<br />
可以直接使用上面的API进行数据对象的缓存，这里需要注意的是对于缓存的对象都是必须可序列化的。在下面的篇幅中笔者还会介绍EHCache和Spring、Hibernate的整合使用。</p>
<p><font size="3"> <wbr></font><wbr><wbr>配置文件<br />
<wbr><wbr><wbr>配置文件ehcache.xml中命名为demoCache的缓存配置：<br />
<wbr><wbr><wbr>&lt;cache name="demoCache"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>maxElementsInMemory="10000"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>eternal="false"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>overflowToDisk="true"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>timeToIdleSeconds="300"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>timeToLiveSeconds="600"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>memoryStoreEvictionPolic<wbr>y="LFU" /&gt;<br />
<wbr><wbr><wbr><br />
各配置参数的含义：<br />
maxElementsInMemory：缓存中允许创建的最大对象数<br />
eternal：缓存中对象是否为永久的，如果是，超时设置将被忽略，对象从不过期。<br />
timeToIdleSeconds：缓存数据的钝化时间，也就是在一个元素消亡之前，两次访问时间的最大时间间隔值，这只能在元素不是永久驻留时有效，如果该值是 0 就意味着元素可以停顿无穷长的时间。<br />
timeToLiveSeconds：缓存数据的生存时间，也就是一个元素从构建到消亡的最大时间间隔值，这只能在元素不是永久驻留时有效，如果该值是0就意味着元素可以停顿无穷长的时间。<br />
overflowToDisk：内存不足时，是否启用磁盘缓存。<br />
memoryStoreEvictionPolic<wbr><wbr>y：缓存满了之后的淘汰算法。LRU和FIFO算法这里就不做介绍。LFU算法直接淘汰使用比较少的对象，在内存保留的都是一些经常访问的对象。对于大部分网站项目，该算法比较适用。<br />
如果应用需要配置多个不同命名并采用不同参数的Cache，可以相应修改配置文件，增加需要的Cache配置即可。</p>
<p><font size="3"> <wbr></font><wbr><wbr>利用Spring APO整合EHCache<br />
<wbr><wbr><wbr>首先，在CLASSPATH下面放置ehcache.xml配置文件。在Spring的配置文件中先添加如下cacheManager配置：<br />
&lt;bean id="cacheManager"<br />
<wbr><wbr><wbr>class="org.springframework.cache.ehcache.EhCacheManagerFactoryBea<wbr>n"&gt;<br />
&lt;/bean&gt;<br />
配置demoCache：<br />
&lt;bean id="demoCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;<br />
<wbr><wbr><wbr>&lt;property name="cacheManager" ref="cacheManager" /&gt;<br />
<wbr><wbr><wbr>&lt;property name="cacheName"&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;value&gt;demoCache&lt;/value&gt;<br />
<wbr><wbr><wbr>&lt;/property&gt;<br />
&lt;/bean&gt;<br />
接下来，写一个实现org.aopalliance.intercept.MethodInterceptor接口的拦截器类。有了拦截器就可以有选择性的配置想要缓存的 bean 方法。如果被调用的方法配置为可缓存，拦截器将为该方法生成 cache key 并检查该方法返回的结果是否已缓存。如果已缓存，就返回缓存的结果，否则再次执行被拦截的方法，并缓存结果供下次调用。具体代码如下：<br />
public class MethodCacheInterceptor implements MethodInterceptor,<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>InitializingBean {</p>
<p><font size="3"><wbr></font><wbr><wbr>private Cache cache;</p>
<p><font size="3"><wbr></font><wbr><wbr><br />
<wbr><wbr><wbr>public void setCache(Cache cache) {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>this.cache = cache;<br />
<wbr><wbr><wbr>}</p>
<p><font size="3"><wbr></font><wbr><wbr><br />
<wbr><wbr><wbr>public void afterPropertiesSet() throws Exception {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>Assert.notNull(cache,<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>"A cache is required. Use setCache(Cache) to provide one.");<br />
<wbr><wbr><wbr>}</p>
<p><font size="3"><wbr></font><wbr><wbr><br />
<wbr><wbr><wbr>public Object invoke(MethodInvocation invocation) throws Throwable {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>String targetName = invocation.getThis().getClass().getName();<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>String methodName = invocation.getMethod().getName();<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>Object[] arguments = invocation.getArguments();<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>Object result;</p>
<p><font size="3"><wbr></font><wbr><wbr><wbr><wbr><wbr><wbr>String cacheKey = getCacheKey(targetName, methodName, arguments);<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>Element element = null;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>synchronized (this){<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>element = cache.get(cacheKey);</p>
<p><font size="3"><wbr></font><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>if (element == null) {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//调用实际的方法<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>result = invocation.proceed();<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>element = new Element(cacheKey, (Serializable) result);<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>cache.put(element);<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>}<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>}<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>return element.getValue();<br />
<wbr><wbr><wbr>}</p>
<p><font size="3"><wbr></font><wbr><wbr><br />
<wbr><wbr><wbr>private String getCacheKey(String targetName, String methodName,<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Object[] arguments) {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>StringBuffer sb = new StringBuffer();<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>sb.append(targetName).append(".").append(methodName);<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>if ((arguments != null) &amp;&amp; (arguments.length != 0)) {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>for (int i = 0; i &lt; arguments.length; i++) {<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>sb.append(".").append(arguments[i]);<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>}<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>}<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>return sb.toString();<br />
<wbr><wbr><wbr>}<br />
}<br />
synchronized (this)这段代码实现了同步功能。为什么一定要同步？Cache对象本身的get和put操作是同步的。如果我们缓存的数据来自数据库查询，在没有这段同步代码时，当key不存在或者key对应的对象已经过期时，在多线程并发访问的情况下，许多线程都会重新执行该方法，由于对数据库进行重新查询代价是比较昂贵的，而在瞬间大量的并发查询，会对数据库服务器造成非常大的压力。所以这里的同步代码是很重要的。</p>
<p><font size="3"><wbr></font><wbr><wbr>接下来，继续完成拦截器和Bean的配置：<br />
&lt;bean id="methodCacheInterceptor" class="com.xiebing.utils.interceptor.MethodCacheInterceptor"&gt;<br />
<wbr><wbr><wbr>&lt;property name="cache"&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;ref local="demoCache" /&gt;<br />
<wbr><wbr><wbr>&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvi<wbr><wbr>sor"&gt;<br />
<wbr><wbr><wbr>&lt;property name="advice"&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;ref local="methodCacheInterceptor" /&gt;<br />
<wbr><wbr><wbr>&lt;/property&gt;<br />
<wbr><wbr><wbr>&lt;property name="patterns"&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;list&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;value&gt;.*myMethod&lt;/value&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;/list&gt;<br />
<wbr><wbr><wbr>&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<wbr><wbr><wbr><br />
&lt;bean id="myServiceBean"<br />
<wbr><wbr><wbr>class="com.xiebing.ehcache.spring.MyServiceBean"&gt;<br />
&lt;/bean&gt;</p>
<p><font size="3">&lt;bean id="myService" class="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />
<wbr></font><wbr><wbr>&lt;property name="target"&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;ref local="myServiceBean" /&gt;<br />
<wbr><wbr><wbr>&lt;/property&gt;<br />
<wbr><wbr><wbr>&lt;property name="interceptorNames"&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;list&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;value&gt;methodCachePointCut&lt;/value&gt;<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>&lt;/list&gt;<br />
<wbr><wbr><wbr>&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p><font size="3">其中myServiceBean是实现了业务逻辑的Bean，里面的方法myMethod()的返回结果需要被缓存。这样每次对myServiceBean的myMethod()方法进行调用,都会首先从缓存中查找,其次才会查询数据库。使用AOP的方式极大地提高了系统的灵活性，通过修改配置文件就可以实现对方法结果的缓存，所有的对Cache的操作都封装在了拦截器的实现中。</font></p>
<p><font size="3"> <wbr></font><wbr><wbr>CachingFilter功能<br />
使用Spring的AOP进行整合，可以灵活的对方法的的返回结果对象进行缓存。CachingFilter功能可以对HTTP响应的内容进行缓存。这种方式缓存数据的粒度比较粗，例如缓存整张页面。它的优点是使用简单、效率高，缺点是不够灵活，可重用程度不高。<br />
<wbr><wbr><wbr>EHCache使用SimplePageCachingFilter类实现Filter缓存。该类继承自CachingFilter，有默认产生cache key的calculateKey()方法，该方法使用HTTP请求的URI和查询条件来组成key。也可以自己实现一个Filter，同样继承CachingFilter类,然后覆写calculateKey()方法，生成自定义的key。<br />
在笔者参与的项目中很多页面都使用AJAX，为保证JS请求的数据不被浏览器缓存，每次请求都会带有一个随机数参数i。如果使用SimplePageCachingFilter，那么每次生成的key都不一样，缓存就没有意义了。这种情况下，我们就会覆写calculateKey()方法。</p>
<p><font size="3">要使用SimplePageCachingFilter，首先在配置文件ehcache.xml中，增加下面的配置：<br />
&lt;cache name="SimplePageCachingFilter" maxElementsInMemory="10000" eternal="false"<br />
<wbr></font><wbr><wbr><wbr><wbr><wbr><wbr>overflowToDisk="false" timeToIdleSeconds="300" timeToLiveSeconds="600"<br />
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>memoryStoreEvictionPolic<wbr>y="LFU" /&gt;<br />
其中name属性必须为SimplePageCachingFilter，修改web.xml文件，增加一个Filter的配置：<br />
&lt;filter&gt;<br />
<wbr><wbr><wbr>&lt;filter-name&gt;SimplePageCachingFilter&lt;/filter-name&gt;<br />
<wbr><wbr><wbr>&lt;filter-class&gt;net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter&lt;/filter-class&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
<wbr><wbr><wbr>&lt;filter-name&gt;SimplePageCachingFilter&lt;/filter-name&gt;<br />
<wbr><wbr><wbr>&lt;url-pattern&gt;/test.jsp&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p><font size="3">下面我们写一个简单的test.jsp文件进行测试，缓存后的页面每次刷新，在600秒内显示的时间都不会发生变化的。代码如下：<br />
&lt;%<br />
out.println(new Date());<br />
%&gt;</font></p>
<p><font size="3">CachingFilter输出的数据会根据浏览器发送的Accept-Encoding头信息进行Gzip压缩。经过笔者测试，Gzip压缩后的数据量是原来的1/4，速度是原来的4-5倍，所以缓存加上压缩，效果非常明显。<br />
在使用Gzip压缩时，需注意两个问题：<br />
1. <wbr></font><wbr><wbr>Filter在进行Gzip压缩时，采用系统默认编码，对于使用GBK编码的中文网页来说，需要将操作系统的语言设置为：zh_CN.GBK，否则会出现乱码的问题。<br />
2. <wbr><wbr><wbr>默认情况下CachingFilter会根据浏览器发送的请求头部所包含的Accept-Encoding参数值来判断是否进行Gzip压缩。虽然IE6/7浏览器是支持Gzip压缩的，但是在发送请求的时候却不带该参数。为了对IE6/7也能进行Gzip压缩，可以通过继承CachingFilter，实现自己的Filter，然后在具体的实现中覆写方法acceptsGzipEncoding。</p>
<p><font size="3">具体实现参考：<br />
protected boolean acceptsGzipEncoding(HttpServletRequest request) {<br />
<wbr></font><wbr><wbr>final boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0");<br />
<wbr><wbr><wbr>final boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0");<br />
<wbr><wbr><wbr>return acceptsEncoding(request, "gzip") || ie6 || ie7;<br />
}</p>
<p><font size="3"> <wbr></font><wbr><wbr>EHCache在Hibernate中的使用<br />
EHCache可以作为Hibernate的二级缓存使用。在hibernate.cfg.xml中需增加如下设置：<br />
&lt;prop key="hibernate.cache.provider_class"&gt;<br />
<wbr><wbr><wbr>org.hibernate.cache.EhCacheProvider<br />
&lt;/prop&gt;<br />
然后在Hibernate映射文件的每个需要Cache的Domain中，加入类似如下格式信息：<br />
&lt;cache usage="read-write|nonstrict-read-write|read-only" /&gt;<br />
比如：<br />
&lt;cache usage="read-write" /&gt;<br />
最后在配置文件ehcache.xml中增加一段cache的配置，其中name为该domain的类名。<br />
&lt;cache name="domain.class.name"<br />
maxElementsInMemory="10000"<br />
eternal="false"<br />
timeToIdleSeconds="300"<br />
timeToLiveSeconds="600"<br />
overflowToDisk="false"<br />
/&gt;</p>
<p><font size="3"> <wbr></font><wbr><wbr>EHCache的监控<br />
<wbr><wbr><wbr>对于Cache的使用，除了功能，在实际的系统运营过程中，我们会比较关注每个Cache对象占用的内存大小和Cache的命中率。有了这些数据，我们就可以对Cache的配置参数和系统的配置参数进行优化，使系统的性能达到最优。EHCache提供了方便的API供我们调用以获取监控数据，其中主要的方法有：</p>
<p><font size="3">//得到缓存中的对象数<br />
cache.getSize();<br />
//得到缓存对象占用内存的大小<br />
cache.getMemoryStoreSize();<br />
//得到缓存读取的命中次数<br />
cache.getStatistics().getCacheHits()<br />
//得到缓存读取的错失次数<br />
cache.getStatistics().getCacheMisses()</font></p>
<p><font size="3"> <wbr></font><wbr><wbr>分布式缓存<br />
EHCache从1.2版本开始支持分布式缓存。分布式缓存主要解决集群环境中不同的服务器间的数据的同步问题。具体的配置如下：</p>
<p><font size="3">在配置文件ehcache.xml中加入<br />
&lt;cacheManagerPeerProvider<wbr><wbr></font>Factory<br />
<wbr><wbr><wbr>class="net.sf.ehcache.distribution.RMICacheManagerPeerProvi<wbr>derFactory"<br />
<wbr><wbr><wbr>properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446"/&gt;</p>
<p><font size="3">&lt;cacheManagerPeerListenerFactory<br />
<wbr></font><wbr><wbr>class="net.sf.ehcache.distribution.RMICacheManagerPeerListe<wbr>nerFactory"/&gt;</p>
<p><font size="3">另外，需要在每个cache属性中加入<br />
&lt;cacheEventListenerFactor<wbr><wbr></font>y class="net.sf.ehcache.distribution.RMICacheReplicatorFactor<wbr><wbr>y"/&gt;<br />
例如：<br />
&lt;cache name="demoCache"<br />
<wbr>maxElementsInMemory="10000"<br />
<wbr>eternal="true"<br />
<wbr>overflowToDisk="true"&gt;<br />
<wbr>&lt;cacheEventListenerFactor<wbr>y class="net.sf.ehcache.distribution.RMICacheReplicatorFactor<wbr><wbr>y"/&gt;<br />
&lt;/cache&gt;</p>
<p><font size="3">总结<br />
<wbr></font><wbr><wbr>EHCache是一个非常优秀的基于Java的Cache实现。它简单、易用，而且功能齐全，并且非常容易与Spring、Hibernate等流行的开源框架进行整合。通过使用EHCache可以减少网站项目中数据库服务器的访问压力，提高网站的访问速度，改善用户的体验。</p>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/333052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-09-27 14:13 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/09/27/333052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts1 标签</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/23/313675.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Tue, 23 Feb 2010 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/23/313675.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/313675.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/23/313675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/313675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/313675.html</trackback:ping><description><![CDATA[<p>标签库：<br />
&nbsp;&nbsp;&nbsp;&nbsp; a) struts框架下的struts标签库<br />
&nbsp;&nbsp;&nbsp;&nbsp; b) sun jstl c标签库<br />
&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 作用: 1) jsp 和 java代码分离 -- 自定义标签<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用标签来替代Java的代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) struts标签 能够和struts-config.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actionForm等特有的对象进行交互 </p>
<p>struts标签库<br />
&nbsp;&nbsp; html标签 --- 替代基本的html元素 </p>
<p>&nbsp;&nbsp; bean标签 --- 访问JavaBean</p>
<p>&nbsp;&nbsp; logic标签 --- for<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if判断&nbsp; 程序结构的标签化</p>
<p>html标签<br />
&nbsp;1.html标签<br />
&nbsp; &lt;% taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br />
&nbsp; 基本html标记的替代标签</p>
<p>a)基本的html元素标签 (选择使用)<br />
&nbsp;&lt;html:html&gt; *****&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:html locale="true"&gt; 对应 &lt;html lang="zh-CN"&gt;<br />
&nbsp;&lt;html:base&gt; *****&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:base/&gt;&nbsp; 对应 &lt;base href="http://localhost:8080/aa.jsp"&gt;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前页面的地址 <br />
&nbsp;&lt;html:img&gt; *******<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:img page="images/zhangying.gif"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;img src="images/zhangying.gif"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 传参数<br />
&nbsp;&nbsp;&nbsp; &lt;html:img page="jspimage.jsp" paramId="id" paramName="1"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp; &lt;img src="jspimage.jsp?id=1"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;</p>
<p>**** &lt;html:link&gt; 3个属性page href forward<br />
&nbsp;&nbsp; 代替Html中超链接标记<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="sueccess.jsp"&gt;跳转&lt;/a&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:link page="logout.jsp"&gt; 相对路径page<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注销<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:link&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="logout.jsp"&gt;注销&lt;/a&gt;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:link href="http://www.sohu.com"&gt; 绝对路径href<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sohu网站<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:link&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="http://www.sohu.com"&gt;sohu网站&lt;/a&gt;</p>
<p><br />
&nbsp;struts-config.xml中的global-forwards<br />
&nbsp;&nbsp;&nbsp; forward</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:link forward="success"&gt;&nbsp; 对应全局转发<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成功页面<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:link&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="/success.jsp"&gt;成功页面&lt;/a&gt;</p>
<p>&nbsp;传参数:</p>
<p>&nbsp;&nbsp; paramId 指定传参数的名字 id<br />
&nbsp;&nbsp; paramName 指定参数的值 1</p>
<p>&nbsp;&nbsp;&nbsp; &lt;html:link page="/deleteemp.do" paramId="id" paramName="1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除<br />
&nbsp;&nbsp;&nbsp; &lt;/html:link&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp; &lt;a href="/deleteemp.do?id=1"&gt;删除&lt;/a&gt;</p>
<p><br />
&lt;html:rewrite&gt;&nbsp; 输出对应的URI 的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不产生超链接&nbsp; <br />
&nbsp;&lt;html:rewrite page="/deleteemp.do" paramId="id" paramName="1"&gt;<br />
&nbsp;&nbsp;&nbsp; 对应<br />
&nbsp;&nbsp;&nbsp; /deleteemp.do?id=1</p>
<p>b)基本表单标签 -&gt;form表单&nbsp; ******<br />
&nbsp; &lt;html:form&gt;<br />
&nbsp; &lt;html:text&gt;<br />
&nbsp; &lt;html:hidden&gt;<br />
&nbsp; &lt;html:reset&gt;<br />
&nbsp; &lt;html:submit&gt;<br />
&nbsp; &lt;html:password&gt;<br />
&nbsp; &lt;html:checkbox&gt;<br />
&nbsp; &lt;html:radio&gt;<br />
&nbsp; &lt;html:file&gt;&nbsp; ----- 文件类型<br />
&nbsp; &lt;html:select&gt;<br />
&nbsp; &lt;html:option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应基本的表单元素&nbsp; property="" value=""</p>
<p>&nbsp;&nbsp; &lt;input type="text" name="user" value=""&gt;<br />
对应于<br />
&nbsp; &lt;html:text property="user" value=""/&gt;</p>
<p>&lt;input type="checkbox" name="ah" value="1"&gt;体育<br />
&lt;input type="checkbox" name="ah" value="2"&gt;游泳<br />
对应于<br />
&lt;html:checkbox property="ah" value="1"&gt;体育&lt;/html:checkbox&gt;<br />
&lt;html:checkbox property="ah" value="2"&gt;游泳&lt;/html:checkbox&gt;</p>
<p>&nbsp; &lt;html:file&gt; ---文件的上传的标签<br />
&nbsp;&nbsp;&nbsp; common-fileupload-1.0.jar<br />
&nbsp;&nbsp; 实现文件的上传 <br />
&nbsp;&nbsp; actionForm中&nbsp; FormFile的类型 代表file文件</p>
<p>&nbsp;用处： &lt;html:file/&gt;&nbsp; 文件上传得<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:link/&gt;&nbsp; 页面跳转的 </p>
<p><br />
c)错误和正确信息标签&nbsp;&nbsp;&nbsp; *******<br />
&nbsp; jdk的bin中 native2ascii.exe<br />
&nbsp;&nbsp;&nbsp;&nbsp; 编码方式变为Unicode方式<br />
&nbsp; native2ascii -encoding gb2312 applicationResources.properties <br />
ApplicationResources_zh_CN.properties</p>
<p><br />
&nbsp; &lt;html:errors/&gt;<br />
&nbsp;&nbsp;&nbsp; 输出所有actionError的内容</p>
<p>&nbsp; &lt;html:errors property="uname"/&gt;<br />
&nbsp;&nbsp;&nbsp; 输出key=uname对应的内容</p>
<p>&nbsp;</p>
<p>2.bean标签&nbsp;&nbsp; 访问变量的属性或输出值 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 访问JavaBean </p>
<p>&nbsp; a)访问http请求信息和jsp隐式对象<br />
**&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:cookie&gt; cookie访问<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:cookie id="mycookie" name="loginname" value="123"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id -- 自己设置Cookie变量的名字<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name -- Cookie对象的名字<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value -- 默认值<br />
&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="mycookie" property="value"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取出值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="mycookie" property="name"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取出名字<br />
&nbsp; <br />
&nbsp; Cookie c = new Cookie("loginname","northwind");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.getValue()<br />
&nbsp;&nbsp;&nbsp;&nbsp; c.getName()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><br />
***&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:parameter&gt;访问请求的参数request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:parameter id="arg1" name="username" value="north"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="arg1"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应的Java代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.getParameter("username");</p>
<p><br />
****&nbsp; &lt;bean:page&gt; 访问jsp的隐式对象---属性 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getId() -&gt; id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCreationTime()&nbsp; -&gt; creationTime<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response <br />
&nbsp; 所有对象的get方法能访问到的属性 都可以被这个标签访问<br />
&nbsp;&nbsp;&nbsp; 属性的第一个字母变成小写后都可以访问</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:page id="this_session" property="session"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="this_session" property="creationTime"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp; b)访问资源<br />
***&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:message&gt; 访问applicationResources中的消息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:message key="hello.user"/&gt; 输出key的值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:include&gt; 包含资源到一个变量中</p>
<p>&nbsp; 动作 &lt;jsp:include page="testpage1.jsp"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 页面运行结果包含进来<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 等价于下面2句话<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:include id="tp1" page="/testpage1.jsp"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="tp1"/&gt; 输出变量的内容<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出的是页面的内容&nbsp; </p>
<p>&nbsp;&nbsp; c) 定义和输出JavaBean<br />
&nbsp;*****&nbsp; &lt;bean:define&gt; 定义一个变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:define id="aa" value="Hello"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="aa"/&gt;&nbsp; -&gt; Hello</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:define id="bb" name="empbean" property="ename"/&gt;<br />
&nbsp; JavaBean:empbean <br />
&nbsp; 属性ename<br />
&nbsp;&nbsp; 变量&nbsp; String bb = empbean.getEname();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="bb"/&gt; 得到empbean中属性ename的值</p>
<p><br />
&nbsp;***&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write&gt; 显示JavaBean及其属性或变量的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="" property="" scope=""/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name=某个范围中的属性的名字 (对象)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; property=JavaBean中的属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope=访问对象的范围</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>3.logic标签 <br />
&nbsp;a)if else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if a=b then 等于<br />
&nbsp;&nbsp;&nbsp;&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; 大于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小于<br />
&nbsp;字符串<br />
&nbsp;&nbsp;&nbsp;&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; 不匹配<br />
&nbsp;&nbsp;&nbsp;&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; 非空值</p>
<p>&nbsp;b)循环<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;vect.size();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; 对集合的遍历如何做??</p>
<p><br />
a)<br />
&nbsp;存在性<br />
&nbsp; &lt;logic:present/&gt; 是否存在某种变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie="cookie名字" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; header="request中的header" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameter="参数" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="变量或JavaBean" property=""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request/session/application"<br />
&nbsp;&nbsp;&nbsp; 如果存在 就输出标签体的内容 </p>
<p>&nbsp; 相反的标签<br />
&nbsp; &lt;logic:notpresent/&gt;<br />
&nbsp; <br />
&nbsp;是否为空<br />
&nbsp;&nbsp; 空 - ""或null <br />
&nbsp;&nbsp; &lt;logic:empty name="变量或JavaBean" property=""&gt;<br />
&nbsp;&nbsp; &lt;/logic:empty&gt;</p>
<p>&nbsp;是否相等<br />
&nbsp;&nbsp; &lt;logic:equal/&gt;<br />
&nbsp;大于&nbsp; &gt;&nbsp; &lt;logic:greaterThan/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;=&nbsp; &lt;logic:greaterEqual/&gt;<br />
&nbsp;小于&nbsp; &lt;&nbsp; &lt;logic:lessThan/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;= &lt;logic:lessEqual/&gt;<br />
&nbsp; <br />
&nbsp;匹配&nbsp; <br />
&nbsp;&nbsp; &lt;logic:match/&gt;<br />
&nbsp;&nbsp; &lt;logic:nomatch/&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; location 表示的是位置 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从开始匹配 start<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从结束匹配 end</p>
<p>循环<br />
&nbsp;&nbsp;&nbsp; &lt;logic:iterate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector v = new Vector();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add("1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add("2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add("3");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add("4");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("number",v);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;&nbsp; <br />
&nbsp;&nbsp; id定义一个变量 <br />
&nbsp;&nbsp; name定义变量的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:iterate id="ele" name="number"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="ele"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:iterate&gt;<br />
&nbsp;对集合中所有元素的循环访问</p>
<p><br />
&nbsp;indexId 定义循环计数器变量 i<br />
&nbsp;offset&nbsp; 开始元素的位置<br />
&nbsp;length&nbsp; 要输出元素的个数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:iterate id="ele" indexId="index" name="number" offset="1" length="2"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean:write name="index"/&gt;.&lt;bean:write name="ele"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:iterate&gt;</p>
<p><br />
&nbsp; c) logic转发和重定向</p>
<p>&nbsp;&nbsp;&nbsp; &lt;logic:forward name="index"/&gt; 对应global-forwards<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转发到index<br />
&nbsp; &lt;jsp:forward page="index"/&gt;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:redirect page="aa.jsp"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重定向到aa.jsp <br />
&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect("aa.jsp")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
struts中文乱码问题的解决<br />
&nbsp;&lt;1&gt;编码转换函数<br />
&nbsp;&lt;2&gt;过滤器</p>
<br />
<br />
Action和jsp的开发其实就是对Struts标签的运用.掌握标签的熟练程度决定了开发效率.初学者往往对某个数据表示或数据获取,束手无策.一个简单的问题浪费一两天时间也就不足为怪了.导致整个开发进度延后.外面的struts书籍介绍标签和数据传输原理都比较简单,下面我对标签技术和数据传输原理,进行全方位多角度的剖析.希望对各位有所帮助.以此为模版,将大大提高开发效率.以sample为机能名称.<br />
<span style="display: none">D(j Jtw/c&amp;J</span>①画面上有一text框,显现内容为某一数据表中的某一字段.那我们该如何设置和得到此数据呢?<span style="display: none">JAVA中文站社区门户D0FYJF</span><br />
SampleJsp:<span style="display: none">JAVA中文站社区门户U!QS2U&amp;s0E0hVT]3]</span><br />
&nbsp; &lt; html:text name = "sampleForm" property="name" /&gt;<br />
<span style="display: none">{D%],L&amp;N c)K1Y o</span>SampleForm.java: // form文件名必须和jsp中标签的name对应<span style="display: none">JAVA中文站社区门户j+b&amp;YB-k6gn.},m!NX</span><br />
&nbsp; String name; // 必须和jsp中该项目的property一样<br />
<span style="display: none">'hu tXL4qs Z</span>&nbsp; public String getName() { return name; }<br />
<span style="display: none">+Mg*i9[p4lj z"L/L$d</span>&nbsp; public void setName(String name) { this.name = name;}<br />
<span style="display: none">{;b L;ZY3_E)WY</span>变量和方法名,不可以顺意.变量abcd,那方法名就是setAbcd和getAbcd.注意大小写.<span style="display: none">JAVA中文站社区门户Ue TEd</span><br />
jsp中的项目必然全部在form里面有所表示,当然反过来,form里的项目在jsp中不一定全部表示(可能有辅助动作的对象或验证)<span style="display: none">JAVA中文站社区门户 zGr,kJ</span><br />
SampleAction.java <span style="display: none">JAVA中文站社区门户d%Sx"ph N8xg0B0W</span><br />
&nbsp; public ActionForward start(ActionMapping mapping,<br />
<span style="display: none">S9x @.}6^#vW</span>&nbsp; ActionForm argForm, HttpServletRequest req, HttpServletResponse res)<span style="display: none">JAVA中文站社区门户.M']ftn:Qn0v:Z:?</span><br />
&nbsp; throws Exception {<span style="display: none">JAVA中文站社区门户&amp;kPF5f)R$K_M&amp;p</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleForm form = (SampleForm) argForm;<span style="display: none">JAVA中文站社区门户 VS| }2u x9P z5F</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;other codes for get name from db<span style="display: none">JAVA中文站社区门户N1X8?-M0@B)BF</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set name<br />
<span style="display: none">3@F+{-S/C-~}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form.setName(name);<span style="display: none">JAVA中文站社区门户$l(l(K/Z7?9c\5D%Um</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // now text will show the name<br />
<span style="display: none">Uop3fz0zqof</span>&nbsp; }<span style="display: none">JAVA中文站社区门户As a1I7r)u,y;a%H</span><br />
public ActionForward save(ActionMapping mapping,<span style="display: none">JAVA中文站社区门户f X?&amp;m7H4i%n</span><br />
&nbsp; ActionForm argForm, HttpServletRequest req, HttpServletResponse res)<br />
<span style="display: none">#{ SEv+Zhq</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<span style="display: none">JAVA中文站社区门户 AQ O rH*L</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleForm form = (SampleForm) argForm;<br />
<span style="display: none">;d2P8rvl1f2`Z2g;c</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get name<span style="display: none">JAVA中文站社区门户YB#L,~*?sW Y</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = form.getName();<br />
<span style="display: none">S c2G c,DB u$j Po%mf</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;other codes for save name<span style="display: none">JAVA中文站社区门户+JyI7EN'P\%x</span><br />
&nbsp; }<span style="display: none">JAVA中文站社区门户8W9NSD'j</span><br />
jsp和form对应,action操作form,form其实起了传输数据的作用.这就是struts标签的核心原理.得到数据和设置数据没问题了,剩下的工作也就得心应手了. <span style="display: none">JAVA中文站社区门户E@+h'U5J xt</span>
<p>②再看一个处理标签的方法.画面上是一个明细一览表示(表).表示的是数据表user的相关数据(id,name).<br />
<span style="display: none">$~dJBY `AZ</span>SampleJsp: <br />
<span style="display: none">R$k)?Hy/L</span>&nbsp; &lt; logic:present name="sampleForm" property="userList" &gt;<span style="display: none">JAVA中文站社区门户'fz9A/O d</span><br />
&nbsp;&nbsp;&nbsp; &lt; logic:iterate id="user" name=" sampleForm " property="userList"&gt;<span style="display: none">JAVA中文站社区门户%kl@5K,d$e B[~)^</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; tr&gt;<br />
<span style="display: none">2h t { X:|3UF*Y</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; td&gt;&lt; bean:write name="user" property="id" /&gt;&lt; /td&gt;<span style="display: none">JAVA中文站社区门户Y k8k8A Z)} b0cz</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; td&gt;&lt; bean:write name="user" property="name" /&gt;&lt; /td&gt;<span style="display: none">JAVA中文站社区门户6w G6|bM</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; /tr&gt;<span style="display: none">JAVA中文站社区门户F4l N!O8RY DVL</span><br />
&nbsp;&nbsp;&nbsp; &lt; /logic:iterate&gt; <br />
<span style="display: none">j}K%FqP:[FH</span>&nbsp; &lt; /logic:present&gt;</p>
<span style="display: none">C@ U`9l.np"Y:m</span> <span style="display: none">JAVA中文站社区门户;REv(zGUpS#JF,o}</span>
<p>logic:present是逻辑判断,sampleForm中userList为空(无数据或null),下面的东东不显示.<span style="display: none">JAVA中文站社区门户b"V1M@%~Nf</span><br />
logic:iterate是逻辑循环,userList有几条数据,就循环几次.</p>
<span style="display: none">P^`a;FUM!o</span>
<p><span style="display: none">:u6Ki#BvTf</span>&lt; bean:write name="user" property="id" /&gt;是lable标签,显示user这个对象(entity)的id属性.或者说显示数据表user中的一条记录中的id这个列.<span style="display: none">JAVA中文站社区门户7[3QE CC8Jx(l^</span><br />
User.java(就是entity,因为和业务密切,高达不开发,切记切记不可顺意修改.遇到设计有问题,QA日本)<span style="display: none">JAVA中文站社区门户!ziw i H%{3M!~g</span><br />
&nbsp;&nbsp;&nbsp; String id;<span style="display: none">JAVA中文站社区门户-M:L"N2Q'|3u^ L</span><br />
&nbsp;&nbsp;&nbsp; public String getId() { return id; }<span style="display: none">JAVA中文站社区门户+e*Aa| \"p9{</span><br />
&nbsp;&nbsp;&nbsp; public void setId(String id) { this.id = id; }<br />
<span style="display: none">qvf3OI</span>&nbsp;&nbsp;&nbsp; String name;<span style="display: none">JAVA中文站社区门户Qk'CT)P!j</span><br />
&nbsp;&nbsp;&nbsp; public String getName () { return name; }<span style="display: none">JAVA中文站社区门户i _ o'^ h+}z</span><br />
&nbsp;&nbsp;&nbsp; public void setName (String name) { this.name = name; }<br />
<span style="display: none">9DC w*v f(?</span>看到这,是否觉得面熟啊,好象和FORM一样,但有点不一样,不一样在哪里,看下去后,自己感悟吧.<span style="display: none">JAVA中文站社区门户Y4v ZYg</span><br />
SampleForm.java: <span style="display: none">JAVA中文站社区门户E y)B?x X</span><br />
&nbsp;&nbsp;&nbsp; List userList;<span style="display: none">JAVA中文站社区门户U e#ft'y(B3M</span><br />
&nbsp;&nbsp;&nbsp; public List getUserList () { return userList; }<br />
<span style="display: none">9BMO aS&amp;B`</span>&nbsp;&nbsp;&nbsp; public void setUserList (List userList) { this.userList = userList; }<br />
<span style="display: none">Ou.I Ve[Z)f</span>form只要这些,那你会问,id和name,struts如何能得到呢?你不是说过jsp必须和form一样对应吗?不错,一一对应是肯定的. UserList信息已经包含了一切,还需要定义id和name吗?至于struts如何得到数据,那就看下面的action是如何处理的吧.<span style="display: none">JAVA中文站社区门户6_a.o)x b"q8z"x)h</span><br />
SampleAction.java <br />
<span style="display: none">7Ab^"t)N/xl-T</span>public ActionForward start(ActionMapping mapping,<span style="display: none">JAVA中文站社区门户u^+H{|</span><br />
&nbsp; ActionForm argForm, HttpServletRequest req, HttpServletResponse res)<span style="display: none">JAVA中文站社区门户z/\+Y7[&amp;I }</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<span style="display: none">JAVA中文站社区门户3w"Ty z4Rpr"F</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleForm form = (SampleForm) argForm;<br />
<span style="display: none">z`7~ F oS*j o%O</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList userList = new ArrayList();<br />
<span style="display: none">MdzP;P&amp;SfZMG</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user = new User();<br />
<span style="display: none">P U`p"iN`c7^p$I</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setId(1);<span style="display: none">JAVA中文站社区门户7u[t,_~ QO2z</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setName(&#8220;name1&#8221;);<br />
<span style="display: none">p6G5drI,}y</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userList.add(user);<span style="display: none">JAVA中文站社区门户Z(J:ww7U</span></p>
<span style="display: none">JAVA中文站社区门户a ENe~{</span>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user = new User();<br />
<span style="display: none">Kq2k5yQ9w!D7YS|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setId(2);<span style="display: none">JAVA中文站社区门户#H/Dja|</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setName(&#8220;name2&#8221;); <br />
<span style="display: none">P%F%w Cz`NV X</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userList.add(user);<span style="display: none">JAVA中文站社区门户8T\J'|%f%C</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="display: none">JAVA中文站社区门户`0r5O-kfs`t</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set userList<span style="display: none">JAVA中文站社区门户8`Ip Q"};No]k</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form.setUserList(userList);<br />
<span style="display: none">btlJ;zUf</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // now table will show<span style="display: none">JAVA中文站社区门户5~!w#M t{`#[-i</span><br />
&nbsp; }<br />
<span style="display: none">e1olp'r!Z</span>一切搞定.是不是很简单,但估计你还是有点晕.你还是想问我,id和name到底是如何设置的?<br />
<span style="display: none">6Dp!SX#E(e0Mtgu</span>Action设置了userList就够了,它包含够多的信息了. struts看见了你设置了userList.它就知道了这个list里面都user(entity),useruser(entity)里面不是有很多get,set方法吗?<span style="display: none">JAVA中文站社区门户 g'|"K*`2d M</span></p>
<p><span style="display: none">9] `.lIb3{8S</span>再看下下面的东东.<br />
<span style="display: none">!aJDU3Vpa-P</span>&lt; logic:iterate id="user" name=" sampleForm " property="userList"&gt;<br />
<span style="display: none">8e)L!jGU;gO n6a</span>&lt; bean:write name="user" property="id" /&gt;<br />
<span style="display: none">5xNl.TZJ*K</span>id=&#8221;user&#8221;,和name="user" 对应了,明白啥意思吗?.就象循环指明索引一样. property="id"就是要显示的这个索引对应的内容.Struts就是这样来认id和name的.</p>
<span style="display: none">v+x3iZ'T!k2t*o~4T</span> <span style="display: none">JAVA中文站社区门户a7u,x4B_}0C R</span>
<p>③接下来,看一个加强版的table例子,在显示的明细一览,每一行前面加一个radio框,让用户选择哪个user.进行删除操作.<br />
<span style="display: none">eW.L_$@s hi@</span>SampleJsp: <br />
<span style="display: none">-iO"ae^ Z</span>&nbsp; &lt; logic:present name="sampleForm" property="userList" &gt;<br />
<span style="display: none">jQ Rv#f</span>&nbsp; &lt; logic:iterate id="user" name=" sampleForm " property="userList"&gt;<br />
<span style="display: none">2m;R;x8mN'D&amp;i:O@</span>&nbsp; &lt; tr&gt;<span style="display: none">JAVA中文站社区门户so4V[)U1ku</span><br />
&nbsp;&nbsp;&nbsp; &lt; td&gt;<span style="display: none">JAVA中文站社区门户(\ J)]-T I]$gu-H.]#i</span><br />
&nbsp; &lt; html:radio name="sampleForm" property="selectedUserId" value="&lt; %=((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user ")).getId().toString() %&gt;" /&gt;<span style="display: none">JAVA中文站社区门户)EY dmM aC</span><br />
&nbsp;&nbsp; &lt; /td&gt;<span style="display: none">JAVA中文站社区门户(z#T5?.c4kTn ~7}</span><br />
&nbsp;&nbsp; &lt; td&gt;&lt; bean:write name="user" property="id" /&gt;&lt; /td&gt;<span style="display: none">JAVA中文站社区门户h[mxV(D4f</span><br />
&nbsp;&nbsp; &lt; td&gt;&lt; bean:write name="user" property="name" /&gt;&lt; /td&gt;<br />
<span style="display: none">?9ZF1g4\ K'PA</span>&nbsp; &lt; /tr&gt;<br />
<span style="display: none">?+h"F#x e*wdj)F</span>&lt; /logic:iterate&gt; <span style="display: none">JAVA中文站社区门户\[M;B3x"_m</span><br />
&lt; /logic:present&gt;<span style="display: none">JAVA中文站社区门户8Y A c/[Sb</span></p>
<p><span style="display: none">e!d\/^J</span>sampleForm.java:<span style="display: none">JAVA中文站社区门户 dmP:[(qU*|H(? U</span><br />
&nbsp;&nbsp;&nbsp; String selectedUserId; <span style="display: none">JAVA中文站社区门户Z%i| i!F;E+p7gCq</span><br />
&nbsp;&nbsp;&nbsp; public String getSelectedUserId () { return selectedUserId; }<br />
<span style="display: none">0J1J ]qb1r ?y</span>&nbsp;&nbsp;&nbsp; public void setSelectedUserId(String selectedUserId) {<span style="display: none">JAVA中文站社区门户H%\C)M-t9[@#J+y</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.selectedUserId = selectedUserId;<span style="display: none">JAVA中文站社区门户(bAP)K4C8F)M</span><br />
&nbsp;&nbsp;&nbsp; }<span style="display: none">JAVA中文站社区门户6D Q,F V)O*aXAv</span><br />
SampleAction.java <span style="display: none">JAVA中文站社区门户)ytt)ETx</span><br />
public ActionForward delete(ActionMapping mapping,<br />
<span style="display: none">?*ZfUP!z</span>&nbsp; ActionForm argForm, HttpServletRequest req, HttpServletResponse res)<br />
<span style="display: none">4[}K#R6k&amp;J^wKC</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br />
<span style="display: none">A8u`(d,y u/B-O</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleForm form = (SampleForm) argForm;<br />
<span style="display: none">cj}o!Q4MM!_0_</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String selectedUserId = form.getSelectedUserId();<br />
<span style="display: none">]4N%v"SV%GE</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get user by selected id<span style="display: none">JAVA中文站社区门户9H-\j{vQ</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user = getUser(selectedUserId);<span style="display: none">JAVA中文站社区门户z;U}&amp;a)](H</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // delete user<br />
<span style="display: none">e,M$t$k2xf5U</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<span style="display: none">$]cV4SiP1L!w</span>radio框. propertys值对应form里的对象.value值是该行radio对应的user中的id(数据表中user的id是主键),那么当用户选中任何一个radio,struts通过form得到propertys值,就可以得到选中哪个user了,然后进行相应操作.<span style="display: none">JAVA中文站社区门户e%`N$` lb CM</span><br />
设置哪个user被选中,一是通过用户选择,没的说.二,通过程序控制,如果进入初期画面,我要让user.id = &#8216;3&#8217;的radio被选中,只要在初期Action中form.selectedUserId(&#8220;3&#8221;);一切搞定,就一句话,进入初期画面时, user.id = &#8216;3&#8217;的radio被选中了.<span style="display: none">JAVA中文站社区门户1Sj*w*fqj</span></p>
<p><span style="display: none">o/J0{g$nY,{v@</span>注意以下标签<span style="display: none">JAVA中文站社区门户2c7HFGa:JR`#j3s</span><br />
&lt; html:radio name="sampleForm" property="selectedUserId" value="&lt; %= ((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user ")).getId().toString() %&gt;" /&gt;<span style="display: none">JAVA中文站社区门户z"YH9^rqu</span><br />
下面发挥想象一下以下标签啥意思?<span style="display: none">JAVA中文站社区门户^9w8Y]6t n~5Y T</span><br />
&lt; html:radio name="sampleForm" property="selectedUserId" value="&lt; %= ((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user ")).getObject1().getObject1().getObject2()&#8230;&#8230;&#8230;&#8230;getObjectN().getId().toString() %&gt;" /&gt;<span style="display: none">JAVA中文站社区门户3Nj] c0_k+TE$\!R1_)_</span><br />
能看出来什么?<span style="display: none">JAVA中文站社区门户^9~E*V*R7|</span><br />
User包含object1,object2包含object3,&#8230;.objectN-1包含objectN,objectN有id属性.<span style="display: none">JAVA中文站社区门户|6D8`g ypB</span><br />
看出来了吗?灵活运用,想象一下,各个entity和form,action该如何写?</p>
<span style="display: none">(il,eu2zL</span>
<p><span style="display: none">qoG_ I&amp;k</span>④接着介绍一下,checkbox是使用.画面有一排checkbox,如何设置和得到数据呢?先看一个简单点的. <span style="display: none">JAVA中文站社区门户7h5H4deQb</span><br />
&nbsp;&lt; html:checkbox name=" sampleForm" property="chechbox1" value="true" /&gt;<br />
<span style="display: none">.}YP1_(\;[</span>&nbsp;&lt; html:checkbox name=" sampleForm" property="chechbox2" value="false" /&gt;<span style="display: none">JAVA中文站社区门户*o Q \&amp;u9K1@Vn</span><br />
&nbsp;&lt; html:checkbox name=" sampleForm" property="chechbox3" value="true" /&gt;<span style="display: none">JAVA中文站社区门户CO ^ X(Nyz&amp;Z</span><br />
第二个框未选中,其他选中.form里面对应三个String chechbox1,chechbox2, chechbox3;下面来个复杂点的,多选择对话框multibox<span style="display: none">JAVA中文站社区门户-r\6H4~ CXL*c['j</span><br />
SampleJsp中：<br />
<span style="display: none">]n"lTS*^r,V</span>&lt; logic:iterate name = "sampleForm" id="user" property="userList"&gt;<br />
<span style="display: none">2f E5RWPB i</span>&nbsp; &lt; html:multibox property="selectedUsers"&gt;<br />
<span style="display: none">T4y&amp;Zr7ux(Q</span>&nbsp;&nbsp;&nbsp; &lt; bean:write name="user" property="id"/&gt; <br />
<span style="display: none">h\h[-X lMF Q</span>&nbsp; &lt; /html:multibox&gt;<span style="display: none">JAVA中文站社区门户-r-ir MV/^4@"Ot</span><br />
&nbsp; &lt; bean:write name="user" property="name"/&gt; <span style="display: none">JAVA中文站社区门户&amp;f RnHiC0e*Z*CZ</span><br />
&lt; /logic:iterate&gt;<span style="display: none">JAVA中文站社区门户ds T)zS)Huwe^</span></p>
<p><span style="display: none">8h%g6Gd+t^I`</span>SampleForm中:<br />
<span style="display: none">T0R T}E8~</span>&nbsp;&nbsp;&nbsp; private String userList[] = new String[0]; <br />
<span style="display: none">a Aah!KP9A</span>&nbsp;&nbsp;&nbsp; public String[] getUserList () { return userList;}<br />
<span style="display: none">L.CDQv&amp;Dw.QX L</span>&nbsp;&nbsp;&nbsp; public void setUserList(String[]userList) {this.userList = userList;}</p>
<span style="display: none">]YxK\T5X</span>
<p><span style="display: none">l%w"R c-mZAR+F2~</span>&nbsp;&nbsp;&nbsp; private String selectedUsers[] = new String[0];<br />
<span style="display: none">!cS1G}2D J i</span>&nbsp;&nbsp;&nbsp; public String[] getSelectedUsers () {return selectedUsers;}<span style="display: none">JAVA中文站社区门户0r C(f[O</span><br />
&nbsp;&nbsp;&nbsp; public void setSelectedUsers (String[]selectedUsers) {this.selectedUsers = selectedUsers;}</p>
<span style="display: none">KLnKkA8P)^</span> <span style="display: none">JAVA中文站社区门户 u9G e"r'Z7@+u9x</span>
<p>如果我们在初期时在action里对bean赋值：<br />
<span style="display: none">7P%z_(q}a</span>userList = { User(&#8221;1&#8221;,&#8221;name1&#8221;), User(&#8221;2&#8221;, &#8221;name2&#8221;), User(&#8221;3&#8221;,&#8221;name3&#8221;) }<br />
<span style="display: none">ek?^,}Zi</span>selectedUsers = {&#8220;1&#8221;，&#8221;3&#8221;}<br />
<span style="display: none">PH%KG$FV#b%l2z8`*O</span>那画面选中第一第三个选择框.</p>
<span style="display: none">gV+K^9lE.z$G</span> <span style="display: none">JAVA中文站社区门户-LXL7rXS</span>
<p>用户修改选择框,选择了第二,第三个,那么在action里取bean的值<br />
<span style="display: none">Y!Iz0u:n)a/qlG b</span>String selectedItems[] = new String[list.getSize()];<br />
<span style="display: none">L#z-^W)GDj0Ik,C U</span>selectedItems = form.getSelectedItems();<span style="display: none">JAVA中文站社区门户W'J(l&amp;f"wn</span><br />
for ( int i = 0 ; i &lt;&nbsp; selectedItems.length ; ++i ){<span style="display: none">JAVA中文站社区门户*Ua `d8d</span><br />
&nbsp; LOGGER.debug( "selected " + i + ": " + selectedItems[i]);<br />
<span style="display: none">U kQH f</span>}<br />
<span style="display: none">;zD4w6c-E</span>Selected 0 : 2 <span style="display: none">JAVA中文站社区门户A*J9M6Ek#?3m</span><br />
Selected 1 : 3<span style="display: none">JAVA中文站社区门户L Fkt'BW2T</span><br />
selectedUsers = {&#8220;2&#8221;，&#8221;3&#8221;}</p>
<span style="display: none">+P(|#|*\D.CL</span>
<p><span style="display: none">Y b%k4QF0q</span>⑤画面上有一user表,每条数据前面有个button,对应一条记录,如何确定选中那条数据呢??<br />
<span style="display: none">A'L^R"US4{Q</span>SampleJsp:<br />
<span style="display: none">lMbA oh,zZs</span>&lt; logic:iterate id="user" indexId="buttonIndex" name="sampleForm" property="userList"&gt;<span style="display: none">JAVA中文站社区门户A!d h2x x"C/FURZ</span><br />
&lt; tr&gt;<span style="display: none">JAVA中文站社区门户yO @ f vn&amp;\sFD8\|</span><br />
&lt; td&gt;<br />
<span style="display: none">4t$\Fn1U*nC0F^</span>&lt; html:submit property="button" indexed='false' &gt;<span style="display: none">JAVA中文站社区门户y [z]#r^'Ip(dA*t</span><br />
&lt; bean:message key="label.button.selectUser"/&gt;<span style="display: none">JAVA中文站社区门户"cT(ae+\D</span><br />
&lt; /td&gt;<span style="display: none">JAVA中文站社区门户k_f@{7A5F'i+GU8w</span><br />
&lt; td&gt;&lt; bean:write name="user" property="id" /&gt;&lt; /td&gt;<span style="display: none">JAVA中文站社区门户(fShe,IDe</span><br />
&lt; td&gt;&lt; bean:write name="user" property="name" /&gt;&lt; /td&gt;<span style="display: none">JAVA中文站社区门户(P0A`m[ c</span><br />
&lt; /tr&gt;<span style="display: none">JAVA中文站社区门户#}i;N0YMc*l</span><br />
&lt; html:hidden name="sampleForm" property="selectUserIndex" value='&lt; %= "" + buttonIndex %&gt;'/&gt;<span style="display: none">JAVA中文站社区门户,Me!x+} i }v</span><br />
&lt; /logic:iterate&gt;</p>
<span style="display: none">;wD*E*\jjs.yC0|</span> <span style="display: none">JAVA中文站社区门户PsE3O ` g{</span>
<p>SampleAction.java<br />
<span style="display: none">c C IOjh.~e</span>&nbsp;&nbsp; int index = Integer.parseInt(form.getSelectUserIndex());<br />
<span style="display: none">1Eu|1sz6mdn;r3[P</span>&nbsp;&nbsp; 通过一个隐藏变量,得到选中第几条数据,然后就能做相应处理.<span style="display: none">JAVA中文站社区门户[d2I~s</span></p>
<p><span style="display: none">,e&amp;o@aoAB8g</span>⑥上面都是通过form和jsp传输数据的.还有session也能让jsp显示数据.但如果我做为设计者,是不提倡这样做的.为什么就不说了.但日本以前的设计很可能会用到session和jsp传数据.那我就有必要讲一下如何用了?做为高达的设计者还是尽量不要用session和jsp沟通.<span style="display: none">JAVA中文站社区门户&amp;P T]t!br \*R/D</span><br />
有个下拉列表框,里面显示所有用户名称.用session传数据.<span style="display: none">JAVA中文站社区门户%y N@fF9Ox1s</span><br />
SampleJsp:<br />
<span style="display: none">1l&amp;p5p@,|</span>&lt; %pageContext.setAttribute("userList",(List) (FwThreadContext<br />
<span style="display: none">m5n-]2K@:{,S+i</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getAttribute("AllUser")));<span style="display: none">JAVA中文站社区门户V;d {+kp^,] t</span><br />
%&gt;<span style="display: none">JAVA中文站社区门户v7V-L0Pd!c:ay</span><br />
&lt; html:select property="selectedUser"&gt; <span style="display: none">JAVA中文站社区门户"FcE(WT&amp;O I</span><br />
&nbsp; &lt; html:options collection="userList" property="id" labelProperty="name" /&gt;<br />
<span style="display: none">PSH$O'X6F</span>&lt; /html:select&gt;<span style="display: none">JAVA中文站社区门户Y8lE(@C8PR</span></p>
<span style="display: none">JAVA中文站社区门户Q6K lA Y_;db</span>
<p>SampleForm.java:<br />
<span style="display: none">"uH1k%UR'^ Mk6}</span>&nbsp;&nbsp;&nbsp; String selectedUser;<br />
<span style="display: none">A9`r2`-tg ^n| _</span>Form里只要一个selectedUser,表示选择的user. 下拉列表框用session表示.<span style="display: none">JAVA中文站社区门户)R6zAM*?'}</span><br />
在action等地方设置了session的内容,那下拉列表框就能显示内容了.这里session名为AllUser, labelProperty="name"是下拉列表框显示的东东, property="id"是下拉列表框每条数据隐藏的东东.通过property="selectedUser"里得到选中那条数据</p>
<span style="display: none">W_ R8p:O*@Pn x</span>
<p><span style="display: none">'c3|C6X{7`3w&amp;d ^S$m</span>&lt; html:text name="sampleForm" property="name" <br />
<span style="display: none">t0[l+G5X1g{h</span>value="&lt; %= (FwThreadContext.getAttribute("UserName")).toString() %&gt;" /&gt;<span style="display: none">JAVA中文站社区门户Z;zIUBUR</span><br />
这里很简单就是把session名为UserName设置到Text框中.得的时候还是通过form中的name得到.</p>
<span style="display: none">h,u _C,^$E3QIR9No</span>
<p><span style="display: none">W!NK1s_~)E4?.WZ tF</span><br />
<span style="display: none">#s C6c1p0YyI%SS</span>标签宝典:<br />
<span style="display: none">(o)i-ap @</span>1,lable<br />
<span style="display: none">xhDioA6N|</span>&lt; bean:write name="sampleForm" property="name" /&gt;<br />
<span style="display: none">QDa2zv</span>2,text<br />
<span style="display: none">8~/U2KV@%YnV</span>&lt; html:text name="sampleForm " property="name" /&gt;<br />
<span style="display: none">aII4R6`5M</span>3,button<br />
<span style="display: none">%e ]vn@{ }zG</span>&lt; html:submit property="button"&gt;<span style="display: none">JAVA中文站社区门户9FQQS]</span><br />
&lt; bean:message key="label.button.save" /&gt;<span style="display: none">JAVA中文站社区门户\6_yX}.F'U</span><br />
&lt; /html:submit&gt;<span style="display: none">JAVA中文站社区门户'e6{Et&amp;|</span><br />
&lt; html:button property="button" onclick="javascript:openCalendar(date);"&gt;<br />
<span style="display: none">3I}7r,L)qd0e|</span>&lt; bean:message key="label.button.date" /&gt;<br />
<span style="display: none">0_e&amp;v!s5EZ</span>&lt; /html:button&gt;<br />
<span style="display: none">0W!Z7Y9m]-VO4yC</span>4,select <br />
<span style="display: none">.t5BbY(B r!Q"U)j4S</span>&lt; html:select property="selectedUser"&gt; <span style="display: none">JAVA中文站社区门户pV2VYZo+?;@</span><br />
&nbsp; &lt; html:options name="sampleForm" collection="userList" property="id" labelProperty="name" /&gt;<span style="display: none">JAVA中文站社区门户]G*Ru&amp;sE</span><br />
&lt; /html:select&gt;<br />
<span style="display: none">UYqnK_2U3d</span>5,checkbox,multibox<br />
<span style="display: none">,G-y8Q+wJG</span>&nbsp; &lt; html:checkbox name="sampleForm" property="chechbox1" value="true" /&gt;<span style="display: none">JAVA中文站社区门户UR%bS kL5w</span><br />
&nbsp; <br />
<span style="display: none">%[^Le Od-x.cX5nd</span>&nbsp; &lt; logic:iterate name = "sampleForm" id="user" property="userList"&gt;<span style="display: none">JAVA中文站社区门户9q(t2Fe+fo</span><br />
&nbsp;&nbsp;&nbsp; &lt; html:multibox property="selectedUsers"&gt;<br />
<span style="display: none">2j9`m/Nb@</span>&nbsp;&nbsp;&nbsp;&nbsp; &lt; bean:write name="user" property="id"/&gt; <span style="display: none">JAVA中文站社区门户,Q~ V"k?5k6mWz/?2Q</span><br />
&nbsp;&nbsp;&nbsp; &lt; /html:multibox&gt;<br />
<span style="display: none">(pF;VM/C*MQ</span>&nbsp;&nbsp;&nbsp; &lt; bean:write name="user" property="name"/&gt; <br />
<span style="display: none">`@8e'D:m]`e/{</span>&nbsp; &lt; /logic:iterate&gt;<span style="display: none">JAVA中文站社区门户%T!w-`"Q{</span></p>
<p><span style="display: none">p$c(W:ns^[</span>6, 循环逻辑<span style="display: none">JAVA中文站社区门户l*Fo2Ts5W</span><br />
&lt; logic:present name="sampleForm" property="userList" &gt;<br />
<span style="display: none">8wWnFWw^'lk0mp'y</span>&lt; logic:iterate id="user" name=" sampleForm " property="userList"&gt;<span style="display: none">JAVA中文站社区门户`U,]lI`7r ?(]%?</span><br />
&lt; tr&gt;<br />
<span style="display: none">e"kO6{ I g5N*@e</span>&nbsp; &lt; td&gt;<br />
<span style="display: none">;Q(N\.\?J+o+? V</span>&nbsp; &lt; html:radio name="sampleForm" property="selectedUserId" value="&lt; %= ((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user ")).getId().toString() %&gt;" /&gt;<span style="display: none">JAVA中文站社区门户 pFT8L:M%~9zz</span><br />
&nbsp; &lt; /td&gt;<br />
<span style="display: none">V/S$G B0Fl6Z:z \</span>&nbsp; &lt; td&gt;&lt; bean:write name="user" property="id" /&gt;&lt; /td&gt;<br />
<span style="display: none">k;e"H&amp;B6c\#`</span>&nbsp; &lt; td&gt;&lt; bean:write name="user" property="name" /&gt;&lt; /td&gt;<span style="display: none">JAVA中文站社区门户IrRj2QCJ/vp</span><br />
&lt; /tr&gt;<span style="display: none">JAVA中文站社区门户6e0U!i~ DQc7}"Q</span><br />
&lt; /logic:iterate&gt; <span style="display: none">JAVA中文站社区门户9n4]]P}</span><br />
&lt; /logic:present&gt;<span style="display: none">JAVA中文站社区门户3bP axI4{</span></p>
<span style="display: none">JAVA中文站社区门户S&amp;l }5x;|*?d HUU</span>
<p>7,if逻辑<br />
<span style="display: none">wP }1VR_</span>&lt; logic:equal name=" sampleForm " property="showAllFlg" value="true" &gt;<span style="display: none">JAVA中文站社区门户i7lmk s v{$W-R</span><br />
&nbsp; &lt; html:submit property="button"&gt;<span style="display: none">JAVA中文站社区门户I9vLI"J</span><br />
&nbsp;&nbsp;&nbsp; &lt; bean:message key="label.button.all"/&gt;<br />
<span style="display: none">mXO8x_r:_%Q3p</span>&nbsp; &lt; /html:submit&gt;<br />
<span style="display: none">;wO0j{9v</span>&lt; /logic:equal&gt;<span style="display: none">JAVA中文站社区门户-f$Ws1ZGa2bO4\1R*|!\:c'~</span><br />
&lt; logic:equal name=" sampleForm " property=" showAllFlg " value="false" &gt;<span style="display: none">JAVA中文站社区门户]:a^@]3g</span><br />
&nbsp; &lt; html:submit property="button"&gt;<span style="display: none">JAVA中文站社区门户 ^E+Jgd6F</span><br />
&nbsp;&nbsp;&nbsp; &lt; bean:message key="label.button.noall"/&gt;<span style="display: none">JAVA中文站社区门户s'^nc1fw ^{4N</span><br />
&nbsp; &lt; /html:submit&gt;<br />
<span style="display: none">/Z&amp;XC H'AH</span>&lt; /logic:equal&gt;&nbsp;&nbsp;<br />
<span style="display: none">vw"M4Qx</span><span style="display: none">JAVA中文站社区门户:xsk%s!mL_?</span></p>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/313675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-23 08:33 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/23/313675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring事务的几种配置方式</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313585.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 22 Feb 2010 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313585.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/313585.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/313585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/313585.html</trackback:ping><description><![CDATA[1.<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="companyDao"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="dao.hibernate.CompanyDaoImpl"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernateTemplate"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="hibernateTemplate"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;需要被增强的bean通常命名为xxxxTarget&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="companyServiceTarget"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="services.CompanyService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="companyDao"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="companyDao"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;事务管理器&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="txManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;被代理之后的service，它具有事务功能,程序中我们就使用它&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="companyService"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;事务管理器&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="txManager"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;需要被代理的目标&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="target"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="companyServiceTarget"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;optimize可选，true代表使用CGLib,&nbsp;false代表使用jdk&nbsp;proxy&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="optimize"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;事务属性,&nbsp;顺序：　PROPAGATION,&nbsp;ISOLATION,&nbsp;readOnly,&nbsp;-Exceptions,&nbsp;+Exceptions&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionAttributes"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="insert*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="update*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="delete*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="list"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED,&nbsp;readOnly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="search*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED,&nbsp;readOnly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
2.事务模板<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="baseTransactionProxy"</span><span style="color: #ff0000">&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span><span style="color: #ff0000">&nbsp;&nbsp;abstract</span><span style="color: #0000ff">="true"</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">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&nbsp; &lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionAttributes"</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">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;本文仅简单用一种方式说明。所有方法起事务，可以修改以精细和区别性控制事务&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;<br />
</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</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">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;业务对象&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="authService"</span><span style="color: #ff0000">&nbsp;parent</span><span style="color: #0000ff">="baseTransactionProxy"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="target"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.xxxx.cms.service.AuthorityService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="authDao"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="authDao"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</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">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span></div>
3.声明式事务配置<br />
通过过&lt;tx:annotation-driven trsanction-manager="transactionManager"&gt;一行配置文件，凡是带有@Transacial的bean便自动具有事务的功能
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/313585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-22 10:51 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring, hibernate与struts集成的大概思路</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311298.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sat, 30 Jan 2010 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311298.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/311298.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/311298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/311298.html</trackback:ping><description><![CDATA[这篇文章是笔者在再次读了夏昕的《Spring Guide》后的一些总结。由于本人最熟悉的是Struts，而对Spring、Hibernate还没有很多的实践经验，所以虽然这篇文章讲的是三者的集成，但主要还是以Struts为中心。 <br />
<br />
&nbsp;&nbsp;&nbsp; 首先看一下Struts与Spring的集成。 <br />
<br />
&nbsp;&nbsp;&nbsp; 首先看一下在struts-config.xml中需要做的改动，最开始是加入插件声明：
<div style="width: 500px; overflow: auto">
<pre style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 4px; background-color: rgb(237,237,237); padding-left: 4px; padding-right: 4px; border-top: black 1px solid; border-right: black 1px solid; padding-top: 4px">
<div><span style="color: rgb(0,0,0)">&lt;struts-config&gt; <br />
&lt;plug-in <br />
className="org.springframework.web.struts.ContextLoaderPlugIn"&gt; <br />
&lt;set-property property="contextConfigLocation" <br />
value="/WEB-INF/applicationContext.xml" /&gt; <br />
&lt;/plug-in&gt; <br />
&lt;/struts-config&gt; <br />
</span></div>
<br />
</pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 还有一个需要在Struts配置文件中改的是它的ActionMapping部分，这个在后面再说。 <br />
<br />
&nbsp;&nbsp;&nbsp; 事实上Struts中加入Spring并不是很复杂，最重要的是我们需要清楚系统是不是一定要Spring，即Spring的所谓依赖注入等特性对开发的意义是不是要大于使用Spring后增加的开发成本。 <br />
<br />
&nbsp;&nbsp;&nbsp; 下面用图来说明Struts与Spring结合后的程序运行基本流程：&nbsp;<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/zhaozhenlin1224/20078222137.jpg" width="672" height="910" /><br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 如上所示，Struts与Spring集成最重要的一点就是改变struts-config.xml中的Action-Mapping设置，在进入Struts的Action之前，Spring就获得了控制权。 <br />
<br />
&nbsp;&nbsp;&nbsp; Spring和Struts集成的部分就先说到这里。 <br />
<br />
&nbsp;&nbsp;&nbsp; 有关Struts和Hibernate的集成，内容不是很复杂，我归纳了以下几个要点： <br />
<br />
&nbsp;&nbsp;&nbsp; 1、Hibernate-Context.xml <br />
<br />
&nbsp;&nbsp;&nbsp; 这个文件的&lt;bean&gt;项中需要设定SessionFactory属性，Spring已经整合了SessionFactory设置，所以无需hibernate.cfg.xml再设了。同时，这个项中也可以设定映射文件.hbm.xml的列表。 <br />
<br />
&nbsp;&nbsp;&nbsp; 2、DAO继承HibernateDaoSupport，以调用其函数 <br />
<br />
&nbsp;&nbsp;&nbsp;HibnernateDaoSupport实现了HibernateTemplate与SessionFactory的关联。HibernateTemplate（用HibnernateDaoSupport里的getHibernateTemplate()可以获得）对Hibernate Session进行了封装，可省去获得Session实例、事务启动与提交/回滚以及异常处理等一系列步骤，所以非常简单。 <br />
<br />
&nbsp;&nbsp;&nbsp; 上面从两个方面讲了Struts、Spring和Hibernate三者的集成，最后简单归纳一下： <br />
<br />
&nbsp;&nbsp;&nbsp; 通过修改Struts的配置文件，Spring得以获得对Struts中Action的控制权，同时也将Spring的特性加入了Struts。而与Hibernate结合以后，通过利用上述的Spring特征，简化了数据库操作。</p>
<div style="position: absolute; width: 104px; height: 104px">Type text here</div>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/311298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-01-30 09:45 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strut1 tiles</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311295.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sat, 30 Jan 2010 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311295.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/311295.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/311295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/311295.html</trackback:ping><description><![CDATA[<p>首先定义definition,指定path<br />
&nbsp; &lt;definition name="adminRootLayout" path="/adminRootLayout.jsp" /&gt;<br />
&nbsp; &lt;definition extends="adminRootLayout" name="admin.baseinfo"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;put name="adminmain" value="/adminbaseinfo.jsp" /&gt;<br />
&nbsp; &lt;/definition&gt;<br />
&nbsp; &lt;definition extends="adminRootLayout" name="admin.open"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;put name="adminmain" value="/adminopen.jsp" /&gt;<br />
&nbsp; &lt;/definition&gt;</p>
<p>&lt;tiles:insert attribute="adminmain"/&gt;</p>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/311295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-01-30 09:43 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>