通过 Spring MVC 框架包含其他 JSP 是个好主意吗?

Posted

技术标签:

【中文标题】通过 Spring MVC 框架包含其他 JSP 是个好主意吗?【英文标题】:Is including other JSP via the Spring MVC framework a good idea? 【发布时间】:2014-06-29 12:29:36 【问题描述】:

这是一个模糊而宏大的问题,但希望我能用尽可能少的具体例子来解释它。

我们最近为我们的应用程序框架切换到 Spring MVC,但在开发过程中发现了一个(而且实际上只有一个)限制因素:如何将动态视图包含在适当的模型中。

例如,我们正在创建一个包含可重用片段的页面。在左侧,我们有一个“随机 q 和 a”片段,而在顶部,我们有一个共同的“导航”片段。

每个片段都需要不同的模型。我一直在指示正在创建“导航”部分的开发人员创建一个导航模型、控制器和视图,它们完全独立于“q 和 a”模型、控制器和逻辑。这是为了鼓励可重用性,如果另一个页面布局想要“导航”而不是“q and a”或反之亦然。

你知道我的意思吗? “主页”页面包含两个片段,但不必“知道”片段需要哪个控制器/模型/视图会很好。

我一直在指导开发人员按以下方式使用 Spring MVC....

home.jsp 示例:

<body>
    <div class="top">
        <jsp:include page="/navigation"/>
    </div>
    <div class="left">
        <jsp:include page="/randomgQuestion"/>
    </div>
</html>

这个想法是在请求时将必要的其他片段与他们需要的模型一起动态拉入。

这是个好主意吗?有没有更好的办法?

欢迎任何讨论,但请保持建设性。

目标是可重用性和愚蠢的视图。

我会应要求提供任何更新或说明。谢谢。

【问题讨论】:

【参考方案1】:

您所描述的感觉有点像门户/portlet 功能 (JSR-286) => 即 应用程序(门户)生成的网页由其他嵌入式应用程序(portlet)生成的内容组成。门户是using INCLUDE dispatch(相当于&lt;jsp:include&gt;)来提供JSR-286 功能。所以从这个角度来看,使用&lt;jsp:include&gt;提供可重用的内容块是个好主意,每个都有自己的MVC生命周期(虽然共享相同的请求属性命名空间)...

另外请注意,如果您只有一个简单的片段,并且您想在 JSP 之间重用它,那么简单的 &lt;%@include file="menu.jspf" %&gt; 可能更合适。

而且我也觉得应该提一下JSP标签功能……将可重用的内容制作成JSP TAG文件(/WEB-INF/tags/[taglib-folder/]*.tag)可以提供一些高级布局功能。对于更高级的功能,您可以实现基于 Java 的标签库。


为了说明我如何在一个项目中使用自定义 TAG 和 include 指令,以下是一个 JSP 视图:

<%@ include file="/WEB-INF/taglib.jspf" %>
<layout:admin section="test">
    <layout:admin-context />
    <layout:admin-content>
        <h1><spring:message code="test.overview.heading" /></h1>
        <h2><spring:message code="test.detail.heading" /></h2>
        <%@ include file="test-detail.jspf" %>
    </layout:admin-content>
</layout:admin>

我们没有需要 INCLUDE 调度(即&lt;jsp:include /&gt;)的用例。

【讨论】:

这并没有解决我希望开发人员能够简单地包含 JSP 而不必知道调用哪个控制器来加载模型的问题。所以,现在我让他们直接调用控制器并在那里加载模型。不过,我担心性能开销。 This 没有解决” - 您心中的答案是哪一部分?您使用 INCLUDE 调度的想法很好......如果您想从 VIEW 启动 MVC,也许您应该检查一些组件框架(例如 JSF)。您的想法可能与这些框架的作者非常相似。【参考方案2】:

就您的 UI 而言,Apache Tiles 和 Sitemesh 是您可能想在这里查看的内容。

http://tiles.apache.org

http://wiki.sitemesh.org/wiki/display/sitemesh/Home

在控制器层方面,Spring 有@ControllerAdvice 注解,可用于将模型属性放置在所有控制器的范围内。例如,如果您将导航模型放在 @ControllerAdvice 中,则其他控制器不必担心将其设置为模型属性。

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html

@ModelAttribute 方法也可以定义在 @ControllerAdvice-annotated 类和此类方法适用于所有 控制器。 @ControllerAdvice 注解是一个组件 注释允许通过自动检测实现类 类路径扫描。

【讨论】:

感谢您的建议,尽管它们都没有真正解决问题。我希望开发人员能够选择一个模板并连接 jsp 而无需关心路径 -> 控制器/模型。听起来我必须创建一些东西,将 JSP 直接映射到一组填充必要模型的方法。控制器将仅处理重定向逻辑等。

以上是关于通过 Spring MVC 框架包含其他 JSP 是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC程序

Spring学习之第一个Spring MVC程序(IDEA开发环境)

SpringMVC

转义 JSP/Spring MVC 中的所有字符串

spring3 mvc 中怎么从当前action跳到另一个action中

jsf struts jsp spring 啥关系和区别?