Выполнение весенних веб-потоковых переходов с использованием формы отправки javascript
В нашем веб-проекте мы используем сочетание лицевых сторон и весеннего веб-потока. В веб-потоке объявлено несколько переменных. Я хотел бы получить доступ к этим переменным вне потока. Причина, по которой я пытаюсь получить доступ к этим переменным, заключается в том, что мы отправляем форму с использованием javaScript. Мы не можем отправить форму как часть веб-потока, используя javaScript.
Кто-нибудь может дать указания, чтобы отправить форму с использованием javaScript и при этом оставаться частью веб-потока (как если бы щелкали commandButton или commandLink)?
ИЛИ ЖЕ
Как я могу получить доступ к переменным потока вне потока?
1 ответ
Я смог найти решение, выполнив еще несколько поисков в Google. Я смог отправить форму из javascript и по-прежнему участвовать в веб-потоке. Я выполнил следующие шаги:
Javascript - форма отправки на изменение значения поля со списком:
jQ161("#comboBoxId").change(function(e) { var formAction = document.myform.action; document.myform.action = formAction + '&_eventId=showDetails¶m1=value1'; document.myform.submit(); });
EventId установлен в значение перехода в веб-потоке.
Нам нужен слушатель JSF Phase. Этот прослушиватель перехватывает поток JSF и перенаправляет поток в исполнитель веб-потока. Мне нужно было, чтобы поток был перехвачен после завершения фазы обновления значений модели JSF. Ниже приведен код для того же:
import javax.el.ELContext; import javax.el.MethodExpression; import javax.faces.component.UICommand; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import org.springframework.faces.webflow.JsfUtils; public class EventIdPhaseListener implements PhaseListener { public void afterPhase(PhaseEvent event) { if (JsfUtils.isFlowRequest()) { FacesContext context = event.getFacesContext(); if (context.getExternalContext().getRequestParameterMap().containsKey("_eventId")) { UICommand eventSource = new UICommand(); eventSource.setTransient(true); eventSource.setParent(context.getViewRoot()); eventSource.setId("_eventId"); String eventId = (String) context.getExternalContext().getRequestParameterMap().get("_eventId"); eventSource.setActionExpression(convertEventIdToMethodExpression(context, eventId)); context.getViewRoot().queueEvent(new ActionEvent(eventSource)); } } } public void beforePhase(PhaseEvent event) { // Do Nothing } public PhaseId getPhaseId() { return PhaseId.UPDATE_MODEL_VALUES; } private MethodExpression convertEventIdToMethodExpression(FacesContext facesContext, String eventId) { ELContext elContext = facesContext.getELContext(); return facesContext.getApplication().getExpressionFactory().createMethodExpression(elContext, eventId, String.class, new Class[0]); } }
Для получения более подробной информации проверьте JSF Phase Listener и Spring Web Flow и интеграцию MVC.