如何在jsf中重置?

时间:2013-02-01 11:27:07

标签: jsf liferay facelets portlet

我正在使用liferay和jsf。在我的portlet中,我试图通过为辅助bean设置新值来提交页面后重置。我有空白的字段,但是当我刷新页面时,我再次获得了我之前提交的旧值,并再次使用旧值提交。

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

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();
}

P.S。提交后,我将此方法称为reset(null);

4 个答案:

答案 0 :(得分:1)

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

request范围内使用bean

tutorial on bean scopes

答案 1 :(得分:1)

看起来你的bean的范围既不是请求也不是viewcope,因为你希望它甚至在视图被销毁之前被重置。

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

How does JSF 2 ConversationScope work?

或者,如果您想重置View Scope bean,那么您也可以在Ajax事件中使用下面的内容来实现它,

Map<String, Object> viewMap = FacesContext.getCurrentInstance().
                              getViewRoot().getViewMap();
viewMap.put("MyBean",new MyBean());

答案 2 :(得分:0)

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

@ManagedBean
@RequestScoped
public class MyBean{

public void resetEvent(ActionEvent actionEv) {
    }

}

答案 3 :(得分:0)

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

由于我使用Liferay,我只能放

<action-url-redirect>true</action-url-redirect> 
像life this-portlet.xml一样

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

所以我选择了这个。