注册 登录
编程论坛 J2EE论坛

调用javabean问题

wolfcool 发布于 2007-05-24 13:07, 1364 次点击

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.sql.*"%>
<jsp:useBean id="conn" scope="page" class="clj.DataBaseCon"/>
<%
Result rs=conn.executeQuery("select* from maxclass");
while(rs.next()){
out.print(rs.getString("classname"));
out.print("<br>");
}

%>
我是这样调用的,DataBaseCon,放在webapps\ROOT\WEB-INF\classes下,怎么会无效呢?!org.apache.jasper.JasperException: /testbean.jsp(4,0) The value for the useBean class attribute clj.DataBaseCon is invalid.
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:150)
org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1227)
org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1116)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2213)
org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2219)
org.apache.jasper.compiler.Node$Root.accept(Node.java:456)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)
org.apache.jasper.compiler.Generator.generate(Generator.java:3272)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:244)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:495)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:476)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:464)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

15 回复
#2
angeloc2007-05-24 13:26
为什么放在ROOT下,你的应用是在ROOT下么?
#3
angeloc2007-05-24 13:28
而且像你这样写代码,也没必要用USEBEAN了,直接把代码写页面里实例化JAVABEAN,这样不伦不类
#4
wolfcool2007-05-24 13:38
我刚学,不知道,那要怎么写才是有伦有类呢?:)
这个我也是看书上写的
#5
wolfcool2007-05-24 13:40
我的页面是放在root下的
#6
angeloc2007-05-24 13:54

用JSP:USEBEAN无非是为了是代码简洁.
如果你上面用USEBEAN,下面<%.....省略代码无数 %>,那么还不如所有代码都写道<%...%>里面,没必要用USEBEAN了!

你这个问题可能是
1. 在编译 JSP 时(不是运行时),指定的 Bean 类没找到
2. Bean 虽然找到了,但是它不是 public 的
3. Bean 类中没有 public 的默认构建函数
4. 没有PACKAGE

#7
wolfcool2007-05-24 14:00

那我在每个页面中至少不要都写那个数据库连接代码啊:)
不是很明白你的意思,包文件是这样写的
package clj;
import java.sql.*;
public class DataBaseCon
{
Connection con=null;
Statement sql=null;
ResultSet rs =null;
int rows=0;
public DataBaseCon()//在JSP中调用这个Bean时自动加载连接
{
try
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//加载sqlserver驱动
Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=shop","sa","");//建立连接
/*
**其中
**172.16.0.8中数据库所在机器的IP
**clj2 是数据库名称
**sa 为数据库管理员名
**clj为数据库管理员密码
**其它内容不变
*/
sql=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);//建立SQL语句对象
}
catch(Exception e)
{
System.out.println("连接database错误:"+e);
}
}
public ResultSet mySelect(String myselect)//改写executeQuery(String sql)方法
{
try
{
rs = sql.executeQuery(myselect);
}
catch(Exception e)
{
System.out.println("查询错误:"+e);
}
return rs;
}
public int myUpdate(String myupdate)//改写executeUpdate(String sql)方法
{
try
{
rows=sql.executeUpdate(myupdate);
}
catch(Exception e)
{
e.getMessage();
}
return rows;
}
public void close()//建立关闭组方法
{
if(rs!=null)
try
{
rs.close();
}
catch(Exception e)
{
System.out.println("关闭结果集错误"+e);
}
if(sql!=null)
try
{
sql.close();
}
catch(Exception e)
{
System.out.println("关闭建立查询句错误:"+e);
}
if(con!=null)
try
{
con.close();
}
catch(Exception e)
{
System.out.println("关闭连接错误:"+e);
}
}

}


#8
wolfcool2007-05-24 14:02
要不你给我个好点的代码
#9
angeloc2007-05-24 14:10

你的CLASS文件放在哪里了?

#10
wolfcool2007-05-24 15:45
刚借书去了
放在D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes
#11
angeloc2007-05-24 15:59
你是否没把DataBaseCon放到class\clj目录下
#12
wolfcool2007-05-24 16:02
没有.我放进去
出了这样的错误了
D:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\testbean_jsp.java:57: cannot resolve symbol
symbol : class Result
location: class org.apache.jsp.testbean_jsp
Result rs=conn.executeQuery("select* from maxclass");
^


An error occurred at line: 5 in the jsp file: /testbean.jsp
Generated servlet error:
D:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\testbean_jsp.java:57: cannot resolve symbol
symbol : method executeQuery (java.lang.String)
location: class clj.DataBaseCon
Result rs=conn.executeQuery("select* from maxclass");
^
2 errors
#13
angeloc2007-05-24 16:35

恩,这个是你的错误!
Result rs=conn.executeQuery("select* from maxclass");
这个语句,conn是什么?是上面的USEBEAN实例化的DataBaseCon类,他并不是CONNECTION的实例,这个你得搞清除!
所以你可以用DataBaseCon类里面的方法得到你想要的东西,比如返回一个CONNECTION的实例,或者直接返回RESULTSET

#14
wolfcool2007-05-24 17:08
??没有明白
#15
angeloc2007-05-24 17:16

没关系,我给你解释下:
<jsp:useBean id="conn" scope="page" class="clj.DataBaseCon"/>知道这句有什么用么?
它相当于
<% DataBaseCon conn=new DataBaseCon(); %>
所以,你用Result rs=conn.executeQuery("select* from maxclass");是错误的,因为这个conn里面没有executeQuery这个方法.但是你可以在DataBaseCon里面加上你想要的方法,比如用方法返回一个Connection或Result.或者直接返回一些数据.
明白了么?

#16
wolfcool2007-05-24 17:46
知道了,晕了,是没有这个方法谢谢非常谢谢你这样耐心教我这个菜鸟
1