?? 轉換器(converter)——struts 2_0中的魔術師 - max on java - blogjava.htm
字號:
align=top> }</SPAN> </SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedBlockEnd.gif"
align=top>}</SPAN> </SPAN></DIV>
<P>再接下來,在源代碼文件夾下新建xwork-conversion.properties,并在其中添加如下代碼:<BR></P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN
style="COLOR: #000000">java.util.Locale</SPAN> <SPAN
style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #000000">tutorial.LocaleConverter</SPAN> </DIV>
<P>發布運行應用程序,在瀏覽器中鍵入<A
href="http://localhost:8080/Struts2_Converter/HelloWorld.action">http://localhost:8080/Struts2_Converter/HelloWorld.action</A>,輸出頁面如圖2所示:<BR><IMG
alt="圖2 HelloWorld英文輸出"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/r_img2.gif"><BR><SPAN
style="FONT-SIZE: smaller; FONT-STYLE: italic">圖2 HelloWorld英文輸出</SPAN></P>
<P>在Locale輸入框中輸入“zh_CN”,按“Submit”提交,出現如圖3所示頁面:<BR><IMG alt="圖3 HelloWorld中文輸出"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/r_img3.gif"><BR><SPAN
style="FONT-SIZE: smaller; FONT-STYLE: italic">圖3 HelloWorld中文輸出</SPAN></P>
<P>上述例子中,Locale文本輸入框對應是Action中的類型為java.util.Locale的屬性loc,所以需要創建一個自定義轉變器實現兩者間的轉換。所有的Struts
2.0中的轉換器都必須實現<A
href="http://www.ognl.org/2.6.9/Documentation/javadoc/ognl/TypeConverter.html">ognl.TypeConverter</A>接口。
為了簡單起見,OGNL包也為你提供了<A
href="http://www.ognl.org/2.6.9/Documentation/javadoc/ognl/DefaultTypeConverter.html">ognl.DefaultTypeConverter</A>類去幫助您實現轉換器。在例子中,LocaleConverter繼承了ognl.DefaultTypeConverter,重載了其方法原型為“public
Object convertValue(Map context, Object value, Class toType)”的方法。下面簡單地介紹一下函數的參數:
</P>
<OL>
<LI>context——用于獲取當前的ActionContext
<LI>value——需要轉換的值
<LI>toType——需要轉換成的目標類型 </LI></OL>實現轉換器,我們需要通過配置告訴Struts 2.0。我們可以通過以下兩種方法做到這點:
<OL>
<LI>配置全局的類型轉換器,也即是上例的做法——在源代碼文件夾下,新建一個名為“xwork-conversion.properties”的配置文件,并在文件中加入“待轉換的類型的全名(包括包路徑和類名)=轉換器類的全名”對;
<LI>應用于某個特定類的類型轉換器,做法為在該類的包中添加一個格式為“類名-conversion.properties”的配置文件,并在文件中加入“待轉換的屬性的名字=轉換器類的全名”對。上面的例子也可以這樣配置——在源代碼文件夾的tutorial包下新建名為“HelloWorld-conversion.properties”文件,并在其中加入“loc=tutorial.LocaleConverter”。</LI></OL>
<CENTER>
<TABLE
style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left"
cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD
style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/lightbulb_on.gif"></TD>
<TD
style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 華文仿宋">在繼承DefaultTypeConverter時,如果是要將value轉換成其它非字符串類型時,要記住value是String[]類型,而不是String類型。它是通過request.getParameterValues(String
arg)來獲得的,所以不要試圖將其強行轉換為String類型。 </TD></TR></TBODY></TABLE></CENTER>
<H2>已有的轉換器</H2>
<P>對于一此經常用到的轉換器,如日期、整數或浮點數等類型,Struts 2.0已經為您實現了。下面列出已經實現的轉換器。 </P>
<OL>
<LI>預定義類型,例如int、boolean、double等;
<LI>日期類型, 使用當前區域(Locale)的短格式轉換,即DateFormat.getInstance(DateFormat.SHORT);
<LI>集合(Collection)類型, 將request.getParameterValues(String
arg)返回的字符串數據與java.util.Collection轉換;
<LI>集合(Set)類型, 與List的轉換相似,去掉相同的值;
<LI>數組(Array)類型,
將字符串數組的每一個元素轉換成特定的類型,并組成一個數組。</LI></OL>對于已有的轉換器,大家不必再去重新發明輪子。Struts在遇到這些類型時,會自動去調用相應的轉換器。
<H2>批量封裝對象(Bean)</H2>
<P>不知道大家是否遇過這種情況,在一個頁面里同時提交幾個對象。例如,在發布產品的頁面,同時發布幾個產品。我在之前一個項目就遇到過這種需求,當時用的是Struts
1.x。那是一個痛苦的經歷,我在Google搜了很久都沒有理想的結果。幸運的是,在Struts
2.0中這種痛苦將一去不復返。下面我就演示一下如何實現這個需求。</P>
<P>首先,在源代碼文件夾下的tutorial包中新建Product.java文件,內容如下:<BR></P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/None.gif"
align=top><SPAN style="COLOR: #0000ff">package</SPAN><SPAN
style="COLOR: #000000"> tutorial;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/None.gif"
align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN
style="COLOR: #000000"> java.util.Date;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG id=Codehighlighter1_64_542_Open_Image
onclick="this.style.display='none'; Codehighlighter1_64_542_Open_Text.style.display='none'; Codehighlighter1_64_542_Closed_Image.style.display='inline'; Codehighlighter1_64_542_Closed_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedBlockStart.gif"
align=top><IMG id=Codehighlighter1_64_542_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_64_542_Closed_Text.style.display='none'; Codehighlighter1_64_542_Open_Image.style.display='inline'; Codehighlighter1_64_542_Open_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - 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"> Product </SPAN><SPAN
id=Codehighlighter1_64_542_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="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_64_542_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> String name;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - 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">double</SPAN><SPAN
style="COLOR: #000000"> price;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> Date dateOfProduction;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> <BR><IMG id=Codehighlighter1_180_210_Open_Image
onclick="this.style.display='none'; Codehighlighter1_180_210_Open_Text.style.display='none'; Codehighlighter1_180_210_Closed_Image.style.display='inline'; Codehighlighter1_180_210_Closed_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_180_210_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_180_210_Closed_Text.style.display='none'; Codehighlighter1_180_210_Open_Image.style.display='inline'; Codehighlighter1_180_210_Open_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> Date getDateOfProduction() </SPAN><SPAN
id=Codehighlighter1_180_210_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="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_180_210_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">
dateOfProduction;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> <BR><IMG id=Codehighlighter1_270_317_Open_Image
onclick="this.style.display='none'; Codehighlighter1_270_317_Open_Text.style.display='none'; Codehighlighter1_270_317_Closed_Image.style.display='inline'; Codehighlighter1_270_317_Closed_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_270_317_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_270_317_Closed_Text.style.display='none'; Codehighlighter1_270_317_Open_Image.style.display='inline'; Codehighlighter1_270_317_Open_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - 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"> setDateOfProduction(Date dateOfProduction) </SPAN><SPAN
id=Codehighlighter1_270_317_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="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_270_317_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.dateOfProduction
</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">
dateOfProduction;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> <BR><IMG id=Codehighlighter1_346_364_Open_Image
onclick="this.style.display='none'; Codehighlighter1_346_364_Open_Text.style.display='none'; Codehighlighter1_346_364_Closed_Image.style.display='inline'; Codehighlighter1_346_364_Closed_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_346_364_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_346_364_Closed_Text.style.display='none'; Codehighlighter1_346_364_Open_Image.style.display='inline'; Codehighlighter1_346_364_Open_Text.style.display='inline';"
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> String getName() </SPAN><SPAN
id=Codehighlighter1_346_364_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="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_346_364_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> name;<BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="轉換器(Converter)——Struts 2_0中的魔術師 - Max On Java - BlogJava.files/InBlock.gif"
align=top> <BR><IMG id=Codehighlighter1_402_425_Open_Image
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -