Du printemps à l'aide de ModelAndView addObject
Je suis en train d'objets d'affichage dans une page jsp qui sont chargés à l'aide de addObject() et retourné par l'intermédiaire d'un contrôleur. Je ne vois pas les objets dans la page jsp. Voici mon controller:
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;
}
}
Voici mon MoviesServiceImpl qui implémente 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());
}
}
Voici la page jsp j'utilise pour afficher les résultats:
<%@ 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>
Enfin, voici mes Films classe:
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;
}
}
Quand je suis arrivé à l'URL /films (localhost), je suis invité pour la connexion. Lorsque je me connecte en tant qu'ADMIN, je devrais voir les films dans les FILMS de la Carte dans MoviesServiceImpl. Je peux voir le débogage dans la statique de la charge de la films. Je peux voir les films accessibles par le débogage dans la MovieController.getAllMovies() la méthode. Je suis bien dirigé vers le allMovies.page jsp, mais la seule chose dont la sortie est "Films:". Si je supprime la recherche autour de la boucle for dans allMovies.jsp j'obtiens le résultat suivant: Films: ${film.nom}. Il n'y a pas les exceptions levées ou d'autres erreurs que je peux voir, cependant, je ne crois pas que je suis en utilisant ModelAndView.addObject() correctement. Un peu d'aide serait appréciée. Je vous remercie à l'avance.
Mise à jour: Si j'ai mis la suivante proclamation dans ma page jsp: <% Système.out.println("jsp: film" + pageContext.findAttribute("films")); %> je vais obtenir la sortie suivante: "jsp: film [Titre: Die Hard; Budget: 20000000, Titre: deux jours à paris; Budget: 1000000]" l'Objet array est arriver à la page jsp, je ne suis pas accéder correctement, mais ne vois pas l'erreur.
- Si vous voyez
${movie.name}
dans la page jsp lorsque vous décochez la case, alors il semble que la JSTL expression n'est pas évaluée. Pourriez-vous poster votreweb.xml
?
Vous devez vous connecter pour publier un commentaire.
Pouvez vous s'il vous plaît vérifier avec le Modèle.addAttribute(nom, valeur) au lieu de ModelAndView.addObject(nom, valeur)?
Je pense que vous devriez obtenir le même problème avec le Modèle.addAttribute approche.
S'il vous plaît essayez d'ajouter le suivant
de la JSP.
Pour ceux qui auraient un problème similaire, la réponse s'est avéré être avec mon web.xml fichier. Cet exemple est à partir du livre Pro de la Sécurité Printemps. L'auteur s'appuie sur les exemples précédents pour illustrer les concepts. Avec cet exemple, l'auteur ne mentionne pas la mise à jour de la web.xml fichier à partir de ses versions antérieures qui ont été à l'aide d'une DTD plutôt que d'un Schéma XML. J'ai dû changer ma web.xml de:
À:
EL expressions n'ont pas été évalués. Fonctionne très bien maintenant.
Résolu en modifiant
comme