如何使用重定向在spring mvc中的jsp上显示验证消息

时间:2013-12-18 13:13:31

标签: java validation spring-mvc

我有这样的表格

<form:form method="POST" action="posts/add" modelAttribute="post">
        <table>
            <tr>
                <td><form:label path="author"><spring:message code="blog.posts.author.name"/></form:label></td>
                <td>
                    <form:select path="author">
                        <form:option value="NONE" label="--- Select ---"/>
                        <form:options items="${authors}" />
                    </form:select>
                </td>
                <td><form:errors path="author" cssClass="error" /></td>
            </tr>
            <tr>
                <td><form:label path="text"><spring:message code="blog.posts.text"/></form:label></td>
                <td><form:textarea path="text" rows="5" cols="30"/></td>
                <td><form:errors path="text" cssClass="error" /></td>   
            </tr>
        </table>
        <input type="submit" value="<spring:message code="blog.posts.save"/>" />
    </form:form>

和它的控制器

@Controller
public class PostsController {

    @Autowired
    private PostDAO postDao;

    @Autowired
    private Validator validator;

    @RequestMapping("/posts")
    public String showAllPosts(ModelMap model) {

        List<String> authors = new ArrayList<String>();
        authors.add("John B.");
        authors.add("Jack C.");

        List<Post> posts = postDao.findAll();
        model.addAttribute("posts", posts);
        model.addAttribute("authors", authors);

        return "posts";
    }

    @ModelAttribute("post")
    public Post getPost(ModelMap model) {
        return new Post();
    }

    @RequestMapping(value = "/posts/add", method = RequestMethod.POST)
    public String savePost(@ModelAttribute("post") Post post, BindingResult errors, ModelMap model) {

        validator.validate(post, errors);

        if (errors.hasErrors()) {
            model.addAttribute("posts", postDao.findAll());
            return "posts";
        }

        postDao.addPost(post);
        model.addAttribute("posts", postDao.findAll());

        return "redirect:/posts";
    }

我使用自定义验证器。

如果是

,它会显示包含错误消息的页面
if (errors.hasErrors()) {
                model.addAttribute("posts", postDao.findAll());
                return "posts";
            }

我尝试在返回语句中使用redirect:/posts

但在这种情况下,它不会在页面上显示错误消息。

另外?我试图添加到控制器。但没有成功。

@SessionAttributes("post")

是否可以重定向到页面并在其上显示错误消息?

1 个答案:

答案 0 :(得分:4)

重定向导致Servlet容器使用302状态代码和Location标头响应客户端,其值为要转到下一个的URI。

模型和请求属性仅在一个请求的生命周期内存在。因此,在Servlet容器发送302之后,它们就消失了。您需要使用Flash属性。如果您使用的是Spring 3.1+,则可以使用RedirectAttributes执行此操作。