在编写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 reportmessage 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;
        }
         
    }
}

解决方案 »

  1.   

    那Teacher类是怎么写的,IsExist()方法..报错是String不能强制转换为Teacher
      

  2.   

    打开Tomcat/work/项目名/去里边找到login_jsp.java看看113行是什么代码.
      

  3.   

    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做用户名很不规范;
      

  4.   

    org.apache.jasper.JasperException: java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
    此处就说明了原因 类型转换问题。不能将String转换为javabean.Teacher
      

  5.   

    teacher.IsExist(use.getUser())这个是113行?你程序报的是类转换异常,你查看得到的对象和要匹配的是不是都是同一个类的对象
      

  6.   

    java.lang.String cannot be cast to javabean.Teacher类转换有问题,不能将string转换为teacher对象
      

  7.   

    这个代码怎么这样写的, 普通类跟数据库管理类太缠绵了, 随便写个,参考一下吧, 然后对你以后的代码设计方式有所帮助吧DBConn.javapackage 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.javapackage 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.javapackage 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两个判断是否存在用了不同实现方式, 不同情况选择不同实现方式, 灵活着用吧
      

  8.   

    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());
            }
        }
      

  9.   

    java.lang.ClassCastException: java.lang.String cannot be cast to javabean.Teacher
    类型转换异常的错误。
    额。其实你贴这么多混乱不堪的代码 没多少人会帮您耐心看完的,
    建议MVC 设计~
      

  10.   

    还是继续写一下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>
      

  11.   

    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>