Java JSP模板中的动态包含
我刚刚开始学习Spring,我正在尝试制作一个web应用程序。我有一些常见的UI元素,如页脚、页眉、侧边栏,还想添加动态块,即小部件。需要在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">
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>