Spring Web Flow, передающий объект модели из потока в контроллер - PullRequest
3 голосов
/ 16 августа 2011

Как правильно передать объект модели, используемый в Spring Web Flow, в контроллер?

Мой пример использования следующий:

У меня есть поток, и отображается состояние концамодельный объект, который содержит некоторые вычисленные результаты.Это хорошо работает.У меня также есть ссылка на странице для создания PDF-файла для отображения результатов.Это также работает нормально, если я вручную устанавливаю объект модели.

Так как же получить объект модели, используемый в потоке, в контроллер?Или есть более чистый способ просмотра PDF-файлов с помощью веб-потока?

Спасибо

Ответы [ 2 ]

4 голосов
/ 23 августа 2011

К сожалению, это не простой способ сделать это.Webflow поддерживает все объекты и их состояния в разное время в своем собственном хранилище.Таким образом, объект модели в e1s2 будет физическим объектом, отличным от e1s3 и т. Д.

Самый простой способ, который я могу придумать, - сохранить объект в сеансе как часть конечного шага.Затем вы можете перенаправить пользователя в контроллер и получить / удалить объект из сеанса.

Альтернативой является фактическое сохранение результатов в некотором постоянном хранилище (например, в базе данных), и ссылка может иметь идентификатор, которыйпозволит вам получить информацию и восстановить результаты (если это возможно)

Редактировать: поскольку размещение объектов управления потоком данных в сеансе может стать раздражающим процессом, участие в этом может оказаться не лучшим решением, но здесьпример того, как это сделать:

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 - это объект, принадлежащий веб-потоку, иВы передадите это, и вы получите массив байтов pdf в сеансе.Вы можете назначить это, используя элемент action-state из веб-потока

<action-state id="setPDF">
    <evaluate expression="mainFlowController.endFlow(flowRequestContext)"/>;
    <transition to="endFlow"/>
</action-state>
<end-state id="endFlow" view="end.jsp"/>

Так как теперь он находится в сеансе, ссылка должна будет попасть в нужный вам контроллер и напрямую извлечь из сеанса.

0 голосов
/ 23 августа 2011

@ Джон В. Спасибо, ваш пост помог мне в правильном направлении. Вот что у меня сейчас работает:

в моем файле 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 определен как bean-компонент в моем файле spring-pdf-views.xml

<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">

Я надеюсь, что это может помочь кому-то еще. Я не уверен, является ли это наиболее эффективным способом сделать это, но я открыт для любых предложений.

...