我会尝试解释我的问题。我在非常严格的环境中使用IBM的JSF 1.2实现(公司层,严格的约束 - 不要添加库等.-)。
我想创建一个可以重复使用的简单页面(通用类型)。 例如 : 1-page1.jsp>点击按钮 2-pageConfirmation.jsp> 2个按钮是或否 3点击否>返回/ 3bis-点击是>转到someAction然后转到page2.jsp
所以我想在会话中存储我需要的东西,我来自哪里,我想去的地方。但问题是:如何调用我想要的动作?这个名字是动态的。我假设在点击“是”后我在控制器中,我想从我在会话中存储的名称中调用“myMethodAction”。我想过使用表达式语言api来评估它,但我被阻止了,因为我无法访问ELContext,并且不允许使用el包(el-api.jar)。
总结一下,点击后,我试图调用一个动作/方法,然后重定向到一个页面,而不是调用一个页面。
有没有人有一些神奇的想法?或者我完全错了?
提前致谢。
答案 0 :(得分:1)
您可以创建一个完全独立的托管bean ConfirmationBean
并将其放在请求范围内。您可以在每个managed property injection工具下的“父”bean中访问它,或者自己创建它并将其放在请求图中。
第一种方式需要在faces-config.xml
中进行大量工作,如果你想将它与很多其他bean联系起来,所以我认为这不是很有吸引力。
第二种方法只需要action方法中的一些(可重复使用的)代码。我举个例子:
public String submit() {
ConfirmationBean conformationBean = new ConfirmationBean();
confirmationBean.setOutcome("outcome"); // Set navigation case outcome where it should return back.
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("confirmationBean", confirmationBean);
return "confirm";
}
并且confirm.jsf
应该在隐藏字段中包含“结果”,例如
<h:selectBooleanCheckbox value="#{confirmationBean.confirm}" />
<h:inputHidden value="#{confirmationBean.outcome}" />
<h:commandButton value="confirm" action="#{confirmationBean.submit}" />
ConfirmationBean
的操作方法应如下所示:
public String submit() {
if (confirm) {
return outcome;
} else {
return "confirm";
}
}
或者如果你是三元运营商的粉丝;)
public String submit() {
return confirm ? outcome : "confirm";
}
答案 1 :(得分:0)
所以我有两个选择: - Override the navigation management of JSF就像这个在to-view-id标签中启用EL的解决方案
(下一条消息中的下一个解决方案,因为我是stackoverflow的新手而受限制)
答案 2 :(得分:0)
第二种解决方案: - 解决操作(会话中存在于confirmationBean中的字符串)invoking EL,如此解决方案
这可能对这里的某些人有用,但对我来说不可用,因为我不允许导入库(el-api)。