2012-09-13 66 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的应用工作。