第八章 Struts2标签库 理论文档格式.docx
- 文档编号:16711804
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:50
- 大小:932.23KB
第八章 Struts2标签库 理论文档格式.docx
《第八章 Struts2标签库 理论文档格式.docx》由会员分享,可在线阅读,更多相关《第八章 Struts2标签库 理论文档格式.docx(50页珍藏版)》请在冰豆网上搜索。
publicclassLoginAction
{
privateStringuid;
//封装用户名
privateStringpwd;
//封装密码
publicStringexecute()throwsException
{
//获取ActionContext对象
ActionContextctx=ActionContext.getContext();
//将uid的值存储到session中
ctx.getSession().put("
this.uid);
//将uid的值存储到StackContext中
ctx.put("
return"
success"
;
}
//getter、setter代码省略…
}
并且已经正确将该Action的uid属性赋值为scott,pwd属性赋值为tiger。
则ActionContext、StackContext、ValueStack三者此时的数据存放情况如图1.8.2所示:
图1.8.2LoginAction数据存储情况
8.1.2OGNL语法基础
OGNL是Object-GraphNavigationLanguage(对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过它的简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
1.访问OGNL上下文中的数据
ActionContext是Struts2中OGNL的上下文环境,也即向ActionContext中添加的数据(实际存储在StackContext中)都可以被OGNL来访问,而ActionContext又包括request,session,ValueStack等这些对象,所以OGNL也可以访问存储在这些对象中的数据。
ValueStack(值栈)是OGNL的根,由于OGNL上下文中的根对象可以直接访问,所以通过OGNL访问ValueStack中的数据时不需要使用任何特殊的“标记”,而访问ActionConext中的其他对象则需要使用“#”标记。
在Struts2中提供了<
s:
property>
标签来访问OGNL上下文中的数据。
(1)<
propertyvalue=”uid”/>
运行该标签时,Struts2会在ValueStack中去查找名为uid项,并输出其值
(2)<
propertyvalue=”#uid”/>
运行该标签时,Struts2会在StackContext中去查找名为uid项,并输出其值
(3)<
propertyvalue=”#session.uid”/>
运行该标签时,Struts2会在StackContext中的session作用域中去查找名为uid项,并输出其值。
(4)<
propertyvalue=”#attr.uid”/>
运行该标签时,Struts2会依次在StackContext的page,request,session,application范围内查找对应的uid中的值。
2.访问JavaBean属性
假设存在employee对象作为OGNL上下文的根对象,对于下面的表达式:
propertyvalue=”name”/>
运行该标签时,Struts2会执行employee对象的getName()方法,对应的Java代码是:
employee.getName()
propertyvalue=”address.country”/>
运行该标签时,Struts2会执行employee对象的getAddress()方法和getCountry()方法。
对应的Java代码是:
employee.getAddress().getCountry()
3.执行JavaBean方法
OGNL不仅可以自动执行getter方法,还能执行JavaBean的其它方法,更重要的是,在执行方法时,还能给方法传入参数。
OGNL执行的方法或以静态方法或非静态方法。
执行静态方法的格式为:
@类的全限名@方法名(参数),为了能让OGNL执行静态方法,必须在struts.xml文件中配置常量,以开启调用静态方法功能,配置代码如下:
<
constantname="
struts.ognl.allowStaticMethodAccess"
value="
true"
/>
以下示例演示了使用OGNL执行JavaBean方法:
(1)创建一个JavaBean,命名为OgnlInfo.java,代码如下:
publicclassOgnlInfo{
//定义静态方法
publicstaticStringsayBye(Stringname)
returnname+"
再见!
"
//定义非静态方法
publicStringsayHello(Stringname)
returnname+"
你好!
}
(2)创建index.jsp页面,代码如下:
<
body>
%
//实例化ognl对象
OgnlInfoognlInfo=newOgnlInfo();
//将ognlInfo对象存入request作用域内
request.setAttribute("
ognlInfo"
ognlInfo);
%>
!
--执行ognl对象的非静态方法-->
<
propertyvalue="
#request.ognlInfo.sayHello('
jack'
)"
--执行ognl对象的静态方法-->
@com.soft.struts8l.entity.OgnlInfo@sayBye('
tom'
/body>
运行index.jsp页面,结果如图1.8.3所示:
图1.8.3OGNL执行JavaBean的方法
4.OGNL操作符号
OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用+,-,*,/,==,!
=,=等操作符之外,还能使用mod(取余),in,notin等
5.%符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。
以下示例代码用于演示%符号在OGNL中的使用方法。
Stringtitle="
提交"
pageContext.setAttribute("
title"
title);
不使用%符号,会按原样显示
submitvalue="
#attr.title"
hr>
使用%符号,会计算OGNL表达式的值
%{#attr.title}"
运行此示例,结果如图1.8.4所示:
图1.8.4OGNL%符号的用法
6.OGNL中的集合操作
(1)生成List类型集合
{e1,e2,e3...}
以上语法,直接生成一个List类型集合,该集合包含了3个元素:
e1、e2和e3。
如果需要更多元素,则多个元素之间以英文逗号隔开。
(2)生成Map类型集合
#{key1:
value1,key2:
value2,...}
以上语法,直接生成一个Map类型集合,该Map中每个key-value对象之间以英文冒号隔开;
多项之间以英文逗号隔开。
(3)使用in和notin运算符
对于集合,OGNL提供两上元素符:
in和notin,其中in判断某个元素是否在指定集合中;
notin则用于判断某个元素是否不在指定集合中。
以下代码演示了in和notin的用法:
--判断java是否在指定集合中-->
<
iftest="
'
java'
in{'
'
jsp'
html'
}"
>
在里面
<
else>
不在里面
/s:
if>
(4)获取集合的子集
OGNL允许通过某个规则取得集合的子集。
取得子集时有以下3种操作符:
?
:
取出所有符合选择逻辑的元素
^:
取出符合选择逻辑的第一个元素
$:
取出符合选择逻辑的最后一个元素
假定在session作用域中存在名为persons集合,该集合由多个Person类的实例组成,在Person类中存在一个age属性,用于描述年龄,则#session.persons.{?
#this.age>
20}表达式用于取出年龄大于20的persons类子集合;
#session.persons.{?
^this.age>
20}表达式用于取出第一个年龄大于20的Person类实例;
20}表达式用于取出最后一个年龄大于20的Person类实例。
8.2Struts2标签库
8.2.1Struts2标签库概述
Struts2提供的大部分标签,可以在各种表现层技术中使用,包括最常用的JSP页面,也可以在Velocity和FreeMarker等模板技术中使用。
struts2的标签以OGNL表达式做为基础
Struts2并末严格提供标签库的分类,并不像Struts1那样,分别提供了html、bean、logic等标签库,而是将所有标签都定义在一个标签库中。
虽然Struts2将所有的标签都定义在URL为”/struts-tags”的命名空间下,但依然可根据标签的功能对其进行简单的分类。
从大的范围分,Struts2可将所有标签分成如下3类:
(1)用户界面标签:
主要用于生成HTML元素的标签
(2)非用户界面标签:
主要用于数据访问、逻辑控制等标签
(3)Ajax标签:
用于Ajax支持的标签。
对于用户界面标签,以又可分为以下两类:
(1)表单标签:
主要用于生成HTML页面表单元素的标签
(2)非表单标签:
非表单标签主要用于生成页面上的树、Tab页等标签。
对于非用户界面标签,又可分为以下两类:
(1)流程控制标签:
主要包含用于实现分支、循环等流程控制的标签
(2)数据访问标签:
主要包含用于输出ValueStack中的值,完成国际化等功能的标签。
Struts2标签库分类如图1.8.5所示:
图1.8.5Struts2标签库分类
在使用Struts2标签之前,必须导入相应的标签库描述文件,格式如下:
%@tagliburi="
/struts-tags"
prefix="
s"
8.2.2数据访问标签
1.<
标签
标签用于输出指定的值,<
标签的属性意义见表1.8.1:
表1.8.1<
标签属性意义
属性名
意义
value
指定要输出的值。
如果没有指定该属性,则会输出ValueStack栈顶的值
escape
指定是否生成HTML代码。
为false表示会生成HTML代码,默认为true
default
表示如果需要输出的属性值为null,则显示default属性指定的值
以下示例用于演示<
标签的用法,代码如下:
Stringurl="
ahref='
index.jsp'
生成超链接<
/a>
//定义变量url
pageContext.setAttribute("
url"
url);
//将变量存储到page范围内
h2>
--不使用escapse属性,输出page范围内的uid-->
#attr.url"
hr/>
--使用escapse属性-->
escape="
false"
--使用default属性-->
#attr.uid"
default="
找不到uid对象!
/h2>
运行以上代码,结果如图1.8.6所示:
图1.8.6<
标签的用法
2.<
set>
标签用于创建一个变量,并放入某个范围中,<
标签的属性意义见表1.8.2:
表1.8.2<
id
指定创建新变量的引用ID
scope
指定新变量被存储的范围,范围包括application、session、request、page等。
如果没有指定属性,则默认存储在StackContext范围中
指定将赋给变量的值。
如果没有指定该属性,则会将ValueStack栈顶的值赋给新变量
--创建一个名为age的变量,存储到session范围内-->
setid="
age"
30"
scope="
session"
--创建一个名为person的变量,存储到StackContext范围内-->
person"
'
--使用OGNL输出age变量的值-->
age的值是:
#session.age"
br/>
--使用OGNL输出person变量的值-->
person的值是:
#person"
运行以上代码,结果如图1.8.7所示:
图1.8.7<
3.<
bean>
标签用于创建一个JavaBean实例。
创建JavaBean实例时,可以在该标签体内使用<
param../>
标签为该JavaBean实例传入属性。
标签的属性意义见表1.8.3:
表1.8.3<
指定创建JavaBean的引用ID
name
指定要实例化的JavaBean的实现类
标签的用法,开发步骤如下:
(1)创建一个JavaBean,命名为Book.java,代码如下:
publicclassBook
privateStringisbn;
//书籍编号
privateStringname;
//书籍名字
//定义getAllBooks方法,获取全部书籍
publicString[]getAllBooks()
String[]books={"
java"
"
JSP"
C#.net"
};
returnbooks;
//getter、setter方法省略…
(2)创建JSP页面,代码如下:
h3>
--实例化一个bookJavaBean对象,并存储到StackContext中-->
beanid="
book"
name="
com.soft.struts8l.entity.Book"
--为book对象的isbn属性赋值-->
paramname="
isbn"
621345"
--为book对象的name属性赋值-->
name"
HTML'
--输出book对象的值-->
book对象的属性值:
isbn:
#book.isbn"
name:
#book.name"
调用book对象的getAllBooks方法获取全部书籍列表:
c:
forEachvar="
items="
${book.allBooks}"
li>
${book}<
/li>
/c:
forEach>
/h3>
运行JSP页面,结果如图1.8.8所示:
图1.8.8<
4.<
date>
标签用于格式化输出一个日期,<
标签的属性意义见表1.8.4:
表1.8.4<
指定要格式化的日期值
format
指定格式化日期的格式
--实例化一个Date对象,得到当前日期-->
today"
java.util.Date"
今天是:
datename="
#today"
format="
yyyy年MM月dd日"
/>
运行以上代码,结果如图1.8.9所示:
图1.8.9<
8.2.3控制标签
控制标签可以完成输出流程控制,例如分支、循环等操作,也可完成对集合的合并、排序等操作。
1.条件标签
Struts2中使用<
、<
elseif>
来实现分支流程控制。
这3个标签可以组合使用,只有<
标签可以单独使用,<
和<
必须与<
标签结合使用。
3个标签结合的语法格式如下:
iftest=”表达式”>
标签体
elseiftest=”表达式”>
/elseif>
...
以下示例用于演示条件标签的用法,代码如下:
shopPrice"
2.5"
--定义商品单价-->
quantity"
15"
--定义购买数量-->
grade"
3"
--定义会员级别-->
#grade==1"
--如果一级会员,打0.9折-->
discount"
0.9"
elseifte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八章 Struts2标签库 理论 第八 Struts2 标签