Java JSP模板中的动态包含

Java JSP模板中的动态包含,java,spring,jsp,spring-mvc,include,Java,Spring,Jsp,Spring Mvc,Include,我刚刚开始学习Spring,我正在尝试制作一个web应用程序。我有一些常见的UI元素,如页脚、页眉、侧边栏,还想添加动态块,即小部件。需要在Java代码中选择要包含的小部件,而不是JSP模板 这就是我被困的地方。每个控制器都返回自己的视图-main.jsp,其中包括一些静态和动态块: <jsp:include page="head.jsp" /> <c:forEach items="${viewList}" var="viewName">

我刚刚开始学习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>
...
但它不起作用,因为当我使用
jsp:include页面时,模型参数不会传递给includee。另外,我不能
%@include file=
,因为在这种情况下,我将无法使用变量,我需要知道在编译时传递哪个视图

当然,如果没有解决方案,我必须在
main.jsp
中硬编码所有可能的小部件视图,并在它们之间切换:

   switch($i) {
    case 1: 
          include file=widget1.jsp;
          break;
    case 2: 
        include file=widget2.jsp;
        break;
      ...                    
    }
这显然是不灵活的

因此,问题是:

  • 有没有办法解决在不使用
    %@include file=
    并使我的小部件正常工作
  • 有没有更好的方法来实现这种小部件结构

  • 谢谢大家!

    您始终可以使用模型属性来决定要包含的文件,如

    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的装饰器,然后您可以将不同的装饰器应用到视图中。试试看

    您是否尝试在包含的
    JSP
    s中转储请求属性?只是为了验证包含的请求仍然包含它们。如果他们在那里,他们是可以接近的。@AlonsoDominguez你什么意思?例如,我将一些类和其他属性设置为model,它们仅在第一个包含的视图中可用。其他观点没有得到支持。我明白你的意思了吗?我不太明白你为什么不能使用
    @MaximOstrovsky不,我的意思是,转到你的
    ${viewName}.jsp
    页面,添加一个Java代码片段(用于调试目的),在其中你可以迭代请求的属性并将它们输出到jsp。这将有助于了解所包含的请求中是否存在这些属性not@CodeChimp他不能使用
    @include
    ,因为它是静态工作的(servlet容器在servlet类中转换JSP之前将包含页面的内容合并到调用页面中)。在Maxim代码中,要包含的页面只有在运行时才知道,因此他需要一种动态包含它的方法,因此使用
    标记,它使用
    RequestDispatcher
    执行包含操作(编译时不合并JSP)。
    <c:choose>
    <c:when test="${fileToInclude == 'HEADER'}">
    <%@include file="header.jsp"%>
    </c:when>
    <c:otherwise>
    </c:otherwise>
    </c:choose>