我想要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}
出了什么问题?
答案 0 :(得分:2)
你不能在scriptlet中使用jstl ..
在页面范围内使用${result.fname}
保存<c:set>
的值。并在scriptlet中使用变量。
e.g。
<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);
%>
或者利用创建scriptlet变量的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变量不变。
答案 1 :(得分:1)
在使用引号添加${result.fname}
时。 JVM将其视为字符串文字。所以你得到这样的结果。
答案 2 :(得分:0)