动态包含在JSP模板中

时间:2013-09-26 21:20:15

标签: java spring jsp spring-mvc include

我刚刚开始学习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;
      ...                    
    }

这显然不灵活。

所以,问题是:

  1. 有没有办法解决传递模型以包含视图而不使用的问题 %@include file=并让我的小工具正常工作?
  2. 有没有更好的方法来实现这样的小部件结构?
  3. 谢谢!

1 个答案:

答案 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