1.OGNL
在MVC设计模式里,视图负责显示模型和其他对象。为了从JSP页面访问这些对象,需要使用Struts从WebWork继承来的OGNL(Object-Graph Navigation Language,对象-图形导航语言)。OGNL可以完成:
把GUI元素(文本字段,选择框)绑定到模型对象,以及把数据值从一种类型转换为另一种类型。
把通用标签与模型对象绑定在一起。
即时创建各种列表和映射关系与GUI对象配合使用;
调用各种方法,调用任何方法,不限于那些用来对属性进行读取和设置方法。
1.1 Value Stack栈
对于每一个动作调用,Struts在执行相应的动作方法之前会先创建一个名为Value Stack的对象。
Value Stack栈内部有两个逻辑组成部分,它们分别叫做Object Stack和Context Map,Struts将把动作和相关对象压入Object Stack,把各种各样的映射关系压入ContextMap.
Struts会把下面这些映射关系压入Context Map
parameters:这个Map包含当前请求的请求参数
request:这个Map包含当前请求的所有请求级属性。
session:这个Map包含当前请求的会话级属性
application:这个Map包含当前应用程序的ServletContext属性。
attr:这个Map用来按照这个顺序来检索某个属性:request、session、application。
访问Context Map时,在OGNL表达式加上一个前缀字符“#”。如果没有前缀字符“#”,搜索将在Object Stack里进行。
请求参数总是返回一个String类型的数组,而不是一个String类型的对象,因此,如果想知道请求参数的个数,就必须使用#parameters.count[0].
1.2读取Object Stack里的对象属性
object.propertyName
object[‘propertyName’]
object["propertyName"]
Object Stack里的对象可以通过一个从零开始的下标来引用。栈顶用[0]来引用,下面一个元素用[1]来引用。
Struts里的OGNL实现有一个重要特征:如果指定的对象里没有找到指定的属性,则到指定的对象的下一个对象里继续搜索。也就是下标[n]的含义是从第n个对象开始搜索,而不是只搜索第n个对象。也就是
[0].password
与这个表达式passwotrd等价
1.3读取Context Map里的对象属性
#object.propertyName
#object['propertyName']
#object["propertyName"]
1.4调用字段和方法
调用任何一个Java类里的静态字段和方法。
@fullyQualifiedClassName@fieldName
@fullyQualifiedClassName@methodName(argumentList)
1.5访问数组类型的属性
类似访问Java数组的元素使用的符号去访问这种数组的各个元素。
可以通过length字段查询出给定数组有多少个元素。
1.6访问List类型的属性
跟访问数组的方式一样。
可以通过size方法和size关键字来查询出给定List的长度。
使用isEmpty关键字或者isEmpty方法判定给出的是否为空。
还可以使用OGNL表达式来创建List,当与提供一组选项的表单标签的时候需要用此来解决。
1.7访问Map类型的属性
map[key]
可以用size或size()查出某给定Map里的键值对的个数。
你可以用isEmpty或isEmpty()检查某给定的Map是不是空的。
访问Context Map里的各个Map要使用#前缀
1.8JSP EL:当OGNL帮不上忙时
输出JSP页面上某个模板对象,你可以使用Struts标签库里的property标签
使用EL表达式也可以
${serverValue}
用Struts定制标签输出一个请求标头是见比较困难的事情,使用EL表达式如下:
${header.host}
在MVC设计模式里,视图负责显示模型和其他对象,需要使用OGNL去访问那些对象。保存动作对象和上下文对象的ValueStack栈。
2.表单标签
struts自带一个标签库,标签分为UI标签和非UI标签,其中UI标签还可以分为数据录入和显示出错信息。其中数据录入部分统称为表单标签。非UI标签可以帮助我们在应用程序里实现各种流程控制和数据访问。还有一部分标签可以完成Ajax编程。
2.1Struts标签的使用方法
在JSP页面的开头加上一条下面的taglib指令即可使用标签
<%taglib prefix="s" uri="/struts-tags"%>
标签的属性可以被赋值为一个静态的值或一个OGNL表达式。如果你在赋值时使用了一个OGNL表达式并把它用“%{”和“}”括起来,这个表达式将会被求值。
2.2form标签
2.3textfield、password、hidden标签
textfield标签将被呈现为一个输入文本字段,password标签将被呈现为一个口令字段,hidden标签将被呈现为一个不可见字段。
password标签扩展自textfield标签,前者比后者多一个showPassword属性。该属性是布尔型,默认值为false。它决定着口令字段输入表单因为没能通过验证而被重新显示给用户时,需不需要把用户刚才输入的口令字显示出来(依然看不到原字符)。
2.4submit标签
submit标签将呈现为一个提交按钮。根据其type属性的值,这个标签可以提供3种呈现效果。
input:把submit标签将呈现为
button:把submit标签呈现为
image:把submit标签呈现为
2.5reset标签
reset标签将呈现为一个重置按钮。根据其type属性的值,这个标签可以提供两种呈现效果。
input:把reset标签呈现为
button:把reset标签呈现为
2.6label标签
label标签将呈现为一个HTML行标元素。
2.7textarea标签
呈现为一个HTML文本域元素。
2.8checkbox标签
每一个呈现为一个HTML单选框元素(多选行为),只有一个特定属性fieldValue。
checkboxlist标签也可以呈现出多个单选框,但它的布局效果是固定的。使用checkbox标签可以让我们灵活地安排多个单选框的位置。
2.9list、listkey、listValue属性
list、listKey和listValue对radio、combobox、select、checklist、doubleselect等标签非常有用。
2.10赋值一个String
将一个数组赋值为String形式。
这里选项的值和行标使用的是同一个字符串元素。
2.11赋值一个Map
让每个选项的值和它的行标不同,使用Map作为选项的来源
Map
cites=new HashMap();
2.12赋值一个Collection或一个对象数组
使用一个对象数组或一个对象Collection来作为选项的来源。
2.13radio标签
radio是单选按钮。用它来实现多选一,对于真假选择的情况,选择checkbox标签
2.14select标签
select标签将呈现为一个select元素。headerKey和headerValue属性可以用来插入一个选项。
2.15optgroup标签对选项进行分组
用optgroup标签对select元素所提供的选项进行分组,每个选项组有它自己的来源。
2.16checkboxlist标签
呈现一组单选框。多选。checkboxlist标签将被映射到一个字符串数组或是一个基本类型的数组。如果一个也没有选中,则被赋值为一个空数组而不是空值。
2.17combobox标签
combobox标签将呈现为一个文本输入字段和一个select元素,也就是说你既可以通过输入内容也可以通过选择它的内容。
2.18updownselect标签
updownselect标签的功能与checklist标签相似,允许从一组选项中选中多个选项。updownselect标签将呈现为一个select元素。拥有同时选中所有选项的的按钮,和用来对那
些选项重新排序的按钮。
2.19optiontransferselect标签
optiontransferselect标签将呈现为两个select元素,内建在这个标签里的Javascript函数可以在那两个select元素之间来回“传输”各个选项。 只有被选中的选项才会被发送到服务器,把一个选项从左侧的select元素移动到右侧的select元素并不等于选中了它。
2.20doubleselect标签
doubleselect标签将呈现为两个相互关联的select元素。
2.10主题
struts提供4种主题
simple:将UI标签翻译成最简单的HTML对应的元素,并且会忽视行标属性。
xhtml:xhtml主题是默认的主体。这个主题的模板通过使用一个布局表提供一种自动化的排版机制。
css_xhtml:使用css来布局和排版。这个主题与xhtml主题里的模板相似。
ajax:这个主题里的模板以xhtml主题里的模板为基础,但增加了一些高级的Ajax功能。
3通用标签
非UI标签统称为“通用标签”
3.1property标签
property标签用来输出一个动作属性的值。
如果value属性没有给出,Value Stack栈中的栈顶对象的值将被输出。
3.2a标签
a标签将呈现为一个HTML链接。
3.3action标签
action标签用来执行一个动作和该动作的结果。它还会把当前动作压入Value Stack栈的Context Map子栈。
3.4param标签用来把一个参数传递给包含着它的那个标签。不管你在给出value属性值时有没有使用“%{}”,Struts都会对它进行求值。
3.5bean标签
bean标签将创建一个JavaBean,并把它压入Value Stack栈的Context Map子栈。这个标签的功能与JSP语言里的useBean动作元素很相似。
3.6date标签
date标签用来对一个Java语言的Date对象进行排版。
3.7include标签
把一个servlet或一个JSP页面的输出包括到当前页面里来。
3.8set标签
set标签用来在以下map对象里创建一个键/值对
Value Stack栈的Context Map子栈
Map类型的session对象(当前会话)
Map类型的application对象
Map类型的request对象
Map类型的page对象
把值压入值栈,后面就能引用了。
3.9push标签
push标签与set标签很相似,它们之间的区别是push标签将把一个对象压入Value Stack而不是压入Context Map。push标签的另一独特之处是,它的起始标签把一个对象压入栈,结束标签将弹出那个对象。所以要利用push标签,就必须在结束标签之前完成一切。
3.10url标签
这个标签用来动态的创建一个URL。
3.11if、else和elseif标签
与Java类似。
3.12iterator标签
这个标签是控制标签里最重要的。它可以用来遍历一个数组、一个collection或一个Map并把这个可遍历对象里的每一个元素依次压入和弹出Value Stack栈。
3.13append标签
这个标签用来合并可遍历对象。如果你有两个各包含3个元素的列表,那么合并后就会成为6个元素。
3.14merge标签
在合并两个列表的时候,merge标签将从每个列表交替读取一个元素,直至读完两个列表。
3.15generator标签
生成一个可遍历对象并把他压入value Stack栈。同样结束标签将弹出那个可遍历对象,需要在结束标签前完成所有操作,如果在后面的步骤里还要访问这个可遍历的对象,那么吧这个对象创建一个引用变量并把该变量设为一个页面属性。
3.16sort标签
用来对一个可遍历对象里的元素进行排序。
3.17subset标签
创建一个可遍历对象的子集。类似于条件删选。需要使用一个Decider类的实例去告诉subset标签如何创建一个可遍历对象的子集。