发表于: 2016-04-06 22:18:30

1 2258


【操作步骤】
1.建立Tiles框架,参考链接:http://www.tuicool.com/articles/ZbMn2a
    1.1 在pom.xml中为项目ITtask_4添加Tiles特性,即在项目中添加上Tiles框架所需要的jar包。
    1.2 创建tilesLayout.xml,放在src/main/resources下,和applicationContext.xml放在一块。
    1.3 在WEB-INF目录下创建tiles文件夹,并在里面新建mainLayout.jsp(主布局)、header.jsp(头部布局)、left.jsp(左边栏布局)、right.jsp(右边栏布局)、footer.jsp(底部布局)、home.jsp(【首页】)、profession.jsp(【职业】)、about.jsp(【关于】)。
    1.4 编写tiles模板文件mainLayout.jsp。
    1.5 对比以前的三个jsp文件:task13-home.jsp、task13-partner.jsp、task13-profession.jsp。将它们的共同部分摘出来,可以发现这三个页面的头部和底部是相同的,并没有左边栏和右边栏,所以在header.jsp、footer.jsp中写上三个页面的头部和底部,在home.jsp、about.jsp、profession.jsp中写上三个页面特有的内容,left.jsp和right.jsp保持空白,有需要再写。
    1.6 在分发器dispatcher-servlet.xml中加上Tiles视图解析器,并把它的优先级设置为最高。
    1.7 创建控制器类PagesController.java。



【知识总结】
1.关于视图解析器,如果项目中同时有两个视图解析器(例如同时存在InternalResourceViewResolver和TilesViewResolver),需要通过p:order这个属性来控制级别,数字越大,级别越低。

2.如果想在maven项目中使用Tiles框架,需要把Spring版本改为3.2以上。

3.在编写Tiles配置文件tilesLayout.xml时,当要引入一个处于WEB-INF文件夹下的jsp文件时,引用路径要把WEB-INF也写上不能省略,例如,要写“/WEB-INF/tiles/mainLayout.jsp”,不能写“/tiles/mainLayout.jsp”。

4.我现在有两种方法来使用Tiles框架:
    4.1 第一种是在Tiles配置文件tilesLayout.xml中只定义一个<definition></definition>,如下所示:
         <definition name="ITtask_4_view" extends="layout">
             <put-attribute name="header" value="/WEB-INF/tiles/header.jsp" />
            <put-attribute name="left" value="/WEB-INF/tiles/left.jsp"/>
            <put-attribute name="right" value="/WEB-INF/tiles/right.jsp"/>
             <put-attribute name="item" expression="/WEB-INF/tiles/${item}.jsp" />
           <put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp"/>    
           </definition>
      其中的item一项使用EL表达式取值,在Controller类中通过model.addAttribute("item","home");来决定显示哪个具体页面。这样的话,在Controller类的方法中,返回值都一样,都是“ITtask_4_view”。
    4.2 第二种方法就是需要几个页面,就在tilesLayout.xml中定义几个<definition></definition>,不使用EL表达式了,直接在<definition></definition>里面把要调用的页面都写死,通过控制Controller类中方法的返回值,来确定展示哪个页面。
    4.3 这两个方法其实差不多,采用第一种方法在tilesLayout.xml中能少写几行代码,不过在Controller类的方法中会多写两行model.addAttribute();第二种方法恰好相反,在Controller类中简单一些。不过我感觉采用第一种方法比较好,因为采用第一种方法就相当于给“header”、“footer”、“left”、“right”这些值设定了默认值,相比而言,第二种方法会写很多重复代码。



【出现的问题(已解决)】
1.项目启动后,网页打开失败,调试,错误提示是Cannot find class [org.springframework.web.servlet.view.tiles3.TilesViewResolver],后来我在pom.xml中把Spring版本由3.1.1改为3.2.8,问题解决。


【出现的问题(未解决)】
1.任务4大部分功能均已正常实现,我见任务要求上还有一个处理时间的任务,我看我手头上的几个页面没有要用到时间的,明天我重新写一个空白页面,在空白页面里实现转换时间的要求。


【疑问】
1.在使用Tiles框架时,怎样处理各页面间的css呢?我觉得Tiles框架只是生硬地把几个页面堆积在一起,假如我要生成一个home页面,为了生成这个home页面,我用到了header.jsp、footer.jsp、home.jsp这三个jsp文件,然后我在这三个文件中都引用了一个test_1.css样式表和一个test_2.css样式表,这两个样式表里面有一些内容会重复,所以我必须保证在最后合成的home页面中,test_1.css在test_2.css的上面,以防止test_2.css中的一些样式被覆盖。
  那么如果我在header.jsp、footer.jsp、home.jsp这三个页面中都引入了这两个样式表的话,最终合成的home页面会不会有6个样式表,还是说Tiles框架会自动剔除重复的css样式表,最后合成的页面中只有两个样式表?(我自己试了半天,会出现异常)
  我还想了一下,如果我把所需要的样式表在每个组成部分页面都重复写一遍的话,这样即使Tiles框架不会自动剔除重复的css样式表也没关系,因为最终的样式表顺序并没有乱。但这样是不是有些繁琐了,违背了Tiles框架的DRY原则?


返回列表 返回列表
评论

    分享到