如何在 jsf 中重置



我正在使用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>

所以我选择了这个。

相关内容

  • 没有找到相关文章

最新更新