|
|
||||||||||||||||||||||||||
Max Poon's Blog
«JavaOne2007 Hands-On Lab 1420 |
Main
| "Introduction to the Spring Framework in NetBeans IDE" Tutorial by Troy Giunipero and Craig MacKay »
Extending the NetBeans Tutorial JSF-JPA-Hibernate Application, Part 1 - Co-ordinating Query Views Based on Parameter Passing from JSF View to Managed BeanPosted by maxpoon on June 13, 2007 at 12:47 PMBackground
The NetBeans tutorial "Using
Hibernate With the Java Persistence API" nicely demonstrates, by
using the
NetBeans IDE, easy construction of : | ||||||||||||||||||||||||||
| Figure 1 - 'Sample' Database Tables to be
used by SimpleJpaHibernateApp |
|
| Figure 2 - SimpleJpaHibernateApp Home Page |
| Figure 3 - "Listing ProductCodes" Page |
| Figure 4 - "Detail of ProductCode" Page |
| Figure 5 - New (Desired) "Detail of ProductCode" Page |
| Figure 6 - New (Desired) "Listing Products"
Page |
| Code Listing 1 - Original "Detail of
ProductCode" Page - Location: simpleJpaHibernateApp/web/productCode/Detail.jsp |
| <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>SimpleJpaHibernateApp - Detail of ProductCode</title> </head> <body> <f:view> <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/> <h1>Detail of productCode</h1> <h:form> <h:panelGrid columns="2"> <h:outputText value="ProdCode:"/> <h:outputText title="ProdCode" value="#{productCode.productCode.prodCode}"/> <h:outputText value="DiscountCode:"/> <h:outputText title="DiscountCode" value="#{productCode.productCode.discountCode}"/> <h:outputText value="Description:"/> <h:outputText title="Description" value="#{productCode.productCode.description}"/> </h:panelGrid> <h:commandLink action="productCode_edit" value="Edit" /> <br> <h:commandLink action="productCode_list" value="Show All ProductCode"/> <br> <a href="/SimpleJpaHibernateApp/index.jsp">Back to Home Page</a> </h:form> </f:view> </body> </html> |
| Code Listing 2 - "List of Product" Page - Location: simpleJpaHibernateApp/web/product/List.jsp |
| <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <html> ... <body> <f:view> <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/> <h1>Listing Products</h1> <h:form> <h:commandLink action="#{product.createSetup}" value="New Product"/> <br> <a href="/SimpleJpaHibernateApp/index.jsp">Back to Home Page</a> <br> <h:outputText value= "Item #{product.firstItem + 1}..#{product.lastItem} of #{product.itemCount}"/> <h:commandLink action="#{product.prev}" value="Previous #{product.batchSize}" rendered="#{product.firstItem >= product.batchSize}"/> <h:commandLink action="#{product.next}" value="Next #{product.batchSize}" rendered="#{product.lastItem + product.batchSize <= product.itemCount}"/> <h:commandLink action="#{product.next}" value="Remaining #{product.itemCount - product.lastItem}" rendered="#{product.lastItem < product.itemCount && product.lastItem + product.batchSize > product.itemCount}"/> <h:dataTable value='#{product.products}' var='item' border="1" cellpadding="2" cellspacing="0"> ... </h:dataTable> </h:form> </f:view> </body> </html> |
| Code Listing 3 - New
<h:commandLink...> added to "Detail of ProductCode" page - simpleJpaHibernateApp/web/productCode/Detail.jsp |
| .... <h:commandLink action="productCode_list" value="Show All ProductCode"/> <br> <h:commandLink action="#{product.setSelectedProdCodeDisplayProducts}" value="List of Product with this ProductCode"> <f:param name="selectedProdCode" value="#{productCode.productCode.prodCode}"/> </h:commandLink> <br> <a href="/SimpleJpaHibernateApp/index.jsp">Back to Home Page</a> .... |
| Code Listing 4 - New bean methods
setSelectedProdCode(String selectedProdCode) and setSelectedProdCodeDisplayProducts() of simpleJpaHibernateApp.controller.ProductController |
/** * Setter for selectedProdCode property * @param selectedProdCode String PROD_CODE column value of the selected * ProducCode e.g. in productCode/Detail.jsp */ public void setSelectedProdCode(String selectedProdCode) { this.selectedProdCode = selectedProdCode; } /** * setSelectedProdCodeDisplayProducts() : * <ol> * <li>Get 'selectedProdCode' parameter from FacesContext</li> * <li>Set bean property 'selectedProdCode' with the parameter value</li> * <li>Return "product_list" to invoke product/List.jsp as defined in * faces-config.xml to display Products with this selectedProdCode</li> * </ol> */ public String setSelectedProdCodeDisplayProducts() { String _selectedProdCode = (String) FacesContext.getCurrentInstance() .getExternalContext().getRequestParameterMap() .get("selectedProdCode"); setSelectedProdCode(_selectedProdCode); return "product_list"; } |
| Code Listing 5 - Modified managed bean
methods getProducts() and getItemCount() of
simpleJpaHibernateApp.controller.ProductController |
/** * Retrieve Products and return as ListDataModel according to: * <ol> * <li>ProductCode selected already * <code> * (selectedProdCode != null && selectedProdCode.length() != 0) * </code> * => retrieve Products with the selected ProductCode * </li> * <li>ProductCode not selected (otherwise) * => retrieve all Products * </li> * </ol> */ public DataModel getProducts() { EntityManager em = getEntityManager(); try{ Query q; if (selectedProdCode != null && selectedProdCode.length() != 0) { q = em.createQuery("select object(o) from Product as o " + "where o.productCode.prodCode = :selectedProdCode") .setParameter("selectedProdCode", selectedProdCode); } else { q = em.createQuery("select object(o) from Product as o"); } q.setMaxResults(batchSize); q.setFirstResult(firstItem); model = new ListDataModel(q.getResultList()); return model; } finally { em.close(); } } /** * Count no. of Products items according to: * <ol> * <li>ProductCode selected already * <code> * (selectedProdCode != null && selectedProdCode.length() != 0) * </code> * => count number of Products with the selected ProductCode * </li> * <li>ProductCode not selected (otherwise) * => count number of all Products * </li> * </ol> */ public int getItemCount() { EntityManager em = getEntityManager(); try{ Query q; if (selectedProdCode != null && selectedProdCode.length() != 0) { q = em.createQuery("select count(o) from Product as o " + "where o.productCode.prodCode = :selectedProdCode") .setParameter("selectedProdCode", selectedProdCode); } else { q = em.createQuery("select count(o) from Product as o"); } int count = ((Long) q.getSingleResult()).intValue(); return count; } finally { em.close(); } } |
| Code Listing 6 - Modified index.jsp |
| <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%-- index.jsp - Modified from index.jsp_orig to use JSF <h:commandLink ...> to clear any previously set ProductController#selectedProdCode for listing Products via 'product_list' action @author Max Poon (maxpoon@dev.java.net) --%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Simple JPA Hibernate Application</title> </head> <body> <f:view> <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/> <h1>Simple JPA Hibernate Application</h1> <h:form> <br/> <h:commandLink value="List of ProductCode" action="productCode_list"/> <br/> <h:commandLink value="List of Product" action="#{product.setSelectedProdCodeDisplayProducts}"> <f:param name="selectedProdCode" value=""/> </h:commandLink> <br/> <h:commandLink value="List of Manufacturer" action="manufacturer_list"/> </h:form> </f:view> </body> </html> |
| Code Listing 7 - Example new
servlet-mapping required in
web.xml |
| .... <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> .... |
| Code Listing 8 - Modified href link to
"Home Page" in all referencing JSP's |
| .... <%-- Modified link from /SimpleJpaHibernateApp/index.jsp to /SimpleJpaHibernateApp/index.jsf --%> <a href="/SimpleJpaHibernateApp/index.jsf">Back to Home Page</a> .... |
| Figure 6 - "Listing Products" Page for "HW"
ProductCode |
| Figure 7 - "Listing Products" Page for All
ProductCodes, i.e. All Available Products |
|
|