【问题标题】:Dynamic includes in JSP templateJSP 模板中的动态包含
【发布时间】:2013-10-03 01:13:43
【问题描述】:

我刚开始学习 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. 有没有更好的方法来实现这种小部件结构?

谢谢!

【问题讨论】:

  • 您是否尝试将请求属性转储到包含的JSPs 中?只是为了验证 included request 是否仍然包含它们。如果它们在那里,它们是可访问的。
  • @AlonsoDominguez 你是什么意思?例如,我为模型设置了一些类和其他属性,它们仅在第一个包含的视图中可用。其他观点没有得到他们。我理解你吗?
  • 我不太明白你为什么不能使用&lt;%@ include。我在一个项目中做到了这一点,我需要做一个“向导”,它使用一种形式但有多个 jsp 片段。我刚刚在我的模型中设置了一个 Enum,它决定了我应该加载哪个片段,并在 JSP 中使用了 c:choose
  • @MaximOstrovsky 不,我的意思是,转到您的 ${viewName}.jsp 页面并添加一个 Java Snippet(用于调试目的),您可以在其中迭代请求的属性并将它们输出到 JSP。这将有助于了解属性是否存在于包含的请求中
  • @CodeChimp 他不能使用@include,因为它是静态工作的(servlet 容器在将 JSP 转换为 servlet 类之前将包含页面的内容合并到调用页面中)。在 Maxim 代码中,要包含的页面仅在运行时才知道,因此他需要一种动态包含它的方法,因此使用 &lt;jsp:include/&gt; 标记,它使用 RequestDispatcher 执行包含操作(在编译期间不合并 JSP )。

标签: java spring jsp spring-mvc include


【解决方案1】:

您始终可以使用模型属性来决定要包含哪个文件

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

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 2014-12-19
    • 2016-12-09
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多