struts2的视图扩展是对xwork框架扩展的最复杂部分,而其中的模板抽象部分占据了大部分内容,今天我想在这里探讨一下模板最终路径的确定问题.在没有讨论这个问题之前先将struts2的视图结构稍作分析.
struts2的视图基础结构实际还是xwork中进行规范的,这个规范就是Result,在struts2中在视图进行扩充时实际就是给出多种形式的Result实现.例如dispatcher,freemarker,redirect,stream,plainText,json等等,并且这种扩充是无限的,作为一个Result实现它们在结构上是具有非常重要的地位,但并不代表这种实现就很复杂,它们的复杂度与它们的实现紧密相关.有得实现很简单,而有得并不是很简单.但在这些Result实现中有一类比较特别的实现主要以dispatcher,freemarker,velocity为代表它们有一个特点就是可以在所谓的"页面"上使用UI组件对象,关于UI组件的问题可以参考我写的另篇文章http://blog.csdn.net/zhongxiucheng/article/details/6774432,关于UI组件是struts2中比较复杂的部分,
这里有一个很重要的问题是不要将Result的dispatcher,freemarker,velocity实现与组件的dispatcher,freemarker,velocity实现混淆,jsp,freemarker,velocity它们只是三种相似的技术,只是它们可以同时用于实现Result与UI component两种抽象结构,这里两种结构虽然不相同,但是它们的联系是非常紧密的,UI组件是建立在Result实现基础之上的,但不要误认为在Result的dispatcher实现就只能使用jsp技术的UI组件,而Result的freemarker实现就只能使用freemarker技术的UI组件.理论上讲Result的在dispatcher,freemarker,velocity三种技术中的任何一种实现,都可以使用三种技术中任何一种UI组件实现.
谈到UI组件,就涉及模板,以及模板路径的问题.这里的模板路径与Result配置中的转发路径是不同的,转发路径就是普通的相对或绝对路径,而模板的路径主要由三个参量来决定:templateDir(模板目录),theme(主题),template(模板名称)而这三个参量又分别有默认参量:defaultTemplateDir,defaultUITheme,defaultTemplate其中defaultTemplateDir默认值是template;而defaultUITheme的默认值为xhtml;defaultTemplate分别是不同的UI组件中定义的比如TextField组件的defaultTemplate值为text.对于,其中从这六个参量就可以看出模板路径的配置相对宽松,可以进行灵活的配置,下面是关于模板参量相关的优先级的说明:
设置模板路径
一般在struts2中的struts.properties 文件中的struts.ui.templateDir属性配置模板路径,默认为template。
模板加载顺序
首先搜索web路径下面的的/template/主题名称/template.ftl
然后再找classpath下面的/template/主题名称/template.ftl
然后再使用struts2包中的主题
设置主题名称
struts.properties 文件
struts.ui.theme设置主题名称 默认为xhtml.
也可以通过struts.xml文件配置以上两个属性。通过constant属性。
上面两个参数配置的实际就是defaultTemplateDir与defaultUITheme的值,这两个参数最好不覆盖,如果要覆盖最好使用templateDir(模板目录),theme(主题),这两个参数
设置模板引擎
通过struts.ui.templateSuffix属性设置。
模板引擎一般为;
ftl:基于FreeMarker的模板引擎