【问题标题】:ClassCastException with Tomcat and JSPTomcat 和 JSP 的 ClassCastException
【发布时间】:2019-05-08 14:27:55
【问题描述】:

我正在开发一个包含 Java Servlet 和 JSP 的网站。我在tomcat上运行它。 我的一个 JSP 使用了一个名为 Message 的自定义类。我在 servlet 中设置了一个数组列表消息,然后尝试在我的 JSP 中使用 request.getAttribute() 访问它 如果我将消息打印到控制台,它就可以工作。但是,当我尝试在我的网站上使用它们时,我得到了一个例外。

java.lang.ClassCastException: Message cannot be cast to classes.Message
org.apache.jsp.html.Chatroom_jsp._jspService(Chatroom_jsp.java:137)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:4 
53)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
MessageServlet.doGet(MessageServlet.java:67)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我已采取的步骤:在 jsp 上放置一个页面导入,将类添加到 web-inf/classes 并将类添加到 catalina.properties。但它仍然无法正常工作。 任何帮助将不胜感激!

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"
 %>
 <%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.Date"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="java.util.Iterator"%>
<%@ page import="java.util.List"%>
<%@ page import="classes.Message"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h2>Chat Messages</h2>

<table>
<!-- dynamically generate the messages here  -->
<tr>
    <th>user</th>
    <th>message</th>
    <th>time</th>
</tr>

<%

    //set the messages into an arraylist
    ArrayList <Message> msgs = new ArrayList<Message>();
    msgs = (ArrayList) request.getAttribute("messages");
    //TEST OUTPUT, to check if we can access messages
    System.out.println("hi. this is the message");
    System.out.println(msgs.get(0));
    //Message mess = new Message();
    //mess.setMessage(msgs.get(0).getMessage());
    //mess.setTime(msgs.get(0).getTime());
    //mess.setUserId(msgs.get(0).getUserId());
    //mess.setFname(msgs.get(0).getFname());

    for(Message mess : msgs)
    {
        %>
        <td><%=mess.getFname() %></td>
        <td><%=mess.getMessage() %></td>
        <td><%=mess.getTime() %></td>
        <%
    }

%>  


</table>


<form>
<div class="container">
      <input type="text" placeholder="Enter message here " name="userPost" required>
      <button onClick = 'myFunction(); return false' type="submit">Submit</button>
    <p id = "demo"></p>

</div>
</form>
<script>
function myFunction() {
    document.getElementByID("demo").innerHTML = "Hello";
}

// Get the modal
var model = document.getElementById('id01');

</script>

</body>
</html>

【问题讨论】:

  • 您是否在 jsp 文件的顶部导入了 Message 类? &lt;%@page import="path.to.your.class"%&gt;
  • 是的,我确实在 jsp 之上导入了它
  • 请也添加你的jsp代码
  • 刚刚做了。谢谢。请注意,消息的测试输出确实有效,但 for 循环是我得到异常的地方
  • 真的很奇怪!尽量不要使用 foreach 并告诉我发生了什么:for(int i = 0; i&lt; msgs.size(); i++) &lt;td&gt;&lt;%=msgs[i].getFname() %&gt;&lt;/td&gt;

标签: java jsp tomcat


【解决方案1】:

您的import 声明不正确。你的类的完全限定类名是简单的Message,而不是classes.Message

因此,您的导入行应如下所示:

<%@page import="Message"%>

但是!没有包就不能导入类...上面的填充会导致编译器错误。

所以,您真正要做的就是将您的Message 类从所谓的“默认包”(即无包)移到一个包中。您分两步完成:

  1. 向您的班级添加package 声明,如下所示:

    打包黄金;

    公开课消息 ...

  2. Message.javasrc/Message.java移动到src/sgolds/Message.java

现在重新编译您的 .java 文件。

现在,更新您的 JSP 以使用正确的 import

<%@page import="sgolds.Message"%>

你应该很高兴。

【讨论】:

  • 耶!!有效!我不敢相信那是问题所在。 (有点尴尬)在调试的某个时候,我为 Message 类制作了一个单独的包,但我认为当我这样做时它不起作用,因为我使用的包已经在其他地方使用过。非常感谢您的帮助!
  • 这是 JSP 规范的一部分,让新手非常惊讶。在实践中,所有类都应该总是在一个包中,因为“默认包”并不总是可寻址的(如本例所示)。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多