我刚刚开始学习Spring,我正在尝试创建一个Web应用程序。我有一些常见的UI元素,如页脚,标题,侧边栏,还想添加动态块,即小部件。要包含哪些小部件需要在Java代码中选择,而不是JSP模板。
这就是我被困住的地方。每个控制器都返回它自己的视图 - main.jsp
,其中包含一些静态和动态块:
<jsp:include page="head.jsp" />
<c:forEach items="${viewList}" var="viewName">
<jsp:include page="${viewName}.jsp" />
</c:forEach>
...
在控制器中,我传递的视图列表和对象将用作建模小部件:
...
views.add(moduleOne.getViewName());
views.add(moduleTwo.getViewName());
model.addAllAttributes(moduleOne.getAttr());
model.addAllAttributes(moduleTwo.getAttr());
model.addAttribute(IModule.VIEW_LIST, views); // passing all views that will be included into main.jsp
...
return "main";
但它不起作用,因为当我使用jsp:include page
模型参数时,不会传递给includee。我也不能%@include file=
,因为在那种情况下我将无法使用变量,我需要知道在编译时传递哪个视图。
当然,如果没有解决方案,我将不得不在main.jsp
中对所有可能的小部件视图进行硬编码并在它们之间切换:
switch($i) {
case 1:
include file=widget1.jsp;
break;
case 2:
include file=widget2.jsp;
break;
...
}
这显然不灵活。
所以,问题是:
%@include file=
并让我的小工具正常工作? 谢谢!
答案 0 :(得分:0)
您始终可以使用模型属性来决定要包含哪个文件,例如
model.addAttribte("fileToInclude",IncludeFile.HEADER);
然后
<c:choose>
<c:when test="${fileToInclude == 'HEADER'}">
<%@include file="header.jsp"%>
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
但是有一种更好,更清洁的方式。使用像SiteMesh这样的装饰器,然后你可以将不同的装饰器应用于你的视图。试一试Sitemesh