如何将 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
问题描述
我是 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:不知道如何迭代提供的项目";在 <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:不知道如何迭代提供的项目";在 <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 getorg.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 <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)
Root Cause
javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <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)
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屋!