📄 strus 2的新表单标志的使用 - max on java - blogjava.htm
字号:
style="COLOR: #0000ff">="Technology"</SPAN><SPAN style="COLOR: #ff0000">
</SPAN><SPAN style="COLOR: #0000ff">/></SPAN><SPAN
style="COLOR: #000000"><BR> </SPAN><SPAN
style="COLOR: #0000ff"></</SPAN><SPAN
style="COLOR: #800000">s:form</SPAN><SPAN
style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN
style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">body</SPAN><SPAN
style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN
style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">html</SPAN><SPAN
style="COLOR: #0000ff">></SPAN></DIV><SPAN
style="FONT-SIZE: smaller; FONT-STYLE: italic">清单4
WebContent/doubleselect.jsp</SPAN>
<P>分布运行应用程序,在浏览器中键入:<A
href="http://localhost:8080/Struts2_CoolTags/doubleselect.action">http://localhost:8080/Struts2_CoolTags/doubleselect.action</A>,出现如下图所示页面:</P>
<P><IMG alt=doubleselect.jsp页面
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/r_doubleselect.gif"><BR><SPAN
style="FONT-SIZE: smaller; FONT-STYLE: italic">清单5 doubleselect.jsp页面</SPAN></P>
<H2>3、<s: token /></H2>
<P>这个标志可能大家不常用,不过本人认为它还是挺有用的。在使用Struts
1.x时,因为跳转通常是用Forward(而不是Redirect)实现的,所以当用户完成请求后,按“F5”刷新页面时,就会重新提交上次的请求,这样经常会出错。要解决这个问题,<s:token
/>可以帮你忙。</P>
<H3>实现原理</H3>
<P>在页面加载时,<s: token />产生一个GUID(Globally Unique
Identifier,全局唯一标识符)值的隐藏输入框如:</P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN
style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">input
</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN
style="COLOR: #0000ff">="hidden"</SPAN><SPAN style="COLOR: #ff0000">
name</SPAN><SPAN style="COLOR: #0000ff">="struts.token.name"</SPAN><SPAN
style="COLOR: #ff0000"> value</SPAN><SPAN
style="COLOR: #0000ff">="struts.token"</SPAN><SPAN
style="COLOR: #0000ff">/></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN
style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">input
</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN
style="COLOR: #0000ff">="hidden"</SPAN><SPAN style="COLOR: #ff0000">
name</SPAN><SPAN style="COLOR: #0000ff">="struts.token"</SPAN><SPAN
style="COLOR: #ff0000"> value</SPAN><SPAN
style="COLOR: #0000ff">="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"</SPAN><SPAN
style="COLOR: #0000ff">/></SPAN></DIV><SPAN
style="FONT-SIZE: smaller; FONT-STYLE: italic">清单6 <s:token
/>的HTML输出</SPAN>
<P>同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。</P>
<H3>具体实现</H3>
<P>首先看一下Action的代码:</P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/None.gif" align=top><SPAN
style="COLOR: #0000ff">package</SPAN><SPAN style="COLOR: #000000">
tutorial;<BR><IMG src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/None.gif"
align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN
style="COLOR: #000000"> com.opensymphony.xwork2.ActionSupport;<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG id=Codehighlighter1_115_471_Open_Image
onclick="this.style.display='none'; Codehighlighter1_115_471_Open_Text.style.display='none'; Codehighlighter1_115_471_Closed_Image.style.display='inline'; Codehighlighter1_115_471_Closed_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedBlockStart.gif"
align=top><IMG id=Codehighlighter1_115_471_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_115_471_Closed_Text.style.display='none'; Codehighlighter1_115_471_Open_Image.style.display='inline'; Codehighlighter1_115_471_Open_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ContractedBlock.gif"
align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN
style="COLOR: #000000"> CoolTagAction </SPAN><SPAN
style="COLOR: #0000ff">extends</SPAN><SPAN style="COLOR: #000000"> ActionSupport
</SPAN><SPAN id=Codehighlighter1_115_471_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_115_471_Open_Text><SPAN style="COLOR: #000000">{
<BR><IMG src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">final</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN
style="COLOR: #000000"> serialVersionUID </SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #000000">6820659617470261780L</SPAN><SPAN
style="COLOR: #000000">;<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> String message;<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
<BR><IMG id=Codehighlighter1_244_265_Open_Image
onclick="this.style.display='none'; Codehighlighter1_244_265_Open_Text.style.display='none'; Codehighlighter1_244_265_Closed_Image.style.display='inline'; Codehighlighter1_244_265_Closed_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_244_265_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_244_265_Closed_Text.style.display='none'; Codehighlighter1_244_265_Open_Image.style.display='inline'; Codehighlighter1_244_265_Open_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> String getMessage() </SPAN><SPAN
id=Codehighlighter1_244_265_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_244_265_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
</SPAN><SPAN
style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">
message;<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif"
align=top><BR><IMG id=Codehighlighter1_308_337_Open_Image
onclick="this.style.display='none'; Codehighlighter1_308_337_Open_Text.style.display='none'; Codehighlighter1_308_337_Closed_Image.style.display='inline'; Codehighlighter1_308_337_Closed_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_308_337_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_308_337_Closed_Text.style.display='none'; Codehighlighter1_308_337_Open_Image.style.display='inline'; Codehighlighter1_308_337_Open_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN
style="COLOR: #000000"> setMessage(String message) </SPAN><SPAN
id=Codehighlighter1_308_337_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_308_337_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN
style="COLOR: #000000">.message </SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> message;<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
@Override<BR><IMG id=Codehighlighter1_377_468_Open_Image
onclick="this.style.display='none'; Codehighlighter1_377_468_Open_Text.style.display='none'; Codehighlighter1_377_468_Closed_Image.style.display='inline'; Codehighlighter1_377_468_Closed_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_377_468_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_377_468_Closed_Text.style.display='none'; Codehighlighter1_377_468_Open_Image.style.display='inline'; Codehighlighter1_377_468_Open_Text.style.display='inline';"
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> String execute() </SPAN><SPAN
id=Codehighlighter1_377_468_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_377_468_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
System.out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Executing action,
your message is </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN
style="COLOR: #000000"> message);<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/InBlock.gif" align=top>
</SPAN><SPAN
style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">
SUCCESS;<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN></SPAN><SPAN style="COLOR: #000000">
<BR><IMG
src="Strus 2的新表单标志的使用 - Max On Java - BlogJava.files/ExpandedBlockEnd.gif"
align=top>}</SPAN></SPAN></DIV><SPAN
style="FONT-SIZE: smaller; FONT-STYLE: italic">清单7
src/tutorial/CoolTagAction.java</SPAN>
<P>以上代码一目了然,再看看JSP的写法:</P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN
style="COLOR: #000000">%@ page language="java" contentType="text/html;
charset=utf-8" pageEncoding="utf-8" %><BR></SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #ffff00"><%</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ taglib prefix</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> </SPAN><SPAN
style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%></SPAN><SPAN
style="COLOR: #000000"><BR><BR></SPAN><SPAN
style="COLOR: #0000ff"><!</SPAN><SPAN style="COLOR: #ff00ff">DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</SPAN><SPAN
style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN
style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">html </SPAN><SPAN
style="COLOR: #ff0000">xmlns</SPAN><SPAN
style="COLOR: #0000ff">="http://www.w3.org/1999/xhtml"</SPAN><SPAN
style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN
style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">head</SPAN><SPAN
style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR>
</SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN
style="COLOR: #800000">title</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN
style="COLOR: #000000">Struts 2 Cool Tags - </SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -