如何将 org.apache.taglibs.standard.tag.common.sql.ResultImpl 类型的数据提取到 jstl 中的 c:forEach 中 [英] how to fetch data of type org.apache.taglibs.standard.tag.common.sql.ResultImpl into c:forEach in jstl

查看:38
本文介绍了如何将 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

的项目不接受它们.

Java 代码:

ResultSet 结果;尝试 {Class.forName(驱动程序);Connect = DriverManager.getConnection(url+dbName, userNameDB, dbpassword);语句 st = Connect.createStatement();result = st.executeQuery("SELECT * FROM questions");}catch(异常e){System.out.print(e);}

jstl:

 <div><c:out value="${row.question}";/><br></c:forEach>

结果是:

堆栈跟踪: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)根本原因javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代提供的项目";在 &lt;forEach>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)根本原因javax.servlet.jsp.JspTagException:不知道如何迭代提供的项目";在 &lt;forEach>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)注意 服务器日志中提供了根本原因的完整堆栈跟踪.Apache Tomcat/9.0.43

解决方案

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

<sql:setDataSource var="myDB";驱动程序=com.mysql.jdbc.Driver";用户=root"密码="url="jdbc:mysql://localhost/exposerjstl";/><sql:query var="questions";数据源=${myDB}";>SELECT * FROM 问题;</sql:query><div><c:forEach var="row";items=${questions.rows}"><c:out value="${row.question}";/><br/></c:forEach>

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

I am new in jstl and i try to use jstl core and sql to fetch data from database.

  • when I use java code i get data of type com.mysql.cj.jdbc.result.ResultSetImpl.

  • when I use sql:query of jstl i get org.apache.taglibs.standard.tag.common.sql.ResultImpl

and <c:forEach>'s items doesn't accept both of them.

Java code:

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>

the result is:

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

解决方案

In your JSTL version the type of the questions attribute is Result. You cannot iterate over it, but you can iterate over Result#getRows(), so just replace ${questions} with ${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>

As remarked by BalusC, the <sql:...> tags are mostly for prototyping. In production you should create the collection in Java code, set it as a request attribute and call the JSP template.

这篇关于如何将 org.apache.taglibs.standard.tag.common.sql.ResultImpl 类型的数据提取到 jstl 中的 c:forEach 中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆