<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項目經驗中,有個問題不時的出現——在創建FormBean時,對于某個屬性到底應該用String還是其它類型?

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

    圖1 UI與服務器對象關系
    圖1 UI與服務器對象關系

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

    要實現上述轉換,Struts 2.0中有位魔術師可以幫到你——Converter。有了它,你不用一遍又一遍的重復編寫諸如此類代碼:

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

    好了,現在讓我們來看一個例子。

    轉換器——Hello World

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

    首先,如《在Struts 2.0中國際化(i18n)您的應用程序》的第一個例子一樣,創建和配置默認的資源文件;

    接著,新建源代碼文件夾下的tutorial包創建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>標志就是通過調用它實現國際化的
    ? ? ? ?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

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

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

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

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

    已有的轉換器

    對于一此經常用到的轉換器,如日期、整數或浮點數等類型,Struts 2.0已經為您實現了。下面列出已經實現的轉換器。

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

    批量封裝對象(Bean)

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

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

    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,內容如下:

    <%@ 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>

    在同樣的文件夾下創建ShowProducts.jsp,內容如下:

    <%@ 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>

    發布運行應用程序,在瀏覽器中鍵入http://localhost:8080/Struts2_Converter/AddProducts.jsp,出現如圖4所示頁面:
    圖4 添加產品頁面
    圖4 添加產品頁面

    按圖4所示,填寫表單,按“Submit”提交,出現圖5所示頁面:
    圖5 查看產品頁面
    圖5 查看產品頁面

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

    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

    上面的代碼并不復雜,但有幾點需要說明:

    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,而不是定義轉換器;
    4. 在AddProducts.jsp的<s:textfield>的name為“%{'products['+#stat.index+'].name'}”,%{exp}格式表示使用OGNL表達式,上述表達式的相當于<%= "products[" + stat.index + "].name" %>,至于<s:iterator>標志的用法可以參考我之前的文章《常用的Struts 2.0的標志(Tag)介紹》。

    轉換錯誤處理

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

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

    重新加載應用程序,刷新瀏覽器重新提交請求,這時頁面返回AddProducts.jsp,格式錯誤的輸入框的值被保留,如下圖6所示:
    圖6 沒有提示的錯返回頁面
    圖6 沒有提示的錯返回頁面

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

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

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

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

    總結

    Struts 2.0的轉換器簡化的WEB應用程序的模型,為我們的編程帶來極大的方便。

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

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

    要具備啥知識﹐有啥好學習方法﹗﹗

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

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

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

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

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

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

    <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中應如何改寫?非常感謝?。。?
      回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2007-08-01 08:42 | 藝凡♂
    嚴重: 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)

    在做這第二個例子時出現上述錯誤,請問Max大哥這是原因?我做第一個例子時用的全局類型轉換器就好用,用“類名-conversion.proterties”也到與類相同的包下就不好用,不知道為什么,第二個也一樣,但是如果我用全局的就出現上述錯誤,麻煩Max大哥百忙之中給予回答!  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2007-08-02 23:42 | Max
    @藝凡♂
    @petpig
    我明天如果有空的話會源代碼放到我們的Google討論組(http://groups.google.com/group/struts2cn)上,到時請留意。  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2007-08-03 09:26 | Max
    @Max
    源代碼已經上傳,請到http://groups.google.com/group/struts2cn/web/Struts2_Converter.rar下載。
    我是用MyEclipse 5.1.0 GA創建的工程;將文件解壓后,將其導入MyEclipse,再加入相應的JAR包即可用。  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 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>

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

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

    不過,數據校檢就不能用action實現了.因為是新行是用inserRow+innerHTML來實現動態添加的

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

    我的思路又回到用javascript來做數據校驗.

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

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

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

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


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

    希望得到您的回復!

      回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 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;
    那樣首次打開頁面的時候就是中文的,但是之后我那怕只要點擊一下提交,也會顯示上面的信息,到底是怎么回事那.

    非常感謝


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

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

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

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

    我的郵箱:wowgenit@gmail.com
    非常期待您的幫助。  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2010-08-20 10:48 | zjnh
    對于那些msg為空的同學,我這里有一個解決方法,第一看你的資源文件配置好沒有,第二就是看你的msg = LocalizedTextUtil.findDefaultText("HelloWorld",loc)中的那個HelloWorld和你的配置文件中的key一樣不一樣,只要解決這兩個應該就沒問題了  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2011-01-17 16:45 |
    按上述配置了實例二,可是日期類型無法顯示,為什么呢?寫一個轉換的話,應該怎么寫  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2011-03-23 16:07 | zhang
    MAX先生能不能解惑下下面這個方法的作用,特別是
    “ return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));
    ”句看不大明白,剛學習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 ;
    }
      回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2012-02-15 20:03 | LaozhonG
    下面那個例子,也就是一個表單提交多個對象,寫得很好??!值得借鑒參考!謝謝!  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2013-04-09 10:20 | tang
    為什么我怎么改都報錯啊  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 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  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2013-04-09 10:24 | tang
    我感覺是因為沒有用自定義的轉換類轉換,因為我在那個轉換類中打了個斷點,沒執行到那  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2013-04-09 16:06 | tang
    樓主,你啥時候能回答我啊,我等的好急  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2013-04-09 16:08 | tang
    qq:569942960,今天晚上你加我啊  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2013-04-10 10:44 | tang
    @yiying
    你怎么解決的?  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師[未登錄] 2013-04-17 14:36 | tang
    為啥沒人回答了?  回復  更多評論
      
    # re: 轉換器(Converter)——Struts 2.0中的魔術師 2015-10-09 14:51 | 侯永濤
    @lxf
    樓主寫的不全,他是個SB,  回復  更多評論
      
    主站蜘蛛池模板: 美女视频黄频a免费大全视频| 99精品免费观看| 黄色免费在线观看网址| 一级做a爱过程免费视| 国产成人无码区免费内射一片色欲| 亚洲欧美日韩综合俺去了| 亚洲gay片在线gv网站| 老湿机一区午夜精品免费福利| 亚洲日韩在线视频| 国产亚洲精品成人AA片| 免费一级全黄少妇性色生活片 | 猫咪免费人成在线网站 | 亚洲综合区图片小说区| 亚洲1234区乱码| 黄色a级片免费看| 99爱视频99爱在线观看免费| 亚洲人成网站免费播放| 日本黄色免费观看| 亚洲人成亚洲人成在线观看| 亚洲国产品综合人成综合网站 | 国产成人高清亚洲| 亚洲精品国产啊女成拍色拍| 亚洲AV无码之国产精品| 麻豆精品不卡国产免费看| 无人在线观看免费高清视频| 久久精品亚洲福利| 亚洲国产成人久久| 日韩久久无码免费毛片软件| 久久成人免费电影| 免费人成视网站在线观看不卡| 免费人成网站7777视频| 亚洲欧洲一区二区| 香蕉视频在线观看免费| 久久国产精品萌白酱免费| 国产精品嫩草影院免费| 亚洲视频在线观看免费| 黄色网址免费在线| 日韩免费a级毛片无码a∨| 国产亚洲精品免费视频播放| 国产午夜亚洲精品| 久久成人免费电影|