如何在jsf中为多个请求提供requestcope?

时间:2012-10-19 19:54:19

标签: java jsp jsf

在我的JSF应用程序中,一些值设置为requestScope,一些值设置在sessionScope中。例如,如果您进行预订,DTO将保存在sessionScope中,以便在下一页和之后成功提交预订后可用。因此,用户可以将预订作为模板保存在下一页中,并在将来使用该模板。保存模板后,用户将被重定向到主页。这些预订值保存在sessionscope中,但仅在requestScope中设置的succssfull提交页面中需要一些其他值。因此requestScope在加载此页面时完成了所需的工作。然后我遇到了一个问题,即如果用户使用已经可用的名称保存为模板,则在检入辅助bean中的数据库后,页面应该返回到包含错误消息的同一页面,而不是转发到主页。由于预订值保存在sessionScope中,因此不存在问题。但是在requestScope中保存的其他值会丢失,并且我在jsp页面中得到nullPointerException。有没有什么方法可以实现我的任务而不使用sessionScope作为其他值。我认为的一种方法是在jsp中使用postrender函数在backing bean中再次设置这些requestcope值。但我不确定请求值是否可用于postrender。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

即使问题中缺少此信息,我也会假设您仍然使用旧版JSF 1.x而不能migrate使用提供新{{3}的JSF 2.x ,否则你不会问这个问题。 IBM标签的存在也暗示了一些遗留怪物。

获取JSF 1.2的view scope并在视图中的任意位置引用您的请求作用域Tomahawk

<t:saveState value="#{managedBeanName}" />

这就是全部。这与新的JSF 2.0视图范围完全相同。所以这样你的#{managedBeanName}实例就变成了一个视图范围的bean。

答案 1 :(得分:0)

如果您使用的是JSF 2,则可以使用@ViewScoped注释使用户处于同一视图时使bean处于活动状态。

如果您使用的是JSF 1.2,则必须使用可以为您处理此问题的第三方库。我只知道两个选择:

  • 从Tomahawk库中,您可以使用<t:stavestate>组件。

  • 从RichFaces 3.3.x开始,您可以在类中使用<a4j:keepAlive>组件或作为注释。我和这个人一起工作过,这很有帮助。我会举个例子。

faces-config.xml文件中具有RequestScope配置的托管bean。

@KeepAlive
public class Bean {
    private String name;
    //constructor...
    //getters and setters...
}

您的JSP / Facelets页面:

<h:form>
    <h:outputText value="Write your name" />
    <h:inputText value="#{bean.name}" />
    <br />
    <a4j:commandButton value="Say hello!" reRender="hello" />
</h:form>
<!-- Since this is outside the form, the #{bean.name} value won't be send to the server -->
<h:outputText value="#{'Hello ' + bean.name}" id="hello" />