JSP吐出错误,我认为这是由于结构?

时间:2012-05-07 20:35:17

标签: java html jsp ms-access

我现在正在快速研究这个JSP,感觉我在这个JSP业务上学得很快。

但我不禁认为这不对?我已经在我的locathost下尝试了它,当它在我的浏览器上吐出时我遇到了问题。所以我觉得我的结构错了,但说实话,不能在我出错的地方锻炼,我已经做了大约5个小时的JSP,所以请给我怀疑的好处。

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<%@ page import="java.io.*" import="java.sql.*"%>
</head>
<body>

<!-- BELOW IS DATABASE CONNECTION SET UP -->
<% 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:database11"); 
// END OF  DATABASE CONNECTION SET UP 
// START OF TESTING 

String mysql="select * from hotels";
Statement s=con.createStatement();
ResultSet rst=s.executeQuery(mysql);

out.println("<table border='1' width='70%'>");
out.println("<tr>");
out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println("<td width='10%'>" + rst.getString ("Country") + "</td>");
out.println("<td width='10%'>" + rst.getString ("PricePerNight") + "</td>");
out.println("<td width='10%'>" + rst.getString ("MaximumPersons") + "</td>");
out.println("<td width='10%'>" + rst.getString ("StarRating") + "</td>");
out.println("<td width='20%'>" + rst.getString ("Description") + "</td>");
out.println("</tr>");

while (rst.next()) {

// Column Details of hotels

out.println("<tr>");
out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println("<td width='10%'>" + rst.getString ("Country") + "</td>");
out.println("<td width='10%'>" + rst.getString ("PricePerNight") + "</td>");
out.println("<td width='10%'>" + rst.getString ("MaximumPersons") + "</td>");
out.println("<td width='10%'>" + rst.getString ("StarRating") + "</td>");
out.println("<td width='20%'>" + rst.getString ("Description") + "</td>");
out.println("</tr>");
}

out.println("</table>");


rst.close();
con.close();

%>

</body>
</html>

如果有任何我做错了,请告诉我,因为我可以想象它会非常整洁,结构合理或完美。

如果您对我正在做的事情感到好奇,请查看我今天早些时候的上一篇文章: https://stackoverflow.com/questions/10485667/university-jsp-booking-project#comment13551068_10485667

但为什么它不起作用,非常感谢任何帮助!?

我的错误:

org.apache.jasper.JasperException: Exception in JSP: /0906055/index.jsp:24

21: 
22: out.println("<table border='1' width='70%'>");
23: out.println("<tr>");
24: out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
25: out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
26: out.println("<td width='10%'>" +  rst.getString ("Country") + "</td>");
27: out.println("<td width='10%'>" + rst.getString ("PricePerNight") + "</td>");


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:395)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

javax.servlet.ServletException: [Microsoft][ODBC Driver Manager] Invalid cursor state
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
    org.apache.jsp._0906055.index_jsp._jspService(index_jsp.java:108)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:371)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state
    sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
    sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    org.apache.jsp._0906055.index_jsp._jspService(index_jsp.java:68)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:371)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.35 logs.

3 个答案:

答案 0 :(得分:1)

这是固定的问题,在查看我的代码后,我不得不进入顶部区域并重复相同的细节。这是重复和签署错误的原因。

我知道有些人知道JSP流利,并会说这是不好的做法; (这是我刚刚学到的东西,所以我恳请你不要这样编码。但是 - 以备将来参考和任何可能在我身边的人。

以下是答案和完成的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<%@ page import="java.io.*" import="java.sql.*"%>
</head>
<body>

<!-- BELOW IS DATABASE CONNECTION SET UP -->
<% 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:webapps"); 
// END OF  DATABASE CONNECTION SET UP 
// START OF TESTING 

String mysql="select * from hotels";
Statement s=con.createStatement();
ResultSet rst=s.executeQuery(mysql);

out.println("<table border='1' width='70%'>");
out.println(" <tr>");
out.println(" <td width='10%'><b>Name of Place</b></td>");
out.println(" <td width='10%'><b>Country</b></td>");
out.println(" <td width='10%'><b>Price Per Night</b></td>");
out.println(" <td width='10%'><b>Maximum Persons</b></td>");
out.println(" <td width='10%'><b>Star Rating</b></td>");
out.println(" <td width='10%'><b>Description</b></td>");
out.println(" </tr>");

while (rst.next()) {

// Column Details of hotels

out.println(" <tr>");

out.println(" <td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println(" <td width='10%'>" + rst.getString ("Country") + "</td>");
out.println(" <td width='10%'>" + rst.getString ("PricePerNight") + "</td>");
out.println(" <td width='10%'>" + rst.getString ("MaximumPersons") + "</td>");
out.println(" <td width='10%'>" + rst.getString ("StarRating") + "</td>");
out.println(" <td width='20%'>" + rst.getString ("Description") + "</td>");
out.println(" </tr>");
}

out.println("</table>");


rst.close();
con.close();

%>

</body>
</html>

答案 1 :(得分:0)

你从一个非常非常古老的资源中学习。你使用的风格在20世纪90年代后期消失了。 没有人以这种方式编写JSP。

这个想法是不应该通过JSP来完成数据库访问。

您还需要学习更多有关JDBC的知识。

您正在使用的ODBC数据源没有您正在使用的Access数据库的概念。请记住,JSP代码在服务器上执行,并创建发送到浏览器的HTML。

我建议您为Access连接使用无DSN的网址:

http://www.jroller.com/sjivan/entry/dsn_less_jdbc_connection_to

我在servlet中建立连接。

我得到Hans Bergsten的关于JSP的O&Reilly书,并开始从中学习。它显示了几年前做事的正确方法。

更新

Invalid cursor state

这是因为您尝试在循环外部访问ResultSet。我已更改您的代码以修复它。看看这是否有帮助。在进一步研究之前,请研究Oracle的JDBC教程。

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<%@ page import="java.io.*" import="java.sql.*"%>
</head>
<body>

<!-- BELOW IS DATABASE CONNECTION SET UP -->
<% 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:database11"); 
// END OF  DATABASE CONNECTION SET UP 
// START OF TESTING 

String mysql="select * from hotels";
Statement s=con.createStatement();
ResultSet rst=s.executeQuery(mysql);

out.println("<table border='1' width='70%'>");

while (rst.next()) {

// Column Details of hotels

out.println("<tr>");
out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println("<td width='10%'>" + rst.getString ("NameofPlace") + "</td>");
out.println("<td width='10%'>" + rst.getString ("Country") + "</td>");
out.println("<td width='10%'>" + rst.getString ("PricePerNight") + "</td>");
out.println("<td width='10%'>" + rst.getString ("MaximumPersons") + "</td>");
out.println("<td width='10%'>" + rst.getString ("StarRating") + "</td>");
out.println("<td width='20%'>" + rst.getString ("Description") + "</td>");
out.println("</tr>");
}

out.println("</table>");


rst.close();
con.close();

%>

</body>
</html>

答案 2 :(得分:0)

您收到了哪些错误消息?这可能是告诉我们问题所在的一个重要线索!

我确实看到一个错误:第一个rst.getString的块在第一个rst.next之前完成。在执行第一个rst.next之前,缓冲区中没有记录,因此无法获取任何字符串。也许你认为在你做next()之前第一条记录是可用的?不是。你做的第一个next()会得到第一个记录。

还有一些小问题,在两个记录转储中,您都会获得两次“NameofPlace”。而你的td宽度总和只有80%。它应该总计100% - td百分比是相对于表的宽度,而不是整个屏幕。 (但这不会给你一个错误。浏览器只是猜测你的意思。)