魔鬼:Struts2标签

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 23:50:04

Struts2标签介绍


Struts2的表单标签

所有的表单标签可以分为两种:form标签本身和单个表单元素的标签。Struts2的表单元素标签都包含了非常多的属性。但有很多属性完全是通用的。

表单标签的通用属性

所有表单标签处理类都继承了UIBean类,UIBean包含了一些通用属性,这些通用属性分成3种:

1,模板相关属性;2,javascript相关属性;3,通用属性。

除了这些属性之外,所有的表单元素标签都存在一个特殊的属性:form,这个属性引用表单元素所在的表单,通过该form属性,可以实现表单元素和表单之间的交互。例如,我们可以通过${parameters.form.id}来取得表单元素所在表单的ID。表单标签的通用属性有以下几类:

1,模板相关的通用属性:可以指定该表单标签所用的模板和主题。

2,javascript相关的通用属性:指定在鼠标在该标签上操作时的javascript函数。

3,设置表单元素的提示:当鼠标在这引动元素上时,系统将出现提示。Struts2将这种特性称为Tooltip。

4,设置表单元素的CSS样式。

表单标签的name和value属性

name属性会映射到Action中的属性名称,value属性则代表此属性的值。例子如下:



实际上Struts2已经自动处理了属性内容的赋值工作,因此我们只需要使用第一种方式就可以了。

checkboxlist标签

checkboxlist标签可以一次创建多个复选框,用于一次生成多个HTML标签中的,它根据list属性指定的集合来生成多个复选框。因此使用该标签要指定一个list属性。其它都是通过属性,但是有两个常用属性:

1,listKey:该属性指定集合元素中的某个属性作为复选框的key

2,listValue:该属性指定集合元素中的某个属性作为复选框的value

下面是一个JSP页面的例子:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:checkboxlist生成多个复选框



使用s:checkboxlist生成多个复选框




list="{'Spring2.0' , 'J2EE' , 'Ajax'}"/>

list="#{'Spring2.0':'2006年10月' , 'J2EE':'2007月4月' , 'Ajax':'2007年6月'}"
listKey="key"
listValue="value"/>


list="#bs.books"
listKey="name"
listValue="author"/>



JavaBean和JavaBean的访问类代码如下:

package lee;
public class Book
{
private String name;
private String author;

public Book()
{
}
public Book(String name , String author)
{
   this.name = name;
   this.author = author;

}

public void setName(String name)
{
   this.name = name;
}
public String getName()
{
   return this.name;
}

public void setAuthor(String author)
{
   this.author = author;
}
public String getAuthor()
{
   return this.author;
}

}

package lee;
public class BookService
{
public Book[] getBooks()
{
   return new Book[]
   {
    new Book("Spring2.0","李"),
    new Book("J2EE","李"),
    new Book("Ajax","李")
   };
}
}

combobox标签

combobox标签生成一个单行文本框和下拉列表框的结合,但两个表单元素只对应一个请求参数,只有单行文本框里的值才包含请求参数,而下拉列表框则只是用于辅助输入,并没有name属性,也就不会产生请求参数。使用该标签时,需要指定一个list属性,该list属性指定的集合将用于生成列表框。例子如下:


<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:combobox生成下拉输入框



使用s:combobox生成下拉输入框



list="{'Spring2.0' , 'J2EE' , 'Ajax'}"
size="20" maxlength="20" name="book"/>



通过访问上面的JSP页面,我们可以看到上面的文本框,用户可以自行输入,可也以选择下面的checkbox中的内容来进行输入。需要注意的是,此时的下拉列表仅仅是用于辅助输入的,并没有任何实际意义,因此不能指定它的listKey和listValue属性。

datetimepicker标签

datetimepicker标签生成一个日期,时间下拉选择框,当我们使用该日期,时间选择框选择某个日期,时间时,系统会自动将选中的日期,时间输入指定的文本框。系统将指定日期,时间输入指定文本框时,必须转换成日期,时间字符串,为了设置该字符串的格式,必须使用日期,时间的格式符。datetimepicker使用例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:datetimepicker生成日期选择框



使用使用s:datetimepicker生成日期选择框



日期选择部件,指定toggleType属性,且指定value="today"

   

日期选择部件,指定了format属性

   

日期选择部件,指定了weekStartsOn属性

   

时间选择部件





doubleselect标签

doubleselect标签会生成一个级联列表框(两个下拉列表框),当选择第一个下拉列表框时,第二个下拉列表框中的内容会随之改变。使用例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:doubleselect生成级联下拉列表框



使用s:doubleselect生成级联下拉列表框



                label="请选择您喜欢的图书"
            name="author" list="{'李', 'David'}"
            doubleList="top == '李' ? {'Spring2.0', 'J2EE' , 'Ajax'} : {'JavaScript: The Definitive Guide'}"
            doubleName="book"/>



默认情况下,第一个下拉列表框只支持两项,如果超过两项则不能这样处理。

我们可以先定义一个Map对象,该Map对象的value都是集合,这样就能以Map对象的多个key创建一个下拉列表框的列表项,而每个key对应的集合则用于创建第二个下拉列表框的列表项。例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:doubleselect生成级联下拉列表框



使用s:doubleselect生成级联下拉列表框


value="#{'李': {'Spring2.0', 'J2EE','Ajax'},
'David': {'JavaScript: The Definitive Guide'},
'Johnson': {'Expert One-on-One J2EE Design and Development'}}" />

                label="请选择您喜欢的图书"
    size="3"
            name="author" list="#bs.keySet()"
            doubleList="#bs[top]"
    doubleSize="3"
            doubleName="book"/>



从访问看到的效果来看,结果并不理想。还可以直接用javascript代码来实现以上效果,这里就不给出代码了。自己去思考一下。

head标签

head标签主要用于成生HTML主要页面的HEAD部分。国为有些主题需要包含特定的CSS和javascript代码,而该标签则用于生成对这此CSS和javaScript代码的引用。

例如,如果需要在页面中使用ajax组件,则使用一个带theme="ajax"属性的head标签,就可以将标准Ajax的头信息包含在页面中。

使用Ajax主题时,可以通过设置head标签的debug参数为true,从而打开调试标志。

一般使用Struts2的UI标签,javascript客户端校验等需要javascript库和CSS支持功能时,都应该先使用head标签。这个标签没有其它特别的用法,前面也已经使用过了。不再写例子。

optiontransferselect标签

optiontransferselect标签会创建两个选项用来转移下拉列表项,该标签会生成两个标签的请求参数都会被提交。例子代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:optiontransferselect来生成可移动列表项的下拉列表框



使用s:optiontransferselect来生成可移动列表项的下拉列表框




label="请选择你喜欢的图书"
name="cnbook"
leftTitle="中文图书:"
rightTitle="外文图书"
list="{'Spring2.0','J2EE','Ajax'}"
multiple="true"
addToLeftLabel="向左移动"
selectAllLabel="全部选择"
addAllToRightLabel="全部右移"
headerKey="cnKey"
headerValue="--- 选择中文图书 ---"
emptyOption="true"
doubleList="{'Expert One-on-One J2EE Design and Development', 'JavaScript: The Definitive Guide'}"
doubleName="enBook"
doubleHeaderKey="enKey"
doubleHeaderValue="--- 选择外文图书 ---"
doubleEmptyOption="true"
doubleMultiple="true"
/>



select标签

select标签用于生成一个下拉列表框,通过为该元素指定list属性,系统会使用list属性指定的集合来生成下拉列表框的选项。这个list属性指定的集合,即可以是普通集合,也可以是Map对象,还可以是集合中的对象的实例。例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:select生成下拉选择框



使用s:select生成下拉选择框




list="{'Spring2.0' , 'J2EE' , 'JavaScript: The Definitive Guide'}"/>

list="#{'Spring2.0':'2006年10月' , 'J2EE':'2007月4月' , 'Ajax':'2007年6月'}"
listKey="key"
listValue="value"/>


list="#bs.books"
listKey="author"
listValue="name"/>


radio标签

radio标签的用法与checkboxlist的用法几乎完全相同,一样可以指定label, list, listKey, listValue等属性。例子代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:radio生成多个单选框



使用s:radio生成多个单选框




list="{'Spring2.0' , 'Spring In Action' , 'JavaScript: The Definitive Guide'}"/>

list="#{'Spring2.0':'2006年10月' , 'J2EE':'2007月4月' , 'Ajax':'2007年6月'}"
listKey="key"
listValue="value"/>


list="#bs.books"
listKey="author"
listValue="name"/>


optgroup标签

optgroup标签用于生成一个下拉列表框的选项组,因此,该标签必须放在标签中使用,一个下拉列表框中可以包含多个选项组,因此可以在一个标签中使用多个标签。例子代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:optgroup生成下拉选择框的选项组



使用s:optgroup生成下拉选择框的选项组




           name="book"
           list="#{'Spring2.0':'李刚','J2EE':'李','Ajax宝典':'李'}"
     listKey="value"
     listValue="key">
              list="#{'Expert One-on-One J2EE Design and Development':'Johnson'}"
     listKey="value"
     listValue="key"/>
              list="#{'JavaScript: The Definitive Guide':'David'}"
     listKey="value"
     listValue="key"/>




通过浏览以上页面,我们可以看到:直接通过select标签的list属性生成的选项,是单独的选项,但通过optgroup标签的list属性生成的选项,则形成一个选项组,对于选项组的组名,是无法选择的。

token标签

token标签是用于防止多次提交的标签。避免了刷新页面时多次提交,如果需要该标签起作用,则应该在Struts2的配置文件中启用TokenInterceptor拦截器或TokenSessionStoreInterceptor拦截器。

token标签的实现原理是在表单中拉架一个隐藏域,每次加载该页面时,该隐藏域的值都不相同。而TokenInterceptor拦截器则拦截所有用户请求,如果两次请求时该隐藏域的值相同,则阻止表单提交。

使用该标签很简单,如下代码:

使用s:token防止重复提交




从访问后产生的HTML页面的源代码可以看到如下HTML代码:


updownselect标签

updownselect标签的用法非常类似于select标签的用法,区别是该标签生成的列表框可以支持选项的上下移动。例子代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>



使用s:updownselect生成可上下移动选项的下拉选择框



使用s:updownselect生成可上下移动选项的下拉选择框




moveUpLabel="向上移动"
list="{'Spring2.0' , 'J2EE' , 'JavaScript: The Definitive Guide'}"/>

moveDownLabel="向下移动"
list="#{'Spring2.0':'2006年10月' , 'J2EE':'2007月4月' , 'Ajax':'2007年6月'}"
listKey="key"
emptyOption="true"
listValue="value"/>


selectAllLabel="全部选择" multiple="true"
list="#bs.books"
listKey="author"
listValue="name"/>


Struts2的非表单UI标签

非表单标签主要用于在页面中生成一引动非表单的可视化元素,例如Tab页面,输出HTML页面的树形结构等,当然,非表单标签也包含在页面显示Action里封装的信息。非表单标签主要有如下几个:

1,a:生成一个超链接

2,actionerror:如果Action实例的getActionErrors()方法返回不为null,则该标签负责输出该方法返回的系列错误。

3,actionmessage:如果Action实例的getActionMessages()方法返回不为null,则该标签负责输出该方法返回的系列消息。

4,component:使用此标签可以生成一个自定义组件。

5,div:此标签负责生成一个div片段

6,fielderror:如果Action实例存在表单域的类型转换错误,校验错误,该标签则负责输出这些错误提示。

7,tabbedPanel:生成HTML页面的Tab页。

8,tree:生成一个树形结构。

9,treenode:生成树形结构的节点。

actionError和actionMessage标签

这两个标签负责输出错误或提示信息到客户端,例子如下:

Action代码如下:

package lee;

import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport
{
@Override
public String execute()
{
   addActionError("第一条错误消息!");
   addActionError("第二条错误消息!");
   addActionMessage("第一条普通消息!");
   addActionMessage("第二条普通消息!");
   return SUCCESS;
}
}

JSP页面代码如下:

<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>







component标签

conponent标签用于使用自定义标签,因为使用自定义组件还是基于主题,模板管理的,因此在使用component标签,常常需要指定如下3个属性:

theme:自定义组件所使用的主题,默认使用xhtml主题。

templateDir:指定自定义组件的主题目录,默认使用系统的主题目录,即template目录。

template:指定自定义组件所使用的模板。

此外,还可以component标签中使用param标签来注入参数的值。例子如下:

<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>


使用s:component标签


使用s:component标签


使用自定义主题,自定义主题目录

从Web应用根路径下加载模板,使用ftl模板。
        theme="customTheme"
        templateDir="customTemplateDir"
        template="ftlCustomTemplate">



   
使用自定义主题,自定义主题目录

从Web应用根路径下加载模板,使用JSP模板。    
        theme="customTheme"
        templateDir="customTemplateDir"
        template="jspCustomTemplate.jsp">

     


使用默认主题(xhtml),默认主题目录(template)

从Web应用中加载模板,使用JSP模板。   





使用自定义主题,自定义主题目录

从/WEB-INF/classes路径下加载模板,使用ftl模板。   
theme="myTheme"
templateDir="myTemplateDir"
template="myAnotherTemplate">



上面使用了FreeMarker和JSP模板,FreeMarker模板的ftlCustomTemplate.ftl代码如下:


FreeMarker自定义模板

请选择您喜欢的图书

<@s.select list="parameters.list"/>

JSP模板jspCustomTemplate.jsp的代码如下:

<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags" %>


JSP自定义模板

请选择您喜欢的图书


tree和treenode标签

tree和treenode标签可以在页面生成一个树形结构,其中tree生成一个树形结构,treenode生成一个树节点。例子如下:

<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>


使用s:tree和s:treenode标签生成静态树



使用s:tree和s:treenode标签生成静态树


showRootGrid="true" showGrid="true" treeSelectedTopic="treeSelected">