【发布时间】: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;
...
}
这显然不灵活。
所以,问题是:
- 有什么办法可以解决传递模型包含视图而不使用的问题
%@include file=并让我的小部件工作? - 有没有更好的方法来实现这种小部件结构?
谢谢!
【问题讨论】:
-
您是否尝试将请求属性转储到包含的
JSPs 中?只是为了验证 included request 是否仍然包含它们。如果它们在那里,它们是可访问的。 -
@AlonsoDominguez 你是什么意思?例如,我为模型设置了一些类和其他属性,它们仅在第一个包含的视图中可用。其他观点没有得到他们。我理解你吗?
-
我不太明白你为什么不能使用
<%@ include。我在一个项目中做到了这一点,我需要做一个“向导”,它使用一种形式但有多个 jsp 片段。我刚刚在我的模型中设置了一个 Enum,它决定了我应该加载哪个片段,并在 JSP 中使用了c:choose。 -
@MaximOstrovsky 不,我的意思是,转到您的
${viewName}.jsp页面并添加一个 Java Snippet(用于调试目的),您可以在其中迭代请求的属性并将它们输出到 JSP。这将有助于了解属性是否存在于包含的请求中 -
@CodeChimp 他不能使用
@include,因为它是静态工作的(servlet 容器在将 JSP 转换为 servlet 类之前将包含页面的内容合并到调用页面中)。在 Maxim 代码中,要包含的页面仅在运行时才知道,因此他需要一种动态包含它的方法,因此使用<jsp:include/>标记,它使用RequestDispatcher执行包含操作(在编译期间不合并 JSP )。
标签: java spring jsp spring-mvc include