如何将 org.apache.taglibs.standard.tag.common.sql.ResultImpl 类型的数据提取到 jstl 中的 c:forEach 中

问题描述

我是 jstl 的新手,我尝试使用 jstl core 和 sql数据库获取数据。

  • 当我使用 java 代码时,我得到 com.MysqL.cj.jdbc.result.ResultSetImpl 类型的数据。

  • 当我使用 jstl 的 sql:query 时,我得到 org.apache.taglibs.standard.tag.common.sql.ResultImpl

<c:forEach>的项目不接受它们。

Java 代码

ResultSet result ;
try {
    Class.forName(driver);
     Connect = DriverManager.getConnection(url+dbname,userNameDB,dbpassword);
    Statement st  = Connect.createStatement();
    result = st.executeQuery("SELECT * FROM questions");
   
    }catch (Exception e) {
   System.out.print(e);
}

jstl:

    <sql:setDataSource var="myDB" driver="com.MysqL.jdbc.Driver" user="root" password="" url="jdbc:MysqL://localhost/exposerjstl" />
        
        <sql:query var="questions" dataSource="${myDB}" >
            SELECT * FROM questions;
        </sql:query>
        <c:forEach var="row" items="${questions}">
            <div><c:out value="${row.question}" /><br>
        </c:forEach>

结果是:

Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:611)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:490)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    examenServlet.doGet(examenServlet.java:72)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

javax.servlet.servletexception: javax.servlet.jsp.JspTagException: Don't kNow how to iterate over supplied "items" in &lt;forEach&gt;
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:664)
    org.apache.jsp.views.home_jsp._jspService(home_jsp.java:217)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    examenServlet.doGet(examenServlet.java:72)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

javax.servlet.jsp.JspTagException: Don't kNow how to iterate over supplied "items" in &lt;forEach&gt;
    org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:274)
    org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:238)
    org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:155)
    javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256)
    org.apache.jsp.views.home_jsp._jspx_meth_c_005fforEach_005f0(home_jsp.java:326)
    org.apache.jsp.views.home_jsp._jspService(home_jsp.java:182)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    examenServlet.doGet(examenServlet.java:72)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/9.0.43

解决方法

在您的 JSTL 版本中,questions 属性的类型是 Result。你不能迭代它,但你可以迭代 Result#getRows(),所以只需用 ${questions} 替换 ${questions.rows}

<sql:setDataSource var="myDB" driver="com.mysql.jdbc.Driver"
                   user="root" password="" url="jdbc:mysql://localhost/exposerjstl" />
<sql:query var="questions" dataSource="${myDB}" >
    SELECT * FROM questions;
</sql:query>
<div>
<c:forEach var="row" items="${questions.rows}">
    <c:out value="${row.question}" />
    <br />
</c:forEach>
</div>

正如 BalusC 所说,<sql:...> 标签主要用于原型设计。在生产中,您应该使用 Java 代码创建集合,将其设置为请求属性并调用 JSP 模板。