您的位置:首页 > 编程语言 > Java开发

Struts2知识点小结1-Struts Tag Library

2010-05-17 14:32 363 查看
对于一个MVC框架而言,重点是实现二个部分: 控制器部分和视图部分。 Struts2框架同样如此:控制器部分由
Action(以及隐藏的系列拦截器)来提供支持,而视图部分则通过大量标签来提供支持。
Struts2标签库使用OGNL表达式作为基础, 且默认支持OGNL, JSTL, Groovy和Velcity表达式。且把所有标签都
定义在URI为 /struts-tags 命名空间下,但我们依然可以依据功能将其分为三类:
1. UI标签;
a. 表单标签;
b. 非表单标签;树、Tab页等;
2. 非UI标签;
a. 流程控制: 条件、循环;
b. 数据访问: 输出ValueStack中的值;
3. AJAX标签;

Object Graph Navigation Language, 缩写为OGNL,是类似于EL的脚本语言,

一. 控制标签
Struts2中的非UI标签包括控制标签和数据标签,其中控制标签可以完成输出流程控制,例如条件、循环等操作,
也可完成对集合的合并、排序等操作,它有如下九个:
1) if: 选择输出;
2) elseIf/elseif: 与if标签结合使用;
3) else: 与if标签结合使用
4) append: 将多个集合拼接成一个新的集合;
5) generator: 将一个字符串解析成一个集合;
6) iterator: 将集合迭代输出;
7) merge: 将多个集合拼接成一个新集合,与append拼接方式不同;
8) sort: 对集合进行排序;
9) subset: 截取集合部分元素,形成新的子集;
1. iterator标签
对集合进行迭代,包括List,Set和数组,Map.
. value: 可选,被迭代的集合,通常使用OGNL表达式指定,如无,则使用ValueStack栈顶集合;
. id: 可选,指向集合中元素;
. status: 可选,指向迭代时IteratorStatus实例,通过该实例可判断当前迭代元素的属性;每次迭代都有
一个IteratorStatus实例,该实例包含以下方法:
a. int getCount(): 返回当前迭代了几个元素
b. int getIndex(): 返回当前迭代元素的索引
c. boolean isEven(): 当前索引是否为偶数
d. boolean isFirst(): 当前迭代元素是否是第一个元素
e. boolean isLast(): 当前迭代元素是否是最后一个元素
f. boolean isOdd(): 当前索引是否为奇数
2. if标签
根据一个Boolean表达式的值,来决定是否计算,输出标签体等内容。

3. append标签
将多个集合对象拼接起来,组成一个新的集合。
其中 id 属性确定拼接生成的新集合的名字。 append可接受多个<s:param ..../>子标签,每个子标签指定一个集合,append
将<s:param..../>指定的多个集合拼接成一个集合;
4. generator标签
将指定字符串按指定分隔符分隔成多个子串,临时生成的多个子串可以使用iterator标签来迭代输出。
a. count: 指定生成集合中元素总数;
b. separator: 指定解析字符串的分隔符;
c. val: 指定被解析的字符串;
d. converter: 可选,指定一个负责将集合中每个字符串转换成对象;
e. id: 指定访问集合的名称,如指定,则集合放在pageContext属性中;
5. merage标签
功能和append类似,但是新集合中各元素顺序不同:
append为:
1) 第一个集合第一个元素;
2) 第一个集合第二个元素;
3) 第一个集合第三个元素;
4) 第二个集合第一个元素;
5) 第二个集合第二个元素;
6) 第二个集合第三个元素;
7) 第三个集合第一个元素;
8) 第三个集合第二个元素;
9) 第三个集合第三个元素;
merage为:
1) 第一个集合第一个元素;
2) 第二个集合第一个元素;
3) 第三个集合第一个元素;
4) 第一个集合第二个元素;
5) 第二个集合第二个元素;
6) 第三个集合第二个元素;
7) 第一个集合第三个元素;
8) 第二个集合第三个元素;
9) 第三个集合第三个元素;
6. subset标签
取得集合的子集:
. count: 指定子集合元素个数;
. source: 指定源集合,如不指定,则默认取得ValueStack栈顶的集合;
. start: 指定从源集合中第几个元素开始截取,默契为第一个(值为0);
. decider: 指定由开发者是否选中该元素;
7. sort标签
对于指定的集合进行排序; 必须提供自己的排序规则,即提供实现 java.util.Comparator接口的实现类;
. comparator: 指定进行排序的 Comparator 实例;
. source: 指定被排序的集合,如不指定,则针对 ValueStack栈顶的集合;

二. 数据标签
提供各种数据访问相关的功能,包含显示一个Action中属性以及生成国际化输出等功能;
1. property标签
提供一种快速、方便地方式从ValueStack或ActionContext中获取值并显示;
. value: 指定输要输出的属性值,如没有指定,则默认输出ValueStack栈顶的值;
. default: 如输出属性值为 null, 则显示 default 属性的值;
. escape: 是否escape HTML 代码, 默认值为 true; 将 < 转化为 <
2. set 标签
将一个已有的值复制给新变量,然后放到指定的范围内
. name: 必填,新变量名字
. scope: 可选属性,指定新变量放置的范围,可以接受 application, session, request, page 或 action 五个值,
默认为 Action中;
. value: 可选,赋给变量的值,没指定,则为ValueStack栈顶的值;
. id: 可选,该元素的引用ID

3. push 标签
将某个值放到valueStack中,从而更加方便访问;
4. bean 标签
创建JavaBean实例;
. name: 必须,要实例化的JavaBean的完整类名;
. var: 可选,可通过该属性值在标签外访问已实例化的JavaBean;
5. Date 标签

格式化输出日期以及计算指定日期和当前时刻间的时差;
. format: 可选,指定日期显示格式;
. nice: 可选, 是否输出指定日期和当前时刻间的时差,默认值为 false;
. name: 必填,日期值;
. id: 可选,引用该元素的 id 值;
如果既指定nice="true", 又指定 format 属性,则会输出指定日期和当前时刻间的时差,即format属性失效;
如没有指定format属性,也没指定nice="true", 则系统会到资源文件中寻找 key 为 struts.date.format的消息作为格式,否
则采用默认的 DateFormat.MEDIUM格式输出。
6. action 标签
直接在JSP页面中直接调用Action
. id: 该Action的引用ID;
. name: 必须:调用哪个Action;
. namespace: 可选,调用Action所属的namespace;
. executeResult: 可选,是否将Action处理结果页面包含到本页面,默认值为false;
. ignoreContextParams: 可选,该页面中请求参数是否需传入调用的Action, 默认值为 false, 传入。
7. debug 标签
用于辅助调试,它在页面上生成一个超级链接,通过该链接可以查看到ValueStack和Stack Context中所有的值信息;
8. include 标签
将一个JSP或servlet包含到本页面中:
. value: 必填, 指定包含的资源;
. id: 可选,该标签的ID引用;
9. url 标签

生成一个URL 地址,可以通过为url标签指定 param 子元素,从而向指定URL发送请求参数。
. includeParams: 可选,是否包含请求参数,值为 none, get或者all.
. scheme: 设置schema属性;
. value: 可选,指定生成的URL值,如果无value有action就使用action指定Action作为URL地址;
如果均提供,则使用value指定URL值;如均不提供,则使用当前页面作为URL地址;
. action: 可选,指定action;
. namespace: 可选,指定命名空间;
. method: 可选,指定使用Action的方法;
. encode: 可选,是否需encode请求参数;
. includeContext: 是否需将当前上下文包含在URL地址中;
. anchor: 可选,指定URL锚点;
. id: 指定该URL元素的引用ID
10. i18n和text 标签
i18n用于显示指定指定语言资源文件;
. name: 资源文件名称;

text用于获取指定资源文件中指定key对应的值;
. name: 资源文件 key 值;
. id: 引用的标识;

三. Form标签
1. checkbox 标签

<s:set name="aBoolean" value="false"/><br>
<s:checkbox label="checkbox test" name="checkboxField1" value="#aBoolean" fieldValue="true"/>
<s:set name="aBoolean" value="true"/><br>
<s:checkbox label="checkbox test" name="checkboxField1" value="#aBoolean" fieldValue="true"/>
显示结果:
<input type="checkbox" name="checkboxField1" value="true" id="checkboxField1"/>
<input type="checkbox" name="checkboxField1" value="true" checked="checked" id="checkboxField1"/>
2. checkboxlist 标签
一次性创建多个复选框,它根据list属性指定的集合来生成多个复选框;
. listKey: 指定集合元素中的某个属性作为复选框的 value;
. listValue: 指定集合元素中的某个属性作为复选框的 标签;
3. combobox 标签
生成一个单行文本框和下拉列表框的组合,但两个表单元素只对应一个请求参数,只有单行文本框里的值才包含
请求参数,而下拉列表框则只是用于辅助输入,没有name属性。
4. doubleselect 标签
生成一个级联列表框, 当选择第一个下拉列表框时,第二个下拉列表框的内容会随之改变。
. list: 第一个下拉列表框的集合;
. listKey: 指定集合元素中某个属性作为第一个下拉列表框的value;
. listValue: 指定集合元素中某个属性作为第一个下拉列表框的标签;
. doubleList: 第二个下拉列表框的集合;
. doublelistKey: 指定集合元素中某个属性作为第二个下拉列表框的value;
. doublelistValue: 指定集合元素中某个属性作为第二个下拉列表框的标签;
. doublename: 第二个下拉列表框的 name 属性;
doubleselect标签一定得位于form中,且form须指定action属性

四. 数据传输以及类型转换

1. 为什么要数据传输以及数据转换?
所有的MVC框架,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件。但所有的请求参数都是,
也只能是字符串数据类型,但Java是强数据类型语言,因此MVC框架必须将这些字符串请求参数转换成相应的数据
类型,这个工作是所有MVC框架均应提供的功能。
不仅于此,在请求处理结束,在格式化显示请求处理结果的时侯,我们也需将封装了结果数据的JavaBean属性值
转换为HTML页面上显示的内容。
数据的传输和转换贯穿于请求处理的整个生命周期。
Struts2通过内置的拦截器提供了非常强大的类型转换机制,也提供了很好的扩展性,开发者可以非常简单地开发出
自己的类型转换器,完成字符串和自定义复合类型的转换(例如将字符串到Student实例间转换). 如果类型转换中
出现异常,开发者也无须关心异常处理逻辑。Struts2的conversionError拦截器提供了非常强大的表现层数据处理
机制, 并且在页面上显示异常信息。总之, Struts2的类型转换器提供了非常强大的表现层处理机制,方便了开发者
的使用和操作。
2. OGNL和Struts2
Struts2的类型转换是基于OGNL表达式的,只要我们将HTML输入项命名为合法的OGNL表达式,就可以充分利用Struts2
的类型转换机制。
3. 内置的类型转换器
Struts2已经内建了字符串类型和如下类型间的类型转换器.
. Date: 日期格式使用用户请求所在Locale的SHORT格式;
. 数组:默认情况下,元素是字符串;
. 集合:在默认情况下,集合元素类型是String;
4. List中放置自定义的类型
1) 提交页面
<s:textfield name="users[0].name" label="User Name"/>
<s:textfield name="users[1].name" label="User Name"/>
<s:textfield name="users[2].name" label="User Name"/>
<s:textfield name="users[0].age" label="User Age"/>
<s:textfield name="users[1].age" label="User Age"/>
<s:textfield name="users[2].age" label="User Age"/>
2) Action
public class ListConversion {
private List<Student> users;
...;
}
其国com.briup.Student类为:
public class Student {
private String name;
private int age;
}

如果Action中List不使用范型,必须在Action同目录下新增一文件, 使名规则为:
Action类名-conversion.properties, 例如,可命名为: ListConversion-conversion.properties
内容为:
Element_list类型属性名称=list中所包含对象完整类名
例如,Element_users=com.briup.Student
3) 显示页面
User Name Number 3: <s:property value="users[2].name"/><br>
User Age Number 2: <s:property value="users[1].age"/><br>

5. Map中放置自定义的类型
1) 提交页面
<s:textfield name="students['one'].name" label="Name"/>
<s:textfield name="students['two'].name" label="Name"/>
<s:textfield name="students['three'].name" label="Name"/>
<s:textfield name="students['one'].age" label="Age"/>
<s:textfield name="students['two'].age" label="Age"/>
<s:textfield name="students['three'].age" label="Age"/>
2) Action
public class MapConversion {
private Map<Student> students;
...;
}
其国com.briup.Student类为:
public class Student {
private String name;
private int age;
}

如果Action中Map不使用范型,必须在Action同目录下新增一文件, 使名规则为:
Action类名-conversion.properties, 例如,可命名为: MapConversion-conversion.properties
内容为:
Element_map类型属性名称=map中value对象完整类名
Key_map类型属性名称=map中key对象完整类名
例如,Element_students=com.briup.Student
Key_students=java.lang.String
3) 显示页面
Age Number One: <s:property value="students['one'].age"/><br>
Name Number Two: <s:property value="students['two'].name"/><br>

6. 自定义类型转换器:

注:JSP页面控件名和Action中属性同名
1) 转换器实现类实现接口 org.apache.struts2.util.StrutsTypeConverter,实现二个方法:
//将请求字符转换成特定对象
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("----------From String-------------");
for(Object key: context.keySet()) {
System.out.printf("Key: %s/tValue: %s%n",
key,
context.get(key));
}
System.out.println("toClass: "+toClass);

String userString = values[0];
Circle newCircle = parseCircle(userString);
return newCircle;
}
//将对象转换成字符串输出
public String convertToString(Map context, Object o) {
System.out.println("----------From String-------------");
for(Object key: context.keySet()) {
System.out.printf("Key: %s/tValue: %s%n",
key,
context.get(key));
}
Circle circle = (Circle) o;
String userString = "toString: C:r" + circle.getRadius();
return userString;
}
2) 设置配置文件:
局部转换器: 在Action所在目录下配置文件:
Action类名-conversion.properties , 例如 CircleAction-conversion.properties,
内容为:
对象属性名称=转换器的完整类名 例如:circle=com.briup.CircleConverter

全局转换器: 在源文件根目录下配置文件:
xwork-conversion.properties,
内容为:
对象完整类名称=转换器的完整类名 例如:com.briup.Circle=com.briup.CircleConverter
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: