struts2中form的theme属性

XuDTone 2010-04-26

转载:http://hi.baidu.com/lamp_php2007/blog/item/4d828baf551221f7fbed50cf.html

struts2中form的theme属性2010年04月20日 14:48struts2中theme属性包括xhtml,html,simple,ajax 。默认是xhtml

theme:设置struts2标签的主题,默认为xhtml。

theme=xhtml时:会默认额外生成tr,td。

theme=simple时:就生成标签所对应的html标签形式。

在默认情况下,表单元素是分布在不同行的。如下代码:

<s:formaction="login2">

<s:textfieldlabel="用户名"name="username"/>

<s:passwordlabel="密码"name="password"/>

<s:submitlabel="提交"/>

</s:form>

我们看着以上的代码跟HTML的差不了多少,但是因为struts2表单默认将表单内的每一个元素都分在单独的一行,label属性就如同我们在HTML中在<inputtype="text"/>前面的文字标签一样。如果我们不想让它自动换行,那就应该写成如下格式:

<s:formaction="login2"theme="simple">

<s:textfieldlabel="用户名"name="username"/>

<s:passwordlabel="密码"name="password"/>

<s:submitlabel="提交"/>

</s:form>

但在设置theme="simple"后,表单元素的label属性将失效,这时我们就得在表单元素前面加入想用label显示的文字。如:

<s:formaction="login2"theme="simple">

用户名:<s:textfieldlabel="用户名"name="username"/>

密码:<s:passwordlabel="密码"name="password"/>

<s:submitlabel="提交"/>

</s:form>

此时显示的为将不在是label中的值,而是显示文本框前面的文字,按钮则显示它原来的默认值:sbumit。

1.模板目录->主题目录->主题(模板文件)这是模板/主题的目录组织方式。以实际为例,打开struts2-core-2.x.x.jar可以看到里面有一个template,在template下有5个目录ajax、css_xhtml、simple、xhtml和archive,其中前四个分别是ajax、css_xhtml、simple、xhtml主题的目录,每个主题目录中有各自的模板文件,主要是ftl文件,还有css和js文件。最后一个archive是归档的主题目录,其下又有ajax、simple、xhtml、模板文件是.vm文件。由此可知Struts2大力推荐的模板语言是FreeMarker,而不是Velocity,以后要好好看看FreeMarker,只知道FreeMarkder更XML化。

2.上面看到模板目录名是template,是struts2-core-2.x.x.jar中,其实目录名是由struts.ui.templateDir常量来指定的,只是默认值是template。意味着Struts2从Web应用的template目录或CLASSPATH的template目录(包)中依次加载特定的模板文件。

3.比如我们使用一个select标签,且指定主题为xhtml,则加载模板文件的顺序为(1)Web应用/template/xhmlt/select.flt(2)CLASSPATH/template/xhtml/select.ftl。Struts2默认是用的FreeMarkder模板技术,可设置常量struts.ui.templateSuffix来改变默认的模板技术,可选值有ftl、vm、jsp。但是对于vm和jsp要自己提供完整的实现,Struts2可没帮你做这些。

4.有时候我们想要自定义主题,如你希望输入框前的标签显示红颜色,你不想要校验错误提示在输入框正上方而是右边。当然你可以修改struts2-core-2.x.x.jar中template下某个主题的模板文件,或拷一份到Web应用目录的template目录修改要定制的模板,这样做总有些不爽。Struts2还支持两种更灵活的主题定制方式。包装和继承现有主题,可以同时使用。

最简单的主题定制方式是利用主题模板的加载优先级,把自定义的模板文件放在优先级高的目录,比如放一个text.ftl在WEB-INF/classes/template/xhtml/目录下,它将覆盖掉struts2-core-2.x.x.jar里的template/xhtml/text.ftl的定义。

5.先看一个包装的例子,在xhtml下的combobox.ftl的内容如下:

<#include"/${parameters.templateDir}/${parameters.theme}/controlheader.ftl"/>

<#include"/${parameters.templateDir}/simple/combobox.ftl"/>

<#include"/${parameters.templateDir}/xhtml/controlfooter.ftl"/><#nt/>

它就是对simple/combobox.ftl的基础上包装上一个controlheader.ftl和一个controlfooter.ftl,包装的局限性是你仍然是要为每一个UI组件提供单独模板文件,即全套的。

和设计模式中的包装(装饰)模式如出一辙,如BufferedInputStream包装了InputStream,但在BufferedInputStream提供了全套的和InputStream一样的操作方法。

6.再说继承来自定义主题,如果简单改变个别UI的风格,继承就是最为高效的了。此继承与Java的继承(即extends)也是一马事。要改变或要新加的用自己定义的,其他的延用父主题的。举个例子,自定义一个名为custom的主题继承自xhtml,只改变select标签的风格,你要做的就是编辑自己的一个select.ftl放在WEB-INF/classes/template/custom下,并在此目录下放一文件theme.properties,内容是:

#指定该主题以xhtml为基础进行扩展

parent=xhml

使用可指定给UI标签,例如<s:formname="aa"theme="custom"...,效果就会是form下的select使用了在custom目录下自定义的select.ftl,其他的直接使用父主题xhtml中的模板文件。Struts2提供的ajax主题就是继承自xhtml主题的。

7.简单说一下Struts2的内建主题,包括simple、xhtml、css_xhtml和ajax。simple主题不用多说,比Struts1的html标签还弱些,只对应简单的html元素,不生成额外内容。xhtml是默认主题,是对simple主题的包装和扩展(也就是继承),该主题下有一个head.ftl用来导入javascript类库(如dojo)。xhtml在simple的基础上增加了以下特性:

1)针对HTML标签(如textfield和select标签)使用标准的两列表格布局

2)每个HTML标签有label属性,默认左边显示,可通过labelposition属性设定位置

3)自动输出后台校验错误或javascript前端校验错误

8.继续Struts2的内建主题的话题。css_xhtml主题是对xhtml的扩展,显示是加入了css样式控制特性。ajax主题是对xhtml主题的扩展,在xhtml主题的每个标签增加了ajax的支持(以Djoj和DWR为基础)。所增Ajax特性有:

1)Ajax方式的客户端校验

2)远程表单的异步提交

3)高级div标签,允许局部更新

4)高级a标签,允许动态加载并执行远端的javascript代码。

5)提供支持ajax的tabbedPanel

6)提供“富客户端”模型的pub-sub事件模型

9.先前有网友问过我,他用了Struts2的校验,但是错误输出是在输入框的上方,但希望错误信息是显示在输入框的右方,该如何做。当时我只告诉了他要修改模板文件,也只是大概告诉了他是在某个template目录下的一个ftl文件,因那时具体操作自己也不太清楚。现在知道了线索,但实际修改还是很麻烦的。

输入框 <s:textfield.../>默认是用的xhtml/text.flt模板,text.ftl包装了smple/text.ftl,错误信息可以追溯发现是在controlheader-core.ftl中定义显示的,所以你可以把xthml/text.ftl和controlheader-core.ftl拷到WEB-INF/classes/template/xhtml目录中进行修改,WEB-INF/classes/template/xhtml中的模板文件是优先于struts2-core-2.x.x.jar里的template/xhtml目录中的模板文件加载。

10. 看有些地方只笼统介绍说:所有表单元素都存在一个特殊的属性:form,这个属性引用元素所在表单,通过该属性实现表单元素与表单间的交互,例如可通过 ${parameters.form.id} 访问表单的 ID。对这句话我只是感到一头雾水,查看像 <s:textfield .../> 等标签并无 form 属性,用 <s:textfield value="${parameters.form.id}" name="aa"/> 也看不到输出所在表单的 ID。去网上找找,才知道前面那句话有出入,其实说的是在主题模板文件里的用法,打开一些主题模板文件,如 combobox.ftl 或 controlheader-core.ftl 文件,你就能看到许多的 parameters 的表示法-- parameters.required、parameters.id。想见一下 parameters 属性才是根本,它代表了表单元素的属性集,parameters 说来还有点像 this,this.id、this.form.id、this.required 等等...struts2中form的theme属性

相关推荐

sunh / 0评论 2013-06-19