Den lidt længere forklaring kommer her.
Jeg starter med et basis eksempel:
<%@ page language="java" import="java.util.*" %>
<%@ taglib uri="
http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="
http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="
http://jakarta.apache.org/struts/tags-nested" prefix="nested" %>
<%!
public class C1
{
private String hdr;
private List c2;
public C1() {
this("");
}
public C1(String hdr) {
this.hdr = hdr;
c2 = new ArrayList();
}
public String getHdr() {
return hdr;
}
public List getC2() {
return c2;
}
public void add(C2 o) {
c2.add(o);
}
}
public class C2
{
private String s1;
private String s2;
public C2() {
this("", "");
}
public C2(String s1, String s2) {
this.s1 = s1;
this.s2 = s2;
}
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
public String getS2() {
return s2;
}
public void setS2(String s1) {
this.s2 = s2;
}
}
%>
<%
C1 v1 = new C1("Gruppe 1");
v1.add(new C2("1", "A"));
v1.add(new C2("2", "BB"));
C1 v2 = new C1("Gruppe 2");
v2.add(new C2("3", "CCC"));
v2.add(new C2("4", "DDDD"));
List lst = new ArrayList();
lst.add(v1);
lst.add(v2);
request.setAttribute("lst", lst);
%>
<html>
<head>
<title>Nested test</title>
</head>
<body>
<logic:iterate id="c1" name="lst">
<bean:write name="c1" property="hdr"/>
<table border="true">
<tr>
<th>s1</th>
<th>s2</th>
<th>s1+s2</th>
</tr>
<nested:root name="c1">
<nested:iterate property="c2">
<tr>
<td><nested:write property="s1"/></td>
<td><nested:write property="s2"/></td>
<td><nested:write property="s1"/><nested:write property="s2"/></td>
</tr>
</nested:iterate>
</nested:root>
</table>
</logic:iterate>
</body>
</html>
og så går jeg på jagt efter nested-el og finder ud af at kun bean, logic og html
findes i en EL udgave.
Nå men så omskriver jeg det da bare til plain bean:
<%@ page language="java" import="java.util.*" %>
<%@ taglib uri="
http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="
http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%!
public class C1
{
private String hdr;
private List c2;
public C1() {
this("");
}
public C1(String hdr) {
this.hdr = hdr;
c2 = new ArrayList();
}
public String getHdr() {
return hdr;
}
public List getC2() {
return c2;
}
public void add(C2 o) {
c2.add(o);
}
}
public class C2
{
private String s1;
private String s2;
public C2() {
this("", "");
}
public C2(String s1, String s2) {
this.s1 = s1;
this.s2 = s2;
}
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
public String getS2() {
return s2;
}
public void setS2(String s1) {
this.s2 = s2;
}
}
%>
<%
C1 v1 = new C1("Gruppe 1");
v1.add(new C2("1", "A"));
v1.add(new C2("2", "BB"));
C1 v2 = new C1("Gruppe 2");
v2.add(new C2("3", "CCC"));
v2.add(new C2("4", "DDDD"));
List lst = new ArrayList();
lst.add(v1);
lst.add(v2);
request.setAttribute("lst", lst);
%>
<html>
<head>
<title>Not nested test</title>
</head>
<body>
<logic:iterate id="c1" name="lst">
<bean:write name="c1" property="hdr"/>
<table border="true">
<tr>
<th>s1</th>
<th>s2</th>
<th>s1+s2</th>
</tr>
<logic:iterate id="c2" name="c1" property="c2">
<tr>
<td><bean:write name="c2" property="s1"/></td>
<td><bean:write name="c2" property="s2"/></td>
<td><bean:write name="c2" property="s1"/><bean:write name="c2" property="s2"/></td>
</tr>
</logic:iterate>
</table>
</logic:iterate>
</body>
</html>
og begynder at kigge på struts el.
Men ak og ve. bean:write er ikke lavet i EL version. De henviser til JSTL.
Suk.
OK, så laver vi det samme i JSTL:
<%@ page language="java" import="java.util.*" %>
<%@ taglib uri="
http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%!
public class C1
{
private String hdr;
private List c2;
public C1() {
this("");
}
public C1(String hdr) {
this.hdr = hdr;
c2 = new ArrayList();
}
public String getHdr() {
return hdr;
}
public List getC2() {
return c2;
}
public void add(C2 o) {
c2.add(o);
}
}
public class C2
{
private String s1;
private String s2;
public C2() {
this("", "");
}
public C2(String s1, String s2) {
this.s1 = s1;
this.s2 = s2;
}
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
public String getS2() {
return s2;
}
public void setS2(String s1) {
this.s2 = s2;
}
}
%>
<%
C1 v1 = new C1("Gruppe 1");
v1.add(new C2("1", "A"));
v1.add(new C2("2", "BB"));
C1 v2 = new C1("Gruppe 2");
v2.add(new C2("3", "CCC"));
v2.add(new C2("4", "DDDD"));
List lst = new ArrayList();
lst.add(v1);
lst.add(v2);
request.setAttribute("lst", lst);
%>
<html>
<head>
<title>Standard test</title>
</head>
<body>
<c:forEach var="c1" items="${lst}">
${c1.hdr}
<table border="true">
<tr>
<th>s1</th>
<th>s2</th>
<th>s1+s2</th>
</tr>
<c:forEach var="c2" items="${c1.c2}">
<tr>
<td>${c2.s1}</td>
<td>${c2.s2}</td>
<td>${c2.s1}${c2.s2}</td>
</tr>
</c:forEach>
</table>
</c:forEach>
</body>
</html>
og forsøger også med ${c2.s1+c2.s2} for at finde ud af EL slet ikke understøtter
string concatanation.
Derfor 2 x separat output.
Præcis samme teknik som i basis udgaven med nested:write (dog er syntaxen nok lidt
lettere).