spring - 使用复合 View 处理 BindingResults 和模型

标签 spring validation jsp spring-mvc

我正在使用 Java、Spring MVC 和 Hibernate 在复合 View 模板之上构建我当前的网站。其工作原理如下:

Browser asks for a page.

An Internal Result View Class intercepts the request, gets its value and redirects to a Template jsp that merges a Header and a Footer with the page asked.

然后它返回模板 jsp,就好像它是所请求的页面一样。

问题是我在阅读主页中的某些信息时遇到困难,例如 BindingResult 对象的验证错误(有关详细信息,请参阅 this 我就该主题提出的未回答的问题)。

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

用户请求页面 > 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);

    }
}

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

最佳答案

我认为你失踪了exposeModelAsRequestAttributes方法

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

 exposeModelAsRequestAttributes(model,request);

它应该放在

@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);

API

关于spring - 使用复合 View 处理 BindingResults 和模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39141969/

相关文章:

java - 如何使用 jsp/servlet/javascript 创建具有放置在服务器文件夹中的图像的幻灯片效果的照片库

java - 如何在 javascript 中启动 Spring WebFlow 转换

spring - 如何将 Liferay portlet 转换为 OSGI 包?

spring - RestTemplate 在获取请求时给出 400 Bad Request 错误

php - Laravel 验证文件数组总允许上传大小

jsp - HttpServletRequest#getParts()返回一个空列表

java - Spring MVC 在 "/"上打开 index.jsp

java - 改变Spring OAuth2的Json返回格式

asp.net - 使用 .Net 验证器在无效时将类添加到文本框

java - 用户输入的数字不重复