java.lang.ClassCastException:
在编写jsp时用到了javabean得一个类老是有如下异常,跪求高手指教!jsp文件:
<%--
Document : login
Created on : 2011-11-21, 23:51:07
Author : Administrator
--%>
<%@page contentType="text/html" pageEncoding="gbk"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>JSP Page</title>
<%
request.setCharacterEncoding("gbk");
String s1 = request.getParameter("user");
String p1 = request.getParameter("passWord");
if (s1.length() != 11 || p1.length() != 6) {//验证用户名和密码格式
%>
<script>
alert("用户名或密码错误 !");
history.go(-1);
</script>
<% } else {
%>
</head>
<body>
<jsp:useBean id="use" class="javabean.User" scope="session"/><%--以用户创建user类--%>
<jsp:setProperty name="use" property="*"/><%--把得到的用户名和密码传入user类--%>
<%
if (use.userIsExist()) {//判断用户名在数据库中用户表中是否存在
if (use.passWordIsExist()) {//判断密码是否正确
use.Close();
%>
<jsp:useBean id="stu" class="javabean.Student" scope="session"/><%--创建student类--%>
<jsp:useBean id="teacher" class="javabean.Teacher" scope="session"/>
<%
if (stu.IsExist(use.getUser())) {//判断用户是否是学生
stu.Close();
use.Close();
teacher.CloseConnecting();
%>
<jsp:forward page="student.jsp"/>
<% } else if (teacher.IsExist(use.getUser())) {
stu.Close();
use.Close();
%>
<jsp:forward page = "teacher.jsp"/>
<% }
} else {
%>
<script>
alert("密码不正确!");
history.go(-1);
</script>
<% }
} else {
%>
<script>
alert("用户名不存在,请注册 !");
history.go(-1);
</script>
<% }
}
%>
</body>
</html>
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: java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:534)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457)
。。。。。。
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
root cause
java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
org.apache.jsp.login_jsp._jspService(login_jsp.java:113)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
。。。。。。。
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.14 logs.
javabean代码如下
package javabean;
import java.sql.*;
public class Teacher extends User {
private String[] snumber;
private String[] sname;
private String[] ssex;
private String[] sGrade;
private String[] department;
private String[] major;
private String url = "jdbc:sqlserver://localhost:1433;databaseName=学生成绩管理系统;user=sa;password=sqlserver;";
private Connection dbcon;
private Statement stmt;
private ResultSet rs;
private String databaseServerDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public Teacher() {
stmt = null;
rs = null;
this.dbcon = super.dbcon;// 连接数据库
}
public Teacher(String url, String databaseServerDriver) {
super();
this.url = url;
this.databaseServerDriver = databaseServerDriver;
try {
Class.forName(databaseServerDriver);
dbcon = DriverManager.getConnection(url);
} catch (SQLException ex) {
// 打印出异常信息
System.out.println(ex.toString());
} catch (ClassNotFoundException ex) {
// 打印出异常信息
System.out.println(ex.toString());
}
}
}
public boolean IsExist(String number) {
String sql = "select * from 教师表 where 职工号='" + number+"'";
try {
rs = null;
stmt = dbcon.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
return true;
} else {
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
}
package javabean;
import com.microsoft.sqlserver.jdbc.SQLServerException;
import java.sql.*;
/**
* 实现对用户表的操作
* **/
public class User {
private String url = "jdbc:sqlserver://localhost:1433;databaseName=学生成绩管理系统;user=sa;password=sqlserver;";
protected Connection dbcon;
private Statement stmt;
private ResultSet rs;
private String databaseServerDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private String user;
private String passWord;
public User() {
// 初始化参数
stmt = null;
rs = null;
// 连接数据库
try {
Class.forName(databaseServerDriver);
dbcon = DriverManager.getConnection(url);
} catch (SQLException ex) {
// 打印出异常信息
System.out.println(ex.toString());
} catch (ClassNotFoundException ex) {
// 打印出异常信息
System.out.println(ex.toString());
}
}
// 构造一个连接,用给定的url和服务器驱动
public User(String url, String databaseServerDriver) {
super();
this.url = url;
this.databaseServerDriver = databaseServerDriver;
try {
Class.forName(databaseServerDriver);
dbcon = DriverManager.getConnection(url);
} catch (SQLException ex) {
// 打印出异常信息
System.out.println(ex.toString());
} catch (ClassNotFoundException ex) {
// 打印出异常信息
System.out.println(ex.toString());
}
}
/**
* @对数据库执行sql执行语句,主要是插入和更新操作,返回一个布尔值变量
*/
public boolean userIsExist(String user) {
String sql = "select * from 用户表 where 用户号='" + user+"'" ;
try {
rs = null;
stmt = dbcon.createStatement();
rs = stmt.executeQuery(sql);
rs.next();
String s = rs.getString(1);
if (s.equals(user)) {
return true;
} else {
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
public boolean userIsExist() {
String sql = "select * from 用户表 where 用户号='" + user + "'";
try {
rs = null;
stmt = dbcon.createStatement();
rs = stmt.executeQuery(sql);
if ( rs.next()) {
return true;
} else {
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
public boolean passWordIsExist() {
try{
rs=null;
stmt = dbcon.createStatement();
rs = stmt.executeQuery("select * from 用户表 where 密码='"+passWord+"' and 用户号='"+user+"'");
rs.next();
int row = rs.getRow();
if (row != 0) {
return true;
} else {
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
}
--------------------编程问答-------------------- 那Teacher类是怎么写的,IsExist()方法..报错是String不能强制转换为Teacher --------------------编程问答-------------------- 打开Tomcat/work/项目名/去里边找到login_jsp.java看看113行是什么代码. --------------------编程问答-------------------- org.apache.jasper.JasperException: java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:534)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457)
。。。。。。
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
类型转换异常,Sring转换javabean.Teacher类报错;
建议包和类名规范些,像javabean做包名,user做用户名很不规范; --------------------编程问答-------------------- org.apache.jasper.JasperException: java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
此处就说明了原因 类型转换问题。不能将String转换为javabean.Teacher --------------------编程问答--------------------
不知道你自己有没有觉得自己的代码是不是很乱,要做好分层,看你的对数据库操作的代码在每个类都有,将来对代码的移植和维护带来很大的困难,如果你要是数据库的登录名和密码改了以后,你是不是每个类都需要改,完全不支持开闭原则。。。。好好想想吧 --------------------编程问答-------------------- teacher.IsExist(use.getUser())这个是113行?
你程序报的是类转换异常,你查看得到的对象和要匹配的是不是都是同一个类的对象 --------------------编程问答-------------------- java.lang.String cannot be cast to javabean.Teacher
类转换有问题,不能将string转换为teacher对象 --------------------编程问答-------------------- 这个代码怎么这样写的, 普通类跟数据库管理类太缠绵了, 随便写个,参考一下吧, 然后对你以后的代码设计方式有所帮助吧
DBConn.java
package javabean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author Administrator
*/
public class DBConn {
private String url = "jdbc:sqlserver://localhost:1433;databaseName=学生成绩管理系统;user=sa;password=sqlserver;";
private Connection dbcon;
private Statement stmt;
private ResultSet rs;
private String databaseServerDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public DBConn() {
//这里面可以从配置文件中读取 数据库配置信息,就不用在类里面写死了
}
public void stmtconn() {
try {
Class.forName(databaseServerDriver);
dbcon = DriverManager.getConnection(url);
stmt = dbcon.createStatement();
} catch (ClassNotFoundException ex) {
System.out.println(ex.toString());
} catch (SQLException ex) {
System.out.println(ex.toString());
}
}
public ResultSet query(String sql) {
try {
rs = stmt.executeQuery(sql);
} catch (SQLException ex) {
System.out.println(ex.toString());
}
return rs;
}
public boolean isExist(String sql) {
boolean exist = false;
try {
stmtconn();
query(sql);
exist = rs.next();
} catch (SQLException ex) {
System.out.println(ex.toString());
} finally {
close();
}
return exist;
}
public void close() {
try {
if (stmt != null) {
stmt.close();
}
if (dbcon != null) {
dbcon.close();
}
} catch (SQLException ex) {
System.out.println(ex.toString());
}
}
}
Student.java
package javabean;
/**
*
* @author Administrator
*/
public class Student {
public boolean userIsExist(String user) {
DBConn db = new DBConn();
String sql = "select * from 用户表 where 用户号='" + user + "'";
return db.isExist(sql);
}
}
Teacher.java
package javabean;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author Administrator
*/
public class Teacher {
private ResultSet rs;
public boolean IsExist(String number) {
String sql = "select * from 教师表 where 职工号='" + number + "'";
DBConn db = new DBConn();
boolean exist = false;
try {
db.stmtconn();
rs = db.query(sql);
exist = rs.next();
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.close();
}
return exist;
}
}
这里面student和teacher两个判断是否存在用了不同实现方式, 不同情况选择不同实现方式, 灵活着用吧 --------------------编程问答-------------------- 我服了你,类转换异常 --------------------编程问答-------------------- Sorry, DBConn.java里面close方法没有关闭rs
应该是这样:
public void close() {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (dbcon != null) {
dbcon.close();
}
} catch (SQLException ex) {
System.out.println(ex.toString());
}
}
--------------------编程问答-------------------- java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
类型转换异常的错误。
额。其实你贴这么多混乱不堪的代码 没多少人会帮您耐心看完的,
建议MVC 设计~ --------------------编程问答-------------------- 还是继续写一下jsp吧
User.java
package javabean;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author Administrator
*/
public class Student extends User {
public boolean IsExist(String number) {
String sql = "select * from 学生表 where 学号='" + number + "'";
DBConn db = new DBConn();
boolean exist = false;
try {
db.stmtconn();
ResultSet rs = db.query(sql);
exist = rs.next();
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.close();
}
return exist;
}
}
User.java
package javabean;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author Administrator
*/
public class User {
private String userName;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//这里面改名了 userIsExist--> isExist
public boolean isExist(String userName) {
DBConn db = new DBConn();
//这里防止sql注入, 简单的替换一下,当然要保证userName不为null,不然会报错
String sql = "select * from 用户表 where 用户号='" + userName.replace("'", "") + "'";
return db.isExist(sql);
}
//很少有这样判断, 放弃这个方法, 改用获取用户
//public boolean isExist(String password)
public User getUser(String userName) {
User user = null;
DBConn db = new DBConn();
String sql = "select * from 用户表 where 用户号='" + userName.replace("'", "") + "'";
try {
db.stmtconn();
ResultSet rs = db.query(sql);
if (rs.next()) {
user.setUserName(rs.getString("userName"));
user.setPassword(rs.getString("Password"));
//可以继续set其他东西
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.close();
}
return user;
}
}
<%@page import="javabean.*"%>
<%@page contentType="text/html" pageEncoding="gbk"%>
<jsp:useBean id="user" class="javabean.User" scope="session"/>
<jsp:useBean id="student" class="javabean.Student" scope="session"/>
<jsp:useBean id="teacher" class="javabean.Teacher" scope="session"/>
<%
request.setCharacterEncoding("gbk");
//我的习惯是变量名和接收参数名保持一致, 不容易搞错了
String username = request.getParameter("username");//变量名称最好写的准确一些, user和username表示意思大不一样, 后面容易搞混淆了
String password = request.getParameter("password");
String errorMsg = "";
String forword = "";
//if (s1.length() != 11 || p1.length() != 6) {//验证用户名和密码格式
//你的代码这里直接用s1.length(), 如果s1不传过来, 是null值 , 这里面就要报错了, 是不是 p1.length()同理
//所以这里我这样写
//同时这里面位置也改了, 无论出错与否, 都尽量生成一个完整的html页面你原来的写法,如果用户名或密码有问题, 返回的页面是不完整的
if (username == null || username.length() != 11 || password == null || password.length() != 6) {
errorMsg = "用户名或密码格式错误!";
} else {
//把得到的用户名和密码传入user类, 这里只是代码示例,并没有用到
user.setUserName(username);
user.setPassword(password);
//是否是老师, 不是老师就是学生, 暂且这么说
boolean isTeacher = teacher.IsExist(username);
if (user != null) {//判断用户名在数据库中用户表中是否存在, 不等于null就说明存在
//然后判断密码, 一般这样来判断
if (password != null && password.equals(user.getPassword())) {//判断密码是否正确(并且不能为空)
if (teacher.IsExist(username)) {//判断用户是否是学生, 不是老师就是学生
forword = "student.jsp";
} else if (teacher.IsExist(username)) {
forword = "teacher.jsp";
}
} else {
errorMsg = "密码不正确!";
}
} else {
errorMsg = "用户不存在,请注册!";
}
}
//这里使用这种方式转发, 注意路径
if (forword.length() > 0) {
request.getRequestDispatcher(forword).forward(request, response);
return;
}
//如果在你使用<jsp:forward>之前,jsp文件已经有了数据,那么文件执行就会出错, 所以, 逻辑处理部分都放到头部
//参考一下: http://www.2cto.com/kf/201109/105650.html
%>
<!--
usebean我一般习惯放在最上面, 因为不论你放哪边,这个对像总归要生成,干脆放上面,一目了然, 变量名我改为user了
有一个逻辑问题, 如果是学生登陆则 bean(student) 包涵了user, 如果是老师登陆, bean(teacher) 也包涵了user
所以这里有必要合并一下, 你自己着情合并一下
-->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>JSP Page</title>
</head>
<body>
<%
if (errorMsg.length() > 0) {
%>
<script type="text/javascript">
alert("<%= errorMsg%>");
history.go(-1);
</script>
<%
}
%>
</body>
</html>
--------------------编程问答-------------------- 12楼上面发的不对
reg.jsp ,代码我没有验证
<%@page import="javabean.*"%>
<%@page contentType="text/html" pageEncoding="gbk"%>
<jsp:useBean id="user" class="javabean.User" scope="session"/>
<jsp:useBean id="student" class="javabean.Student" scope="session"/>
<jsp:useBean id="teacher" class="javabean.Teacher" scope="session"/>
<%
request.setCharacterEncoding("gbk");
//我的习惯是变量名和接收参数名保持一致, 不容易搞错了
String username = request.getParameter("username");//变量名称最好写的准确一些, user和username表示意思大不一样, 后面容易搞混淆了
String password = request.getParameter("password");
String errorMsg = "";
String forword = "";
//if (s1.length() != 11 || p1.length() != 6) {//验证用户名和密码格式
//你的代码这里直接用s1.length(), 如果s1不传过来, 是null值 , 这里面就要报错了, 是不是 p1.length()同理
//所以这里我这样写
//同时这里面位置也改了, 无论出错与否, 都尽量生成一个完整的html页面你原来的写法,如果用户名或密码有问题, 返回的页面是不完整的
if (username == null || username.length() != 11 || password == null || password.length() != 6) {
errorMsg = "用户名或密码格式错误!";
} else {
//把得到的用户名和密码传入user类, 这里只是代码示例,并没有用到
user.setUserName(username);
user.setPassword(password);
if (user != null) {//判断用户名在数据库中用户表中是否存在, 不等于null就说明存在
//然后判断密码, 一般这样来判断
if (password != null && password.equals(user.getPassword())) {//判断密码是否正确(并且不能为空)
if (student.IsExist(username)) {//判断用户是否是学生, 不是老师就是学生
forword = "student.jsp";
} else if (teacher.IsExist(username)) {
forword = "teacher.jsp";
}
} else {
errorMsg = "密码不正确!";
}
} else {
errorMsg = "用户不存在,请注册!";
}
}
//这里使用这种方式转发, 注意路径
if (forword.length() > 0) {
request.getRequestDispatcher(forword).forward(request, response);
return;
}
//如果在你使用<jsp:forward>之前,jsp文件已经有了数据,那么文件执行就会出错, 所以, 逻辑处理部分都放到头部
//参考一下: http://www.2cto.com/kf/201109/105650.html
%>
<!--
usebean我一般习惯放在最上面, 因为不论你放哪边,这个对像总归要生成,干脆放上面,一目了然, 变量名我改为user了
有一个逻辑问题, 如果是学生登陆则 bean(student) 包涵了user, 如果是老师登陆, bean(teacher) 也包涵了user
所以这里有必要合并一下, 你自己着情合并一下
-->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>JSP Page</title>
</head>
<body>
<%
if (errorMsg.length() > 0) {
%>
<script type="text/javascript">
alert("<%= errorMsg%>");
history.go(-1);
</script>
<%
}
%>
</body>
</html>
--------------------编程问答-------------------- 回复3楼
我应该怎么命包名和用户名?
比如。。。。 --------------------编程问答-------------------- 回复5,8,12,13楼,我的代码确实有点乱,因为是初期编,不知道会用到什么表和对哪些表操作,所以就弄个通用的,等功能完善了,一定要改的。 --------------------编程问答-------------------- 回复10楼
我关了还是不行。
补充:Java , Web 开发