Spring using ModelAndView addObject



我正在尝试在jsp页面中显示使用addObject()加载并通过控制器返回的对象。我没有在jsp中看到对象。这是我的控制器:

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.getAllMovies()

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身份登录时,我应该会看到这两部电影都添加到MoviesServiceImpl中的movies映射中。我可以看到调试在静态块加载电影。我可以在MovieController.getAllMovies()方法中看到调试访问的电影。我被正确地引导到allMovies.jsp页面,但唯一输出的是"Movies:"。如果我删除allMovies.jsp中for循环的检查,我会得到以下输出:Movies:${movie.name}。没有抛出异常或其他错误,但我认为我没有正确使用ModelAndView.addObject()。如有帮助,不胜感激。提前谢谢。

更新:如果我在jsp页面中放入以下语句:<%System.out.println("jsp:movie"+pageContext.findAttribute("movies"));%>我将得到以下输出:"jsp:movie[Title:DieHard;Budget:20000000,Title:twodaysinparis;Budget:10000000]"所以Object数组正在访问jsp页面,我只是没有正确访问它,但没有看到错误。

你能用Model.addAttribute(name,value)而不是ModelAndView.addObject(name,value)检查吗?我认为Model.addAttribute方法也应该遇到同样的问题。

请尝试添加以下

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

到JSP。

对于那些可能有类似问题的人来说,答案是我的web.xml文件。这个例子来自Pro-Spring Security一书。作者在前面的例子的基础上阐述了一些概念。在这个例子中,作者没有提到从使用DTD而不是XMLSchema的早期版本更新web.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>

收件人:

<?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表达式。现在工作正常。

通过修改解决

<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">

最新更新