2012-09-13 65 views
6

修剪此字符串的最佳方法是什麼?放置修剪代碼的最佳位置是哪裏?修剪Struts2文本字符串輸入

說我在我的JSP中的下列文本框:

<s:textfield label="First Name" name="person.firstname"/> 

動作類:

public class BaseAction extends ActionSupport implements ServletRequestAware, SessionAware { 
    private Person person; 
    // Getters, setters and action logic 
} 

豆子:

public class Person implements Serializable { 
    private String lastname; 
    private String firstname; 
    // Getters and setters 
} 

我可以更改默認設置豆,但這看起來像一個黑客:

public void setFirstname(String firstname) { 
    this.firstname = firstname.trim(); 
} 

編輯:我也見這個問題:struts2 trim all string obtained from forms在那裏它也被一些「正確」的方法是使用攔截器建議。

爲什麼攔截器是「正確」的方式?改變bean的setter有什麼錯誤?

回答

3

簡短的回答是不是默認的,沒有內置的機制來做到這一點,你需要在你的動作類中做或者某種java腳本會爲你做。

其他可能的方法是創建一個攔截器來做到這一點,排除選項或類似的跋涉。

我相信攔截器是一個很好的方法來做到這一點,它最好有這樣的攔截器來自S2。

+0

謝謝Umesh。心靈擴大一點你的答案,並解釋爲什麼攔截器是要走的路? – nmc

+1

@nmc實現使用攔截器是很好的,因爲我們可以用通用的方式來實現,並應用於任何操作。 –

6

可以用Struts2 converters完成。

public class TrimmingStringConverter extends StrutsTypeConverter { 

    public Object convertFromString(Map ctx, String[] values, Class arg2) { 
     if (values != null && values.length > 0) { 
      return values[0].trim(); 
     } 

     return null; 
    } 

    public String convertToString(Map ctx, Object o) { 
     if (o != null) { 
      return o.toString(); 
     } 
     else { 
      return null; 
     } 
    } 

    public Object convertValue(Map context, Object o, Class toClass) 
    { 
     if (o == null) { 
      return null; 
     } else if (toClass == java.lang.String.class) { 
      if (o instanceof String[]) { 
       String[] os = (String[]) o; 

       if (os.length > 0) { 
        return os[0].trim(); 
       } 
      } 

      return o.toString().trim(); 
     } 

     return super.convertValue(context, o, toClass); 
    } 
} 

它必須在xwork-conversion.properties註冊: java.lang.String中= es.jogaco.webapp.TrimmingStringConverter

這將適用於所有用戶輸入。

它會工作,如果你有默認的struts2攔截器。從struts2的文檔引用:

默認情況下,轉換攔截包含在默認的堆棧

的struts-default.xml中另外,我有它在我的Struts2的應用工作。