关于 ActionForm 的设计问题

记得以前刚刚用 JSP 的时候, 在 JSP ,Servlet 中光光是的参数是传递就折磨了够呛,还好, 自从用了Struts 以后,很少在这方面担忧了,但是新的问题又随之而来了,对应一些功能比较多,复杂的界面,你的ActiomForm怎么设计: 就比如下面这张截图

注意这里是分页显示的, 所以图中版主是在一个循环里面输出的,还要主要每一个版主后面有一个"设置生效"submit,好的,就这种情况,怎么设置ActionForm ? 刚刚开始想以整个table 为一个ActionForm ,然后用他的List,Map属性来接受,接着想到了,不对! 对于每一个独立的版主,你对他管理的资源进行权限分配了以后, 点击Sumbit提交了,就会把其他的,不属于该版主的(其他版主)信息也提交上去,别说你在Action中处理时将其他的版主置之不理,就说你如何分辨出哪些是你设置的版主的信息都很难!
况且还提交了一些无用的数据.

当然还可以以一行为一个ActionForm,但是由于是分页显示,数据是循环输出的, 如果你的<html:form ...></html:form>是在循环内的, 那么出来的这些<form />是同名的, 虽然写的时候可以通过id 的递增来给Form命名, 但是我发现,Struts中<html:form />标签生成的form始终跟struts-config.xml 中的action-mappings 元素中的 name属性或是attribute属性(优先)同名,已经写死了,可见不能生成递增的,不同的form.

就退一步来讲, 即使能在页面生成连续几个不同的form,型如:

<form name="form1" action=".." />
<form name="form2" action=".." />
<form name="form n" action=".." />
你的ActionForm 又如何设计? 总不能这样有相应的ActionForm1,ActionForm2,ActionForm3......吧...
..直到现在也不知道怎么设计上面这个ActionForm了,,,
象这样的问题一直都困扰我很久, 不知道大家有什么好的思路.

这个问题我也遇到过的,其实这是一个Master/Detail的模式,有点想采购订单或发票,有主要字段信息,有Detail信息,detail主要是多行记录。在Struts中可以采用MapForm来处理,而且比较方便,我当时使用就是JSTL+MapForm处理,可能你这个情况比我的更复杂些,不过你可以在MapForm中扩展你的功能。至于分页,我个人认为这和Form无关,主要是Action处理完毕后,通知Jsp页面有无相关的分页信息就可以啦。
这是我写的文章,或许对你有点帮助: http://www.jetmaven.net/documents/j_mapformInStruts.php
如果你有问题可以和我联系,msn: linux_china@hotmail.com,也只能帮点小忙。

看了Linux_china写的文章, 感觉不错, 但是这个目前还是不知道如何处理,当然,如果界面上只有一个版主,旗下面就是他的访问资源和权限,如果翻到第二页就是另一个独立的 版主,这样,每一页就是一个版主,
按照Linux_china的那种方式 可以作出来, 可以下面的ActionForm:


public class EditorActionForm extends ActionForm{
private int editor_id;
private int editor_name;
private Map resource;
//set get
//....
}


但是,我强调的是一个页面有多个版主,这种情况是比较复杂了点,,
不知道大家有什么好的想法!

It's ez, because u modify one row data, not multi-rows datas.

just use "ONE" actionForm for all datas.

just use a hidden input named "uid", when u onchange the forum-list options, u should set the hidden "uid" as the focus. and to set other values in hidden objects by javascript.

我是采取Tiles,将页面分成几个组件子页面,每个子页面对应不同的ActionForm,这个思路非常类似Tapestry。

这样做的最大好处是可以显示处理清晰,互相不影响,进而达到显示组件的重用。不知对你是否有借鉴作用?

private String[] accountID = new String[12];
/**
* Returns the accountID.
* @return String[]
*/
public String[] getAccountID() {
return accountID;
}


public String getAccountID(int index) {
return accountID[index];
}

如果仅仅实现此功能,有必要放那末多的 submit吗
另外,这个问题基本上任何信息系统都会碰到,html element多个同名提交是作为数组存在,这个应该比较清楚如何处理了吧。

用Javascript来处理应该比较方便

<form name="testForm" action="....">
<input type="hidden" name="subBoardName" value="">
<input type="hidden" name="checkbox1" value="">
<input type="hidden" name="checkbox2" value="">
<input type="hidden" name="checkbox3" value="">
<input type="hidden" name="checkbox4" value="">
<input type="hidden" name="id" value="">
</form>

<script>
function submitForm(){
document.subBoardName.value = ...
document.checkbox1.value = document.XXX.selected
.........
testForm.submit();
}
</script>

你在点击submit按钮的时候,调用这个函数,提交那个Form就行了。那个Form可以放在页面中任何一个地方,反正全部都是hidden域。


<form name="testForm" action="....">
<input type=
"hidden" name="subBoardName" value="">
<input type=
"hidden" name="checkbox1" value="">
<input type=
"hidden" name="checkbox2" value="">
<input type=
"hidden" name="checkbox3" value="">
<input type=
"hidden" name="checkbox4" value="">
<input type=
"hidden" name="id" value="">
</form>

<script>
function submitForm(){
document.subBoardName.value = ...
document.checkbox1.value = document.XXX.selected
.........
testForm.submit();
}
</script>

个人一直使用类似skyyjck的方法.
利用JAVASCRIPT来控制DISPATCHACTION的入口, JSP只是各个DISPATCHACTIONS之间的连接.

呵呵,感谢大家给于帮助,,特别是感谢 Banq 对这个问题的重视。还有
skyyjck,使困扰很久的问题得到了“解决之道”! ----->"解道"

你“提交”给处理器的始终是“数据”(form)+“命令”(action),从你的情款看来,你的“提交”很多,但又想通过尽量少的“数据”(form)+“命令”(action)来完成处理,我建议你一个"提交"对应一套“数据”(form)+“命令”(action)。。因为他们本身就是1...1...1的关系,这样分离的好处显而易见的,纠错容易,扩展方便

其实很简单,不要用那么多提交的按钮,只用一个,提交按钮的地方放checkbox。
提交的时候只要知道选中的checkbox的值就行了

我是先设计一个接口model然后各个form继承这个model,就把很多的form与action的依赖关系给IOC 了.

我对这种页面没有对应到ActionForm。

实际它所表示的就是一个,或多个一对多的关系。
页这种关系又可以用OO的方式所表示它的模型。

所以用一个JSP页面来动态生成这样的页面列表。取得页面数据MAP。对数据进行分析。以字段对应的方式,存储到数据库中。关系是一个或多个一对多!

不过我觉得“组合视图”应该是最OO的解决方法了!