<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-34  評論-1965  文章-0  trackbacks-0

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

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

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

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

    要實現(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)在讓我們來看一個例子。

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

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

    首先,如《在Struts 2.0中國際化(i18n)您的應(yīng)用程序》的第一個例子一樣,創(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中國際化的工具類,<s:text>標(biāo)志就是通過調(diào)用它實現(xiàn)國際化的
    ? ? ? ?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 >

    接下來,在源代碼文件夾的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 ;
    ? ?}

    }

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

    java.util.Locale = tutorial.LocaleConverter

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

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

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

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

    已有的轉(zhuǎn)換器

    對于一此經(jīng)常用到的轉(zhuǎn)換器,如日期、整數(shù)或浮點數(shù)等類型,Struts 2.0已經(jīng)為您實現(xiàn)了。下面列出已經(jīng)實現(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ù)組的每一個元素轉(zhuǎn)換成特定的類型,并組成一個數(shù)組。
    對于已有的轉(zhuǎn)換器,大家不必再去重新發(fā)明輪子。Struts在遇到這些類型時,會自動去調(diào)用相應(yīng)的轉(zhuǎn)換器。

    批量封裝對象(Bean)

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

    首先,在源代碼文件夾下的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īng)用程序,在瀏覽器中鍵入http://localhost:8080/Struts2_Converter/AddProducts.jsp,出現(xiàn)如圖4所示頁面:
    圖4 添加產(chǎn)品頁面
    圖4 添加產(chǎn)品頁面

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

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

    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ù)雜,但有幾點需要說明:

    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)換錯誤處理

    不知道大家在運行上面的例子時,有沒有填錯日期或數(shù)字情況,又或者您有沒有思考過這種情況?如果還沒有嘗試的朋友可以試一下,在第一行的Price和Date of production中輸入英文字母,然后按“Submit”提交。你會看到頁面為空白,再看一下服務(wù)器的控制臺輸出,有如下語句: 警告: 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)用程序,刷新瀏覽器重新提交請求,這時頁面返回AddProducts.jsp,格式錯誤的輸入框的值被保留,如下圖6所示:
    圖6 沒有提示的錯返回頁面
    圖6 沒有提示的錯返回頁面

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

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

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

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

    總結(jié)

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

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

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

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

    email hunter123456@126.com  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-03-22 09:59 | 應(yīng)用之美
    謝謝了 ,非常需要!!!  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-03-27 18:33 | tiger
    在你幫助下成長  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-03-27 23:17 | Max
    @tiger
    @應(yīng)用之美
    過獎了,只是略盡綿力而已。最重要是文章對你們有所幫助。  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-04 15:29 | 凌偉
    啊   回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-07 10:48 | furong
    謝謝你MAX
    無意中發(fā)先了你的blog,受益匪淺!
    希望可以學(xué)習(xí)到更多,期待你的文章  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-10 23:27 | ColinBin
    非常感謝.受益非淺  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-18 19:49 | 杰克
    關(guān)于類型轉(zhuǎn)換錯誤提示的疑問:在圖7中顯示的錯誤提示應(yīng)該有兩份:一是conversion Error Interceptor的默認(rèn)錯誤提示;一是手動添加的<s:fielderror />標(biāo)簽提供的錯誤提示。真正改寫錯誤提示的方法應(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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-19 10:33 | Tony
    多謝你的struts2系列文章,在這些文章的幫助下我還是很有收獲的。可是我最想知道的是:你在接觸一個新的框架的時候是怎么開始學(xué)習(xí)的?
    俗話說的好:授之以魚不如授之以漁。還望你不吝賜教。
      回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-19 23:35 | Max
    @Tony
    我會先詳細(xì)閱讀它的文檔,最好可以找到相關(guān)的書籍學(xué)習(xí),對于入門書往往比文檔要容易許多;
    然后,嘗試去寫一些簡單的應(yīng)用;
    熟悉之后,思考一下框架的實現(xiàn)原理。  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-04-20 13:53 | gege
    比較好,可是還是吃力啊,
    怎樣設(shè)置用戶校驗啊?那個驗證的xml在什么時候加載啊?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-28 16:34 | soa
    我在運行你這個例子的時候,出現(xiàn)了錯誤:
    輸入:http://localhost:8080/converter/AddProducts.jsp
    報錯:
    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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-28 16:35 | soa
    是什么問題呢?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2007-04-28 17:00 | soa
    不好意思,我有個屬性文件放錯位置了

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

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

    請問這是什么原因呢?   回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-08 10:13 | Max
    @bruy
    你的問題應(yīng)該是轉(zhuǎn)換或校驗出錯,所以會返回到輸入頁面。你可以在輸入JSP頁面加入<s:actionerror/>,查看出錯信息。  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-10 14:21 | EricaseJang
    @bruy
    將HelloWorld.java里邊的
    msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc);
    這句引號里邊的空格去掉  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-10 14:27 | EricaseJang
    不好意思,好像理解錯了……有空格沒有錯誤提示  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-10 17:34 | EricaseJang
    問個問題:
    struts2中的radio、checkbox是不是不能夠設(shè)置默認(rèn)選中?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-11 09:01 | Max
    @EricaseJang
    當(dāng)然可以。  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-11 11:21 | EricaseJang
    怎么實現(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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-11 18:28 | EricaseJang
    啊。會了。原來在MAX大大的另一篇里邊提到了……
    以后一定要看完了全部再提問  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-05-24 10:32 | min
    批量封裝對象
    這個在我的項目中正好用到,謝謝MAX,但是我的項目中需要動態(tài)增加記錄,意思是增加的對象個數(shù)不定,我看你的是只有3條,要是對象個數(shù)不定是怎么作呢?
    MAX希望在百忙中幫解決一下.我的郵箱:cbz_com0826@163.com  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-06-28 16:31 | fuckjapan(法克哲潘)
    好文章啊!謝謝  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-06-29 16:40 | lsmxcool
    求救:為什么老是報下面的錯,我類已經(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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-06-30 23:08 | Max
    @lsmxcool
    可能是類名輸錯了  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-07-09 18:10 | 任遨游
    在做第二個例子時,productconfirm的execute方法中,取得的products為null,請問是什么原因,報錯如下:

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

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

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

    .....
    </s:iterator>

    其中textfield的顯示沒有問題,但是submit 到 action 時,無法得到products List。 顯示 size()=0。 而在2.0.6中沒有任何問題。不知道在2.0.8中應(yīng)如何改寫?非常感謝!!!
      回復(fù)  更多評論
      
    # 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)

    在做這第二個例子時出現(xiàn)上述錯誤,請問Max大哥這是原因?我做第一個例子時用的全局類型轉(zhuǎn)換器就好用,用“類名-conversion.proterties”也到與類相同的包下就不好用,不知道為什么,第二個也一樣,但是如果我用全局的就出現(xiàn)上述錯誤,麻煩Max大哥百忙之中給予回答!  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-02 23:42 | Max
    @藝凡♂
    @petpig
    我明天如果有空的話會源代碼放到我們的Google討論組(http://groups.google.com/group/struts2cn)上,到時請留意。  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-03 09:26 | Max
    @Max
    源代碼已經(jī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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-10 23:26 | binger
    @bruy
    我一開始和你的錯誤一樣,后來把struts.xml里的文件改成:
    <action name="ProductConfirm" class="tutorial.ProductConfirm">
    <result>/ShowProducts.jsp</result>
    <result name="input">/AddProducts.jsp</result>
    </action>

    就好了,希望對你有用~.~  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-08-31 17:26 | tf
    運行批量封裝對象里的例子時我輸入錯誤的數(shù)據(jù)既然不會提示錯誤?
    請問MAX這是什么原因?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-09-12 17:21 | jarwang
    想問一個max,你上邊提到的一次發(fā)表多個對象.
    我仔細(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ā)表三個產(chǎn)品,當(dāng)然也可是多個,但這要事先固定.
    有沒有動態(tài)的呢?也就說發(fā)表多個產(chǎn)品,由使用者自行決定.
    還有就是,通否添加,或撤銷呢?
    比如:原來準(zhǔn)備發(fā)表3個,但點擊到新增頁面時發(fā)現(xiàn)要發(fā)表4個,怎么辦?

    我現(xiàn)在的做法是用innerHTML+innerCell來解決.
    不知道用struts2可否實現(xiàn)???
      回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-09-13 00:13 | Max
    @jarwang
    可以,只要在新增的表單項中將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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-09-19 10:18 | jarwang
    多謝max指教,
    原來,只要將name更改一下就可以呀!

    不過,數(shù)據(jù)校檢就不能用action實現(xiàn)了.因為是新行是用inserRow+innerHTML來實現(xiàn)動態(tài)添加的

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

    我的思路又回到用javascript來做數(shù)據(jù)校驗.

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

    文件還是能正常工作,很困惑。 為什么刪除這個文件還能正常呢?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-10 20:55 | hgskj
    dhliqw7ei owia  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-14 22:57 | jaja
    @WJJ
    我的也是這情況,不知道如何  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-28 16:49 | ElgooG
    我在做helloworld時候遇到了這樣的問題:第一次能夠顯示“Hello
    World”,但是在textfield中輸入“zh_CN‘,后,點擊提交之后,頁面還是跳轉(zhuǎn)回了”en_US“的頁面,這是為什么呢?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2007-12-28 16:56 | ElgooG
    @bruy
    兄弟,你的問題解決了嗎  回復(fù)  更多評論
      
    # 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 請教MAX大哥為什么我的出現(xiàn)這樣的錯誤...  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2008-01-02 11:37 | javer
    不錯,好好學(xué)習(xí).  回復(fù)  更多評論
      
    # 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)

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

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


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

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

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

    非常感謝


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

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

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

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

    我的郵箱:wowgenit@gmail.com
    非常期待您的幫助。  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2010-08-20 10:48 | zjnh
    對于那些msg為空的同學(xué),我這里有一個解決方法,第一看你的資源文件配置好沒有,第二就是看你的msg = LocalizedTextUtil.findDefaultText("HelloWorld",loc)中的那個HelloWorld和你的配置文件中的key一樣不一樣,只要解決這兩個應(yīng)該就沒問題了  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2011-01-17 16:45 |
    按上述配置了實例二,可是日期類型無法顯示,為什么呢?寫一個轉(zhuǎn)換的話,應(yīng)該怎么寫  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2011-03-23 16:07 | zhang
    MAX先生能不能解惑下下面這個方法的作用,特別是
    “ 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ù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2012-02-15 20:03 | LaozhonG
    下面那個例子,也就是一個表單提交多個對象,寫得很好啊!值得借鑒參考!謝謝!  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 10:20 | tang
    為什么我怎么改都報錯啊  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 10:20 | tang
    報這個錯:
    Error setting expression 'loc1' with value '[Ljava.lang.String;@1b35853'
    ognl.MethodFailedException: Method "setLoc1" failed for object com.converter.HelloWorld@839139  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 10:24 | tang
    我感覺是因為沒有用自定義的轉(zhuǎn)換類轉(zhuǎn)換,因為我在那個轉(zhuǎn)換類中打了個斷點,沒執(zhí)行到那  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 16:06 | tang
    樓主,你啥時候能回答我啊,我等的好急  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-09 16:08 | tang
    qq:569942960,今天晚上你加我啊  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-10 10:44 | tang
    @yiying
    你怎么解決的?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師[未登錄] 2013-04-17 14:36 | tang
    為啥沒人回答了?  回復(fù)  更多評論
      
    # re: 轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師 2015-10-09 14:51 | 侯永濤
    @lxf
    樓主寫的不全,他是個SB,  回復(fù)  更多評論
      
    主站蜘蛛池模板: 久久亚洲免费视频| 国产一区二区三区免费视频| 男女交性无遮挡免费视频| 久久亚洲免费视频| 亚洲欧洲日本在线| 亚洲狠狠久久综合一区77777| 精品国产亚洲AV麻豆| 国产精品爱啪在线线免费观看| 亚洲人成网7777777国产| 色欲aⅴ亚洲情无码AV| 青青青国产在线观看免费网站| 亚洲人成伊人成综合网久久久| 麻豆安全免费网址入口| 成人免费毛片内射美女APP| 亚洲国产日韩一区高清在线| yellow视频免费看| 国产又长又粗又爽免费视频| 亚洲AV日韩AV鸥美在线观看| 一二三四在线观看免费中文在线观看| 午夜神器成在线人成在线人免费| 亚洲成a人片在线观看中文!!!| 免费成人在线视频观看| 亚洲日本韩国在线| 国产成人高清亚洲一区久久| 成人毛片免费视频| 亚洲午夜电影在线观看高清| 一级毛片免费毛片一级毛片免费| 伊人久久综在合线亚洲91| 免费看一级毛片在线观看精品视频| 在线看片人成视频免费无遮挡| 亚洲另类图片另类电影| 免费能直接在线观看黄的视频| 亚洲色图在线播放| 日本免费大黄在线观看| 国产国拍亚洲精品mv在线观看| 国产vA免费精品高清在线观看 | 无码少妇一区二区浪潮免费| 久久精品国产亚洲AV无码娇色| 国产激情免费视频在线观看| 亚洲成色www久久网站夜月| 在线免费观看h片|