分类: Java
2008-07-17 21:38:46
4. struts标记库
4.1 Bean标记
4.1.1 Bean复制标记
4.1.2 定义脚本变量标记
4.1.3 显示bean属性
4.1.4 消息国际化标记
4. struts标记库
4.1 Bean标记
4.1.1 Bean复制标记
4.1.2 定义脚本变量标记
4.1.3 显示bean属性
4.1.4 消息国际化标记
4.2 逻辑标记
4.2.1 条件标记
4.2.2 重复标记
4.2.3 转发和重定向标记
4.3 HTML标记
4.3.1 显示表单元素和输入控件
4.3.2 显示错误信息的标记
4.3.3 其他HTML标记
4.4 模板标记
4.标记库
JSP视窗组件所使用的 struts标记库由四类标记组成:
l Bean标记:用来在JSP页中管理bean
l 逻辑标记:用来在JSP页中控制流程
l HTML标记:用来生成HTML标记,在表单中显示数据,使用会话ID对URL进行编程
l 模板标记:使用动态模板构造普通格式的页
4.1 Bean标记
这个标记库中包含用于定义新bean、访问bean及其属性的标记。框架提供了多种自定义标记用来在JSP页中处理。这些标记被封装在一个普通的标记库中,在文件struts-bean.tld中定义了它的标记库描述器。Bean标记库将标记定义在四个子类别中:
l 创建和复制bean的标记
l 脚本变量定义标记
l bean翻译标记
l 消息国际化标记
4.1.1 Bean复制标记
可定义新bean,可复制现有bean,还可从现有bean复制属性。
l 定义新字符串常数
l 将现有的bean复制到新定义的bean对象
l 复制现有bean的属性来创建新的bean
属性
描述
Id
新定义的bean脚本变量名称,必须设置
Type
定义引入脚本变量的类
Value
为id属性定义的脚本变量分配一个新的对象
Name
目标bean的名称。若value属性没有设置,这个属性就必须设置
property
Name属性定义的bean的属性名称,用来定义新的bean
Scope
源bean的作用域。若没有设置,搜索范围是从页作用域到应用程序作用域
toScope
目标bean的作用域。若没有设置,默认值是页作用域
例如:定义一个bean:
源bean在页作用域中被拷贝大哦请求作用域中的另一个bean:
scope="page" toScope="request"/>
4.1.2 定义脚本变量的标记
从多种资源中定义和生成脚本变量,这些资源包括cookie,请求参数,HTTP标头等等。属性如下:
属性
描述
Id
脚本变量和要定义的页作用域属性的名称
Name
cookie/标头/参数的名称
multiple
如果这个属性设置了任意一个数值,所有匹配的cookie都会被积累并存储到一个Cookie[](一个数组)类型的bean里。若无设置,指定cookie的第一个值将作为Cookie类型的值
Value
如果没有匹配的cookie或数值,就返回这个属性指定的默认值
例如:
脚本变量名称是myCookie,用来创建这个属性的cookie的名称是userName。
脚本变量名称是myHeader,请求标头的名称是Accept-Language.
脚本变量名称是myPatameter,它保存的请求参数的名称也是myParameter.
属性
描述
Id
脚本变量和要定义的页作用域属性的名称
Page
一个内部资源
forward
一个ActionForward
Href
要包含的资源的完整URL
例如:
脚本变量的名称是myInclude,要检索的响应来自资源MyJsp?x=1。
属性
描述
Id
脚本变量和要定义的页作用域属性的名称
Name
资源的相对路径
Input
如果这个属性不存在,资源的类型就是字符串
例如:
脚本变量的名称是myResource,要检索的资源的名称是myResource.xml。
4.1.3 显示Bean属性
标记库中定义了
属性
描述
Name
要进行属性显示的bean的名称
property
要显示的属性的名称。如果这个属性类有java.beans.PropertyEditor,getAsText()或toString 方法会被调用
Scope
Bean的作用域,若没有设置,搜索范围是从页到应用程序作用域
Filter
如果设置true,属性中的所有特殊HTML字符都将被转化为相应的实体引用
Ignore
如果设置false,当发现属性时会产生一个请求时间异常,否则返回null
例如:
filter="true"/>
myBean的属性myProperty将会被显示,作用域为请求,如果发现任何HTML特殊字符都将被转化为相应的实体引用。
4.1.4 消息标记和国际化
strtus框架支持国际化和本地化。用户在他们的计算机中定义自己所在的区域,当web应用程序需要输出一条消息时,它将引用一个资源文件,在这个文件中所有的消息都使用了适当的语言。一个应用程序可能提供了很多资源文件,每个文件提供了用不同语言编写的消息。如果没有找到所选语言的资源文件,就将使用默认的资源文件。
struts框架对国际化的支持是使用
用strtus实现国际化和本地化:
第一步要定义资源文件的名称,这个文件会包含用默认语言编写的在程序中会出现的所有消息。这些消息以"关键字-值"的形式存储,如下:
error.validation.location = The entered location is invalid
这个文件需要存储在类的路径下,而且它的路径要作为初始化参数传送给ActionServlet作为参数进行传递时,路径的格式要符合完整Java类的标准命名规范。比如,如果资源文件存储在WEB-INF\classes目录中,文件名是ApplicationResources.properties,那么需要传递的参数值是ApplicationResources。如果文件在WEB-INF\classes\com\test中,那么参数值就应该是com.test. ApplicationResources.
为了实现国际化,所有的资源文件必须都存储在基本资源文件所在的目录中。基本资源文件包含的是用默认地区语言-本地语言编写的消息。如果基本资源文件的名称是ApplicationResources.properties,那么用其他特定语言编写的资源文件的名称就应该是ApplicationResources_xx.properties(xx为ISO编码,如英语是en)。因此这些文件应包含相同的关键字,但关键字的值是用特定语言编写的。
ActionServlet的区域初始化参数必须与一个true值一起传送,这样ActionServlet就会在用户会话中的Action.LOCALE_KEY关键字下存储一个特定用户计算机的区域对象。现在可以运行一个国际化的web站点,它可以根据用户计算机上的设置的区域自动以相应的语言显示。
我们还可以使用特定的字符串来替换部分消息,就象用java.text.MessageFormat的方法一样:
error.invalid.number = The number {0} is valid
我们可以把字符串{0}替换成任何我们需要的数字。
属性
描述
Key
资源文件中定义消息关键字
Locale
用户会话中存储的区域对象的属性名称。若没有设置,默认值是Action.LOCALE_KEY
Bundle
在应用程序上下文中,存储资源对象的属性的名称。如果没有设置这个属性,默认值是Action.MESSAGE_KEY
arg0
第一个替换参数值
arg1
第二个替换参数值
arg2
第三个替换参数值
arg3
第四个替换参数值
例如:资源文件中定义了一个消息:
info.myKey = The numbers entered are {0},{1},{2},{3}
我们可使用下面的消息标记:
这个信息标记输出到JSP页会显示为:The numbers entered are 5,6,7,8
4.2 逻辑标记
逻辑库的标记能够用来处理外观逻辑而不需要使用scriptlet。逻辑标签库包含的标记能够有条件地产生输出文本,在对象集合中循环从而重复地产生输出文本,以及应用程序流程控制。它也提供了一组在JSP页中处理流程控制的标记。这些标记封装在文件名为struts-logic.tld的标记包中。逻辑标记库定义的标记能够执行下列三个功能:
l 条件逻辑
l 重复
l 转发/重定向响应
4.2.1 条件逻辑
struts有三类条件逻辑。第一类可以比较下列实体与一个常数的大小:
l cookie
l 请求参数
l bean或bean的参数
l 请求标头
以下列出了这一类标记:
标记
功能
如果常数与被定义的实体相等,返回true
如果常数与被定义的实体不相等,返回true
如果常数大于等于被定义的实体,返回true
如果常数小于等于被定义的实体,返回true
如果常数小于被定义的实体,返回true
如果常数大于被定义的实体,返回true
这一类的所有标记有相同的属性
属性
描述
Value
要进行比较的常数值
Cookie
要进行比较的HTTP cookie的名称
Header
要进行比较的HTTP请求标头的名称
parameter
要进行比较的HTTP请求参数的名称
Name
如果要进行比较的是bean或bean的属性,则这个属性代表bean的名称
property
要进行比较的bean属性的名称
Scope
Bean的作用域,如果没有指定作用域,则它的搜索范围是从页到应用程序
例如:
The entered name is SomeName
判断名为"name"的请求参数的值是否是"SomeName"。
The value of bean.Prop is greater than 7
判断在页的作用域中是否有一个名为"bean"的bean,它有一个prop属性,这个属性的值是否大于7。如果这个属性能够转化为数值,就进行数值比较,否则就进行字符串比较。
第二类条件标记定义了两个标记:
l
l
它们的功能是在计算标记体之前判断特定的项目是否存在。标记的属性和属性值决定了要进行检查的项目。
属性
描述
Cookie
由这个属性指定的cookie将被检查是否存在
Header
由这个属性指定的请求标头将被检查是否存在
parameter
由这个属性指定的请求参数将被检查是否存在
Name
如果没有设置property属性,那么有这个属性指定的bean将被检查是否存在。如果设置了,那么bean和bean属性都将被检查是否存在。
property
检查有name属性指定的bean中是否存在指定的属性
Scope
如果指定了bean的名称,这就是bean的作用域。如果没有指定作用域,搜索的范围从页到应用程序作用域。
Role
检查当前已经确认的用户是否属于特殊的角色
User
检查当前已经确认的用户是否有特定的名称
例如:
The bean property bean.prop is present
标记判断在页作用域中是否存在一个名为"bean"的bean,这个bean有一个prop属性。
第三类条件标记比较复杂,这些标记根据模板匹配的结果检查标记体的内容。换句话说,这些标记判断一个指定项目的值是否是一个特定常数的子字符串:
l
l
这些标记允许JSP引擎在发现了匹配或是没有发现时计算标记主体。属性如下:
属性
描述
Cookie
要进行比较的HTTP cookie的名称
Header
要进行比较的的HTTP标头 的名称
parameter
要进行比较的的HTTP请求参数的名称
Name
若要对bean或bean的属性进行比较,这个属性是用户指定bean的名称
location
如果设置了这个属性的值,将会在这个指定的位置(索引值)进行匹配
scope
如果对bean进行比较,这个属性指定了bean的作用域。如果没有设置这个参数,搜索范围是从页到应用程序作用域
property
要进行比较的bean的属性名称
value
要进行比较的常数值
例如:
The parameter name is a sub-string of the string xyz from index 1
标记检查名为"name"的请求参数是否是"xyz"的子字符串,但是子字符串必须从"xyz"的索引位置1开始(也就是说子字符串必须是"y"或"yz")。
4.2.2 重复标记
在逻辑标记库中定义了
,java.util.Map或是一个数组。有三种方法可以定义这个集合:
l 使用运行时间表达式来返回一个属性集合的集合
l 将集合定义为bean,并且使用name属性指定存储属性的名称。
l 使用name属性定义一个bean,并且使用property属性定义一个返回集合的bean属性。
当前元素的集合会被定义为一个页作用域的bean。属性如下,所有这些属性都能使用运行时表达式。
属性
描述
collection
如果没有设置name属性,它就指定了要进行重复的集合
Id
页作用域bean和脚本变量的名称,它保存着集合中当前元素的句柄
indexed
页作用域JSP bean的名称,它包含着每次重复完成后集合的当前索引
Length
重复的最大次数
Name
作为集合的bean的名称,或是一个bean名称,它由property属性定义的属性,是个集合
Offset
重复开始位置的索引
property
作为集合的Bean属性的名称
Scope
如果指定了bean名称,这个属性设置bean的作用域。若没有设置,搜索范围从页到应用程序作用域
Type
为当前定义的页作用域bean的类型
例如:
collection="<% =myList %>"
type="java.lang.Integer"
offset="1"
length="2">
<% =currentint %>
代码将从列表中的第一个元素开始重复两个元素并且能够让当前元素作为页作用域和java.lang.Integer类型的脚本变量来使用。也就是说,如果myList包含元素1,2,3,4等,代码将会打印1和2。
4.2.3 转发和重定向标记
转发标记
重定向标记
属性
描述
Forward
映射了资源相对路径的ActionForward
Href
资源的完整URL
Page
资源的相对路径
Name
Map类型的页名称,请求,会话或程序属性的名称,其中包含要附加大哦重定向URL(如果没有设置 property属性)上的"名称-值"参数。或是具有Map类型属性的bean名称,其中包含相同的信息(没有设置property属性)
Property
Map类型的bean属性的名称。Bean的名称由name属性指定。
Scope
如果指定了bean的名称,这个属性指定搜索bean的范围。如果没有设置,搜索范围从页到应用程序作用域
ParamID
定义特定查询参数的名称
ParamName
字符串类型的bean的名称,其中包含查询参数的值(如果没有设置paramProperty属性);或是一个bean的名称,它的属性(在paramProperty属性中指定)包含了查询参数值
paramProperty
字符串bean属性的名称,其中包含着查询参数的值
ParamScope
ParamName定义的bean的搜索范围
使用这个标记时至少要指定forward,href或page中的一个属性,以便标明将响应重定向到哪个资源。
4.3 HTML标记
HTML标记可以大致地分为以下几个功能:
l 显示表单元素和输入控件
l 显示错误信息
l 显示其他HTML元素
4.3.1 显示表单元素和输入控件
struts将HTML表单与为表单操作而定义的ActionForm bean紧密联系在一起。表单输入字段的名称与ActionForm bean里定义的属性名称是对应的。当第一次显示表单时,表单的输入字段是从ActionForm bean中移植过来的,当表单被提交时,请求参数将移植到ActionForm bean实例。
所有可以在