问题描述
我是 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 <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
解决方法
在您的 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 模板。