终于开始第三章啦,O(∩_∩)O哈哈~,今天这一章主要讲Struts 2的标签库,以理论居多,权当下饭啦。
本章总结
1 . OGNL的Context对象分类:
2 . Struts2 的标签库大致分类和作用:
其实这章的大部分内容当API看就行,不用特别较真,就当饭后甜点吧,哈哈,加油↖(^ω^)↗。
第一部分 Struts 2的OGNL
3.1.1 OGNL表达式基础
OGNL是Object Graphic Navigation Language(对象导航语言)的缩写,是一个开源项目一种强大的EL(Expression Language 表达式语言)。可以通过简单的表达式来访问Java对象的属性,也是Struts2框架的特点之一。
(1)OGNL根对象。
标准的OGNL会设定一个根对象(root对象)。假设使用标准OGNL表达式来求值(不是Struts 2 OGNL),如果OGNL上下文有两个对象:foo对象和bar对象,同时foo对象被设置为根对象(root),访问根对象直接对象.属性,非根对象则需要加上命名空间,下面的OGNL表达式求值:
(2)根对象:值栈。
在Struts2框架中,值栈(Value Stack)就是OGNL的根对象。假设值栈中存在两个对象实例:Man和Animal,这两个对象实例都有一个name属性,Animal有一个species属性,Man有一个salary属性。假设Animal在值栈的顶部,Man在Animal后面,如图所示:
最后一行代码中,返回的是animal.getName()返回值,即返回了Animal的name属性,因为Animal是值栈的顶部元素,OGNL将从顶部元素搜索,所以会返回Animal的name属性值。如果要获得Man的name值,则需要如下代码:
(3)值栈中使用索引。
Struts 2允许在值栈中使用索引,实例代码如下:
由于值栈是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,则可以通过如下代码访问值栈中的属性:
(4)访问其他非根对象。
如果访问其他Context中的对象,由于不是根对象,在访问时,需要加#前缀。如下图的对象:
session对象:用来访问HttpSession,例如,#session.userName或者#session["userName"],相当于调用session.getAttribute("userName")。
其他的application、parameters、request等都是如此。
attr对象:包含前面4种作用域的所有属性。例如,#attr.userName。
3.1.2 OGNL的集合操作
如果需要一个集合元素(例如List对象或者Map对象),可以使用OGNL中与集合相关的表达式。可以使用如下代码直接生成一个List对象:
该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1,e2和e3。如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。下面的代码可以直接生成一个Map对象:
Map类型的集合对象,使用key-value格式定义,每个key-value元素使用冒号表示,多个元素之间使用逗号隔开。
对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中,代码如下所示:
除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。
? :获得所有符合逻辑的元素。
^ :获得符合逻辑的第一个元素。
$ :获得符合逻辑的最后一个元素。
例如,下面的代码:
第一部分 Struts 2的标签库
Struts 2的标签库根据用途不同可以分为如下5类:
3.1.1 数据标签
数据标签主要包括以下几个:
1.<s:action>标签
利用Struts 2的action标签,可以直接在页面发出该请求,并在发送请求的页面显示“success.jsp”的内容,页面并没有跳转到“success.jsp”。调用action标签页面action.jsp的代码如下:
部署运行,结果如图所示:
2.<s:property>标签
property标签的作用就是输出value属性指定的值。如果没有指定的value属性,则默认输出值栈栈顶的值。
3.<s: param>标签
param标签主要用于为其他标签提供参数,例如,include标签、bean标签。
4.<s:bean>标签
创建JavaBean实例时,可以在该标签内使用param标签为该JavaBean实例传入属性,如果需要使用param标签为该JavaBean实例传入属性值,则应该为该JavaBean类提供对应的setter方法,如果还希望访问该属性值,还必须为该属性提供getter方法。其name属性用来指定要实例化的JavaBean的实现类。
5.<s:date>标签
<%
//定义一个时间为2022年2月4号20点54分
Date bir=new Date(122,1,4,20,54,00);
request.setAttribute("bir",bir);
%>
指定format格式为yyyy-MM-dd,且nice=false结果:
<s:date name="#request.bir" format="yyyy-MM-dd" nice="false"/><br>
指定format格式为yyyy-MM-dd,且nice=true结果:
<s:date name="#request.bir" format="yyyy-MM-dd" nice="true"/><br>
未指定format,且nice=false结果:
<s:date name="#request.bir" nice="false"/><br>
未指定format格式,且nice=true结果:
<s:date name="#request.bir" nice="true"/><br>
运行该页面,结果如图所示:
6.<s:debug>标签
7.< s:include>标签
就是导入其他的JSP页面,可以携带值。
8.<s:set>标签
set标签用于将某个值放入指定的范围内,该标签包含以下3个参数。
3.1.2 控制标签
控制标签主要用于完成流程的控制,以及对值栈的相关操作,有以下几个:
1.<s:if>/<s:elseif>/<s:else>标签
这3个标签都用于分支控制,它们都是用于根据一个boolean表达式(就是test=)的值,来决定是否计算、输出标签体的内容。这3个标签可以组合使用,只有if标签可以单独使用,而elseif和else标签必须和if标签结合使用。其中,if标签可以和多个elseif标签结合使用,但只能和一个else标签使用。其用法格式如下:
2.<s:iterator>标签
iterator标签主要用于对集合进行迭代,这里的集合包含List、Set,也可以对Map类型的对象进行迭代输出。如果指定该属性,其实例包含如下几个方法:
3.<s:append>标签
append标签用于将多个集合对象拼接起来,组成一个新的集合。在使用append标签时,可以通过在标签体中加入param标签来指定想要进行拼接的集合。下面是实例代码:
运行结果如图所示,可以发现两个集合被拼接到了一起(后面一个集合紧接在前面一个集合后面):
4.<s:merge>标签
merge标签的作用和append标签相同,都是用来将几个集合拼接到一起,组成一个新的集合,但二者的拼接方式不同,可以把下面的代码片段:
可以发现,该标签的拼接方式是依次取各集合的第一个元素,然后再依次取各集合的第二个元素,依次类推,从而拼接而成。它们拼接方式的区别如图3.所示:
5.<s:generator>标签
generator标签用于将一个字符串按照指定的分隔符分割成多个子字符串,并将这些子字符串放入一个集合中。
运行后的界面如图所示:
6.<s: sort >标签
sort标签用于对指定的集合元素进行排序,排序时必须提供自己的排序规则。首先编写规则实现类:
然后编写页面文件“sort.jsp”:
运行该页面,得到如图界面的输出:
7.<s: subset>标签
在新集合生成时所有元素都被放到值栈的栈顶,当subset标签结束时这些元素被弹出值栈。
3.1.2 表单标签
1.与HTML功能相同的标签:
虽然这些标签与HTML标签功能相同,但实际上它们有一些HTML标签没有的属性,下面列举Struts 2标签的一些通用属性:
2.<s:checkboxlist>标签
checkboxlist标签用来生成多个复选框。
3 . <s:combobox>标签:下拉框
4.<s:doubleselect>标签:该标签一般应用在选择省、城市的表单中,省下拉列表为父列表,城市下拉列表为子列表。
在应用该标签时,必须在具体的form下,并且该form要指定具体的action,而在struts.xml配置文件中也必须有该action的配置。例如,该例中要配置:
运行后的界面如图所示:
5.<s:updownselect>标签:用来生成一个列表框,列表框中选项可以手动进行排序。
6.<s:optiontransferselect>标签:标签用于生成两个列表选择框,并且生成一系列的按钮用于控制各选项在两个下拉列表框之间的移动、升降等。当提交表单时,两个列表选择框对应的请求参数都会被提交。
7.<s:optgroup>标签:用于生成一个下拉列表框的选项组,通常和select标签组合使用,在一个select标签中可以包含多个optgroup生成的选项组。
8.<s:token>标签:用来解决表单多次提交的问题,使用该标签不会在页面生成任何表单元素。由于包含token标签的页面每次被请求都会有一个struts.token的值被提交,系统就可以通过对比这个值来判断是否重复提交。
3.1.2 非表单标签
1.<s:actionerror>、<s:actionmessage>、<s:fielderror>标签:从名字就可以看出来,主要用于输出错误信息,要先编写Action类哦,然后用JSP页面输出,直接看程序吧:
运行程序,在浏览器地址栏输入“http://localhost:8080/Struts2Tag/nonform.action”后按回车,就会出现如图所示的界面:
2.<s:component>标签:用来创建自定义视图组件,该标签不经常用到。
本章实例代码GitEE地址:
https://gitee.com/jahero/bookManage/blob/master/Struts2Tag.tar.gz