在JSTL中使用的Java ArrayList(<c:foreach>)</c:foreach>

时间:2014-04-21 10:12:08

标签: java jsp foreach jstl

我想要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} 

出了什么问题?

3 个答案:

答案 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)

在jstl中使用foreach循环,例如查看例如here

并避免jsp页面中的java代码检查此链接

How to avoid Java code in JSP files?