【问题标题】:CastException:Java.lang.String can not cast to class转换异常:Java.lang.String 无法转换为类
【发布时间】:2013-09-08 05:19:00
【问题描述】:

我有一个问题..

  1. Servlet 调用了一些业务逻辑(在“MyPack.abc”类中)并获得了一些返回值。
  2. 现在此值设置为会话“result”并调用 sendRedirect("xy.jsp")。
  3. 我想在 <jsp:useBean id="result" class="MyPack.abc" scope="session"></jsp:useBean> 的帮助下在 jsp 中获取该值,但 <jsp:useBean> 显示异常 CastException(Java.lang.String 无法转换为类)。

代码如下:

index.jsp

<html> 
<body> 
  <form action="MyController"> 
   <input type="text" name="name"><br> 
    <input type="submit" name="b1" value="submit">
  </form> 
</body> 
</html>  

servlet MyController

import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
import myPack.*;
 public class MyController extends HttpServlet 
 { 
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
   { 
      response.setContentType("text/html;charset=UTF-8"); 
      PrintWriter out = response.getWriter(); 
      abc d=new abc(); 
      d.setName((String)request.getParameter("name"));
      String s=(String) d.getName(); 

      HttpSession session=request.getSession(); 
      session.setAttribute("result",s); 
      response.sendRedirect("xy.jsp"); 
    }
  }   

myPack 中的 bean 类 abc

 package myPack; 

 public class abc { 

 public abc() { } 
 public String name; 

 public String getName() { 
   return name; 
 } 
 public void setName(String name) {
  this.name = name; 
 } 
} 

xy.jsp

 <%@page contentType="text/html" pageEncoding="UTF-8" import="myPack.abc" %> 
 <html>
 <body>
  <jsp:useBean id="result" class="myPack.abc" scope="session"></jsp:useBean> 
  <jsp:getProperty property="name" name="r"></jsp:getProperty>
 </body> 
 </html>   

但它抛出了一个 CastException(Java.lang.String 不能转换为类)。

【问题讨论】:

  • 你能附上你的错误日志吗?还有它抛出错误的代码。?
  • 抱歉发布不完整.. 1. Servlet 调用了一些业务逻辑(在“MyPack.abc”类中)并获得了一些返回值。 2. 现在这个值被设置为会话“result”并调用了 sendRedirect("xy.jsp")。 3. 我想在 的帮助下在 jsp 获取这个值但是 显示异常 CastException(Java.lang.String 无法转换为类)。
  • 您没有准确上报错误信息。再试一次。释义或您认为它所说的不够好。

标签: jsp servlets javabeans


【解决方案1】:

我努力解决了你的问题。由于您的信息不容易从 cmets 读取。

<jsp:useBean id="beanInstanceName" scope="page|request|session|application"
             class="package.class" type="package.class" 
             beanName="package.class | <%= expression %>">
</jsp:useBean>   

你的错误

session.setAttribute("result",s); //setting the attribute with String key as result

以及xy.jsp 上的行抛出异常org.apache.jasper.JasperException: java.lang.ClassCastException: java.lang.String cannot be cast to myPack.abc

<jsp:useBean id="result" class="myPack.abc" scope="session"></jsp:useBean>

查看语法id="beanInstanceName" 的第一个属性,它是您的bean 类abc 的实例,并且您使用了result,这是会话属性的关键,这意味着您正在尝试将abc 类型的对象设置为String 结果。

解决方案:
只需将 xy.jsp result 的 id 属性重命名为 r 或 abc 之类的名称。这解决了您的异常问题,但运行应用程序后您会看到名称为null。这是因为您正试图访问一个您根本没有放入会话范围的bean,因此JSP 正在创建一个全新的,而不是在会话中重用现有的。您在会话中仅设置字符串名称属性。
要在 jsp 上获取 bean 属性 name,您必须编辑您的 xy.jsp

<%@page contentType="text/html" pageEncoding="UTF-8" import="myPack.abc" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
   <c:out value="${result}" />
</body> 
</html> 

在运行您的应用程序之前,在 WEB-INF\lib 文件夹中添加 jstl-1.2.jar。这工作正常。

一些有用的链接:

  1. jsp wiki
  2. jsp useBean
  3. why jstl ${result}

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多