如何删除特定视图的apache切片中的切片?

时间:2014-01-04 18:04:34

标签: java spring-mvc apache-tiles

我想知道如何从视图中删除图块。我的主要观点看起来像这样

Main layout of my web page

磁贴配置由4个部分组成:标题,菜单,正文和页脚。

现在我知道如果我申请新页面,我可以覆盖主视图,例如替换正文,以便我在那里显示不同的内容。

但是我希望能够点击菜单中的链接,将我带到一个只有标题和正文(没有菜单或页脚)的页面。

specific layout without the menu and footer

然后用户将完成一个向导,他们可以从一个页面转到另一个页面,然后一旦完成,它应该再次返回到主要布局。

这是我的问题:如何从视图中删除菜单和页脚?我的问题在这里停止。

由于没有太多关于磁贴的文档,我可以找到,我想我会为其他人努力获得使用Spring工具套件使用Apache Tiles和Spring MVC的工作示例的一步一步示例(我的版本是STS 3.2.0)。

步骤要使用STS

创建一个简单的站点
  1. 创建新的STS项目

    档案>>新>>春天模板项目>> Spring MVC项目

    选择“Spring MVC Project”选项

    为您的项目提供名称和顶级包

    GiveUrProjectANameAndPackage

    这将创建一个类似于下面的项目

    enter image description here

  2. 更改POM以使用SPRING 3.2.0.RELEASE
  3. 自:

    <org.springframework-version>3.1.1.RELEASE</org.springframework-version>
    

    要:

    <org.springframework-version>3.2.0.RELEASE</org.springframework-version>
    
    1. 将以下依赖项添加到POM文件以包含Apache Tile依赖项
    2. <!-- Tiles -->
      <dependency>
          <groupId>org.apache.tiles</groupId>
          <artifactId>tiles-api</artifactId>
          <version>3.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.tiles</groupId>
          <artifactId>tiles-core</artifactId>
          <version>3.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.tiles</groupId>
          <artifactId>tiles-jsp</artifactId>
          <version>3.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.tiles</groupId>
          <artifactId>tiles-servlet</artifactId>
          <version>3.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.tiles</groupId>
          <artifactId>tiles-template</artifactId>
          <version>3.0.1</version>
      </dependency> 
      
      1. 更改“servlet-context.xml”以使用TilesViewResolver而不是默认的InternalViewResolver
      2. <!-- Remove -->
        <beans:bean class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
            <beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property>
            <beans:property name="order" value="0"></beans:property>
        </beans:bean>
         
        <!-- Add -->
        <beans:bean class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
        <beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property>
            <beans:property name="order" value="0"></beans:property>
        </beans:bean>
        
        1. 添加引用以了解已配置切片的位置
        2. <beans:bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" id="tilesConfigurer">
              <beans:property name="definitions" value="/WEB-INF/spring/tiles.xml"> </beans:property>
          </beans:bean>
          
          1. 现在指定视图 - 用于指定视图的JSP文件...例如标题,菜单,页脚和正文(这可以是实际内容,通常你将拥有超过1个正文,具体取决于用户在菜单中点击的内容) - 布局将像这篇文章中的第一张图片。 / LI>

            在视图文件夹中创建的JSP文件,每个文件都有内容

            header.jsp中

            <h2>This is the header</h2>
            

            footer.jsp中

            <p>This is the footer</p>
            

            content1.jsp

            <h1>This is content page 1</h1>
            <p>Blah blah content 1</p>
            

            content2.jsp

            <h1>This is content page 2</h1>
            <p>Blah blah content 2</p>
            

            引入了menu.jsp

            <h2>Menu</h2>
                <a href="">Go to home page</a><br/>
                <a href="page1">Display page 1</a><br/>
                <a href="page2">Display page 2</a>
            
            1. 创建项目时,会创建一个名为“HomeController.java”的默认控制器。这是用于确定单击菜单项时下一步的位置。如果您打开家庭控制器并将其更改为以下
            2. package com.stp.myapp;
              import java.util.Locale;
              import org.springframework.stereotype.Controller;
              import org.springframework.ui.Model;
              import org.springframework.web.bind.annotation.RequestMapping;
              import org.springframework.web.bind.annotation.RequestMethod;
              import org.springframework.web.servlet.ModelAndView;
              /**
               * Handles requests for the application home page.
               */
              @Controller
              public class HomeController {
              
                  /**
                   * The request mapping has a value. That is what we are 
              * requesting for. When opening the site it will request the main 
              * page or the index page. The “/” indicates it is the index page.
              * In this simple example we simply return the new ModalAndView with 
              * the page in the view folder. In This case it is the mainPage.
              * The mainPage is the reference of what is configured in the 
              * apache tiles configuration – not the actual page that will be 
              * displayed. 
                   */
                      @RequestMapping(value = "/", method = RequestMethod.GET)
                      public ModelAndView home(Locale locale, Model model) {
                      return new ModelAndView("mainPage");
                      }
              
                      /**
                       * The request mapping is for page1 (page1 is the value from the menu.
                       */
              
                      @RequestMapping(value = "/page1", method = RequestMethod.GET)
                      public ModelAndView viewArticle(Locale locale, Model model) {
                      return new ModelAndView("displayPageContent1");
                      }
              
                      @RequestMapping(value = "/page2", method = RequestMethod.GET)
                      public ModelAndView viewEmployees(Locale locale, Model model) {
                      return new ModelAndView("displayPageContent2");
                  }
              
              }
              
              1. 现在让我们配置瓷砖
              2. 使用

                创建“tiles.xml”文件
                 <?xml version="1.0" encoding="UTF-8" ?>
                    <!DOCTYPE tiles-definitions PUBLIC
                           "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
                           "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
                
                <!-- This file has several definitions of page layouts -->
                <tiles-definitions>
                
                    <!-- The main definition with the header footer menu and body -->
                    <definition name="base.definition" template="/WEB-INF/views/mainTemplate.jsp">
                        <put-attribute name="title" value=""></put-attribute>
                        <put-attribute name="header" value="/WEB-INF/views/header.jsp"></put-attribute>
                        <put-attribute name="menu" value="/WEB-INF/views/menu.jsp"></put-attribute>
                        <put-attribute name="body" value=""></put-attribute>
                        <put-attribute name="footer" value="/WEB-INF/views/footer.jsp"></put-attribute>
                    </definition>
                
                    <!-- Now you can specify as many layours as you want... The name will match the names the --> 
                    <!-- HomeController.java returns aka... as we specified it as displayPageContent1 and displayPageContent2 -->
                    <!-- You can override each of the base.definition entries. In this we change the page title and display a different -->
                    <!-- page as the body. As we didn't override the menu of footer it will display as specified in tha base.defition-->
                    <definition name="displayPageContent1" extends="base.definition">
                        <put-attribute name="title" value="Page context 1 displaying..."></put-attribute>
                        <put-attribute name="body" value="/WEB-INF/views/content1.jsp"></put-attribute>
                    </definition>
                
                    <definition name="displayPageContent2" extends="base.definition">
                        <put-attribute name="title" value="Employees List"></put-attribute>
                        <put-attribute name="body" value="/WEB-INF/views/content2.jsp"></put-attribute>
                    </definition>
                
                     <definition name="mainPage" extends="base.definition">
                        <put-attribute name="title" value="This is the home page being displayed....."></put-attribute>
                        <put-attribute name="body" value="/WEB-INF/views/home.jsp"></put-attribute>
                    </definition>
                
                </tiles-definitions>
                

                tiles.xml文件将“mainTemplate.jsp”定义为基本定义。创建一个具有主html布局的文件“mainTemplate.jsp”。这些文件有“tiles:insertAttribute”,它定义了可以在每个视图中覆盖的基本布局部分。

                <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/html4/loose.dtd">
                <html>
                <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                <title>
                    <tiles:insertAttribute name="title" ignore="true"></tiles:insertAttribute>
                </title>
                </head>
                <body>
                <table border="1" cellpadding="2" cellspacing="2" align="left">
                    <tr>
                        <td colspan="2" align="center">
                            <tiles:insertAttribute name="header"></tiles:insertAttribute>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <tiles:insertAttribute name="menu"></tiles:insertAttribute>
                        </td>
                        <td>
                            <tiles:insertAttribute name="body"></tiles:insertAttribute>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2"  align="center">
                            <tiles:insertAttribute name="footer"></tiles:insertAttribute>
                        </td>
                    </tr>
                </table>
                </body>
                </html>
                
                1. 最后,你应该得到一个类似这样的文件结构
                2. InTheEndTheFilesShouldLookLikeThis

2 个答案:

答案 0 :(得分:4)

Tiles.xml中删除页眉和页脚值,如下所示:

<definition name="base.definition" template="/WEB-INF/views/mainTemplate.jsp">
  <put-attribute name="title" value=""></put-attribute>
  <put-attribute name="header" value=""></put-attribute>
  <put-attribute name="menu" value=""></put-attribute>
  <put-attribute name="body" value=""></put-attribute>
  <put-attribute name="footer" value=""></put-attribute>
</definition>

然后,如果你想要唯一的标题和正文:

<definition name="displayPageContent2" extends="base.definition">
  <put-attribute name="title" value="Employees List"></put-attribute>
  <put-attribute name="header" value="/WEB-INF/views/header.jsp" />"></put-attribute>
  <put-attribute name="body" value="/WEB-INF/views/content2.jsp"></put-attribute>
</definition>

答案 1 :(得分:1)

我不知道如果这是你所期望的,但是你可以随时添加你的tile配置,一个空文件的引用(首先创建一个) - 所以菜单将消失:

您可以在菜单jsp中移动菜单td,因此布局看起来与此类似:

<tr>        
<tiles:insertAttribute name="menu"></tiles:insertAttribute>
[...]
</tr>

DEFS:

<definition name="displayPageContent1" extends="base.definition">
[...]
<put-attribute name="menu" value="/WEB-INF/views/empty.jsp"></put-attribute>    
</definition>

在上面给出的场景中,将不会显示带菜单的td,与页脚部分相同。

另一种方法是制作一个定义并将其嵌套到另一个定义中,这也将导致嵌套模板,然后您可以插入这样的自定义模板(来自其他项目的示例):

<definition name="menu_template"  template="/WEB-INF/layouts/main_template/header.ftl">
<put-attribute name="SYSTEM_NAME_SHORT" value="SOL"/>
<put-attribute name="menu" value="/WEB-INF/views/menus/menu.ftl"/>
</definition>

<definition name="record.history" extends="main_template">
<put-attribute name="content" value="/WEB-INF/views/xxx.ftl"/>
<put-attribute name="header" >
<definition extends="menu_template">
<put-attribute name="menu" value="/WEB-INF/layouts/blank.ftl"/>
</definition>
</put-attribute>
</definition>

如上所示,您可以将其他模板作为属性注入主模板 - 在这种情况下,菜单模板将插入到名为header的属性中。