【问题标题】:How to reset in jsf?如何在jsf中重置?
【发布时间】:2013-02-01 11:27:06
【问题描述】:

我正在使用 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();
}

附:提交后我将此方法称为 reset(null);

【问题讨论】:

  • bean 的作用域是什么?
  • 如果您的范围是 viewScope 则必须在刷新页面时重置视图。请检查是否由于浏览器的自动填充条目而发生。请重新检查您的托管 bean 范围。
  • @Kush Sahu:你用的是哪个框架?

标签: jsf liferay facelets portlet


【解决方案1】:

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

request范围内使用bean

tutorial on bean scopes

【讨论】:

  • 感谢您的回复。但是我需要 viewscope 中的 bean 来获得更多功能。有没有办法重置viewscope bean。
  • @KushSahu :总有一种方法,但不是我所知道的。等到 BalusC 看到你的问题.. ;) :)
  • 是的,我正在尝试找出解决方案 :) ;)
【解决方案2】:

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

您可以在 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());

【讨论】:

  • 感谢您的回复,我会试试这个并让您知道。 :)
  • 这个 bean 不会被容器管理,记得调用你的 bean 的 PostConstruct/init 方法,因为容器不会为你调用它。
【解决方案3】:

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

@ManagedBean
@RequestScoped
public class MyBean{

public void resetEvent(ActionEvent actionEv) {
    }

}

【讨论】:

  • 我需要在视图范围内获取其他功能中的一些值
【解决方案4】:

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

因为我用的是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>

所以我选择了这个。

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 2014-07-22
    • 2017-03-09
    • 2013-01-24
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多