Reputation: 364
I am using JSF 2.1.1. I have a sample JSF page that is used to post country comments. I use the f:viewparam
tag to select country pages. Here is the code:
country.xhtml
:
<f:metadata>
<f:viewParam name="country" value="#{countryBean2.selectedCountry}" converter="countryConverter" />
</f:metadata>
<h:head>
<title>Country</title>
</h:head>
<h:body>
<h:form id="form">
<h:outputText value="#{countryBean2.selectedCountry.countryName}" />
<br/><br/>
<h:outputText value="Comment:" />
<h:inputText value="#{countryBean2.comment}" />
<br/>
<h:commandButton value="Send">
<f:ajax listener="#{countryBean2.sendComment}" render="form" />
</h:commandButton>
</h:form>
</h:body>
CountryBean2.java
:
@Named("countryBean2")
@SessionScoped
public class CountryBean2 implements Serializable {
private EntityCountry selectedCountry;
private String comment;
public EntityCountry getSelectedCountry() { return selectedCountry; }
public void setSelectedCountry(EntityCountry newValue) { selectedCountry = newValue; }
public String getComment() { return comment; }
public void setComment(String newValue) { comment = newValue; }
EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU");
public void sendComment() {
EntityManager em = emf.createEntityManager();
try {
FacesMessage msg = null;
EntityTransaction entr = em.getTransaction();
boolean committed = false;
entr.begin();
try {
EntityCountryComment c = new EntityCountryComment();
c.setCountry(selectedCountry);
c.setComment(comment);
em.persist(c);
committed = true;
msg = new FacesMessage();
msg.setSeverity(FacesMessage.SEVERITY_INFO);
msg.setSummary("Comment was sended");
} finally {
if (!committed) entr.rollback();
}
} finally {
em.close();
}
}
}
CountryConverter.java
:
public class CountryConverter implements Converter {
public static EntityCountry country = new EntityCountry();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU");
@Override
public EntityCountry getAsObject(FacesContext context, UIComponent component, String value) {
EntityManager em = emf.createEntityManager();
Query query = em.createQuery("SELECT c FROM EntityCountry c WHERE c.countryName = :countryName")
.setParameter("countryName", value);
country = (EntityCountry) query.getSingleResult();
return country;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
EntityCountry c = (EntityCountry) value;
return c.getCountryName();
}
}
I can open a country pages successfully (for example http://localhost:8080/test/faces/country.xhtml?country=england
), but when I try to post a comment using the commandButton
, the setComment
setter is not called and the comment
variable remains null
. I tried to set immediate="true"
on both inputText
and commandButton
, it does not work.
Upvotes: 0
Views: 706
Reputation: 1108632
The execute
attribute of <f:ajax>
defaults to @this
, the current component. If you want to submit the entire form, then you need @form
instead. Use this in the render
as well.
<h:commandButton value="Send">
<f:ajax execute="@form" listener="#{countryBean2.sendComment}" render="@form" />
</h:commandButton>
Upvotes: 1