Java 将用户输入转换为特定的类实例 背景
用户在web表单输入中键入信息,例如: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
<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数组
输入值:
谢谢大家! 将类型信息放入名称-值对的名称中是一种很好的方法。它允许过程自动化。例如,您可以编写一个过滤器,迭代请求参数,对每个参数进行转换,并将新对象存储为请求属性
另外,每个类(除了
列表
)都包含一个.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.