3

我正在使用 liferay 和 jsf。在我的 portlet 中,我尝试在提交页面后通过为支持 bean 设置新值来进行重置。我得到了空白字段,但是当我刷新页面时,我再次获得了我之前提交的旧值,并且它再次使用旧值提交。

我试图获得新的 viewroot,但它也给了我相同的结果。

public void reset(AjaxBehaviorEvent event){

    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    ViewHandler viewHandler = application.getViewHandler();
    UIViewRoot viewRoot = viewHandler.createView(context, context
            .getViewRoot().getViewId());
    context.setViewRoot(viewRoot);
    context.renderResponse(); //Optional

    this.MyBean = new MyBean();
}

PS 提交后,我将此方法称为 reset(null);

4

4 回答 4

1

如果您希望在每次请求后重置 bean;在这种情况下,您可以使用 jsf 提供的范围,而不是使用该功能。

request在范围内使用 bean

bean 范围教程

于 2013-02-01T11:32:03.340 回答
1

似乎您的 bean 的范围既不是请求也不是视图范围,因为您希望它甚至在视图被销毁之前就被重置。

您可以ConversationScoped在开始对话时创建的 CDI 中使用,您可以通过调用将其标记为结束conversation.end()

JSF 2 ConversationScope 是如何工作的?

或者,如果你想重置 View Scope bean,那么你也可以在 Ajax 事件中使用下面的方法,

Map<String, Object> viewMap = FacesContext.getCurrentInstance().
                              getViewRoot().getViewMap();
viewMap.put("MyBean",new MyBean());
于 2013-03-20T17:44:03.467 回答
0

刷新不是问题,而是发送先前提交的数据的浏览器。我找到了一些非常好的解决方案。

由于我使用的是 Liferay,所以我只需要放

<action-url-redirect>true</action-url-redirect> 

在 liferay-portlet.xml 像这样

<portlet>
<portlet-name>booksportlet</portlet-name>
<icon>/icon.png</icon>
<action-url-redirect>true</action-url-redirect>
<instanceable>false</instanceable>
</portlet>

所以我选择了这个。

于 2013-03-27T20:30:08.077 回答
0

这真的很简单:只需使用 @RequestScoped 和一个按钮进行注释:

@ManagedBean
@RequestScoped
public class MyBean{

public void resetEvent(ActionEvent actionEv) {
    }

}
于 2013-03-26T11:38:49.120 回答