【问题标题】:Executing spring web flow transitions using javascript form submit使用javascript表单提交执行spring web flow转换
【发布时间】:2011-06-16 16:01:35
【问题描述】:
我们在我们的 Web 项目中使用了 facelets 和 spring web flow 的组合。在 Web 流中声明了一些变量。我想在流程之外访问这些变量。我试图访问这些变量的原因是,我们正在使用 javaScript 提交一个表单。我们不能使用 javaScript 提交表单作为 webflow 的一部分。
任何人都可以指导使用 javaScript 提交表单并且仍然是 Web 流的一部分(就像单击了 commandButton 或 commandLink)?
或
如何访问我们流之外的流变量?
【问题讨论】:
标签:
spring-webflow-2
jsf-1.2
【解决方案1】:
在谷歌上进行更多搜索后,我能够找到解决方案。我能够从 javascript 提交表单,并且仍然是 Web 流程的一部分。我按照以下步骤操作:
-
Javascript - 在组合框值更改时提交表单:
jQ161("#comboBoxId").change(function(e) {
var formAction = document.myform.action;
document.myform.action = formAction + '&_eventId=showDetails¶m1=value1';
document.myform.submit();
});
eventId 设置为 Web 流中 transition 的值。
-
我们需要一个 JSF Phase 监听器。此侦听器在 JSF 流中拦截并将流转移到 Web 流执行器。我需要在 Update Model Values 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 and MVC integration。