JSF - 创建通用确认页面(动态导航)

时间:2009-12-15 16:28:26

标签: java jsf el

我会尝试解释我的问题。我在非常严格的环境中使用IBM的JSF 1.2实现(公司层,严格的约束 - 不要添加库等.-)。

我想创建一个可以重复使用的简单页面(通用类型)。 例如 : 1-page1.jsp>点击按钮 2-pageConfirmation.jsp> 2个按钮是或否 3点击否>返回/ 3bis-点击是>转到someAction然后转到page2.jsp

所以我想在会话中存储我需要的东西,我来自哪里,我想去的地方。但问题是:如何调用我想要的动作?这个名字是动态的。我假设在点击“是”后我在控制器中,我想从我在会话中存储的名称中调用“myMethodAction”。我想过使用表达式语言api来评估它,但我被阻止了,因为我无法访问ELContext,并且不允许使用el包(el-api.jar)。

总结一下,点击后,我试图调用一个动作/方法,然后重定向到一个页面,而不是调用一个页面。

有没有人有一些神奇的想法?或者我完全错了?

提前致谢。

3 个答案:

答案 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)。