这是一个含糊不清的问题,但希望我能用尽可能少的具体例子来解释。
我们最近为应用程序框架切换到了Spring MVC,但在开发过程中发现了一个(实际上也是唯一一个)限制因素:如何使用适当的模型包含动态视图。
例如,我们正在创建一个包含可重用片段的页面。在左边我们有一个“随机q和a”片段,而在顶部我们有一个共同的“导航”片段。
这些片段中的每一个都需要不同的模型。我一直指示正在创建“导航”部分的开发人员创建一个完全独立于“q和a”模型,控制器和逻辑的导航模型,控制器和视图。如果另一个页面布局需要“导航”而不是“q和a”或反之,那么这是为了鼓励可重用性。
你知道我要去哪儿吗? “主页”页面包含两个片段,但不必“知道”片段需要哪个控制器/模型/视图是很好的。
我一直在指示开发人员以下列方式使用Spring MVC ....
home.jsp的例子:
<body>
<div class="top">
<jsp:include page="/navigation"/>
</div>
<div class="left">
<jsp:include page="/randomgQuestion"/>
</div>
</html>
这个想法是在请求时将必要的其他片段与他们需要的模型动态地拉入。
这是个好主意吗?还有更好的方法吗?
欢迎任何讨论,但请建设性。
目标是可重用性和愚蠢的观点。
我会根据要求提供任何更新或说明。谢谢。
答案 0 :(得分:4)
您所描述的内容有点像门户/ portlet功能(JSR-286)=&gt;即应用程序(门户)生成的网页由其他嵌入式应用程序(portlet)生成的内容组成。门户网站using INCLUDE dispatch(相当于<jsp:include>
)提供JSR- 286功能。因此,从这个角度来看,使用<jsp:include>
提供可重用的内容块是个好主意,每个内容块都有自己的MVC生命周期(尽管共享相同的请求属性命名空间)...
另请注意,如果您只有一个简单的片段,您希望在JSP之间重复使用,那么简单的<%@include file="menu.jspf" %>
可能更适合。
我还觉得应该提到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调度(即<jsp:include />
)。
答案 1 :(得分:2)
就您的UI而言,Apache Tiles和Sitemesh是您可能希望在此处查看的内容。
就控制器层而言,Spring具有@ControllerAdvice注释,可用于将模型属性放置在所有控制器的范围内。例如,如果您将导航模型放在@ControllerAdvice中,则其他控制器不必担心将其设置为模型属性。
http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html
@ModelAttribute方法也可以在一个中定义 @ControllerAdvice-annotated类和这样的方法适用于所有 控制器。 @ControllerAdvice注释是一个组件 允许通过自动检测实现类的注释 classpath扫描。