One way to do ad-hoc templating is to use Facelets instead of JSPs. Since these have become part of JSF 2.0 (due in JEE6), I think it is a good time to consider them.
For example, for the beans:
public class LiBean implements Serializable {
private static final long serialVersionUID = 1L;
private String href;
private String title;
public String getHref() { return href; }
public void setHref(String href) { this.href = href; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}
...and:
public class UlBean implements Serializable {
private static final long serialVersionUID = 1L;
private final List<LiBean> listItems = new ArrayList<LiBean>();
public UlBean() {
String[] links = { "http://www.sun.com", "Sun",
"http://www.oracle.com", "Oracle",
"http://www.ibm.com", "IBM",
"http://stackoverflow.com",
"<stackoverflow.com> & encoded output" };
for (int i = 0; i < links.length; i++) {
LiBean item = new LiBean();
item.setHref(links[i]);
item.setTitle(links[++i]);
listItems.add(item);
}
}
public List<LiBean> getListItems() {
return listItems;
}
}
...defined in session scope:
<managed-bean>
<managed-bean-name>ulBean</managed-bean-name>
<managed-bean-class>beans.UlBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
...can be used in this Facelet page:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>repeat</title>
</head>
<body>
<ul>
<ui:repeat value="#{ulBean.listItems}" var="item">
<li><a href="#{item.href}"><h:outputText
value="#{item.title}" /></a></li>
</ui:repeat>
</ul>
</body>
</html>
...to produce this output:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>repeat</title>
</head>
<body>
<ul>
<li><a href="http://www.sun.com">Sun</a></li>
<li><a href="http://www.oracle.com">Oracle</a></li>
<li><a href="http://www.ibm.com">IBM</a></li>
<li><a href="http://stackoverflow.com">&lt;stackoverflow.com&gt; & encoded output</a></li>
</ul>
</body>
</html>
If you are sticking with JSPs, there isn't anything in the core implementation that will let you do this (the only repeating control is the dataTable). You may find something in one of the 3rd party component libraries.