2009-10-07 44 views
1

除了我的問題"Creating an 「Edit my Item」-page in Java Server Faces with Facelets"我想掩蓋這個問題。在Java Server Faces中使用託管屬性和命令按鈕

當我按下命令按鈕ID = 100被刪除,頁面刷新,這是之前,它甚至運行該方法,對,所以這意味着我沒有ID時,我按下按鈕。

你如何解決這個問題?

有了這個託管Bean

public class BeanWithId implements Serializable { 
    private String id; 
    private String info; 

    private void populateInfo() { 
    info = "Some info from data source for id=" + id; 
    } 

    public String getId() { return id; } 

    public void setId(String id) { 
    this.id = id; 
    populateInfo(); 
    } 

    public String getInfo() { return info; } 
    public void setInfo(String info) { this.info = info; } 

    public String save() { 
    System.out.println("Saving changes to persistence store"); 
    return null; // no navigation 
    } 
} 

並添加

<p><h:commandButton action="#{beanWithId.save}" value="Save" /></p> 

爲了我的facelet頁。現在我在faces-config.xml中也有正確的信息,當我使用ID = 100訪問我的頁面時,我得到的返回的正確項目。

回答

1

有幾種方法可以保留原始GET URL中的ID。我並不想全面。

添加PARAM到commandLink

<h:commandLink action="#{beanWithId.save}" value="Save"> 
    <f:param name="ID" value="#{param.ID}" /> 
</h:commandLink> 

任何時間鏈接被點擊時,ID從參數來設置。

使用隱藏字段

<h:form> 
    <h:inputHidden value="#{beanWithId.id}" /> 
    <p>ID: <h:outputText value="#{beanWithId.id}" /></p> 
    <p>Info: <h:inputText value="#{beanWithId.info}" /></p> 
    <p><h:commandButton action="#{beanWithId.save}" value="Save" /></p> 
</h:form> 

形式發佈任何時間,該ID將從形式來設置。


保存URL

由於表單URL不包括原來的查詢,後將從瀏覽器欄中的URL刪除ID。這可以通過在執行操作後使用服務器端重定向來糾正。

public String save() { 
    System.out.println("Saving changes to persistence store: id=" + id); 
    redirect(); 
    return null; // no navigation 
    } 

    private void redirect() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext ext = context.getExternalContext(); 
    UIViewRoot view = context.getViewRoot(); 
    String actionUrl = context.getApplication().getViewHandler().getActionURL(
     context, view.getViewId()); 
    try { 
     // TODO encode id value 
     actionUrl = ext.encodeActionURL(actionUrl + "?ID=" + id); 
     ext.redirect(actionUrl); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } 
    } 
+0

再一次,你是一個救世主!感謝上級的回答! – 2009-10-07 13:10:00

0

如果您使用JSF 1.2或更新版本,您可以使用f:setPropertyActionListener來設置屬性。

<h:commandButton value="Save" action="#{beanWithId.save}"> 
    <f:setPropertyActionListener target="#{beanWithId.id}" value="100" /> 
</h:commandButton> 

如果您使用的是JSF 1.1或之前,你可以使用

<f:param name="reqId" value="100" /> 

但這個時候你必須得到參數和像這樣的動作手動設置:

public String save() { 
String idParam 
=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("reqId"); 
setId(idParam); 
return null; 
} 
0

這解決了我的問題

<h:commandLink action="#{beanWithId.save}" value=""> 
    <f:verbatim><input type="button" value="Save"/></f:verbatim> 
    <f:param name="id" value="#{beanWithId.id}"/> 
</h:commandLink> 

像Charm一樣工作,但它確實刪除了可見的GET參數,但它仍被存儲以便faces-config可以訪問param.id。

+0

如果您想要一個按鈕,請查看隱藏字段解決方案。 – McDowell 2009-10-07 12:32:23