struts2修剪从表单中获取的所有字符串

use*_*292 6 java struts2

我使用struts2开发Web应用程序.我想改进从表单中获取字符串.为此需要修剪所有字符串,如果获得的字符串为空,则将null设置为field.

为此,我创建了StringConverter.

public class StringConverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map context, String[] strings, Class toClass) {
       if (strings == null || strings.length == 0) {
          return null;
       }

       String result = strings[0];
       if (result == null) {
          return null;
       }

       result = result.trim();
       if (result.isEmpty()) {
          return null;
       }
       return result;
    }

    @Override
    public String convertToString(Map context, Object object) {
       if (object != null && object instanceof String) {
          return object.toString();
       }
       return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我将行添加到xwork-conversion.properties

java.lang.String=com.mypackage.StringConverter
Run Code Online (Sandbox Code Playgroud)

就这样.但我没有得到理想的结果.


在jsp构建表单时调用convertToString()方法,但convertFromString()不会调用.

我做错了什么?如何使用其他方式获得相同的行为?

请不要提供以下解决方案:

  1. 使用javascript删除此类表单元素的值.
  2. 创建使用反射的util方法.然后为每个表单bean调用它.

先谢谢,阿列克谢.

Tod*_*wen 5

您将在StrutsTypeConverter类的代码中找到答案.基本上,在这个级别的类型转换器框架并不会知道数据是否来了"从"或"到"用户,它仅仅知道它是从一种类型(字符串)转换为另一种类型(也字符串)任何东西.因为它首先检查"to"类型,所以它总是调用convertToString.

简而言之,Struts的当前版本(2.1.x是我正在使用的)没有,也不能支持String-to-String类型的转换器.毕竟,它们是类型转换器,你可以说这是设计的.

我也在寻找一种方法来获得类似的结果,但还没有找到一个非常好的解决方案.可能最"正确"的方法是编写一个拦截器(如@leonbloy所提到的).有几种方法可以解决这个问题,最直接的方法是在动作上设置所有请求参数之前(即在"params"拦截器执行之前).


Bal*_*usC 1

我不使用Struts2,但是类似的问题在JSF中一直表现出来,直到2006年的1.2版本(JSF是Sun的MVC框架,Struts2的竞争对手)。String在 JSF 中“按设计”转换为不可能。较旧的 JSF 版本用于检查目标类型是否等于java.lang.String,然后仅在模型中设置请求参数值,而不尝试对其进行转换(因为请求参数值已作为 获取String)。如果目标类型不同,那么它将找到并运行任何关联的转换器,将其转换为所需的目标类型(不是String)。从 JSF 1.2 开始,他们通过删除目标类型的检查并以任何方式定位转换器来修复它。

如果 Struts2 中存在类似的功能/错误,我不会感到惊讶。如果还没有相关问题/错误报告,我会查看他们的主页,否则发布一个。