当前位置:编程学习 > JAVA >>

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 --------------------编程问答--------------------
引用 4 楼 jushi1988 的回复:
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 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,