其中一个是使用瓷砖的更好方法

时间:2012-07-13 06:26:12

标签: java jsp spring-mvc struts2 tiles

问题:我有两个相同的网页home.jspcontact.jsp具有相同的结构。它们仅在身体内容和标题方面有所不同。我想使用tiles框架创建一个布局页面,并重用两个JSP的代码。控制器框架尚未确定,可能是Spring MVC 3Struts 2

解决方案A:直接从控制器/操作类调用JSP个文件/视图。

我在tiles.xml中写了一个单一的定义,如:

<definition name="baseLayout" template="/WEB-INF/jsp/layout/baseLayout.jsp">
    <put-attribute name="title" value="" />
    <put-attribute name="header" value="/WEB-INF/jsp/includes/header.jsp"/>
    <put-attribute name="body" value="" />
</definition>

现在在baseLayout.jsp

<html>
    <head><title><tiles:insertAttribute name="title"/></title></head>
    <body>
        <div class="wrapper">
            <div class="header"><tiles:insertAttribute name="header"/></div>
            <div class="body"><tiles:insertAttribute name="body"/></div>
        </div>
    </body>
</html>

现在在home.jsp

<tiles:insertDefinition name="baseLayout">
    <tiles:putAttribute name="title">
        Title for home page
    </tiles:putAttribute>
    <tiles:putAttribute name="body">
        Content for home page
    </tiles:putAttribute>
</tiles:insertDefinition>

同样适用于contact.jsp

<tiles:insertDefinition name="baseLayout">
    <tiles:putAttribute name="title">
        Title for contact page
    </tiles:putAttribute>
    <tiles:putAttribute name="body">
        Content for contact page
    </tiles:putAttribute>
</tiles:insertDefinition>

解决方案B:从cotrollers / action类中调用tiles definition个不同JSP个文件。对于我将编写的每个tiles definition文件,此方法需要一个JSP。总共有3个图块定义(一个用于baseLayout,另外两个用于homecontact)。

tiles.xml:

<definition name="baseLayout" template="/WEB-INF/jsp/layout/baseLayout.jsp">
    <put-attribute name="title" value="" />
    <put-attribute name="header" value="/WEB-INF/jsp/includes/header.jsp"/>
    <put-attribute name="body" value="" />
</definition>

<definition name="home" extends="baseLayout">
    <put-attribute name="title" value="Title for home page" />
    <put-attribute name="header" value="/WEB-INF/jsp/home.jsp"/>
</definition>
<definition name="contact" extends="baseLayout">
    <put-attribute name="title" value="Title for contact page" />
    <put-attribute name="header" value="/WEB-INF/jsp/contact.jsp"/>
</definition>

baseLayout.jsp:Same as **Solution A**

home.jsp:Content for home page

contact.jsp:Content for contact page


我想知道我应该坚持哪种上述方法。

3 个答案:

答案 0 :(得分:3)

第二种解决方案是最好的方法:

  • 您可以在tiles属性中为每个属性设置独立部分 jsp布局。
  • 您可以随时更改
  • ,而不会影响其他布局
  • struts
  • 中最常用的方式

第一个解决方案:

  • 以后可能会因为必须使用任何更改进行编辑而导致问题 特别是当您深入了解高级项目时
  • 更通用的方法不适用于struts / tiles architecture 设计

答案 1 :(得分:1)

解决方案B是实施的最佳方法,

  • 您将拥有单独的样式模板,如果其他jsp需要,您可以在以后重复使用,而不会像解决方案A那样弄乱jsp中的代码。

  • 在理解时,第二种方法更加清晰,并且遵循一个共同的标准。

答案 2 :(得分:0)

解决方案A通过分发配置并通过显式配置提升名称约定来帮助维护大型应用程序。此外,它在概念上与其他模板解决方案兼容,如JSF或普通标签。例如,请参阅:JSP tricks to make templating easier?

考虑一个具有数百个控制器的应用程序和不同人在很长一段时间内编写的视图。使用解决方案B,您将不得不面对一个巨大的tiles.xml文件。添加略微缺乏纪律和视图名称最终会在配置中出现不一致的混乱和内容(如您的示例)。