6

修剪此字符串的最佳方法是什么/放置修剪代码的最佳位置在哪里?

假设我的 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
}

我可以更改 bean 中的默认设置,但这似乎是一个 hack:

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

编辑:我确实也看到了这个问题:struts2 trim all string 从表单中获得,其中一些人还建议“正确”的方法是使用拦截器。

为什么拦截器是“正确”的方式?更改 bean 的设置器有什么问题?

4

2 回答 2

6

可以使用Struts2 转换器来完成。

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 应用程序中使用它。

于 2012-10-20T14:27:18.653 回答
3

简短的回答是默认情况下不是,没有内置机制来执行此操作,您需要在您的操作类中执行此操作,或者某种 java 脚本会为您执行此操作。

其他可能的方法是创建一个拦截器来执行此操作,其中包含排除选项或类似跋涉中的类似内容。

我相信拦截器是一个很好的方法,最好有这样的拦截器与 S2 一起。

于 2012-09-13T16:36:56.457 回答