我正在使用 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,就好像它是所请求的页面一样。
block 引用>问题是我在阅读主页中的某些信息时遇到困难,例如 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);
关于spring - 使用复合 View 处理 BindingResults 和模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39141969/