我正在使用liferay和jsf。在我的 portlet 中,我尝试通过在提交页面后通过为支持豆设置新值来重置。我有空白字段,但是当我刷新页面时,我再次获得了我之前提交的旧值,然后它再次使用旧值提交。
我试图获得新的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();
}
附言提交后,我将此方法称为重置(null);
如果您希望在每次请求后重置 bean;在这种情况下,您可以使用 jsf 提供的作用域,而不是使用该函数。
在request
范围内使用 Bean
关于 Bean 作用域的教程
似乎您的 bean 的范围既不是请求也不是视图范围,因为您希望甚至在视图被销毁之前重置它。
您可以使用 CDI 中的ConversationScoped
,该将在您开始对话时创建,您可以通过呼叫 conversation.end()
将其标记为结束。
JSF 2 ConversationScope 如何工作?
或者,如果你想重置视图范围 bean,那么你也可以通过在 Ajax 事件中使用以下命令来做到这一点,
Map<String, Object> viewMap = FacesContext.getCurrentInstance().
getViewRoot().getViewMap();
viewMap.put("MyBean",new MyBean());
就是这么简单: 只需用@RequestScoped和一个按钮进行注释:
@ManagedBean
@RequestScoped
public class MyBean{
public void resetEvent(ActionEvent actionEv) {
}
}
刷新不是问题,而是发送以前提交数据的浏览器。我找到了一些非常好的解决方案。
-
来自BalusC博客POST-Redirect-GET模式
-
来自rohit salecha博客Liferay Refresh bug
由于我使用的是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>
所以我选择了这个。