This question already has answers here:
Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern
                                
                                    (5个答案)
                                
                        
                                3年前关闭。
            
                    
我想要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中使用变量。

例如

<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标记的功能来创建scriptlet变量:

<c:set var="fname" value="${result.fname}" />
<jsp:useBean id="fname" type="java.lang.String"/>
<%
  System.out.println(fname);
 %>


请注意,EL变量和Scriptlet变量最初指向相同的String。
但是在scriptlet代码中更改字符串将更改其指向的值,而EL变量保持不变。

07-27 13:25