Spring Web Flow将模型对象从流程传递到控制器

时间:2011-08-16 17:32:19

标签: java spring spring-mvc spring-webflow

将Spring Web Flow中使用的模型对象传递给Controller的正确方法是什么?

我的用例如下:

我有一个流程,结束状态显示包含一些计算结果的模型对象。这很好用。我还在页面上有一个链接,生成一个pdf来显示结果。如果我手动设置模型对象,那也可以正常工作。

那么如何将流程中使用的模型对象传递给控制器​​?或者是否有更简洁的方法来使用webflow查看pdfs?

由于

2 个答案:

答案 0 :(得分:4)

遗憾的是,这不是一个简单的方法。 Webflow在其自己的存储库中的不同时间维护所有对象及其状态。因此,e1s2处的模型对象将是e1s3等不同的物理对象。

我能想到的最简单的方法是将对象存储在会话中作为结束步骤的一部分。然后,您可以将用户重定向到控制器,并从会话中获取/删除对象。

另一种方法是将结果实际保存在某个持久性存储(例如数据库)中,并且链接可以有一个ID,允许您提取信息并重新生成结果(如果可能)

编辑: 因为在会话中放置流控制对象可能会成为让自己参与其中的烦人过程可能不是最好的解决方案,但这里有一个如何做的示例:

public class MainFlowController{
    ...rest of the flow's logic

    public void endFlow(RequestContext context){
       ModelObject obj = ...;
       HttpServletRequest req = (HttpServletRequest )context.getExternalContext().getNativeRequest();   
       req.getSession().setAttribute("endModelObject",obj );
    }
}

在这里,您将ModelObject分配给会话,并需要使用endModelObject将其拉回

RequestContext是一个webflow拥有的对象,你将传入这将获得pdf字节数组到会话中。您可以使用webflow

中的action-state元素进行分配
<action-state id="setPDF">
    <evaluate expression="mainFlowController.endFlow(flowRequestContext)"/>;
    <transition to="endFlow"/>
</action-state>
<end-state id="endFlow" view="end.jsp"/>

由于它现在在会话中,链接必须击中您想要的控制器并直接从会话中拉出。

答案 1 :(得分:0)

@John V.谢谢你的帖子确实帮助了我正确的方向。这就是我现在所做的工作:

在我的flow.xml中

<view-state id="summary" view="summary.jsp">
    <on-entry>
        <set name="result" value="conversationScope.result" />
        <evaluate expression="printPDF" />
    </on-entry>
    <transition on="startOver" to="startOver" />
</view-state>

在我的webflowContext.xml文件中

<bean id="printPDF" class="com.example.actions.PrintPDF"/>

PrintPDF.class

public class PrintPDF extends AbstractAction {

    @Override
    public Event doExecute(RequestContext context) {

        Result obj = (Result)context.getFlowExecutionContext().getConversationScope().get("result");
        HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getNativeRequest();
        req.getSession().setAttribute("result", obj);
        return success();
    }

}

在我的控制器中

@RequestMapping(method=RequestMethod.GET, value="/pdf")
public ModelAndView showPDF(ModelMap model, HttpServletRequest request) {
    Result result = (Result)request.getSession().getAttribute("result");
    model.addAttribute("result", result);
    return new ModelAndView("PDF", model);
}

PDF在我的spring-pdf-views.xml文件中定义为bean

<bean id="PDF" class="com.example.view.PDF">
    <property name="url" value="/pdf/example.pdf" />
</bean>

该类包含以下内容:

public class PDF extends AbstractPdfStamperView {

    @Override
    protected void mergePdfDocument(Map<String, Object> model, PdfStamper stamper, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {

        Result result = (Result)model.get("result");

        AcroFields form = stamper.getAcroFields();
//map form fields

最后jsp有一个像

这样的链接
<a href="/pdf.html">

我希望能帮助别人。我不确定这是否是最有效的方式,但我愿意接受任何建议。