Выполнение весенних веб-потоковых переходов с использованием формы отправки javascript - PullRequest
0 голосов
/ 16 июня 2011

В нашем веб-проекте мы используем комбинацию граней и пружинного потока. В веб-потоке объявлены некоторые переменные. Я хотел бы получить доступ к этим переменным вне потока. Я пытаюсь получить доступ к этим переменным, потому что мы отправляем форму, используя javaScript. Мы не можем отправить форму как часть веб-потока с использованием javaScript.

Кто-нибудь может дать указания, как отправить форму с использованием javaScript и при этом оставаться частью веб-потока (как если бы щелкали по кнопке commandButton или commandLink)?

OR

Как я могу получить доступ к переменным потока вне потока?

1 Ответ

1 голос
/ 21 июня 2011

Я смог найти решение после еще одного поиска в Google. Я смог отправить форму из javascript и по-прежнему участвовать в веб-потоке. Я выполнил следующие шаги:

  1. Javascript - отправка формы при изменении значения поля со списком:

    jQ161("#comboBoxId").change(function(e) {
        var formAction = document.myform.action;
        document.myform.action = formAction + '&_eventId=showDetails&param1=value1';
        document.myform.submit();
    });
    

    eventId устанавливается равным значению перехода в веб-потоке.

  2. Нам нужен слушатель 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 .

...