In my .xhtml page, I have the following form:
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./../template/CustomerTemplate.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:define name="formContent">
<h:form>
<p:dataGrid var="item" value="#{mrBean.items}" columns="3">
<p:column>
<p:panel header="#{item.name}">
<h:panelGrid columns="1" style="width:100%">
...
<h:commandButton value="Add To Cart" actionListener="#{cartBean.addItem(item.id)}" />
...
</h:panelGrid>
</p:panel>
</p:column>
</p:dataGrid>
</h:form>
</ui:define>
</ui:composition>
The CustomerTemplate.xhtml is:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
... // import css, js files
</h:head>
<h:body>
... // Other things on the page
<div class="grid_9 content">
<ui:insert name="contentTitle"></ui:insert>
<ui:insert name="formContent"></ui:insert>
</div>
...
</h:body>
</html>
And this is my ManagedBean:
@ManagedBean
@ViewScoped
public class MrBean {
...
private List<ItemState> items;
...
@PostConstruct
public void prepareItemList() {
...
Map<String,String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
partnerID = Long.parseLong(params.get("partnerID"));
...
}
}
As you can see, my MrBean is a ViewScoped ManagedBean. I expected that the @PostContruct function will only be called once when the page is 1st rendered. However, when I click the Add To Cart
button, I ran into the null exception at the line Long.parseLong(params.get("partnerID"))
even though I am still on the same View.
I'd be very grateful if someone could give me an advice on how to tackle this problem.
UPDATE: I managed to get the function working by wrapping the commandButton
inside an ajax
tag like following:
...
<f:ajax listener="#{cartManagedBean.addItem(item.id)}">
<h:commandButton value="Add To Cart" />
</f:ajax>
....