【Struts高难度】动态表单元素的类设计!【Struts高难度】

bloodwar 2004-10-25 12:20:08
现在要对一张表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);
}
}


...全文
291 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodwar 2004-11-08
  • 打赏
  • 举报
回复
up
helenofnt 2004-10-28
  • 打赏
  • 举报
回复
有没有想过用动态表单所付出的代价呢?
每次查询新增修改都要先动态的取表结构,然后才显示
传的数据量变大
操作起来也变麻烦
效率会降低……
还有数据验证的问题
俺面向对象学的没楼主那么好
但做的思想大致一样
我就发现速度很成问题
最好能做成用户可以配置
配置完就自动生成程序文件
再编译一把就OK
这样效果最好!
wxfczg 2004-10-28
  • 打赏
  • 举报
回复
up
bloodwar 2004-10-28
  • 打赏
  • 举报
回复
提点建议吧?
zairwolfi 2004-10-28
  • 打赏
  • 举报
回复
,+***+,
,*********, , ,@@,
.****+++****,*: ,WW.
,***:.,,,.+****+ ,WW.
***., ,:***+ ,WW.
.**: ****+ ,WW.
+*+, ,.+++. :@@*, +@@:,WW.*@*.#@:
**: ,,,,,WWWWWW: ,WWWWWWWW.#WWWWWWW,+++,
,**: @WW@*WW. WWW**WWWW.#WWW#*WW* ::
,**: WWW*,.., #WW:,,.@WW.#WW+.,+WW,. .
+*+, .WWWW+, WW+, .WW.#W@. .WW,+#
.**, ,:WWWWW:,WW: ,WW.#W@, .WW,@@,
,***, ., ,.:#WWW.WW*, .WW.#W#, .WW.#+,
.***, +**, +,,,WWW:+WW. WWW.#W#, .WW. ,
,.*****+*****. WWWWWWW.,WWWWWWWWW.#W#, .WW,**,
,.********+., :WWWWWW+, .@WWWW@WW.#W#, .WW,**
,.+++++:, ,.:++:., ,:++:.++..++, ,++,,,
,,,,, ,,,, ,,, ,,,,,, ,,
用http://bbs.soulsky.net/pub/ascii/做的。
cold_blooded 2004-10-28
  • 打赏
  • 举报
回复
用XML
kui 2004-10-26
  • 打赏
  • 举报
回复
hibernate可实现这样的功能,但如果你的这两个类就能实现你想要的功能,已经算是高效的了。再做完善一点,加上实例,欢迎把它加入到JavaWebStudio的开源项目Struts_db中。
patty79 2004-10-26
  • 打赏
  • 举报
回复
建议你用jpetstore的方式。
zhz586 2004-10-26
  • 打赏
  • 举报
回复
hibernate
bloodwar 2004-10-26
  • 打赏
  • 举报
回复
up
s_phoenix 2004-10-25
  • 打赏
  • 举报
回复
mark
禽兽v5 2004-10-25
  • 打赏
  • 举报
回复
楼上... -_-||

比如说apache的velocity有个模板,但是它语法奇怪,限制又多,很不好用?怎么办?
于是自己写了个模板,java语法,beanshell解析。over。

也就是说,能用则用,不能用则换(struts的各部件很容易替换的),另外,你是否真的完全理解了struts。如果没猜错,DynaValidatorForm可能可以实现这个功能,或者可以用普通的<bean:define>来代替。

没有这个技术实力?说明研究还不够透彻,功力还不够深。
风斧 2004-10-25
  • 打赏
  • 举报
回复
如何不落入全套,说说看。
禽兽v5 2004-10-25
  • 打赏
  • 举报
回复
不要落入框架的圈套。
figoren 2004-10-25
  • 打赏
  • 举报
回复
这也是struts的一个缺点 每个actionForm只能对应相应的表单,一旦某个表单增加字段则actionForm 要相应更改
风斧 2004-10-25
  • 打赏
  • 举报
回复
up
du9232 2004-10-25
  • 打赏
  • 举报
回复
看了大段代码眼花……
留给后面的人解决吧……
风斧 2004-10-25
  • 打赏
  • 举报
回复
我还没有看楼主的解决方案,但感觉这个问题很实用,在struts中,每个.jsp对应一个action,action又和一个actionForm保持联系,如果前台jsp的数据结构是变化的,怎么半。
先做个记号,希望打厦门发表告件。
风斧 2004-10-25
  • 打赏
  • 举报
回复
怎么会每人理财,我顶一下。

67,542

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧