2014-02-11 2 views
0

Я пытаюсь отображать объекты на странице 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, я просто не доступ к нему правильно, но не вижу ошибки.

+0

Если вы видите '$ {кино.name} 'в jsp, когда вы удаляете чек, тогда кажется, что выражение JSTL не оценивается. Не могли бы вы разместить свой 'web.xml'? –

ответ

1

Для тех, у кого может быть аналогичная проблема, ответ оказался в моем файле web.xml. Этот пример из книги Pro Spring Security. Автор опирается на предыдущие примеры, иллюстрирующие концепции. В этом примере автор не упомянул об обновлении файла web.xml из более ранних версий, в которых использовался DTD, а не XML-схема. Я должен был изменить свой web.xml от:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
... 
</web-app> 

To:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
... 
</web-app> 

Выражения EL не были оценены. Сейчас работает отлично.

1

Можете ли вы проверить с Model.addAttribute (имя, значение) вместо ModelAndView.addObject (имя, значение)? Я думаю, что вы должны получить ту же проблему с подходом Model.addAttribute.

Пожалуйста, попробуйте добавить следующую

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 

к JSP.

+0

Я пробовал использовать Model.addAttributes и имел ту же проблему. Я добавил <% @ taglib prefix = "spring" uri = "http://www.springframework.org/tags"%> в jsp и по-прежнему имел ту же проблему. –

0

Решенный путем изменения

<web-app> 

в

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0" 
    metadata-complete="true"> 
Смежные вопросы