2012-12-27 49 views
1

我發現視圖參數不會從目標頁面上支持bean不同的頁面傳遞。我如何將產品參數從test1.xhtml傳遞到test2.xhtml?JSF ViewParams不被傳遞

test.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui"> 

<body> 
    <f:metadata> 
     <o:viewParam name="product" value="#{holder.value}" 
      converter="#{productConverter}" 
      converterMessage="Bad request. Unknown product." required="true" 
      requiredMessage="Bad request. Please use a link from within the system." /> 
    </f:metadata> 
    <h:link outcome="/test2.xhtml" includeViewParams="true">link</h:link> 

</body> 
</html> 

test2.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui"> 

<h:head></h:head> 
<body> 
    <f:metadata> 
     <o:viewParam name="product" value="#{holder2.value}" 
      converter="#{productConverter}" 
      converterMessage="Bad request. Unknown product." required="true" 
      requiredMessage="Bad request. Please use a link from within the system." /> 
    </f:metadata> 
    <h:link outcome="/test.xhtml" includeViewParams="true">link</h:link> 
</body> 
</html> 

Holder.java

@ManagedBean 
@ViewScoped 
public class Holder<T> implements Serializable { 
    private T value; 

    public T getValue() { 
     return value; 
    } 

    public void setValue(T value) { 
     this.value = value; 
    } 


} 

Holder2.java

@ManagedBean 
@ViewScoped 
public class Holder2<T> implements Serializable { 
    private T value; 

    public T getValue() { 
     return value; 
    } 

    public void setValue(T value) { 
     this.value = value; 
    } 


} 

Product.java

public class Product { 

    private String name; 

    public Product(String name) { 
     super(); 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 



} 

產品轉換

public class ProductConverter implements Converter { 

     private Map<String,Product> productMap=new HashMap<String, Product>(); 

     public ProductConverter(List<Product> products) { 
      for (Product product:products){ 
       productMap.put(product.getName().toLowerCase(), product); 
      } 
     } 

     @Override 
     public Object getAsObject(FacesContext context, UIComponent component, String value) { 
      return productMap.get(value.toLowerCase()); 
     } 

     @Override 
     public String getAsString(FacesContext context, UIComponent component, Object value) { 
       if (!(value instanceof Product)) { 
        return null; 
       } 

       return ((Product) value).getName().toLowerCase(); 
     } 





    } 

回答

1
<h:link outcome="/test2.xhtml?includeViewParams=true">link</h:link> 

這並不是讓JSF包括在<h:link>視圖參數的正確方式。將其作爲查詢字符串參數提供僅在屬性UICommand組件中有效。

改爲需要the includeViewParams attribute of the <h:link>

<h:link outcome="/test2.xhtml" includeViewParams="true">link</h:link> 
+0

我改變了我的問題來反映你的建議,但仍然有同樣的問題。 –

+0

什麼是JSF impl/version?請注意,只有在目標視圖也具有在元數據中聲明的視圖參數時纔會包含它。所以根據你發佈的代碼片段,這應該已經很好了。 – BalusC

+0

com.sun.faces 2.1.13 –

0

@ViewScoped僅適用於回傳 - 如果更改URL,豆死亡。

要傳遞參數小面之間,使用<ui:param>

+2

雖然你的陳述是真實的,但這不完全是OP的具體問題的原因。 OP正試圖在鏈接URL中自動包含視圖參數。另外,''應該有一個完全不同的目的,它是在Facelets之間傳遞參數(在一個請求/合成中!),你可能意味着建議''在請求之間傳遞參數。 – BalusC

+0

」的用法不正確嗎? – djmj