使用复合视图处理BindingResults和模型

Tia*_*que 5 validation spring jsp spring-mvc

我正在使用Java,Spring MVC和Hibernate在复合视图模板之上构建我当前的网站.以下是它的工作原理:

浏览器要求页面.

内部结果视图类拦截请求,获取其值并重定向到模板jsp,该模板jsp将页眉和页脚与所请求的页面合并.

然后它返回模板jsp,就像它是被询问的页面一样.

问题是,我有在读的主网页的一些信息的麻烦,因为,例如,从BindingResult对象验证错误(见这个我有关的细节问题所作回答的问题).

我认为请求流是这样的(如果错误,请纠正我):

用户请求页面> InternalResourceView拦截并重定向到Template.jsp>显示合并的jsp.

我认为合并页面中的模型不存在于合并的jsp中.

现在我担心,当从数据库中收集的数据显示列表和动态表单时,我可能会遇到麻烦.我的烦恼是错的吗?如果没有,我该怎么做才能解决诸如BindingResult错误之类的问题?

有关参考,请使用以下有关BindingResult错误和CompositeView类的链接:

import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.view.InternalResourceView;

public class CompositeView extends InternalResourceView {

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        String dispatcherPath = prepareForRendering(request, response);
        String[] parts = dispatcherPath.split("/");
        String endpath;
        if (parts[parts.length - 2].endsWith("views")) {
            endpath = parts[parts.length - 1];
        } else {
            endpath = parts[parts.length - 2] +"/"+ parts[parts.length - 1];

        }

        request.setAttribute("partial", endpath);


        RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/template.jsp");
        rd.include(request, response);

    }
}
Run Code Online (Sandbox Code Playgroud)

和Template.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript" src="resources/js/jquery-3.1.0.js"></script>
<script type="text/javascript" src="resources/js/bootstrap.js"></script>

<link rel="stylesheet" href="resources/css/bootstrap.css">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title><spring:message code="application.title"></spring:message></title>
</head>
<body>
    <div class="row">
        <div class="col-md-8 col-md-offset-2">

            <jsp:include page="navbar/header.jsp" />
        </div>
    </div>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <jsp:include page="${partial}" />
            <jsp:include page="navbar/footer.jsp" />
        </div>
    </div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

San*_*nka 3

我认为您缺少hideModelAsRequestAttributes方法

将给定映射中的模型对象公开为请求属性。名称将从模型地图中获取。该方法适用于RequestDispatcher可到达的所有资源。

 exposeModelAsRequestAttributes(model,request);
Run Code Online (Sandbox Code Playgroud)

它应该放置在

@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {

    //start :new code added by sanka
    exposeModelAsRequestAttributes(model,request);
    //end :new code added by sanka

    String dispatcherPath = prepareForRendering(request, response);
Run Code Online (Sandbox Code Playgroud)

应用程序编程接口