c:import加载的视图与tile中指定的视图不同

时间:2011-07-08 06:50:40

标签: spring jsp jstl tiles

使用:

  • Spring Web 3.0.5
  • JSTL 1.2.0
  • Apache Tiles 2.1.4
  • Resin 3.1.9

template1:​​为url1导入jsp main jsp:imports / my / simple / url2 导入的jsp:jsp页面没有导入也没有包含

瓦片: url1的逻辑视图:url1.view(扩展tempate1)
url2的逻辑视图:url2.view(是一个jsp页面)

现在发生了什么:
当访问/ my / simple / url1:进入控制器和命令然后结果到       渲染一个模板(template1),导入主jsp
在看到/ my / simple / url2的导入后,调度此URL的请求  反过来,这又使用另一个命令转到另一个控制器并呈现另一个jsp(又名:导入的jsp)

控制器URL2的执行后,我期望url2.view将呈现和附加到主JSP。但是,而不是这样,再次渲染template1,导致循环。

之前有没有人遇到过这个问题?我不确定发生了什么。

2 个答案:

答案 0 :(得分:0)

好的,所以我不确定这是否适用于早期版本的Tiles和Spring(目前使用的是Spring 3.1和Tiles 2.2.2),但无论如何它仍然存在。

我意识到由于某种原因,当你在一个tile模板中使用核心标记库进行导入时,让我们说import依次调用一个Spring MVC控制器,它会导致无限循环。我解决这个问题的方法是做以下几点:

  • 在布局的切片定义中添加一个属性,该属性将引用包含要执行导入的代码的jsp。比方说吧:

    <definition name="cti.layouts.fooBarLayout" template="/WEB-INF/views/layouts/foo-bar-layout.jsp"> <put-attribute name="body" value="/WEB-INF/views/some-body.jsp"/> <put-attribute name="foo" value="/WEB-INF/views/my-import.jsp"/> </definition>

在此示例中,您要在my-import.jsp中添加导入代码。您可以使用核心JSTL标记<c:import>

  • 在foo-bar-layout.jsp内部,添加tiles:insertAttribute标记,只要您想要导入此页面即可。引用属性的名称(在本例中为'foo'):

    <tiles:insertAttribute name="foo"/>

现在您可以从此布局扩展而无需担心无限循环。不知道为什么这是有效的,因为我不明白底层实现在做什么,但由于某种原因,tile不允许在模板页面内使用动态导入。

希望这会有所帮助。

答案 1 :(得分:0)

我遇到了同样的问题,并通过使用磁贴的绝对URI来解决。这触发了对服务器的“干净”请求,并且不知道当前的图块渲染。

我使用了导入,因为我需要一个更动态的网址。

对于示例案例:

<c:import url="/path/to/the/import/jsp/or/controller"/>

变为

<c:import url="http://localhost:8080/mycontext/path/to/the/import/jsp/or/controller" />

当然,您需要将baseURI更新为适用的情况。

这避免了在使用c:import

组合切片时发生的递归

注意:这会向您的服务器触发新的HTTP请求。