隨筆-34  評(píng)論-1965  文章-0  trackbacks-0

          在我已往的Struts 1.x項(xiàng)目經(jīng)驗(yàn)中,有個(gè)問(wèn)題不時(shí)的出現(xiàn)——在創(chuàng)建FormBean時(shí),對(duì)于某個(gè)屬性到底應(yīng)該用String還是其它類型?

          開發(fā)Web應(yīng)用程序與開發(fā)傳統(tǒng)桌面應(yīng)用程序不同,Web應(yīng)用程序?qū)嶋H上是分布個(gè)不同的主機(jī)(當(dāng)然也可以同一個(gè)主機(jī),不過(guò)比較少見)上的兩個(gè)進(jìn)程之間互交。這種互交建立在HTTP之上,它們互相傳遞是都是字符串。換句話說(shuō), 服務(wù)器可以的接收到的來(lái)自用戶的數(shù)據(jù)只能是字符串或字符數(shù)組,而在服務(wù)器上的對(duì)象中,這些數(shù)據(jù)往往有多種不同的類型,如日期(Date),整數(shù)(int),浮點(diǎn)數(shù)(float)或自定義類型(UDT)等,如圖1所示。因此,我們需要服務(wù)器端將字符串轉(zhuǎn)換為適合的類型。

          圖1 UI與服務(wù)器對(duì)象關(guān)系
          圖1 UI與服務(wù)器對(duì)象關(guān)系

          同樣的問(wèn)題也發(fā)生在使用UI展示服務(wù)器數(shù)據(jù)的情況。HTML的Form控件不同于桌面應(yīng)用程序可以表示對(duì)象,其值只能為字符串類型,所以我們需要通過(guò)某種方式將特定對(duì)象轉(zhuǎn)換成字符串。

          要實(shí)現(xiàn)上述轉(zhuǎn)換,Struts 2.0中有位魔術(shù)師可以幫到你——Converter。有了它,你不用一遍又一遍的重復(fù)編寫諸如此類代碼:

          Date birthday = DateFormat.getInstance(DateFormat.SHORT).parse(strDate);
          <input type="text" value="<%= DateFormat.getInstance(DateFormat.SHORT).format(birthday) %>" />

          好了,現(xiàn)在讓我們來(lái)看一個(gè)例子。

          轉(zhuǎn)換器——Hello World

          在我的上一篇文章《在Struts 2.0中國(guó)際化(i18n)您的應(yīng)用程序》的最后我舉了一個(gè)可以讓用戶方便地切換語(yǔ)言的例子,下面例子與其相似,但實(shí)現(xiàn)方法不同。

          首先,如《在Struts 2.0中國(guó)際化(i18n)您的應(yīng)用程序》的第一個(gè)例子一樣,創(chuàng)建和配置默認(rèn)的資源文件;

          接著,新建源代碼文件夾下的tutorial包創(chuàng)建HelloWorld.java文件,代碼如下:

          package tutorial;

          import java.util.Locale;

          import com.opensymphony.xwork2.ActionSupport;
          import com.opensymphony.xwork2.util.LocalizedTextUtil;

          public class HelloWorld extends ActionSupport {
          ? ?
          private String msg;
          ? ?
          private Locale loc = Locale.US;
          ??
          ? ?
          public String getMsg() {
          ? ? ? ?
          return msg; ? ? ? ?
          ? ?}

          ? ?
          ? ?
          public Locale getLoc() {
          ? ? ? ?
          return loc;
          ? ?}

          ? ?
          ? ?
          public void setLoc(Locale loc) {
          ? ? ? ?
          this .loc = loc;
          ? ?}

          ? ?
          ? ?@Override
          ? ?
          public String execute() {
          ? ? ? ?
          // LocalizedTextUtil是Struts 2.0中國(guó)際化的工具類,<s:text>標(biāo)志就是通過(guò)調(diào)用它實(shí)現(xiàn)國(guó)際化的
          ? ? ? ?msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc);
          ? ? ? ?
          return SUCCESS;
          ? ?}

          }

          然后,在源代碼文件夾下的struts.xml加入如下代碼新建Action:

          < package name ="ConverterDemo" extends ="struts-default" >
          ? ?
          < action name ="HelloWorld" class ="tutorial.HelloWorld" >
          ? ? ? ?
          < result > /HelloWorld.jsp </ result >
          ? ?
          </ action >
          </ package >

          再在Web文件夾下,新建 HelloWorld.jsp,代碼如下:

          < %@ page ? contentType ="text/html; charset=UTF-8" % >
          < %@taglib prefix ="s" uri ="/struts-tags" % >
          < html >
          < head >
          ? ?
          < title > Hello World </ title >
          </ head >
          < body >
          ? ?
          < s:form action ="HelloWorld" theme ="simple" > ? ? ? ? ? ?
          ? ? ? ? Locale:
          < s:textfield name ="loc" /> &nbsp; < s:submit />
          ? ?
          </ s:form > ? ?
          ? ?
          < h2 >< s:property value ="msg" /></ h2 >
          </ body >
          </ html >

          接下來(lái),在源代碼文件夾的tutorial包中新建LocaleConverter.java文件,代碼如下:

          package tutorial;

          import java.util.Locale;
          import java.util.Map;

          public class LocaleConverter extends ognl.DefaultTypeConverter {
          ? ?@Override
          ? ?
          public Object convertValue(Map context, Object value, Class toType) {
          ? ? ? ?
          if (toType == Locale. class ) {
          ? ? ? ? ? ?String locale
          = ((String[]) value)[ 0 ];
          ? ? ? ? ? ?
          return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));
          ? ? ? ?}
          else if (toType == String. class ) {
          ? ? ? ? ? ?Locale locale
          = (Locale) value;
          ? ? ? ? ? ?
          return locale.toString();
          ? ? ? ?}

          ? ? ? ?
          return null ;
          ? ?}

          }

          再接下來(lái),在源代碼文件夾下新建xwork-conversion.properties,并在其中添加如下代碼:

          java.util.Locale = tutorial.LocaleConverter

          發(fā)布運(yùn)行應(yīng)用程序,在瀏覽器中鍵入http://localhost:8080/Struts2_Converter/HelloWorld.action,輸出頁(yè)面如圖2所示:
          圖2 HelloWorld英文輸出
          圖2 HelloWorld英文輸出

          在Locale輸入框中輸入“zh_CN”,按“Submit”提交,出現(xiàn)如圖3所示頁(yè)面:
          圖3 HelloWorld中文輸出
          圖3 HelloWorld中文輸出

          上述例子中,Locale文本輸入框?qū)?yīng)是Action中的類型為java.util.Locale的屬性loc,所以需要?jiǎng)?chuàng)建一個(gè)自定義轉(zhuǎn)變器實(shí)現(xiàn)兩者間的轉(zhuǎn)換。所有的Struts 2.0中的轉(zhuǎn)換器都必須實(shí)現(xiàn)ognl.TypeConverter接口。 為了簡(jiǎn)單起見,OGNL包也為你提供了ognl.DefaultTypeConverter類去幫助您實(shí)現(xiàn)轉(zhuǎn)換器。在例子中,LocaleConverter繼承了ognl.DefaultTypeConverter,重載了其方法原型為“public Object convertValue(Map context, Object value, Class toType)”的方法。下面簡(jiǎn)單地介紹一下函數(shù)的參數(shù):

          1. context——用于獲取當(dāng)前的ActionContext
          2. value——需要轉(zhuǎn)換的值
          3. toType——需要轉(zhuǎn)換成的目標(biāo)類型
          實(shí)現(xiàn)轉(zhuǎn)換器,我們需要通過(guò)配置告訴Struts 2.0。我們可以通過(guò)以下兩種方法做到這點(diǎn):
          1. 配置全局的類型轉(zhuǎn)換器,也即是上例的做法——在源代碼文件夾下,新建一個(gè)名為“xwork-conversion.properties”的配置文件,并在文件中加入“待轉(zhuǎn)換的類型的全名(包括包路徑和類名)=轉(zhuǎn)換器類的全名”對(duì);
          2. 應(yīng)用于某個(gè)特定類的類型轉(zhuǎn)換器,做法為在該類的包中添加一個(gè)格式為“類名-conversion.properties”的配置文件,并在文件中加入“待轉(zhuǎn)換的屬性的名字=轉(zhuǎn)換器類的全名”對(duì)。上面的例子也可以這樣配置——在源代碼文件夾的tutorial包下新建名為“HelloWorld-conversion.properties”文件,并在其中加入“l(fā)oc=tutorial.LocaleConverter”。
          在繼承DefaultTypeConverter時(shí),如果是要將value轉(zhuǎn)換成其它非字符串類型時(shí),要記住value是String[]類型,而不是String類型。它是通過(guò)request.getParameterValues(String arg)來(lái)獲得的,所以不要試圖將其強(qiáng)行轉(zhuǎn)換為String類型。

          已有的轉(zhuǎn)換器

          對(duì)于一此經(jīng)常用到的轉(zhuǎn)換器,如日期、整數(shù)或浮點(diǎn)數(shù)等類型,Struts 2.0已經(jīng)為您實(shí)現(xiàn)了。下面列出已經(jīng)實(shí)現(xiàn)的轉(zhuǎn)換器。

          1. 預(yù)定義類型,例如int、boolean、double等;
          2. 日期類型, 使用當(dāng)前區(qū)域(Locale)的短格式轉(zhuǎn)換,即DateFormat.getInstance(DateFormat.SHORT);
          3. 集合(Collection)類型, 將request.getParameterValues(String arg)返回的字符串?dāng)?shù)據(jù)與java.util.Collection轉(zhuǎn)換;
          4. 集合(Set)類型, 與List的轉(zhuǎn)換相似,去掉相同的值;
          5. 數(shù)組(Array)類型, 將字符串?dāng)?shù)組的每一個(gè)元素轉(zhuǎn)換成特定的類型,并組成一個(gè)數(shù)組。
          對(duì)于已有的轉(zhuǎn)換器,大家不必再去重新發(fā)明輪子。Struts在遇到這些類型時(shí),會(huì)自動(dòng)去調(diào)用相應(yīng)的轉(zhuǎn)換器。

          批量封裝對(duì)象(Bean)

          不知道大家是否遇過(guò)這種情況,在一個(gè)頁(yè)面里同時(shí)提交幾個(gè)對(duì)象。例如,在發(fā)布產(chǎn)品的頁(yè)面,同時(shí)發(fā)布幾個(gè)產(chǎn)品。我在之前一個(gè)項(xiàng)目就遇到過(guò)這種需求,當(dāng)時(shí)用的是Struts 1.x。那是一個(gè)痛苦的經(jīng)歷,我在Google搜了很久都沒有理想的結(jié)果。幸運(yùn)的是,在Struts 2.0中這種痛苦將一去不復(fù)返。下面我就演示一下如何實(shí)現(xiàn)這個(gè)需求。

          首先,在源代碼文件夾下的tutorial包中新建Product.java文件,內(nèi)容如下:

          package tutorial;

          import java.util.Date;

          publicclass Product {
          ? ?
          private String name;
          ? ?
          privatedouble price;
          ? ?
          private Date dateOfProduction;
          ? ?
          ? ?
          public Date getDateOfProduction() {
          ? ? ? ?
          return dateOfProduction;
          ? ?}

          ? ?
          ? ?
          publicvoid setDateOfProduction(Date dateOfProduction) {
          ? ? ? ?
          this.dateOfProduction = dateOfProduction;
          ? ?}

          ? ?
          ? ?
          public String getName() {
          ? ? ? ?
          return name;
          ? ?}

          ? ?
          ? ?
          publicvoid setName(String name) {
          ? ? ? ?
          this.name = name;
          ? ?}

          ? ?
          ? ?
          publicdouble getPrice() {
          ? ? ? ?
          return price;
          ? ?}

          ? ?
          ? ?
          publicvoid setPrice(double price) {
          ? ? ? ?
          this.price = price;
          ? ?}
          ? ?
          }

          然后,在同上的包下添加ProductConfirm.java類,代碼如下:

          package tutorial;

          import java.util.List;

          import com.opensymphony.xwork2.ActionSupport;

          publicclass ProductConfirm extends ActionSupport {
          ? ?
          public List<Product> products;

          ? ?
          public List<Product> getProducts() {
          ? ? ? ?
          return products;
          ? ?}


          ? ?
          publicvoid setProducts(List<Product> products) {
          ? ? ? ?
          this.products = products;
          ? ?}

          ? ?
          ? ?@Override
          ? ?
          public String execute() {
          ? ? ? ?
          for(Product p : products) {
          ? ? ? ? ? ?System.out.println(p.getName()
          + " | "+ p.getPrice() +" | " + p.getDateOfProduction());
          ? ? ? ?}

          ? ? ? ?
          return SUCCESS;
          ? ?}

          }

          接看,在同上的包中加入ProductConfirm-conversion.properties,代碼如下:

          Element_products=tutorial.Product

          再在struts.xml文件中配置ProductConfirm Action,代碼片段如下:

          <action name="ProductConfirm" class="tutorial.ProductConfirm">
          ? ?
          <result>/ShowProducts.jsp</result>
          </action>

          在WEB文件夾下新建AddProducts.jsp,內(nèi)容如下:

          <%@ page ?contentType="text/html; charset=UTF-8"%>
          <%@taglib prefix="s" uri="/struts-tags"%>
          <html>
          <head>
          ? ?
          <title>Hello World</title>
          </head>
          <body>
          ? ?
          <s:form action="ProductConfirm" theme="simple"> ? ? ? ? ? ?
          ? ? ? ?
          <table>
          ? ? ? ? ? ?
          <tr style="background-color:powderblue; font-weight:bold;">
          ? ? ? ? ? ? ? ?
          <td>Product Name</td>
          ? ? ? ? ? ? ? ?
          <td>Price</td>
          ? ? ? ? ? ? ? ?
          <td>Date of production</td>
          ? ? ? ? ? ?
          </tr>
          ? ? ? ? ? ?
          <s:iterator value="new int[3]" status="stat">
          ? ? ? ? ? ? ? ?
          <tr>
          ? ? ? ? ? ? ? ? ? ?
          <td><s:textfield name="%{'products['+#stat.index+'].name'}"/></td>
          ? ? ? ? ? ? ? ? ? ?
          <td><s:textfield name="%{'products['+#stat.index+'].price'}"/></td>
          ? ? ? ? ? ? ? ? ? ?
          <td><s:textfield name="%{'products['+#stat.index+'].dateOfProduction'}"/></td>
          ? ? ? ? ? ? ? ?
          </tr>
          ? ? ? ? ? ?
          </s:iterator>
          ? ? ? ? ? ?
          <tr>
          ? ? ? ? ? ? ? ?
          <td colspan="3"><s:submit /></td>
          ? ? ? ? ? ?
          </tr>
          ? ? ? ?
          </table>
          ? ?
          </s:form> ? ?
          </body>
          </html>

          在同樣的文件夾下創(chuàng)建ShowProducts.jsp,內(nèi)容如下:

          <%@ page ?contentType="text/html; charset=UTF-8"%>
          <%@taglib prefix="s" uri="/struts-tags"%>
          <html>
          <head>
          ? ?
          <title>Hello World</title>
          </head>
          <body> ? ?
          ? ?
          <table>
          ? ? ? ?
          <tr style="background-color:powderblue; font-weight:bold;">
          ? ? ? ? ? ?
          <td>Product Name</td>
          ? ? ? ? ? ?
          <td>Price</td>
          ? ? ? ? ? ?
          <td>Date of production</td>
          ? ? ? ?
          </tr>
          ? ? ? ?
          <s:iterator value="products" status="stat">
          ? ? ? ? ? ?
          <tr>
          ? ? ? ? ? ? ? ?
          <td><s:property value="name"/></td>
          ? ? ? ? ? ? ? ?
          <td>$<s:property value="price"/></td>
          ? ? ? ? ? ? ? ?
          <td><s:property value="dateOfProduction"/></td>
          ? ? ? ? ? ?
          </tr>
          ? ? ? ?
          </s:iterator>
          ? ?
          </table>
          </body>
          </html>

          發(fā)布運(yùn)行應(yīng)用程序,在瀏覽器中鍵入http://localhost:8080/Struts2_Converter/AddProducts.jsp,出現(xiàn)如圖4所示頁(yè)面:
          圖4 添加產(chǎn)品頁(yè)面
          圖4 添加產(chǎn)品頁(yè)面

          按圖4所示,填寫表單,按“Submit”提交,出現(xiàn)圖5所示頁(yè)面:
          圖5 查看產(chǎn)品頁(yè)面
          圖5 查看產(chǎn)品頁(yè)面

          查看服務(wù)器的控制臺(tái),有如下輸出:

          Expert One-on-One J2EE Development without EJB | 39.99 | Mon Jun 2100:00:00 CST 2004
          Pro Spring |
          32.99 | Mon Jan 3100:00:00 CST 2005
          Core J2EE Patterns: Best Practices and Design Strategies
          , Second Edition | 34.64 | Sat May 1000:00:00 CST 2003

          上面的代碼并不復(fù)雜,但有幾點(diǎn)需要說(shuō)明:

          1. ProductConfirm文件中的for(Product p : productes)的寫法是J2SE 5.0中的新特性,作用遍歷products列表;
          2. List<Product>也是J2SE 5.0的才有的泛型(Generic);
          3. ProductConfirm-conversion.properties中“Element_products=tutorial.Product”是告訴Struts 2.0列表products的元素的類型為Product,而不是定義轉(zhuǎn)換器;
          4. 在AddProducts.jsp的<s:textfield>的name為“%{'products['+#stat.index+'].name'}”,%{exp}格式表示使用OGNL表達(dá)式,上述表達(dá)式的相當(dāng)于<%= "products[" + stat.index + "].name" %>,至于<s:iterator>標(biāo)志的用法可以參考我之前的文章《常用的Struts 2.0的標(biāo)志(Tag)介紹》。

          轉(zhuǎn)換錯(cuò)誤處理

          不知道大家在運(yùn)行上面的例子時(shí),有沒有填錯(cuò)日期或數(shù)字情況,又或者您有沒有思考過(guò)這種情況?如果還沒有嘗試的朋友可以試一下,在第一行的Price和Date of production中輸入英文字母,然后按“Submit”提交。你會(huì)看到頁(yè)面為空白,再看一下服務(wù)器的控制臺(tái)輸出,有如下語(yǔ)句: 警告: No result defined for action tutorial.ProductConfirm and result input,它提示我們沒有為Action定義輸入結(jié)果,所以,我們應(yīng)該在源代碼文件夾下的struts.xml中的ProductConfirm Action中加入以下代碼:

          <result name="input">/AddProducts.jsp</result>

          重新加載應(yīng)用程序,刷新瀏覽器重新提交請(qǐng)求,這時(shí)頁(yè)面返回AddProducts.jsp,格式錯(cuò)誤的輸入框的值被保留,如下圖6所示:
          圖6 沒有提示的錯(cuò)返回頁(yè)面
          圖6 沒有提示的錯(cuò)返回頁(yè)面

          當(dāng)然,我們還可以在頁(yè)面上加上錯(cuò)誤提示信息,通過(guò)在AddProducts.jsp的“<body>”后,加入下面代碼可以實(shí)現(xiàn):

          <div style="color:red">
          ? ?
          <s:fielderror />
          </div>

          刷新瀏覽器,重新提交請(qǐng)求,出現(xiàn)如圖7所示頁(yè)面:
          圖7 帶提示的錯(cuò)返回頁(yè)面
          圖7 帶提示的錯(cuò)返回頁(yè)面

          以上的功能的都是通過(guò)Struts 2.0里的一個(gè)名為conversionError的攔截器(interceptor)工作,它被注冊(cè)到默認(rèn)攔截器棧(default interceptor stack)中。Struts 2.0在轉(zhuǎn)換出錯(cuò)后,會(huì)將錯(cuò)誤放到ActionContext中,在conversionError的作用是將這些錯(cuò)誤封裝為對(duì)應(yīng)的項(xiàng)錯(cuò)誤(field error),因此我們可以通過(guò)<s:fielderror />來(lái)將其在頁(yè)面上顯示出來(lái)。另外,大家看第二和第三行的Price都被賦為0.0的值,而第一行則保留其錯(cuò)誤值。這同樣是conversionError的功勞——沒有出錯(cuò)的行調(diào)用的products[index].price(默認(rèn)值為0.0),而出錯(cuò)的行則會(huì)被賦為頁(yè)面所提交的錯(cuò)誤值,這樣可以提供更好的用戶體驗(yàn)。

          總結(jié)

          Struts 2.0的轉(zhuǎn)換器簡(jiǎn)化的WEB應(yīng)用程序的模型,為我們的編程帶來(lái)極大的方便。

          posted on 2006-11-07 14:26 Max 閱讀(42147) 評(píng)論(98)  編輯  收藏 所屬分類: Struts 2.0系列

          評(píng)論:
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2006-11-07 15:28 | 壞男孩
          搶到沙發(fā)!
          跑跑卡丁車  回復(fù)  更多評(píng)論
            
          # 請(qǐng)求轉(zhuǎn)載 2006-11-07 15:58 | zz3zcwb
          站長(zhǎng):
          你好,你的Struts 2系列寫得很好,我想在我個(gè)人站點(diǎn)上轉(zhuǎn)載收藏,不知可否,望你在百忙中回信.
          陳偉波
          我的站點(diǎn):www.java3z.com
          email:zz3zcwb@sina.com
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2006-11-20 15:16 | lxf
          為什么我在圖2和圖3中都無(wú)法出現(xiàn)“hello world”和“你好,世界”  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-03-11 14:52 | praguesky
          好文章.....  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-03-15 12:00 | hunter
          剛接觸struts2!!學(xué)起來(lái)好吃力﹗﹗

          要具備啥知識(shí)﹐有啥好學(xué)習(xí)方法﹗﹗

          email hunter123456@126.com  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-03-22 09:59 | 應(yīng)用之美
          謝謝了 ,非常需要!!!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-03-27 18:33 | tiger
          在你幫助下成長(zhǎng)  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-03-27 23:17 | Max
          @tiger
          @應(yīng)用之美
          過(guò)獎(jiǎng)了,只是略盡綿力而已。最重要是文章對(duì)你們有所幫助。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-04 15:29 | 凌偉
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-07 10:48 | furong
          謝謝你MAX
          無(wú)意中發(fā)先了你的blog,受益匪淺!
          希望可以學(xué)習(xí)到更多,期待你的文章  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-10 23:27 | ColinBin
          非常感謝.受益非淺  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-18 19:49 | 杰克
          關(guān)于類型轉(zhuǎn)換錯(cuò)誤提示的疑問(wèn):在圖7中顯示的錯(cuò)誤提示應(yīng)該有兩份:一是conversion Error Interceptor的默認(rèn)錯(cuò)誤提示;一是手動(dòng)添加的<s:fielderror />標(biāo)簽提供的錯(cuò)誤提示。真正改寫錯(cuò)誤提示的方法應(yīng)該是修改i18n key。官方網(wǎng)站原文摘錄如下:
          --------------------------------
          By default, all conversion errors are reported using the generic i18n key xwork.default.invalid.fieldvalue, which you can override (the default text is Invalid field value for field "xxx", where xxx is the field name) in your global i18n resource bundle.

          However, sometimes you may wish to override this message on a per-field basis. You can do this by adding an i18n key associated with just your action (Action.properties) using the pattern invalid.fieldvalue.xxx, where xxx is the field name.
          -----------------------------------  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-19 10:33 | Tony
          多謝你的struts2系列文章,在這些文章的幫助下我還是很有收獲的。可是我最想知道的是:你在接觸一個(gè)新的框架的時(shí)候是怎么開始學(xué)習(xí)的?
          俗話說(shuō)的好:授之以魚不如授之以漁。還望你不吝賜教。
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-19 23:35 | Max
          @Tony
          我會(huì)先詳細(xì)閱讀它的文檔,最好可以找到相關(guān)的書籍學(xué)習(xí),對(duì)于入門書往往比文檔要容易許多;
          然后,嘗試去寫一些簡(jiǎn)單的應(yīng)用;
          熟悉之后,思考一下框架的實(shí)現(xiàn)原理。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-20 13:53 | gege
          比較好,可是還是吃力啊,
          怎樣設(shè)置用戶校驗(yàn)啊?那個(gè)驗(yàn)證的xml在什么時(shí)候加載啊?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-28 16:34 | soa
          我在運(yùn)行你這個(gè)例子的時(shí)候,出現(xiàn)了錯(cuò)誤:
          輸入:http://localhost:8080/converter/AddProducts.jsp
          報(bào)錯(cuò):
          org.apache.jasper.JasperException
          org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
          org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
          org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
          org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:248)


          root cause

          java.lang.NullPointerException
          org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:703)
          org.apache.struts2.components.UIBean.end(UIBean.java:450)
          org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:36)
          org.apache.jsp.AddProducts_jsp._jspx_meth_s_textfield_0(org.apache.jsp.AddProducts_jsp:193)
          org.apache.jsp.AddProducts_jsp._jspx_meth_s_iterator_0(org.apache.jsp.AddProducts_jsp:157)
          org.apache.jsp.AddProducts_jsp._jspx_meth_s_form_0(org.apache.jsp.AddProducts_jsp:112)
          org.apache.jsp.AddProducts_jsp._jspService(org.apache.jsp.AddProducts_jsp:69)
          org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
          org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
          org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
          org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
          org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:248)

            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-28 16:35 | soa
          是什么問(wèn)題呢?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-28 17:00 | soa
          不好意思,我有個(gè)屬性文件放錯(cuò)位置了

          解決了:)  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-30 16:41 | bruy
          第一個(gè)簡(jiǎn)單的例子我這里測(cè)試不通過(guò)
          第一步成功了,界面出來(lái)了,Locale那里顯示的是en_US
          但當(dāng)我將en_US改為zh_CN提交時(shí),報(bào)錯(cuò):
          No result defined for action tutorial.HelloWorld and result input

          如果在struts.xml配置改action的input result,則不報(bào)錯(cuò),但提交后還是原來(lái)的界面,沒有顯示預(yù)料中的中文

          請(qǐng)問(wèn)這是什么原因呢?   回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-08 10:13 | Max
          @bruy
          你的問(wèn)題應(yīng)該是轉(zhuǎn)換或校驗(yàn)出錯(cuò),所以會(huì)返回到輸入頁(yè)面。你可以在輸入JSP頁(yè)面加入<s:actionerror/>,查看出錯(cuò)信息。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-10 14:21 | EricaseJang
          @bruy
          將HelloWorld.java里邊的
          msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc);
          這句引號(hào)里邊的空格去掉  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-10 14:27 | EricaseJang
          不好意思,好像理解錯(cuò)了……有空格沒有錯(cuò)誤提示  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-10 17:34 | EricaseJang
          問(wèn)個(gè)問(wèn)題:
          struts2中的radio、checkbox是不是不能夠設(shè)置默認(rèn)選中?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-11 09:01 | Max
          @EricaseJang
          當(dāng)然可以。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-11 11:21 | EricaseJang
          怎么實(shí)現(xiàn)呢?比如:
          <s:set name="male" value="%{getText('sex_male')}"/>
          <s:set name="female" value="%{getText('sex_female')}"/>
          <s:radio label="%{getText('reg_sex')}" name="Sex" list="#{'1':#male,'0':#female}" />
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-11 18:28 | EricaseJang
          啊。會(huì)了。原來(lái)在MAX大大的另一篇里邊提到了……
          以后一定要看完了全部再提問(wèn)  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-24 10:32 | min
          批量封裝對(duì)象
          這個(gè)在我的項(xiàng)目中正好用到,謝謝MAX,但是我的項(xiàng)目中需要?jiǎng)討B(tài)增加記錄,意思是增加的對(duì)象個(gè)數(shù)不定,我看你的是只有3條,要是對(duì)象個(gè)數(shù)不定是怎么作呢?
          MAX希望在百忙中幫解決一下.我的郵箱:cbz_com0826@163.com  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-06-28 16:31 | fuckjapan(法克哲潘)
          好文章啊!謝謝  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-06-29 16:40 | lsmxcool
          求救:為什么老是報(bào)下面的錯(cuò),我類已經(jīng)建好了啊
          2007-6-29 16:36:02 com.opensymphony.xwork2.util.XWorkConverter loadConversionProperties
          嚴(yán)重: Conversion registration error
          java.lang.ClassNotFoundException: tutorial.LocaleConverterat org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1332)at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1181)  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-06-30 23:08 | Max
          @lsmxcool
          可能是類名輸錯(cuò)了  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-07-09 18:10 | 任遨游
          在做第二個(gè)例子時(shí),productconfirm的execute方法中,取得的products為null,請(qǐng)問(wèn)是什么原因,報(bào)錯(cuò)如下:

          type Exception report

          message

          description The server encountered an internal error () that prevented it from fulfilling this request.

          exception

          javax.servlet.ServletException
          org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
          org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
          org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)


          root cause

          java.lang.NullPointerException

            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-07-11 06:17 | petpig
          你的文章寫得非常不錯(cuò),對(duì)我正在做的項(xiàng)目很有幫助。
          最近剛從2.0.6升級(jí)到2.0.8后,發(fā)現(xiàn)類似如下的代碼不能工作了。

          <s:iterator value="products" status="stat">

          <s:textfield name="%{'products['+#stat.index+'].name'}"/>

          .....
          </s:iterator>

          其中textfield的顯示沒有問(wèn)題,但是submit 到 action 時(shí),無(wú)法得到products List。 顯示 size()=0。 而在2.0.6中沒有任何問(wèn)題。不知道在2.0.8中應(yīng)如何改寫?非常感謝!!!
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-01 08:42 | 藝凡♂
          嚴(yán)重: Conversion registration error
          java.lang.ClassCastException: com.neusoft.softdev.struts2.converter.Product
          at com.opensymphony.xwork2.util.XWorkConverter.createTypeConverter(XWorkConverter.java:760)
          at com.opensymphony.xwork2.util.XWorkConverter.loadConversionProperties(XWorkConverter.java:778)
          at com.opensymphony.xwork2.util.XWorkConverter.<init>(XWorkConverter.java:183)
          at com.opensymphony.xwork2.util.AnnotationXWorkConverter.<init>(AnnotationXWorkConverter.java:79)
          at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
          at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
          at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
          at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
          at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:388)
          at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:461)
          at com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:501)
          at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:549)
          at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:499)
          at com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32)
          at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:134)
          at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:49)
          at com.opensymphony.xwork2.inject.ContainerImpl$ParameterInjector.inject(ContainerImpl.java:431)
          at com.opensymphony.xwork2.inject.ContainerImpl.getParameters(ContainerImpl.java:446)
          at com.opensymphony.xwork2.inject.ContainerImpl.access$000(ContainerImpl.java:48)
          at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:288)
          at com.opensymphony.xwork2.inject.ContainerImpl$2.call(ContainerImpl.java:117)
          at com.opensymphony.xwork2.inject.ContainerImpl$2.call(ContainerImpl.java:115)
          at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:542)
          at com.opensymphony.xwork2.inject.ContainerImpl.injectStatics(ContainerImpl.java:114)
          at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:494)
          at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:145)
          at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
          at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)
          at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:452)
          at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:201)
          at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:221)
          at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:302)
          at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:78)
          at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3635)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4222)
          at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
          at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
          at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
          at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:626)
          at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)
          at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
          at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
          at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
          at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
          at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
          at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
          at org.apache.catalina.core.StandardService.start(StandardService.java:448)
          at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
          at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:585)
          at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
          at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)

          在做這第二個(gè)例子時(shí)出現(xiàn)上述錯(cuò)誤,請(qǐng)問(wèn)Max大哥這是原因?我做第一個(gè)例子時(shí)用的全局類型轉(zhuǎn)換器就好用,用“類名-conversion.proterties”也到與類相同的包下就不好用,不知道為什么,第二個(gè)也一樣,但是如果我用全局的就出現(xiàn)上述錯(cuò)誤,麻煩Max大哥百忙之中給予回答!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-02 23:42 | Max
          @藝凡♂
          @petpig
          我明天如果有空的話會(huì)源代碼放到我們的Google討論組(http://groups.google.com/group/struts2cn)上,到時(shí)請(qǐng)留意。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-03 09:26 | Max
          @Max
          源代碼已經(jīng)上傳,請(qǐng)到http://groups.google.com/group/struts2cn/web/Struts2_Converter.rar下載。
          我是用MyEclipse 5.1.0 GA創(chuàng)建的工程;將文件解壓后,將其導(dǎo)入MyEclipse,再加入相應(yīng)的JAR包即可用。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-10 23:26 | binger
          @bruy
          我一開始和你的錯(cuò)誤一樣,后來(lái)把struts.xml里的文件改成:
          <action name="ProductConfirm" class="tutorial.ProductConfirm">
          <result>/ShowProducts.jsp</result>
          <result name="input">/AddProducts.jsp</result>
          </action>

          就好了,希望對(duì)你有用~.~  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-31 17:26 | tf
          運(yùn)行批量封裝對(duì)象里的例子時(shí)我輸入錯(cuò)誤的數(shù)據(jù)既然不會(huì)提示錯(cuò)誤?
          請(qǐng)問(wèn)MAX這是什么原因?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-09-12 17:21 | jarwang
          想問(wèn)一個(gè)max,你上邊提到的一次發(fā)表多個(gè)對(duì)象.
          我仔細(xì)看了這段代碼.
          <s:iterator value="new int[3]" status="stat">
          <tr>
          <td><s:textfield name="%{'products['+#stat.index+'].name'}"/></td>
          <td><s:textfield name="%{'products['+#stat.index+'].price'}"/></td>
          <td><s:textfield name="%{'products['+#stat.index+'].dateOfProduction'}"/></td>
          </tr>
          </s:iterator>
          這只能發(fā)表三個(gè)產(chǎn)品,當(dāng)然也可是多個(gè),但這要事先固定.
          有沒有動(dòng)態(tài)的呢?也就說(shuō)發(fā)表多個(gè)產(chǎn)品,由使用者自行決定.
          還有就是,通否添加,或撤銷呢?
          比如:原來(lái)準(zhǔn)備發(fā)表3個(gè),但點(diǎn)擊到新增頁(yè)面時(shí)發(fā)現(xiàn)要發(fā)表4個(gè),怎么辦?

          我現(xiàn)在的做法是用innerHTML+innerCell來(lái)解決.
          不知道用struts2可否實(shí)現(xiàn)???
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-09-13 00:13 | Max
          @jarwang
          可以,只要在新增的表單項(xiàng)中將name的值遞增就行了,如
          <tr>
          <td><input type="text" name="products[4].name"/></td>
          <td><input type="text" name="products[4].price"/></td>
          <td><input type="text" name="products[4].dateOfProduction"/></td>
          </tr>  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-09-19 10:18 | jarwang
          多謝max指教,
          原來(lái),只要將name更改一下就可以呀!

          不過(guò),數(shù)據(jù)校檢就不能用action實(shí)現(xiàn)了.因?yàn)槭切滦惺怯胕nserRow+innerHTML來(lái)實(shí)現(xiàn)動(dòng)態(tài)添加的

          而作數(shù)據(jù)校檢時(shí),在提交action后就消失了.為了避免此情況.

          我的思路又回到用javascript來(lái)做數(shù)據(jù)校驗(yàn).

          不知道m(xù)ax有什么高招?
          多謝!!!
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-09-19 13:28 | Spring
          @bruy
          我也遇到這個(gè)問(wèn)題,第一步界面出來(lái)了,Locale那里顯示的是en_US
          但當(dāng)我再次提交時(shí),不管是en_US還是zh_CN,都報(bào)錯(cuò)(我用的是STRUTS2.0.9):
          No result defined for action tutorial.HelloWorld and result input
          檢查了配置問(wèn)題都沒有問(wèn)題。
          請(qǐng)問(wèn)此問(wèn)題你們是怎么解決的?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-09-24 15:17 | Jackson
          我在運(yùn)行批量封裝對(duì)象例子時(shí),輸入的日期:2004-6-21,可提交時(shí)總出現(xiàn)如下提示:
          Invalid field value for field "products[1].dateOfProduction
          Invalid field value for field "products[2].dateOfProduction
          Invalid field value for field "products[0].dateOfProduction
          而無(wú)法轉(zhuǎn)到下一頁(yè)面,究竟是什么原因,有哪位碰到過(guò)這個(gè)問(wèn)題嗎?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-09-24 15:28 | Jackson
          上述問(wèn)題解決了,原因是我在做前面的例子時(shí)把瀏覽器的默認(rèn)語(yǔ)言改成了英文,改為中文后就可以了!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-10-26 20:36 | William_00
          遇到跟上面petpig一樣的問(wèn)題,請(qǐng)教如何解決?showProducts為什么接受不到addProducts里面的數(shù)據(jù)?希望能看見max大師的答復(fù)  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-10-28 01:33 | wulong
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-11-13 17:27 | WJJ
          msg = LocalizedTextUtil.findDefaultText("HelloWorld",loc);
          我在類里面測(cè)試msg 的值的時(shí)候,發(fā)現(xiàn)它的值是null。不知道為什么取不到值,請(qǐng)問(wèn)是怎么回事?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-11-19 16:24 | 游客
          @lsmxcool
          xwork-conversion.properties文件中=號(hào)前后的空格全部去掉就不會(huì)出現(xiàn)
          java.lang.ClassNotFoundException: tutorial.LocaleConverterat 錯(cuò)誤  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-05 11:22 | 劉文濤
          我按照你的例子做成功了,后來(lái)發(fā)現(xiàn)刪除 :
          ProductConfirm-conversion.properties

          文件還是能正常工作,很困惑。 為什么刪除這個(gè)文件還能正常呢?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-10 20:55 | hgskj
          dhliqw7ei owia  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-14 22:57 | jaja
          @WJJ
          我的也是這情況,不知道如何  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-28 16:49 | ElgooG
          我在做helloworld時(shí)候遇到了這樣的問(wèn)題:第一次能夠顯示“Hello
          World”,但是在textfield中輸入“zh_CN‘,后,點(diǎn)擊提交之后,頁(yè)面還是跳轉(zhuǎn)回了”en_US“的頁(yè)面,這是為什么呢?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-28 16:56 | ElgooG
          @bruy
          兄弟,你的問(wèn)題解決了嗎  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-31 11:55 | zhjp
          java.lang.ClassCastException :com.test.bean.Product cannot be cast to ognl.TypeConverter 請(qǐng)教MAX大哥為什么我的出現(xiàn)這樣的錯(cuò)誤...  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-02 11:37 | javer
          不錯(cuò),好好學(xué)習(xí).  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-04 00:22 | slyOS
          嚴(yán)重: Conversion registration error
          java.lang.NullPointerException
          at com.opensymphony.xwork2.conversion.impl.XWorkConverter.createTypeConverter(XWorkConverter.java:729)

          我在做第一個(gè)例子時(shí)啟動(dòng)tomcat出現(xiàn)上面錯(cuò)誤,是什么原因呢。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-04 17:21 | 蔣林
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-04 21:48 | 55
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-09 13:21 | : 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師
          微任何金黃人猝然感豆腐花個(gè)
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-13 12:43 | 小撥
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-13 12:44 | 小撥
          很好用  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2008-01-15 18:39 | 陳鑫
          我回讓你很幸福..
          不回在讓你傷心  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-20 12:29 | CLD
          剛開始接觸STRUTS2.0 怎么第一個(gè)就出錯(cuò)了呢,提示:
          Invalid field value for field "loc".  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2008-01-28 11:36 | java愛好者
          講得一般!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-02-14 17:48 | xry
          @bruy
          我也遇到了相同的問(wèn)題,不知您是否已經(jīng)解決,我在頁(yè)面添加錯(cuò)誤顯示后,提交顯示:Invalid field value for field "loc". 請(qǐng)賜教,謝謝!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-03-01 13:40 | ttt
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-03-05 14:36 | v
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-03-14 17:15 | wjk
          我是個(gè)初學(xué)者,在實(shí)現(xiàn)第二個(gè)例子的時(shí)候出問(wèn)題了:
          Invalid field value for field "products[0].dateOfProduction".
          我填的日期是 2007-12-11
          怎么解決?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-03-19 20:25 | BruceLee
          樓主把STRUTS2的批量保存基本講清楚了,但我有一個(gè)問(wèn)題就是,如果在剛才那個(gè)批量保存里加一個(gè)添加新行,應(yīng)該怎樣坐,這在現(xiàn)實(shí)開始中是常有的能,我試過(guò)用MAKENEW[].VALUE的形式,如果是單純的添加OK可以通過(guò),如果在編輯部分新加行的話就不能保存,因?yàn)榫庉嫴糠值拿质?quot;%{'products['+#stat.index+'].name'}"這樣的形式,造成同一列卻有兩個(gè)不同的名字,此問(wèn)題困擾了我很久,希望樓主解答,我郵箱:brucelee365@qq.com謝謝!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-04-08 19:13 | zdy
          你好!

          為什么我的時(shí)間在英文系統(tǒng)下得不到呢!仍然是字符串,沒有自動(dòng)轉(zhuǎn)換成Date


          中文下可以得到!一切正常!

          希望得到您的回復(fù)!

            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-04-22 16:58 | yiying
          您好,我想問(wèn)一下,在第一個(gè)例子中,我只有首次打開頁(yè)面的時(shí)候才可以顯示信息,此后不管我選擇en_US還是zh_CN,都是顯示
          No result defined for action tutorial.HelloWorld and result input
          如果這樣寫
          private Locale loc = Locale.US;
          那樣首次打開頁(yè)面的時(shí)候就是英文的
          如果
          private Locale loc = Locale.CHINA;
          那樣首次打開頁(yè)面的時(shí)候就是中文的,但是之后我那怕只要點(diǎn)擊一下提交,也會(huì)顯示上面的信息,到底是怎么回事那.

          非常感謝


            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-04-23 08:45 | yiying
          嘿嘿,問(wèn)題解決了,xwork-conversion.properties這個(gè)文件必須要放在WEB-INF/classes中  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-06-04 11:26 | hover
          @Spring
          @ElgooG
          你們的問(wèn)題解決了嗎?我也是同樣的問(wèn)題  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-07-29 11:18 | tinsoldier
          樓主,你在不同的環(huán)境下編譯過(guò)你的代碼沒有。
          你這一節(jié)的product對(duì)象的例子和之前有一個(gè)user對(duì)象驗(yàn)證的例子,都會(huì)報(bào)空指針錯(cuò)誤。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-08-19 16:34 | goldgood
          我只有一個(gè)問(wèn)題,就是在提交日期字符串時(shí)(格式:2005-3-2),傳入的是一個(gè)空字符。這是怎么回事?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-08-21 01:40 | 繁榮
          其實(shí)最近真的很開心,但是我沒有想到也會(huì)有不開心的事發(fā)生  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-10-20 10:42 | 似懂非懂
          空指針異常:先檢查標(biāo)簽是否用錯(cuò),再檢查action中是否有set/get方法,最后是否定義list類型變量的元素類型。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-11-03 17:58 | 李言
          幸福LOVE瑋手語(yǔ)——
          真的感覺我們走的越來(lái)越遠(yuǎn)了,好想回到從前,回到擁有他的日子,盡管是那么簡(jiǎn)單可是心中充滿了說(shuō)不清的愛。因?yàn)橛袗鬯钥鞓罚〔恢朗裁磿r(shí)候才能讓心里的愛去放縱,不知道心中的他有沒有一絲的感動(dòng)。
          一切都是那么茫然……我不知道該如何面對(duì)以后的日子,沒有他的日子我該怎么繼續(xù),我不敢再去過(guò)多的想象,因?yàn)槲遗拢袝r(shí)候覺得自己好膽小心中的愛都不敢說(shuō)出口,誰(shuí)能給我勇氣……
          想你,愛你,直至老死……   回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2009-01-18 20:44 | shuzigui
          java.lang.ClassNotFoundException: tutorial.LocaleConverter ,我運(yùn)行你的第一個(gè)例子的時(shí)候出現(xiàn)這個(gè)錯(cuò)誤,而且不管我選擇en_US還是zh_CN,都是顯示
          No result defined for action tutorial.HelloWorld and result input ,請(qǐng)問(wèn)一下這是什么原因
            回復(fù)  更多評(píng)論
            
          # 第一個(gè)例子的第二種實(shí)現(xiàn)方法:應(yīng)用于某個(gè)特定類的類型轉(zhuǎn)換器 2009-02-27 12:01 | chjiangsh
          需要修改LocaleConverter.java類的代碼:代碼片段如下:
          else if ( toType == String.class) {
          if (value == null) {return null;}
          Locale locale = (Locale) value;
          return locale.toString();
          }  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2009-03-10 15:01 | liu
          Conversion registration error
          這個(gè)錯(cuò)誤大家碰到?jīng)]?
          我的配置件都是對(duì)的。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2009-08-26 18:02 | david hu
          @WJJ

          我也是一樣,msg為空,取不到值
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2009-10-03 12:04 |
          播客不錯(cuò),非常感謝  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2010-03-08 16:57 |
          要想在第一個(gè)例子中出字,必須配置國(guó)際化資源文件@lxf
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2010-03-09 10:17 |
          我覺得這個(gè)文件多余,根本不用指定products的元素類型,因?yàn)樵趈ava文件中已經(jīng)知道這一點(diǎn)了@劉文濤
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2010-07-28 10:14 | du
          網(wǎng)友你好,你這套代碼不錯(cuò),但是那個(gè)屬性文件,我也加上了,為什么仍然不行啊。
          那個(gè)屬性文件需要?jiǎng)e的配置,在那個(gè)地文加裁的啊?
          我的郵箱:wowgenit@gmail.com
          非常期待您的幫助。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2010-07-28 10:18 | du
          網(wǎng)友你好,批量封裝set集合的時(shí)候,怎么老是為空。在jsp里面我用的是makeNew,例:<s:textfield name="fmatInIs.makeNew[1].FdStatus" value="2" />

          在網(wǎng)上查的帖子里面都有一個(gè)屬性文件,要定義一個(gè)屬性KeyProperty_**=**
          這個(gè)我也定義了,但在調(diào)用action的時(shí)候仍然為空。

          其它的代碼與網(wǎng)上的帖子相同,
          批量封裝set集合,還有其它的需要注意的地方嗎?

          我的郵箱:wowgenit@gmail.com
          非常期待您的幫助。  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2010-08-20 10:48 | zjnh
          對(duì)于那些msg為空的同學(xué),我這里有一個(gè)解決方法,第一看你的資源文件配置好沒有,第二就是看你的msg = LocalizedTextUtil.findDefaultText("HelloWorld",loc)中的那個(gè)HelloWorld和你的配置文件中的key一樣不一樣,只要解決這兩個(gè)應(yīng)該就沒問(wèn)題了  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2011-01-17 16:45 |
          按上述配置了實(shí)例二,可是日期類型無(wú)法顯示,為什么呢?寫一個(gè)轉(zhuǎn)換的話,應(yīng)該怎么寫  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2011-03-23 16:07 | zhang
          MAX先生能不能解惑下下面這個(gè)方法的作用,特別是
          “ return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));
          ”句看不大明白,剛學(xué)習(xí)struts2沒幾天,希望你能答疑解惑,謝謝
          @Override
          public Object convertValue(Map context, Object value, Class toType) {
          if (toType == Locale. class ) {
          String locale = ((String[]) value)[ 0 ];
          return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));
          } else if (toType == String. class ) {
          Locale locale = (Locale) value;
          return locale.toString();
          }
          return null ;
          }
            回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2012-02-15 20:03 | LaozhonG
          下面那個(gè)例子,也就是一個(gè)表單提交多個(gè)對(duì)象,寫得很好啊!值得借鑒參考!謝謝!  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 10:20 | tang
          為什么我怎么改都報(bào)錯(cuò)啊  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 10:20 | tang
          報(bào)這個(gè)錯(cuò):
          Error setting expression 'loc1' with value '[Ljava.lang.String;@1b35853'
          ognl.MethodFailedException: Method "setLoc1" failed for object com.converter.HelloWorld@839139  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 10:24 | tang
          我感覺是因?yàn)闆]有用自定義的轉(zhuǎn)換類轉(zhuǎn)換,因?yàn)槲以谀莻€(gè)轉(zhuǎn)換類中打了個(gè)斷點(diǎn),沒執(zhí)行到那  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 16:06 | tang
          樓主,你啥時(shí)候能回答我啊,我等的好急  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 16:08 | tang
          qq:569942960,今天晚上你加我啊  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-10 10:44 | tang
          @yiying
          你怎么解決的?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-17 14:36 | tang
          為啥沒人回答了?  回復(fù)  更多評(píng)論
            
          # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2015-10-09 14:51 | 侯永濤
          @lxf
          樓主寫的不全,他是個(gè)SB,  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 综艺| 桃源县| 长白| 洞口县| 广安市| 如皋市| 巴林左旗| 利辛县| 尉氏县| 晋宁县| 卢龙县| 斗六市| 南乐县| 越西县| 仁怀市| 乐至县| 中山市| 咸宁市| 新郑市| 洛阳市| 朝阳县| 微博| 沈丘县| 蓬莱市| 高邑县| 高陵县| 大连市| 兴义市| 临西县| 鄄城县| 德昌县| 湟源县| 隆安县| 汉中市| 西盟| 商城县| 高青县| 南漳县| 夏津县| 拉孜县| 东兰县|