在 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 这样的通用名称。以它实际代表的事物或它所填充的功能来命名它。
我是 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 这样的通用名称。以它实际代表的事物或它所填充的功能来命名它。