这可能是编码问题的设计问题。
我们有一个现有的订购界面,我们正试图将其转换为Spring Web Flow。对于每种产品,我们都有一些可重复使用的组件,如联系方式,合同细节,订单详情,定价......
现在我们想把它们放在一个页面上,但仍然可以重复使用,以便它可以用于不同的产品。
例如 - 我有一个服务详细信息页面,我在其中有三个不同的组件:
Host Details
IP Details
Backup Details
这些组件中的每一个都需要在其他产品中重复使用,所以问题是如何实现这一目标?
问题:如果我创建一个名为“服务详细信息”的子流,那么关联的视图必须包含所有三个jsps,子流的模型属性将是一个复合属性,必须绑定所有上述值,如主机详细信息, IP详细信息,备份详细信息....
我永远不会重复使用整个页面,只需要在不同的页面上重用这些组件。
答案 0 :(得分:1)
这不是特定于Webflow的 - 您想要创建与模型中的组件相关的可重用视图组件吗?
确实,在webflow中你只能自动绑定&对其中一个变量作用域中的单个对象进行验证,因此我建议您创建一个bean来保存这三个组件,例如
public class Holder implements Serializable {
private HostDetails;
private IpDetails;
private BackupDetails;
//getters & setters
}
然后,您的流中的'model'属性将引用此Holder类的实例。
您只需记住,如果您想将提交的字段绑定到例如HostDetails,您的输入应使用点表示法来引用该字段(包括'holder'):
<input type="text" name="holder.hostDetails.hostName"/>
然后,为了在视图层中重用组件,请创建一个包含其他组件的JSP。我喜欢为此目的创建.tag文件,一个标签文件负责渲染每个组件。
<%!-- This is the main JSP --%>
<%!-- Include modules using tag files --%>
<content:hostDetails details="${holder.hostDetails}" nestedPath="holder.hostDetails"/>
<content:ipDetails details="${holder.ipDetails}" nestedPath="holder.ipDetails"/>
<content:backupDetails details="${holder.backupDetails}" nestedPath="holder.backupDetails "/>
我将'nestedPath'属性放在那里,以便标记文件是模块化的,即使包含在不同的页面中也可以重复使用(即使没有Holder.class)。可能有一种更优雅的方式来做这一点...
我这里没有显示标记文件的实现,但请看这里:http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags5.html