2012-10-19 46 views
0

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

+0

我不知道如果我完全理解你正试图在这里完成的任务,但将'@ ViewScoped'为你服务吗? http://balusc.blogspot.nl/2010/06/benefits-and-pitfalls-of-viewscoped.html – Aquillo

+0

其次,我假设您正在使用JSF 1.2,因为您正在使用JSP页面? – Aquillo

回答

0

尽管问题中缺少此信息,但我会假设您仍然使用旧版JSF 1.x,但不能将migrate添加到提供新版本view scope的JSF 2.x中,否则您不会已经问过这个问题。 IBM标签的存在也暗示了一些传统怪物的情况。

获取用于JSF 1.2的Tomahawk,并在视图中的任何位置引用请求范围bean的<t:saveState>

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

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

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" /> 
+0

@BalusC是的,你们是对的,我们使用的是JSF 1.2和IBM jsf。我没有选择,只能使用它,因为我没有做出任何决定。这不仅仅是bean,还有一些其他值也被放入requestScope中,例如getRequestScope().put("showActualStatus", "true") 点击转发页面中的某些命令后,我需要这些值。我不需要bean的范围,只需要传递给转发页面的值。我决定把它们放在会话范围内并使用这些值。 – techtabu