JSF, PrimeFaces

Powerful Ajax with Update and Process attributes in PrimeFaces

Hi,

PrimeFaces has a very easy and powerful ajax infrastructure using update and process attributes in ajaxified components. Let’s have this following condition:

There is a required inputText field, and also below that you have a dependent 2 h:selectOneMenu components that needs to be ajaxified. Let’s say those two selectOneMenu’s are for country – city, and last requirement is you have to add the selected city to a datatable. A little complicated screen maybe, but which requirement is not? :).Here is the final output we want :

Let’s do the coding. We need a required inputText for the description and a county city selector as follows :


<h:form>

   Description:<br/>
  <h:inputText label="description" required="true" id="description" requiredMessage="Description is required" />

  <p:panel header="Location Selection" id="locationSelector">
   <h:panelGrid columns="2">
      <h:outputText value="Select Country" />
      <h:selectOneMenu id="country" value="#{locationController.country}">
          <f:selectItem itemLabel="Select a Country" itemValue="" />
          <f:selectItems value="#{locationController.allCountries}" />
          <p:ajax update="city" process="country" event="change" actionListener="#{locationController.chooseCountry}" />
      </h:selectOneMenu>

      <h:outputText value="Select City" />
      <h:selectOneMenu id="city" value="#{locationController.city}" >
         <f:selectItem itemLabel="Select a City" itemValue="" />
         <f:selectItems value="#{locationController.cities}" />
      </h:selectOneMenu>
   </h:panelGrid>
   <br />

   <p:commandLink actionListener="#{locationController.selectLocation}" update="selectedCities" process="locationSelector" >
      <h:outputText value="select city" />
   </p:commandLink>
  </p:panel>
</h:form>

The tricky part here is the <p:ajax update="city" process="country" event="change" actionListener="#{locationController.chooseCountry}" /> part. This one does an ajax request when the h:selectOneMenu is changed ( event=”change” ), the selectOneMenu with the id country is processed ( process=”country” ), as only the country part is important while filling the city selector selectOneMenu ( note that we do not have a required message error due to description field, as we never process it even if they are in the same form), and finally refresh city selectOneMenu ( update=”city” ) to refresh the city selector. This way we have minimum load on the server, and we do not fight with validation errors.

Let’s move on to the p:datatable part, think we have a very basic table below for selected Cities :

<p:panel id="selectedCities" header="Selected Cities">
   <p:dataTable value="#{locationController.selectedCities}" var="city">
      <p:column>
          <f:facet name="header">
              City Name
          </f:facet>
         <h:outputText value="#{city.name} ( #{city.country.name} )"/>
     </p:column>
  </p:dataTable>
</p:panel>

Same way as p:ajax works, the p:commandLink will work as follow, update the table ( update=”selectedCities” ), but process the location selector div ( process=”locationSelector” ) as we need to use city and country in our action listener. Easy huh?

I think, this is one of the most powerful side of the PrimeFaces. You can do ajax request without having any validations errors.

I am leaving you the delete command link in the datatable as an exercise 😉

Java, Spring

execute method after all dependencies are injected

Hi,

In Spring, if you want to execute a method after all the dependencies are injected, you can use InitializingBean interface.

A Sample code is as follows :

import org.springframework.beans.factory.InitializingBean;

public class MyViewClass implements InitializingBean {

@Autowired

private AnotherBean anotherBean;

@Autowired

private SomeOtherBean someOtherBean;
.....
@Override
public void afterPropertiesSet() throws Exception {
someOtherBean.someMethod();
// any other thing you want as everything is injected...
}

}

Java

Compare Enums

Hi,

compareTo method is declared as final in Enums so you cannot override it. The default compareTo method is comparing the ordinals ( the order they are defined ) in the Enum. If you want to compare your enums based on name what you can do is, writing your own comparator and use it. For example:

public enum Category {
Technology,
Banking,

....

}

public class CategoryComparator implements Comparator<Category> {

public int compare(Category o1, Category o2) {
Collator collator = Collator.getInstance(new Locale("tr"));
return collator.compare(o1.name(), o2.name());
}
}

and use it in your sort method like :

Collections.sort(categories,new CategoryComparator());

and that is it.

if you want to know why I used Collator to compare check here

Java, Spring

calling method after properties are set in Spring

Hi,

if you want to call a method which you want to be run after all the injections are done just do the following:

1. Make your class implement org.springframework.beans.factory.InitializingBean
2. override afterPropertiesSet method

and that is it. Sample code will be like:

public class MyBean implements InitializingBean {

@Autowired
private MyDao dao;

@Autowired
private MyOtherDao otherDao;

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("this will be called after all the setters are done.");
}
}