我正在使用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);
答案 0 :(得分:1)
答案 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)
刷新不是问题,而是发送以前提交的数据的浏览器。我找到了一些非常好的解决方案。
来自BalusC博客POST-Redirect-GET pattern
来自rohit salecha blog Liferay Refresh bug
由于我使用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>
所以我选择了这个。