Я пытаюсь отображать объекты на странице jsp, которые загружаются с помощью addObject() и возвращаются через контроллер. Я не вижу объекты в jsp. Вот мой контроллер:Spring using ModelAndView addObject
import java.util.ArrayList;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.apress.pss.terrormovies.model.Movie;
import com.apress.pss.terrormovies.service.MoviesService;
@Controller
@RequestMapping("/movies")
public class MovieController {
@Autowired
private MoviesService moviesService;
... Other Mapped mehtods not shown ...
// Respond to http://localhost:8080/movies and require login
// Get a list of movie objects in an ArrayList and return to view
@RequestMapping(method = RequestMethod.GET, value="/")
public ModelAndView getAllMovies() {
ModelAndView mv = new ModelAndView("allMovies");
// Debug
for (Movie movie: moviesService.getAllMovies()) {
System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " + movie.getName());
}
mv.addObject("movies", moviesService.getAllMovies());
return mv;
}
}
Вот мой MoviesServiceImpl, который реализует moviesService.getAllMoivies()
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreFilter;
import org.springframework.security.access.prepost.PostFilter;
import com.apress.pss.terrormovies.model.Movie;
public class MoviesServiceImpl implements MoviesService {
private static final Map<String, Movie> MOVIES = new HashMap<String, Movie>();
static {
//System.out.println("----------------- Entering Die Hard");
MOVIES.put("die hard", new Movie("Die Hard", "20000000"));
// Create another movie for testing PostAuthorize in MoviesController
//System.out.println("----------------- Entering two days in paris");
MOVIES.put("two days in paris", new Movie("two days in paris", "1000000"));
}
... Other methods not shown....
// Allow ROLE_ADMIN to have access to movies with budget over 5000000. Other
// users will see only movies with budgets < 5000000
@PreAuthorize("isFullyAuthenticated()")
@PostFilter("hasRole('ROLE_ADMIN') or (hasRole('ROLE_USER') and T(java.lang.Integer).parseInt(filterObject.budget) < 5000000)")
public Collection<Movie> getAllMovies() {
return new ArrayList<Movie>(MOVIES.values());
}
}
Вот страница JSP Я использую для отображения результатов:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="security"
uri="http://www.springframework.org/security/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Terror movies</title>
</head>
<p>Movies:</p>
<body>
<c:if test="${not empty movies}">
<c:forEach items="${movies}" var="movie">
${movie.name}<br />
</c:forEach>
</c:if>
</body>
</html>
Наконец, вот мой класс фильмов:
public class Movie {
private String name;
private String budget;
public Movie(String name, String budget) {
super();
this.name = name;
this.budget = budget;
}
public String getName() {
return name;
}
public String getBudget() {
return budget;
}
public void setName(String name) {
this.name = name;
}
public void setBudget(String budget) {
this.budget = budget;
}
public String toString() {
return "Title: " + name + "; Budget: " + budget;
}
}
Когда я добрался до URL/фильмов (на локальном хосте), мне будет предложено ввести логин. Когда я вхожу в систему как ADMIN, я должен увидеть оба фильма, добавленные в Карту MOVIES в MoviesServiceImpl. Я вижу, что отладка в статическом блоке загружает фильмы. Я вижу фильмы, к которым обращается отладка в методе MovieController.getAllMovies(). Я правильно перенаправлен на страницу allMovies.jsp, но единственное, что есть, - «Фильмы:». Если я удалю проверку вокруг цикла for в allMovies.jsp, я получаю следующий вывод: Movies: $ {movie.name}. Никаких исключений или других ошибок, которые я вижу, не вижу, однако я не верю, что правильно использую ModelAndView.addObject(). Некоторая помощь будет оценена по достоинству. Заранее спасибо.
Update: Если я ставлю следующий statemnt в моей странице JSP: <% System.out.println ("JSP: фильм" + pageContext.findAttribute ("кино")); %> Я получу следующий результат: «jsp: movie [Название: Die Hard; Budget: 20000000, Title: two days in paris; Budget: 1000000]» Итак, массив Object попадает на страницу jsp, я просто не доступ к нему правильно, но не вижу ошибки.
Если вы видите '$ {кино.name} 'в jsp, когда вы удаляете чек, тогда кажется, что выражение JSTL не оценивается. Не могли бы вы разместить свой 'web.xml'? –