Problems
1. Using c:if for conditional output seemed to always result in FALSE when clearly that wasn't the case. There are a few options in JSF 2.0 world but the easiest was to now use ui:fragment as shown below.
<ui:fragment rendered="#{queryBean.rowcount > 0}">
2. As was the case with c:if , c:forEach didn't work for me either. I believe it had something to do with it being run when the component tree is being built. So now I will be using ui:repeat instead, which is close to identical but now use the attribute value instead of items.
<ui:repeat var="columnName" value="#{queryBean.queryData.columnNames}">
So here is the Facelet page, Managed bean and a quick HTML screen show of how it worked.
Query.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/pages/templates/EmpTemplate.xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:metadata>
<f:viewParam name="refresh" value="#{employeeBean.refresh}" />
<f:viewParam name="deptno" value="#{employeeBean.deptno}" />
<f:viewParam name="empno" value="#{employeeBean.empno}" />
</f:metadata>
<ui:define name="title">
#{msg.browserheading}
</ui:define>
<ui:define name="header">
<ui:include src="/pages/employees/header.xhtml" />
</ui:define>
<ui:define name="body">
<b>Enter SQL query below without semi colon</b>
<p />
<h:message for="query" style="color: #336699"/>
<h:form>
<h:inputTextarea rows="8"
cols="100"
value="#{queryBean.query}"
required="true"
requiredMessage="You must an SQL select statement to execute"
validator="#{queryBean.validateQuery}"
id="query"/>
<br />
<h:commandButton value="Submit Query" action="#{queryBean.executeQuery}"/>
<h:commandButton value="Clear" action="#{queryBean.clearScreen}"/>
<p />
</h:form>
<p />
<ui:fragment rendered="#{queryBean.rowcount > 0}">
<i>Total of #{queryBean.rowcount} record(s) found</i>
<p />
<table border="1">
<thead>
<tr>
<ui:repeat var="columnName" value="#{queryBean.queryData.columnNames}">
<th class="heading">#{columnName}</th>
</ui:repeat>
</tr>
</thead>
<tbody>
<ui:repeat var="row" value="#{queryBean.queryData.rows}" varStatus="loop">
<tr class="${((loop.index % 2) == 0) ? 'even' : 'odd'}">
<ui:repeat var="columnName" value="#{queryBean.queryData.columnNames}">
<td>#{row[columnName]}</td>
</ui:repeat>
</tr>
</ui:repeat>
</tbody>
</table>
<p />
</ui:fragment>
</ui:define>
<ui:define name="footer">
<ui:include src="/pages/employees/footer.xhtml" />
</ui:define>
</ui:composition>
QueryBean.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package oracle.jsf.demo.managedbeans;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.jsp.jstl.sql.Result;
import oracle.jsf.demo.dao.emp.EmployeeService;
/**
*
* @author papicell
*/
@ManagedBean
public class QueryBean
{
private Result queryData;
private String query;
private int rowcount;
@ManagedProperty(value="#{employeeServiceImpl}")
private EmployeeService service;
public QueryBean()
{
rowcount = 0;
}
public String getQuery()
{
return query;
}
public void setQuery(String query)
{
this.query = query;
}
public Result getQueryData()
{
return queryData;
}
public void setQueryData(Result queryData)
{
this.queryData = queryData;
}
public EmployeeService getService()
{
return service;
}
public void setService(EmployeeService service)
{
this.service = service;
}
public int getRowcount()
{
return rowcount;
}
public void setRowcount(int rowcount)
{
this.rowcount = rowcount;
}
/*
* Custom Validation method for query field
*/
public void validateQuery(FacesContext context,
UIComponent componentToValidate,
Object value) throws ValidatorException
{
String statementSQL = ((String)value);
if (!statementSQL.toLowerCase().startsWith("select"))
{
FacesMessage message =
new FacesMessage("Not a valid SQL Select statement entered");
throw new ValidatorException(message);
}
}
public void executeQuery ()
{
queryData = service.executeQuery(getQuery());
setRowcount(queryData.getRowCount());
}
public void clearScreen ()
{
queryData = null;
setRowcount(0);
}
}
Browser Ouput

No comments:
Post a Comment