Example use JSTL tag <c:foreach, <c:if, <c:set with JSF
843842Feb 28 2004 — edited Oct 11 2007This is full example of using JSLT and JSF togather. it is a Menu Tree (expansable).
The only bug is from JSF or tomcat that <f:attribute > is not working when ui-component appear second time. SO It is replaced by <f:paramter> and each <h:command_link> tag nested within <h:form> tag. It just a turn arround.
-------------------full JSP code--------------
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<% request.setAttribute("CONTEXT_PATH", request.getContextPath()); %>
<LINK rel="stylesheet" type="text/css" href='<c:out value="${requestScope.CONTEXT_PATH}"/>/style/menutree.css'/>
<SCRIPT type='text/javascript' src='<c:out value="${requestScope.CONTEXT_PATH}"/>/js/hideshow.js'></SCRIPT>
<!--f:loadBundle basename="bundle.common.Menu" var="bundle"/-->
<f:subview id="userMenuView">
<c:set var="root" value="${sessionScope.menuTree}"/>
<table class="" width="150px" bgcolor="blue">
<c:forEach var="menuBar" begin="0" items="${root.submenus}">
<c:set var="menu" value="${menuBar.value}"/>
<tr>
<td>
<c:choose>
<c:when test="${menu.isLeaf}">
<c:set var="menuJSF" value="${menu}" scope="request"/>
<h:form>
<h:command_link action="#{Action.action}">
<f:action_listener type="com.nusino.web.listener.menu.MenuListener"/>
<h:output_text value="#{requestScope.menuJSF.name}"/>
<f:parameter name="COMMAND" value="#{requestScope.menuJSF.treeId}"/>
<!--f:attribute name="COMMAND" value="#{requestScope.menuJSF.treeId}"/-->
</h:command_link>
</h:form>
</c:when>
<c:otherwise>
<span class="" onclick="javascript:hideshow('<c:out value="${menu.treeId}"/>')">
<c:out value="${menu.name}"/>
</span>
<div id='<c:out value="${menu.treeId}"/>' >
<table class="">
<c:forEach var="submenu" begin="0" items="${menu.submenus}">
<c:set var="menuItem" value="${submenu.value}"/>
<tr>
<td>
<c:choose>
<c:when test="${menuItem.isLeaf}">
<c:set var="menuItemJSF" value="${menuItem}" scope="request"/>
<h:form>
<h:command_link action="#{Action.action}">
<f:action_listener type="com.nusino.web.listener.menu.MenuListener"/>
<f:parameter name="COMMAND" value="#{requestScope.menuItemJSF.treeId}"/>
<h:output_text value="#{requestScope.menuItemJSF.name}"/>
<!--f:attribute name="COMMAND" value="#{requestScope.menuItemJSF.treeId}"/-->
</h:command_link>
</h:form>
</c:when>
<c:otherwise>
<span class="" onclick="javascript:hideshow('<c:out value="${menuItem.treeId}"/>')">
<c:out value="${menuItem.name}"/>
</span>
<div id='<c:out value="${menuItem.treeId}"/>' >
<table class="">
<c:forEach var="item" begin="0" items="${menuItem.submenus}">
<c:set var="itemObj" value="${item.value}"/>
<tr>
<td>
<c:choose>
<c:when test="${itemObj.isLeaf}">
<c:set var="itemObjJSF" value="${itemObj}" scope="request"/>
<h:form>
<h:command_link action="#{Action.action}">
<f:action_listener type="com.nusino.web.listener.menu.MenuListener"/>
<h:output_text value="#{requestScope.itemObjJSF.name}"/>
<f:parameter name="COMMAND" value="#{requestScope.itemObjJSF.treeId}"/>
<!--f:attribute name="COMMAND" value="#{requestScope.itemObjJSF.treeId}"/-->
</h:command_link>
</h:form>
</c:when>
<c:otherwise>
<span class="">
<c:out value="${itemObj.name}"/>
</span>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
</div>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
</div>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
</f:subview>
<script language= "javascript" >
function prehide(){
<c:forEach var="menuBar" begin="0" items="${root.submenus}">
<c:set var="menu" value="${menuBar.value}"/>
<c:if test="${!menu.isLeaf}">
hide('<c:out value="${menu.treeId}"/>');
<c:forEach var="submenu" begin="0" items="${menu.submenus}">
<c:set var="menuItem" value="${submenu.value}"/>
<c:if test="${!menuItem.isLeaf}">
hide('<c:out value="${menuItem.treeId}"/>');
</c:if>
</c:forEach>
</c:if>
</c:forEach>
}
if(document.all){
prehide();
}
</script>