1

我现在在这个 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.
4

3 回答 3

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>
于 2012-05-08T09:24:28.600 回答
0

你正在从一个非常非常古老的资源中学习。您使用的样式在 1990 年代后期就已经过时了。 再也没有人以这种方式编写 JSP。

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

您还需要了解更多关于 JDBC 的知识。

您使用的 ODBC 数据源不知道您使用的 Access 数据库在哪里。请记住,JSP 代码在服务器上执行并创建发送到浏览器的 HTML。

我建议您对 Access 连接使用无 DSN 的 URL:

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

我会在 servlet 中建立这种连接。

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

更新:

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>
于 2012-05-07T20:43:18.613 回答
0

您收到什么错误消息?这可能是告诉我们问题所在的重要线索!

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

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

于 2012-05-07T20:44:43.637 回答