Java 类型安全:未选中从对象到ArrayList的强制转换
我正在开发一个音乐商店,它允许您使用由servlet、JSP和JavaBeans组成的MVC框架购买歌曲。我有一个ControllerServlet,它根据JSP中表单的动作值向相关JSP视图发送请求。同一个包中还有另一个名为CartBean的类,它作为包含歌曲和专辑信息的2个数组列表的模型(每个数组列表调用另2个名为SongBean和AlbumBean的不同JavaBean)。下面是servlet的开始部分,其中3种类型的bean被声明为全局变量,以便将它们公开给整个类,而不仅仅是在doGet和doPost中Java 类型安全:未选中从对象到ArrayList的强制转换,java,jsp,servlets,arraylist,casting,Java,Jsp,Servlets,Arraylist,Casting,我正在开发一个音乐商店,它允许您使用由servlet、JSP和JavaBeans组成的MVC框架购买歌曲。我有一个ControllerServlet,它根据JSP中表单的动作值向相关JSP视图发送请求。同一个包中还有另一个名为CartBean的类,它作为包含歌曲和专辑信息的2个数组列表的模型(每个数组列表调用另2个名为SongBean和AlbumBean的不同JavaBean)。下面是servlet的开始部分,其中3种类型的bean被声明为全局变量,以便将它们公开给整个类,而不仅仅是在doGet
/**
* Servlet implementation class ControllerServlet
*/
@WebServlet(urlPatterns="/search", displayName="ControllerServlet")
public class ControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
Logger logger = Logger.getLogger(this.getClass().getName());
// make the SongBean and AlbumBean global variables so the parsed data is available
// to whole class (not just doGet) as long as class exists
public ArrayList<SongBean> songs = new ArrayList<SongBean>();
public ArrayList<AlbumBean> albums = new ArrayList<AlbumBean>();
public CartBean cart = new CartBean();
/**
*Servlet实现类ControllerServlet
*/
@WebServlet(urlPatterns=“/search”,displayName=“ControllerServlet”)
公共类ControllerServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
Logger Logger=Logger.getLogger(this.getClass().getName());
//使SongBean和AlbumBean成为全局变量,以便解析的数据可用
//对整个类(不仅仅是doGet),只要类存在
public ArrayList songs=new ArrayList();
public ArrayList albums=new ArrayList();
public CartBean cart=new CartBean();
在doPost方法中,如果用户试图向购物车添加内容,那么当他在从doGet返回的搜索结果JSP视图中选择一些复选框时,他应该能够这样做
} else if (action.equals("add")) {
String selected[] = request.getParameterValues("checkbox-anything-songs");
// iterate through the songs selected in results.jsp for matching songs in order to add to cart
for (int i = 0; i < selected.length; i++) {
System.out.println("You selected song with songID: " + selected[i]);
// iterate through SongBeans in global variable, songs
for (SongBean song : songs) {
// selected song is added to cart using songID to match with SongBean's songID & break out of for loop
if (song.getSongID().matches(selected[i])) {
cart.addSong(song);
break;
}
}
}
ArrayList<SongBean> songsInCart = cart.getSongs();
System.out.println("You added " + selected.length + " songs to your cart and have a total of " + cart.getSongs().size() + " songs in your cart now!");
System.out.println("Songs in cart now: " + songsInCart);
request.setAttribute("songsCart", songsInCart);
RequestDispatcher requestdispatcher = request.getRequestDispatcher("/cart.jsp");
requestdispatcher.forward(request, response);
}else if(action.equals(“add”)){
所选字符串[]=request.getParameterValues(“复选框”);
//迭代results.jsp中选择的歌曲以匹配歌曲,以便添加到购物车
对于(int i=0;i
我试图将cart或songsInCart的对象带到cart.jsp视图中,以便在其中显示保存的数据。我知道正确的数据保存在对象中,正如我在控制台打印中看到的,并且知道它正在将正确的数据保存在对象中。问题是,当我在发送请求后尝试在cart.jsp视图中显示它时到那里,并使用getAttribute获取songsCart对象,它不断给我以下错误:
HTTP Status 500 - An exception occurred processing JSP page /cart.jsp at line 182
type Exception report
message An exception occurred processing JSP page /cart.jsp at line 182
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: An exception occurred processing JSP page /cart.jsp at line 182
179:
180: <!-- Message about whether the shopping cart is empty or not -->
181: <c:choose>
182: <c:when test="<%= songbean.size() == 0 && albumbean.size() == 0 %>">
183: <h2><small>Your shopping cart is empty.</small></h2>
184: </c:when>
185: <c:when test="<%= songbean.size() >= 1 || albumbean.size() >= 1 %>">
HTTP状态500-在第182行处理JSP页面/cart.JSP时发生异常
类型异常报告
消息在第182行处理JSP页面/cart.JSP时发生异常
说明服务器遇到内部错误,无法满足此请求。
例外
org.apache.jasper.jaspereException:在第182行处理JSP页面/cart.JSP时发生异常
179:
180:
181:
182:
183:你的购物车是空的。
184:
185:
我怀疑它与cart.jsp顶部的代码有关,如下所示,我收到一条警告消息:“类型安全:未经检查的从对象到ArrayList的强制转换:”ArrayList songbean=(ArrayList)session.getAttribute(“songsCart”);“:
我不知道是什么问题,我怀疑这与songsCart对象没有正确转换为包含所有歌曲的ArrayList有关。或者与c标记有关,或者与getAttributes操作不正确有关。有人知道是什么问题吗?“发生了异常”它是哪一个?如果在错误页面中没有看到它,请在服务器日志中查找它。该异常本身代表了整个答案。我找不到日志…那么您首先要解决另一个问题。它是tomcat apache目录的logs文件夹中的catalina.out吗?它不显示今天的日志日志日志文件的位置取决于服务器的配置和启动方式。如果它是集成在Eclipse中并通过Eclipse的Servers视图执行的未经修改的Tomcat实例,则日志位于Eclipse自己的控制台视图中。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="edu.unsw.comp9321.*, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
// initialize session
// get the beans from importing edu.unsw.comp9321.*
CartBean cartBean;
SongBean songBean;
AlbumBean albumBean;
// check the session status to see if session has been initialized and shopping cart activated
if (session.getAttribute("shopping") == null) {
cartBean = new CartBean();
songBean = new SongBean();
albumBean = new AlbumBean();
session.setAttribute("shopping", cartBean);
session.setAttribute("songBean", songBean);
session.setAttribute("albumBean", albumBean);
System.out.println("cart.jsp: Creating New Session.");
} else {
System.out.println("cart.jsp: Already In Session.");
}
cartBean = (CartBean) session.getAttribute("shopping");
// get SongBeans and AlbumBeans so can fetch CartBean attributes from them
ArrayList<SongBean> songbean = (ArrayList<SongBean>) session.getAttribute("songsCart");
ArrayList<AlbumBean> albumbean = cartBean.getAlbums();
%>