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 votre web.xml?
InformationsquelleAutor Mike HT | 2014-02-11