【Struts高难度】动态表单元素的类设计!【Struts高难度】
现在要对一张表t1进行录入,由于表结构可能改动(添加或删除字段),此表的表结构(字段名,字段中文名,字段类型等等)由另一张表t2保存。录入表单从t2读取表结构动态生成表单。填好表单向t1表插入数据。
这样的需求用struts写。需要一些面向对象的封装,暂时由如下两个文件完成。大家看看有没有更好的方法,要求可扩展性要好。
import java.util.*;
/**
* 属性的一个列表
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company</p>
* @author
* @version 1.0
*/
public class ColumnList {
private Map map = new LinkedHashMap();
public ColumnList() {
}
public ColumnList(ColumnList columnlist) {
this.map = columnlist.map;
}
/**
* 添加一个属性到属性列表中
* @param index int
* @param attr Attribute
*/
public void addColumn(Column col) {
map.put(col.getColumnName(), col);
}
/**
* 获得该属性列表中属性的个数
* @return int
*/
public int size() {
return map.values().size();
}
/**
* 获得属性列表的Iterator
* @return Iterator 对Attribute的iterate
*/
public Iterator iterator() {
return map.values().iterator();
}
/**
* 用逗号分隔获得column名称的列表,用于查询字段列表的数据
* @return String
*/
public String getColumnNameList() {
Iterator it = iterator();
String result = "";
boolean first = true;
while (it.hasNext()) {
Column column = (Column)it.next();
if (!first) result += ",";
result += column.getColumnName();
first = false;
}
return result;
}
/**
* 对当前的column列表中的某个column设置值
* @param columnName String
* @param value String
*/
public void setColumnValue(String columnName, String value) {
Column col = (Column)map.get(columnName);
col.setValue(value);
}
}
--------------------------------------
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author
* @version 1.0
*/
public class Column {
public static final int TYPE_TIME = 4;
public static final int TYPE_NUMERIC = 0; //整数类型
public static final int TYPE_VARCHAR = 1; //字符串类型
public static final int TYPE_OPTION = 2; //一个select选项类型
public static final int TYPE_UPLOAD_FILE = 3; //上载的文件类型
private String columnName; //名称(用于页面之间传递,一般为英文)
private String displayName; //显示名称(一般为中文)
private int type; //属性类型
//private String[] options = null; //如果是TYPE_OPTION类型,那么这个是其所有的选项
/**
* 1. 整型,value为其整型值
* 2. 字符型,value为字符串的值
* 3. 选项型,value为相应选项的名称(一般为中文)
* 4. 上载型,value为相应上载后在服务器上的文件名。当显示时,显示文件名,并链接到这个物理文件。
*/
private String value; //对于INTEGER,STRING,OPTION来说保存其值,对于UPLOAD_FILE保存上传后的文件名
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public void setType(String type) {
if (type.equalsIgnoreCase("NUMERIC")) {
this.type = TYPE_NUMERIC;
} else if (type.equalsIgnoreCase("VARCHAR")) {
this.type = TYPE_VARCHAR;
} else if (type.equalsIgnoreCase("OPTION")) {
this.type = TYPE_OPTION;
} else if (type.equalsIgnoreCase("UPLOAD_FILE")) {
this.type = TYPE_UPLOAD_FILE;
} else if (type.equalsIgnoreCase("datetime")){
this.type = TYPE_TIME;
}
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public int hashCode() {
return columnName.hashCode();
}
public boolean equals(Object obj) {
Column coll = (Column)obj;
return columnName.equals(coll.columnName);
}
}