I am trying to return an ArrayList of database search results from a servlet to be displayed on a jsp page.
Setting the arraylist as an attibute of request in the servlet and forwarding the request to the jsp page. when I try to retrieve it on the jsp page it it gives the following error:
"java.util.Vector cannot be cast to java.util.ArrayList"
The servlet code:
List<Car> ResultList=SearchPartsDAO.displaySearchResults(car);
if(ResultList.size()>=1){
request.setAttribute("ResultList", ResultList);
request.getRequestDispatcher("SearchResults.jsp").forward(request, response);
}else
response.sendRedirect("NotFound.jsp");
The JSP:
<body>
<%
ArrayList<Car> resultList = new ArrayList<Car>();
resultList=(ArrayList<Car>)request.getAttribute("ResultList");
%>
<%System.out.println(resultList.get(0).getCarMake());%>
You haven't shown your displaySearchResults
method, but it sounds like that returns a Vector
rather than an ArrayList
. But fundamentally, you shouldn't care which implementation it returns - if you just cast to List<Car>
instead, you should be fine:
<body>
<%
List<Car> resultList = (List<Car>) request.getAttribute("ResultList");
%>
<%System.out.println(resultList.get(0).getCarMake());%>
Note how I've removed the initial assignment of an empty ArrayList
- that's pointless if you're immediately going to assign a new value to the variable anyway.
It's cleaner to work in terms of the collection interfaces than the concrete classes - and you're already doing that in your first snippet of code. That only requires that the return value implements List<Car>
, so you should only have the same requirement when you deal with the same value later.
It's also worth understanding that your cast to List<Car>
is somewhat unsafe, in that it's only really casting to List
, due to the lack of reified generics. You could still get a ClassCastException
later when you access the individual elements, if they turn out to be some non-Car
references. Unfortunately there's not a lot you can do about that.
See more on this question at Stackoverflow