2013-02-01 33 views
3

我正在使用liferay和jsf。在我的portlet中,我通過將新值設置爲backing bean來提交頁面後嘗試重置。我有空白的字段,但是當我刷新頁面時,我再次獲得了我之前提交的舊值,並以舊值再次提交。如何在jsf中重置?

我試圖得到新的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(); 
} 

P.S.提交後,我把這個方法稱爲reset(null);

+0

bean的範圍是什麼? –

+0

如果您的範圍是viewScope,則必須在刷新頁面上重置視圖。請檢查瀏覽器自動填入是否發生。並請重新檢查您的管理bean範圍。 – Jitesh

+0

@Kush Sahu:你在使用哪種框架? –

回答

0

這不是刷新問題,而是它發送之前提交的數據的瀏覽器。我發現了一些相當不錯的解決方案。

由於我使用的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> 

所以我選擇了這個。

1

如果您希望在每個請求之後重置bean;在這種情況下,您可以使用由jsf提供的作用域而不是使用該功能。

使用豆在request範圍

tutorial on bean scopes

+0

感謝您的回覆。但是我需要viewcope中的bean來獲得更多的功能。沒有任何方法可以重置viewcope bean。 –

+0

@KushSahu:總有一種方法,但不是我所知道的。等到BalusC看到你的問題..;):) –

+0

是的,我試圖找出解決方案:);) –

1

看來,你的bean的範圍,既不要求也不viewscope只要你想它來查看被破壞之前就被重置。

您可以在CDI中使用ConversationScoped,這將在您開始對話時創建,您可以通過呼叫conversation.end()將其標記爲結束。

How does JSF 2 ConversationScope work?

另外,如果你想在視圖範圍豆重置你也可以做到這一點通過在Ajax事件使用下面,

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

感謝您的回覆,我會嘗試這一點,讓你知道。 :) –

+0

這個bean不會被容器管理,記得調用你的bean的PostConstruct/init方法,因爲容器不會爲你調用它。 –

0

它就是這麼簡單:只要用@註解RequestScoped和一個按鈕:

@ManagedBean 
@RequestScoped 
public class MyBean{ 

public void resetEvent(ActionEvent actionEv) { 
    } 

} 
+0

我需要在視圖範圍內獲取其他功能的一些值 –