DD.
DD.

Reputation: 21971

JSF ViewParams not being passed

I am finding view params will not be passed from a page where the backing bean is different on the target page. How can I pass the product param from test1.xhtml to test2.xhtml?

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;
    }



}

Product Converter

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();
        }





    }

Upvotes: 1

Views: 653

Answers (2)

BalusC
BalusC

Reputation: 1108632

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

This is not the right way to let JSF include view parameters in a <h:link>. Supplying it as a query string parameter is only valid in action attribute of UICommand components.

You need the includeViewParams attribute of the <h:link> instead.

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

Upvotes: 1

8bitjunkie
8bitjunkie

Reputation: 13245

@ViewScoped is only valid for postbacks - if you change the URL, the bean dies.

To pass parameters between facelets, use <ui:param>

Upvotes: 0

Related Questions