Java 将用户输入转换为特定的类实例 背景

Java 将用户输入转换为特定的类实例 背景,java,class,instantiation,Java,Class,Instantiation,用户在web表单输入中键入信息,例如: <input type="text" name="report_name" value="First name" /> <select name="report_date_birthday"> <option value="2038-01-19">Jan 19, 2038</option> </select> <input type="checkbox" name="report_arr

用户在web表单输入中键入信息,例如:

<input type="text" name="report_name" value="First name" />
<select name="report_date_birthday">
  <option value="2038-01-19">Jan 19, 2038</option>
</select>
<input type="checkbox" name="report_array_colour[]" value="Blue" />Blue
<input type="checkbox" name="report_array_colour[]" value="Red" />Red
所有用户输入都以
java.lang.String
值的形式提交,除了
report\u array\u

问题 忽略
报告\u数组
输入值:

  • 使用用户提供的值实例化映射到用户输入类型的Java类的最有效方法是什么
  • 是否有更好的机制来映射用户输入类型,以便实例化其代表性类更容易实现
  • 是否有更好的方法在web表单中表示用户输入类型

  • 谢谢大家!

    将类型信息放入名称-值对的名称中是一种很好的方法。它允许过程自动化。例如,您可以编写一个过滤器,迭代请求参数,对每个参数进行转换,并将新对象存储为请求属性


    另外,每个类(除了
    列表
    )都包含一个
    .valueOf(String)
    方法,该方法将为您完成大部分转换。您最好使用创建时间和日期对象的方法。这将允许您清理数据。

    我发现转换值的唯一方法是手动执行:

    protected Object convertValue( String prefix, String value ) {
      Class<?> c = getPrefixes().get( prefix );
      Object result = value;
    
      try {
        if( c == java.lang.String.class ) {
          result = new String( value );
        }
        else if( c == java.sql.Timestamp.class ) {
          result = Timestamp.valueOf( value );
        }
        else if( c == java.sql.Time.class ) {
          result = Time.valueOf( value );
        }
        else if( c == java.util.Date.class ) {
          DateFormat sdf = createDateFormat();
          result = sdf.parse( value );
        }
        else if( c == java.math.BigDecimal.class ) {
          result = new BigDecimal( value );
        }
        else if( c == java.lang.Integer.class ) {
          result = Integer.valueOf( value );
        }
        else if( prefix.equalsIgnoreCase( PARAM_VARIABLE_PREFIX + "array_int_" ) ) {
          result = parseIntegerArray( value );
        }
      }
      catch( Exception e ) {
        throw new RuntimeException( e );
      }
    
      return result;
    }
    
    由于映射未向转换过程添加任何值,因此可以将其删除,这意味着
    convertValue
    方法变为:

      protected Object convertValue( String prefix, String value ) {
        Object result = value;
    
        try {
          if( prefix.equalsIgnoreCase( PARAM_VARIABLE_PREFIX + "" ) ) {
            result = new String( value );
          }
          else if( prefix.equalsIgnoreCase( PARAM_VARIABLE_PREFIX + "timestamp_" ) ) {
            result = Timestamp.valueOf( value );
          }
          // ... etc.
    

    没有“valueOf”接口,因此无法自动实例化单独的类。看起来我必须使用一系列if-else语句将类转换为相应的实例。@Dave:您可以反射
    valueOf
    并调用它。只有三个类有一个静态
    valueOf
    方法。@Dave:正确。因此,你必须使用SimpleDataFormat作为日期。注释的长度不足以解释我的想法。有关详细信息,请参阅我的答案。
      map.put( REPORT_VARIABLE_PREFIX + "", java.lang.String.class );
      map.put( REPORT_VARIABLE_PREFIX + "int_", java.lang.Integer.class );
      map.put( REPORT_VARIABLE_PREFIX + "float_", java.math.BigDecimal.class );
      map.put( REPORT_VARIABLE_PREFIX + "array_", java.util.List.class );
      map.put( REPORT_VARIABLE_PREFIX + "date_", java.util.Date.class );
      map.put( REPORT_VARIABLE_PREFIX + "time_", java.sql.Time.class );
      map.put( REPORT_VARIABLE_PREFIX + "timestamp_", java.sql.Timestamp.class );
    
      protected Object convertValue( String prefix, String value ) {
        Object result = value;
    
        try {
          if( prefix.equalsIgnoreCase( PARAM_VARIABLE_PREFIX + "" ) ) {
            result = new String( value );
          }
          else if( prefix.equalsIgnoreCase( PARAM_VARIABLE_PREFIX + "timestamp_" ) ) {
            result = Timestamp.valueOf( value );
          }
          // ... etc.