在 Java 中实现 Bean class 时遇到问题 - ClassCastException

Trouble implementing Bean class in Java- ClassCastException

我是 java beans 和 JSP 的新手。 在我的项目中,我所做的是,我创建了多个 bean,如 LoginBean、RegisterBean、AddCourseBean 等。

假设第 A.jsp 页上的 m 使用 bean LoginBean 来获取和设置一些属性。 之后 m 移动到页面 B.jsp,它使用另一个 bean 说 RegisterBean 来设置一些属性或将数据添加到数据库中。

从页面 A 移动到 B 时,在 tomcat 中出现错误

HTTP Status 500 - java.lang.ClassCastException: ankit.ShowCourseBean cannot be cast to ankit.LoginBean

type Exception report

message java.lang.ClassCastException: ankit.ShowCourseBean cannot be cast to ankit.LoginBean

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

exception

org.apache.jasper.JasperException: java.lang.ClassCastException: ankit.ShowCourseBean cannot be cast to ankit.LoginBean
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

java.lang.ClassCastException: ankit.ShowCourseBean cannot be cast to ankit.LoginBean
    org.apache.jsp.components.jsp.Login_jsp._jspService(Login_jsp.java:72)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

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

我在JSP页面中使用bean的代码如下: 第 A.jsp

    <%@   page   language="java"  %>
    <%@ page import="java.sql.*;" %>

    <%!  
    ResultSet rs;
    String coursename,courseid;
    %>

    <jsp:useBean   id="obj"  scope="application"  class="ankit.ShowCourseBean" />

    <%
        rs=obj.getCourse();
    %>
//my remaining Html and logic

第B.jsp页

<%@   page   language="java"  %>
<%!  
boolean b;
String myemail, mypassword,userName,userType;
%>

<jsp:useBean   id="obj"  scope="application"  class="ankit.LoginBean" />
<jsp:setProperty  name="obj"   property="myemail"  />
<jsp:setProperty  name="obj"    property="mypassword"  />
<% 
myemail=request.getParameter("myemail");
mypassword=request.getParameter("mypassword");

try{
  b=obj.checkLogin(myemail,mypassword);
  System.out.println(b);
if(b)
{
 userName=obj.checkUserName();
 userType=obj.checkUserType();
 System.out.println(userName);
 session.setAttribute("loggedUserName",userName);
 session.setAttribute("loggedUserType",userType);
 response.sendRedirect("http://localhost:8080/vt/index.jsp");
}
else
{
out.println("Wrong User Name and Password");
}
}catch(Exception  e)
 {  
 out.println("Wrong User Name and Password");
 e.printStackTrace();
 }

%>

您将名称为 "obj" 的 bean 定义为 scope="application" 这意味着它在全球范围内可用。

看看不同的范围 (页面、请求、会话、应用程序)并适当地使用它们。在这种情况下,您也可以通过为对象使用不同的名称来避免该问题。 (而不是 'obj')。

当你运行你的程序时,一个对象存储在应用程序范围内的名称"obj"下(就像一个静态变量),然后在另一个jsp中你尝试转换它到另一种类型。 (useBean在name下有none的时候创建一个bean,或者有的时候就使用原地找到的bean)。

所以基本上:如果您在请求期间只需要该对象,请切换到请求范围。 如果 session/application 作用域需要两者,则必须使用不同的名称。

另外:永远不要使用像 obj 和 stuff 和 thing 这样的通用名称。以它实际代表的事物或它所填充的功能来命名它。