我想要foreach项目添加数组列表
<sql:query var="query" dataSource="${db}"> select fname, lname from users where fname='ali' </sql:query> <c:forEach items="${query.rows}" var="result"> <% ArrayList l= new ArrayList(); l.add("${result.fname}"); l.add("${result.lname}"); for(int i=0; i<l.size(); i++) { out.println(l.get(i)); } %> </c:forEach>
输出结果:
${result.fname} ${result.lname} ${result.fname} ${result.lname} ${result.fname} ${result.lname}
怎么了 ?
您不能在scriptlet中使用jstl。
保存的值${result.fname}用<c:set>在页面范围内。并在scriptlet中使用变量。
${result.fname}
<c:set>
例如
<c:forEach items="${query.rows}" var="result"> <c:set var="lname" value="${result.lname}" /> <c:set var="fname" value="${result.fname}" /> <% ArrayList l= new ArrayList(); l.add((String)pageContext.getAttribute("fname")); l.add((String)pageContext.getAttribute("lname")); for(int i=0; i<l.size(); i++) { out.println(l.get(i)); } %> </c:forEach>
有关更多信息,请访问http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL4.html
http://javapapers.com/jsp/jsp-life-cycle- explain/
http://docs.oracle.com/cd/E13222_01/wls/docs81/taglib/handler.html
更新
EL属性存储在范围-页面,请求,会话,应用程序中。<c:set>标签示例未指定范围,因此可以这样获得:
<c:set var="fname" value="${result.fname}" /> <% String fname = (String)pageContext.getAttribute("fname"); System.out.println(fname); %>
或者,利用useBean创建脚本变量的标记功能:
useBean
<c:set var="fname" value="${result.fname}" /> <jsp:useBean id="fname" type="java.lang.String"/> <% System.out.println(fname); %>
请注意,EL变量和Scriptlet变量最初指向相同的String。但是在scriptlet代码中更改字符串将更改其指向的值,而EL变量保持不变。