【问题标题】:Dealing with BindingResults and Models with Composite View使用复合视图处理 BindingResults 和模型
【发布时间】:2016-08-25 09:50:29
【问题描述】:

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

浏览器请求页面。

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

然后它返回模板 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>

【问题讨论】:

  • InternalResourceView 方法的原始实现中,我看到调用exposeModelAsRequestAttributes(model, request);exposeHelpers(request); 也许也使用那个调用?
  • 不会只抓取请求和响应中的内容吗?

标签: spring validation jsp spring-mvc


【解决方案1】:

我认为你缺少exposeModelAsRequestAttributes 方法

将给定地图中的模型对象作为请求属性公开。名称将从模型地图中获取。此方法适用于 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

【讨论】:

  • 正是如此。在看到您的答案之前,我设法解决了它,但这就是重点。现在我唯一的问题是如何使绑定结果错误通过重定向存活(flash 属性不起作用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2011-09-05
  • 2011-11-14
  • 1970-01-01
  • 2012-11-06
相关资源
最近更新 更多