Весенние переменные requestScope веб-потока не видны в представлении

данный

<view-state id="bstate" model="foo">
<on-entry>
    <evaluate expression="service.createPerson(22,'Adam', 'Hayek')"
            result="viewScope.person"></evaluate>
</on-entry>
...
</view-state>

в представлении jsp я могу успешно получить человека

${person}

но когда я помещаю requestScope вместо viewScope

${person} больше не доступен в jsp


person bastiat    schedule 18.12.2014    source источник


Ответы (1)


Как вы знаете, SWF использует POST-REDIRECT-GET для отображения представлений, давайте проведем простой тест, чтобы увидеть, как работают действия. Измените свою конфигурацию на что-то вроде -

<view-state id="bstate" model="foo">
    <on-entry>
        <evaluate expression="myBean.OnEntry()"></evaluate>
    </on-entry>
    <on-render>
        <evaluate expression="myBean.OnRender()"></evaluate>
    </on-render>
</view-state>

И получить доступ к потоку и заметить журналы

19:08:07.805 [tomcat-http--35] DEBUG o.s.webflow.execution.ActionExecutor - Executing [EvaluateAction@31865599 expression = myBean.onEntry(), resultExpression = [null]]
19:08:07.809 [tomcat-http--35] DEBUG o.s.w.mvc.servlet.FlowHandlerAdapter - Sending flow execution redirect to '/webflow-actions-test/mypath?execution=e3s1'
19:08:07.841 [tomcat-http--36] DEBUG o.s.webflow.execution.ActionExecutor - Finished executing [EvaluateAction@7584e5f9 expression = myBean.onRender(), resultExpression = [null]]; result = success

Как видите, сначала выполняется onEntry(), затем происходит перенаправление, а затем вызывается onRender(). Поскольку это два разных запроса, вы не можете получить доступ к переменной с областью запроса от одного запроса к другому.

Итак, как упомянул Прасад, вы можете перенести свою логику на рендеринг

<on-render>
    <evaluate expression="service.createPerson(22,'Adam', 'Hayek')"
            result="requestScope.person"></evaluate>
</on-render>

и получить доступ к нему в вашем JSP

или вы можете изменить свою область действия на flashScope [ПРИМЕЧАНИЕ. Это очищается каждый раз, когда представление отображается. Это означает, что он переживет первоначальное перенаправление, но будет недоступен, если вы снова обновите страницу] или вы можете использовать viewScope [переменная будет доступна в вашем состоянии просмотра]. если вам нужны переменные в разных состояниях, вы можете использовать viewScope.

Подробнее об областях — http://docs.spring.io/autorepo/docs/webflow/2.3.x/reference/html/el.html#el-variables

Также интересная ветка - http://forum.spring.io/forum/spring-projects/web/web-flow/68756-what-is-the-use-of-request-scope-and-flash-scope

person Aniket Thakur    schedule 17.01.2016