在我的 JSF 应用程序中,一些值设置为 requestScope,一些值设置在 sessionScope 中。例如,如果您正在预订,则 DTO 保存在 sessionScope 中,以便在下一页和之后成功提交预订后可用。因此,用户可以将预订保存为下一页中的模板,并在以后使用该模板。保存模板后,用户将被重定向到主页。这些预订值保存在 sessionscope 中,但其他一些值仅在 requestScope 中设置的成功提交页面中需要。因此 requestScope 在加载此页面时完成了所需的工作。然后我遇到了一个问题,如果用户使用已经可以保存为模板的名称,则在签入支持 bean 的数据库后,页面应该返回到带有错误消息的同一页面,而不是转发到主页。由于预订值保存在 sessionScope 中,所以这不是问题。但是保存在 requestScope 中的其他值会丢失,并且我在 jsp 页面中得到 nullPointerException。有什么方法可以在不使用 sessionScope 作为其他值的情况下完成我的任务。我认为的一种方法是在 jsp 中使用 postrender 函数在 backing bean 中再次设置这些 requestscope 值。但我不确定请求值是否可用于后期渲染。有人可以帮我吗?我认为的一种方法是在 jsp 中使用 postrender 函数在 backing bean 中再次设置这些 requestscope 值。但我不确定请求值是否可用于后期渲染。有人可以帮我吗?我认为的一种方法是在 jsp 中使用 postrender 函数在 backing bean 中再次设置这些 requestscope 值。但我不确定请求值是否可用于后期渲染。有人可以帮我吗?
问问题
1179 次
2 回答
0
即使问题中缺少此信息,我仍假设您仍在使用旧版 JSF 1.x 并且无法迁移到提供新视图范围的 JSF 2.x ,否则您不会问这个问题。IBM 标签的出现也暗示了一些关于一些遗留怪物的东西。
获取JSF 1.2 的Tomahawk<t:saveState>
并通过视图中的任何位置引用您的请求范围 bean 。
<t:saveState value="#{managedBeanName}" />
就这样。这在幕后与新的 JSF 2.0 视图范围所做的完全一样。因此,通过这种方式,您的#{managedBeanName}
实例实际上变成了一个视图范围的 bean。
于 2012-10-19T20:32:13.787 回答
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" />
于 2012-10-19T20:33:55.103 回答