求解:一个使用javabean访问Access数据库的jsp发生的错误

cds1 2006-03-30 12:39:34
用JDBC访问Access数据库,首先创建了stud.mdb,然后在数据库中创建Table1表,表中有三个字段,分别是name,sex,score
配置了ODBC数据源,数据源名称为student

javabean源代码如下,并已编译成class文件放到Tomcat 5.5\webapps\ROOT\WEB-INF\classes\student下:

package student;
import java.sql.*;
public class conn {
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr = "jdbc:odbc:student";
Connection connect = null;
ResultSet rs = null;
public conn() {
try {
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println( e.getMessage());
}
}
public ResultSet executeQuery(String sql) {
try {
connect = DriverManager.getConnection(sConnStr);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println(ex.getMessage());
}
return rs;
}
}


另有一个访问javabean的jsp文件conn_db.jsp,源码如下:

<%@ page contentType="text/html;charset=GBK" %>
<%@ page language="java" import="java.sql.*"%>
<jsp:useBean id="connDbBean" scope="page" class="student.conn"/>
<html>
<head>
<title>test db connection</title>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<table width="60%" border="1">
<tr bgcolor="#CCCCFF">
<td width="50%">
<div align="center"><font color="#FF0033"><b>姓名</b></font></div>
</td>
<td width="25%">
<div align="center"><font color="#FF0033"><b>性别</b></font></div>
</td>
<td width="25%">
<div align="center"><font color="#FF0033"><b>分数</b></font></div>
</td>
</tr>
<%
ResultSet RS_result = connDbBean.executeQuery("select * from Table1");
String studentName="";
String studentSex="";
int studentScore=0;
while(RS_result.next())
{
studentName=RS_result.getString("name");
studentSex=RS_result.getString("sex");
studentScore=RS_result.getInt("score");
%>
<tr>
<td width="50%" bgcolor="#FFFFFF">
<div align="center"><%=studentName%></div>
</td>
<td width="25%">
<div align="center"><%=studentSex%></div>
</td>
<td width="25%">
<div align="center"><%=studentScore%></div>
</td>
</tr>
<%
}
RS_result.close();
%>
</table>
</body>
</html>


我的启动文件放在ROOT/myjsp/JSP-08下面
然后我通过以下地址进行访问 http://localhost:8080/myjsp/JSP-08/conn_db.jsp

运行的错误如下:
HTTP Status 500 -

--------------------------------------------------------------------------------

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Exception in JSP: /myjsp/JSP-08/conn_db.jsp:27

24: String studentName="";
25: String studentSex="";
26: int studentScore=0;
27: while(RS_result.next())
28: {
29: studentName=RS_result.getString("name");
30: studentSex=RS_result.getString("sex");


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause

java.lang.NullPointerException
org.apache.jsp.myjsp.JSP_002d08.conn_005fdb_jsp._jspService(org.apache.jsp.myjsp.JSP_002d08.conn_005fdb_jsp:77)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


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


--------------------------------------------------------------------------------



不知道为什么,哪里弄错了呢
期待解答
Apache Tomcat/5.5.15
...全文
277 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Annalisa 2006-04-08
  • 打赏
  • 举报
回复
非常奇怪,我今天重新设置CLASSPATH后,似乎又可以使用javabean访问数据库了,太奇怪了,共同探讨
gougou8180 2006-04-05
  • 打赏
  • 举报
回复
NullPointerException
是由于string对象值为空
葫芦的世界 2006-04-05
  • 打赏
  • 举报
回复
我出现的问题也和楼主的一样.而且以上的方法都不行呀.我连接的是SQLSERVER.在JSP里可以从数据库里取出数据.可是一用到BEAN(和楼主的一样).就会出现:java.lang.NullPointerException
错误.望大虾们指点.
Annalisa 2006-04-04
  • 打赏
  • 举报
回复
系统DSN好像是所有用户都可以使用的,用户DSN就只有创建的用户可以用吧
zjhdzwm1 2006-04-04
  • 打赏
  • 举报
回复
用JDBC访问Access数据库,首先创建了stud.mdb,然后在数据库中创建Table1表
你这里的数据库名字叫stud,怎么在下面引用的时候变成student了(String sConnStr = "jdbc:odbc:student";)
不好意思,我是新手,说错了不要怪我呀
cds1 2006-04-02
  • 打赏
  • 举报
回复
多谢楼上兄弟的意见
已经可以连接上数据库啦

不过还想问下设置数据源的时候,
在“用户DSN”里设置跟在“系统DSN”里设置,
没什么区别吗?
以后都可以直接在“系统DSN”里设置数据源吗
Annalisa 2006-04-02
  • 打赏
  • 举报
回复
我和你遇到了同样的问题,后来我把ODBC数据源设成系统DSN(原来设的用户DSN),结果成功了。
建议你先不要用bean连数据库,先将连数据库的几条语句直接放到jsp文件中,看看是否报错,我就是这样调试的。现在成功了,呵呵,很高兴。
cds1 2006-03-31
  • 打赏
  • 举报
回复
怎么没有人帮忙给解决的哦?

cds1 2006-03-31
  • 打赏
  • 举报
回复
图片竟然显示不出来的,不过接这个网址就可以看到了
http://img309.photo.163.com/cdsheng1983/37996111/1030278556.jpg
cds1 2006-03-31
  • 打赏
  • 举报
回复
楼上的大哥,由于学习不够深入,还无法完全理解你表达的内容。

不过小弟把程序改了改后,现在又有新的问题了,同时,运行过程中不出现错误提示了
只是输入的结果不对哦,程序修改后如下:

jvavbean为:
package student;
import java.sql.*;
public class conn {
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr = "jdbc:odbc:student";
Connection connect = null;
ResultSet rs = null;
public conn() {
try {
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println( e.getMessage());
}
}
public ResultSet executeQuery(String sql) {
try {
connect = DriverManager.getConnection(sConnStr);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql);
return rs;
}
catch(SQLException ex) {
System.err.println(ex.getMessage());
return null;
}

}
}


conn_db.jsp源代码修改如下:

<%@ page contentType="text/html;charset=GBK" %>
<%@ page language="java" import="java.sql.*"%>
<jsp:useBean id="connDbBean" scope="page" class="student.conn"/>
<html>
<head>
<title>test db connection</title>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<table width="60%" border="1">
<tr bgcolor="#CCCCFF">
<td width="50%">
<div align="center"><font color="#FF0033"><b>姓名</b></font></div>
</td>
<td width="25%">
<div align="center"><font color="#FF0033"><b>性别</b></font></div>
</td>
<td width="25%">
<div align="center"><font color="#FF0033"><b>分数</b></font></div>
</td>
</tr>
<%
ResultSet RS_result = connDbBean.executeQuery("select * from Table1");
String studentName="";
String studentSex="";
int studentScore=0;
if(RS_result!=null){
while(RS_result.next())
{
studentName=RS_result.getString("name");
studentSex=RS_result.getString("sex");
studentScore=RS_result.getInt("score");
%>
<tr>
<td width="50%" bgcolor="#FFFFFF">
<div align="center"><%=studentName%></div>
</td>
<td width="25%">
<div align="center"><%=studentSex%></div>
</td>
<td width="25%">
<div align="center"><%=studentScore%></div>
</td>
</tr>
<%
}
RS_result.close();
}
else
out.println("返回值为空");
%>
</table>
</body>
</html>


经过http://localhost:8080/myjsp/JSP-08/conn_db.jsp进行访问,
浏览器没有提示错误,有页内容输出,只是并没有输出数据库中的任何值,
难道是数据库连接不上吗?可是我数据源设置也设了,javabean中的数据库连接
也应该没有错吧?数据库里有name sex score三个字段,而且都赋了值了呀
为什么会出现这样的情况呢,望多多指教,网页输出如下:

(姓名 性别 分数
返回值为空)
<img src="http://img309.photo.163.com/cdsheng1983/37996111/__scale__1_1030278556.jpg">
crazy_bug 2006-03-30
  • 打赏
  • 举报
回复
public ResultSet executeQuery(String sql) {
try {
connect = DriverManager.getConnection(sConnStr);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println(ex.getMessage());
}
return rs;
}
}
问题的关键是当发生了异常,将返回null(ResultSet rs = null;),从上述代码来看,发生了异常,程序并不会终止,那么在jsp中,应该对ResultSet作非空判断(ResultSet RS_result = connDbBean.executeQuery("select * from Table1");)。
java.lang.NullPointerException,就是因为RS_result是个空指针。
而且从上述javabean的设计来看,问题比较多,数据库连接没用关闭,ResultSet是成员变量,如果多线程操作,调用了另外一个方法,将改变ResultSet对象,导致结果出错。在处理多线程时,应该慎用成员变量(Web应用就是多线程的)。
pigengler 2006-03-30
  • 打赏
  • 举报
回复
一楼正解。。。。。

循环RS一定要使用try的例外机制
hou_yu 2006-03-30
  • 打赏
  • 举报
回复
取结果集之前加上
RS_result.first()试试,
或者改一改connect.createStatement()
让它带个可以前滚参数什么的,具体代码忘了,网上查查
crazy_bug 2006-03-30
  • 打赏
  • 举报
回复
jsp页面作相应的变化,这里仅只是给出示例:

<%@ page contentType="text/html;charset=GBK" %>
<jsp:useBean id="studentBean" scope="page" class="JavaBean"/>
<html>
<head>
<title>test db connection</title>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<table width="60%" border="1">
<tr bgcolor="#CCCCFF">
<td width="50%">
<div align="center"><font color="#FF0033"><b>ÐÕÃû</b></font></div>
</td>
<td width="25%">
<div align="center"><font color="#FF0033"><b>ÐÔ±ð</b></font></div>
</td>
<td width="25%">
<div align="center"><font color="#FF0033"><b>·ÖÊý</b></font></div>
</td>
</tr>
<%
Iterator it = studentBean.query().iterator();
while (it.hasNext()){
Student student = (Student)it.next();
%>
<tr>
<td width="50%" bgcolor="#FFFFFF">
<div align="center"><%=student.getName()%></div>
</td>
<td width="25%">
<div align="center"><%=student.getSex()%></div>
</td>
<td width="25%">
<div align="center"><%=student.getAge()%></div>
</td>
</tr>
<%
}

%>
</table>
</body>
</html>
crazy_bug 2006-03-30
  • 打赏
  • 举报
回复
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Vector;

public class JavaBean {

private static final String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";

private static final String sConnStr = "jdbc:odbc:student";

static {
try {
Class.forName(sDBDriver);
} catch (java.lang.ClassNotFoundException e) {
System.err.println(e.getMessage());
}
}

/**
* 在javabean里完成所有数据库操作,将数据库记录转换成业务对象Student,
* 在jsp中直接获取该业务对象,则jsp无须关注具体的业务逻辑,可以很好的将界面和逻辑分离。
* 具体的思路可以参考MVC的模式,这里只是做过简单的例子,希望你能从中领悟出一些思路。
*
* @param id
* @return
* @throws SQLException
*/
public Student queryStudentById(String id) throws SQLException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet ret = null;

try{
conn = getConnection();
stmt = conn.prepareStatement("select * from Table where id = ?");
stmt.setString(1, id);

ret = stmt.executeQuery();

if (ret.next()){
Student st = new Student();
st.setName(ret.getString("name"));
st.setAge(ret.getInt("age"));

return st;
}else {
return null;
}
}finally {
if (ret != null) ret.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}
}

/**
* 如果查询的记录是一个集合,则可以将业务对象存放在集合里,然后在jsp中遍历集合显示所有记录
*
* @return
* @throws SQLException
*/
public List queryStudent() throws SQLException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet ret = null;

List l = new Vector();

try{
conn = getConnection();
stmt = conn.prepareStatement("select * from Table");
ret = stmt.executeQuery();

while (ret.next()){
Student st = new Student();
st.setName(ret.getString("name"));
st.setAge(ret.getInt("age"));

l.add(st);
}

}finally {
if (ret != null) ret.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}

return l;
}

private Connection getConnection() throws SQLException{
return DriverManager.getConnection(sConnStr);
}
}

class Student {
private String id;

private String name;

private int age;

public Student(){

}

/**
*
* @return
*/
public int getAge() {
return age;
}

/**
*
* @param age
*/
public void setAge(int age) {
this.age = age;
}

/**
*
* @return
*/
public String getId() {
return id;
}

/**
*
* @param id
*/
public void setId(String id) {
this.id = id;
}

/**
*
* @return
*/
public String getName() {
return name;
}

/**
*
* @param name
*/
public void setName(String name) {
this.name = name;
}


}
xiongbing528 2006-03-30
  • 打赏
  • 举报
回复
package student;
import java.sql.*;
public class conn {
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr = "jdbc:odbc:student";
Connection connect = null;
ResultSet rs = null;
public conn() {
try {
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println( e.getMessage());
}
}
public ResultSet executeQuery(String sql) {
try {
connect = DriverManager.getConnection(sConnStr);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql);
return rs;

}
catch(SQLException ex) {
System.err.println(ex.getMessage());
return null;
}
}
}
///////////////////
这样可以了吧

cds1 2006-03-30
  • 打赏
  • 举报
回复
回crazy_bug
我还是搞不定啊,由于是初学
还请你给全面改改
因为我自己试着改了之后还是不行的
cds1 2006-03-30
  • 打赏
  • 举报
回复
回一楼的
改成
public ResultSet executeQuery(String sql) {
try {
connect = DriverManager.getConnection(sConnStr);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql);
return rs;
}
catch(SQLException ex) {
System.err.println(ex.getMessage());
}

}
之后,无法编译通过,因为没有返加值
老鱼趣多多 2006-03-30
  • 打赏
  • 举报
回复
public ResultSet executeQuery(String sql) {
try {
connect = DriverManager.getConnection(sConnStr);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql);
return rs;
}
catch(SQLException ex) {
System.err.println(ex.getMessage());
}

}

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧