我使用Java,Spring MVC和Hibernate在复合视图模板之上构建我当前的网站。以下是它的工作原理:
浏览器要求提供一个页面。
内部结果视图类拦截请求,获取其值并重定向到模板jsp,该模板jsp将页眉和页脚与所请求的页面合并。
然后它返回模板jsp,就像它是被询问的页面一样。
问题在于我在阅读主页面中的某些信息时遇到了麻烦,例如,来自BindingResult对象的验证错误(有关详细信息,请参阅this未回答的问题。 )。
我认为请求流程是这样的(如果错误则纠正我):
用户请求页面> InternalResourceView截取并重定向到Template.jsp>显示合并的jsp。
我认为合并页面中的模型不存在于合并的jsp中。
现在我担心,当从数据库中收集的数据显示列表和动态表单时,我可能会遇到麻烦。我的烦恼是错的吗?如果没有,我该怎么做才能解决诸如BindingResult错误的问题?
对于Reference,请使用以下链接: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>
答案 0 :(得分:2)
我认为您缺少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);