2011-09-30 38 views
0

这可能是设计问题,然后是编码问题。Spring Web Flow - 重用子流的问题

我们有一个现有的订购界面,我们试图转换成Spring Web Flow。对于每种产品,我们都有一些可重复使用的组件,例如联系方式,合同细节,订单详细信息,定价...

现在我们希望将它们放在单个页面上,但仍然保持可重复使用,以便可用于不同的产品。

如 - 我有,我有三个不同的组件称为服务详情页:

Host Details 
    IP Details 
    Backup Details 

每个组件需要在其他产品中重复使用,因此,问题是如何实现这一目标?

问题:如果我创建了一个名为“Service Details”的子流,那么相关的视图必须包含所有三个jsps,并且子流的模型属性将是一个复合属性,它必须绑定上述所有值, ,IP详细信息,备份详细信息....

我永远不会重复使用整个页面,只有组件需要在不同的页面之间重用。

回答

1

这不是特别针对webflow的 - 您想创建与模型中组件相关的可重用视图组件?

这是真的,在webflow中,你只能对一个变量作用域中的单个对象进行自动绑定&验证,所以我建议你创建一个bean来保存这三个组件。

public class Holder implements Serializable { 

     private HostDetails; 
     private IpDetails; 
     private BackupDetails; 

     //getters & setters 
} 

然后,流中的'model'属性将引用此Holder类的实例。

您只需要记住,如果您想将提交的字段绑定到例如HostDetails,您的输入应该使用点符号引用字段(包括“保持器”):

<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

+0

谢谢,我现在有一点想法怎么办呢。我们使用Tiles而不是jsp标记来重用位。如果我们继续使用瓷砖,你认为我会撞墙吗? – V1sh

+0

使用拼贴很好,你可以使用jsp标签和拼贴相互连接。我倾向于使用视图组合/布局(页面之间一致)和标记文件来封装公共内容。标记文件有一个明确的'合同'的好处,但你必须深入挖掘一下,以找出渲染一个图块需要哪些输入。 –