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.Struts标记库
JSP视窗组件所使用的 struts标记库由四类标记组成:
l Bean标记:用来在JSP页中管理bean
l 逻辑标记:用来在JSP页中控制流程
l HTML标记:用来生成HTML标记,在表单中显示数据,使用会话ID对URL进行编程
l 模板标记:使用动态模板构造普通格式的页
4.1 Bean标记
这个标记库中包含用于定义新bean、访问bean及其属性的标记。Struts框架提供了多种自定义标记用来在JSP页中处理JavaBean。这些标记被封装在一个普通的标记库中,在文件struts-bean.tld中定义了它的标记库描述器。Bean标记库将标记定义在四个子类别中:
l 创建和复制bean的标记
l 脚本变量定义标记
l bean翻译标记
l 消息国际化标记
4.1.1 Bean复制标记
可定义新bean,可复制现有bean,还可从现有bean复制属性。
<bean:define>标记用来:
l 定义新字符串常数
l 将现有的bean复制到新定义的bean对象
l 复制现有bean的属性来创建新的bean
<bean:define>标记属性:
属性
描述
Id
新定义的bean脚本变量名称,必须设置
Type
定义引入脚本变量的类
Value
为id属性定义的脚本变量分配一个新的对象
Name
目标bean的名称。若value属性没有设置,这个属性就必须设置
property
Name属性定义的bean的属性名称,用来定义新的bean
Scope
源bean的作用域。若没有设置,搜索范围是从页作用域到应用程序作用域
toScope
目标bean的作用域。若没有设置,默认值是页作用域
例如:定义一个bean:
<bean:define id=”test” value=”this is a test”/>
源bean在页作用域中被拷贝大哦请求作用域中的另一个bean:
<bean:define id=”targetBean” name=”sourceBean”
scope=”page” toScope=”request”/>
4.1.2 定义脚本变量的标记
从多种资源中定义和生成脚本变量,这些资源包括cookie,请求参数,HTTP标头等等。属性如下:
属性
描述
Id
脚本变量和要定义的页作用域属性的名称
Name
cookie/标头/参数的名称
multiple
如果这个属性设置了任意一个数值,所有匹配的cookie都会被积累并存储到一个Cookie[](一个数组)类型的bean里。若无设置,指定cookie的第一个值将作为Cookie类型的值
Value
如果没有匹配的cookie或数值,就返回这个属性指定的默认值
例如:
<bean:cookie id=”myCookie” name=”userName”/>
脚本变量名称是myCookie,用来创建这个属性的cookie的名称是userName。
<bean:header id=”myHeader” name=”Accept-Language”/>
脚本变量名称是myHeader,请求标头的名称是Accept-Language.
<bean:parameter id=”myParameter” name=”myParameter”>
脚本变量名称是myPatameter,它保存的请求参数的名称也是myParameter.
<bean:include>标记将对一个资源的响应进行检索,并引入一个脚本变量和字符串类型的页作用域属性。这个资源可以是一个页,一个ActionForward或一个外部URL。与<jsp:include>的不同是资源的响应被存储到一个页作用域的bean中,而不是写入到输出流。属性如下:
属性
描述
Id
脚本变量和要定义的页作用域属性的名称
Page
一个内部资源
forward
一个ActionForward
Href
要包含的资源的完整URL
例如:
<bean:include id=”myInclude” page=”MyJsp?x=1”/>
脚本变量的名称是myInclude,要检索的响应来自资源MyJsp?x=1。
<bean:resource>标记将检索web应用中的资源,并引入一个脚本变量和InputStream或字符串类型的页作用域属性。如果在检索资源时发生问题,就会产生一个请求时间异常。属性如下:
属性
描述
Id
脚本变量和要定义的页作用域属性的名称
Name
资源的相对路径
Input
如果这个属性不存在,资源的类型就是字符串
例如:
<bean:resource id=”myResource” name=”/WEB-INF/images/myResource.xml”/>
脚本变量的名称是myResource,要检索的资源的名称是myResource.xml。
4.1.3 显示Bean属性
标记库中定义了<bean:write>标记,用来将bean的属性输送到封装的JSP页写入器。这个标记与<jsp:getProperty>类似,属性如下:
属性
描述
Name
要进行属性显示的bean的名称
property
要显示的属性的名称。如果这个属性类有java.beans.PropertyEditor,getAsText()或toString 方法会被调用
Scope
Bean的作用域,若没有设置,搜索范围是从页到应用程序作用域
Filter
如果设置true,属性中的所有特殊HTML字符都将被转化为相应的实体引用
Ignore
如果设置false,当发现属性时会产生一个请求时间异常,否则返回null
例如:
<bean:write name=”myBean” property=”myProperty” scope=”request”
filter=”true”/>
myBean的属性myProperty将会被显示,作用域为请求,如果发现任何HTML特殊字符都将被转化为相应的实体引用。
4.1.4 消息标记和国际化
strtus框架支持国际化和本地化。用户在他们的计算机中定义自己所在的区域,当web应用程序需要输出一条消息时,它将引用一个资源文件,在这个文件中所有的消息都使用了适当的语言。一个应用程序可能提供了很多资源文件,每个文件提供了用不同语言编写的消息。如果没有找到所选语言的资源文件,就将使用默认的资源文件。
struts框架对国际化的支持是使用<bean:message>标记,以及使用java.util数据包中定义的Locale和ResourceBundle类来实现Java2平台对这些任务的支持。Java.text.MessageFormat类定义的技术可以支持消息的格式。利用此功能,开发人员不需了解这些类的细节就可进行国际化和设置消息的格式。
用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}替换成任何我们需要的数字。<bean:message>标签属性如下:
属性
描述
Key
资源文件中定义消息关键字
Locale
用户会话中存储的区域对象的属性名称。若没有设置,默认值是Action.LOCALE_KEY
Bundle
在应用程序上下文中,存储资源对象的属性的名称。如果没有设置这个属性,默认值是Action.MESSAGE_KEY
arg0
第一个替换参数值
arg1
第二个替换参数值
arg2
第三个替换参数值
arg3
第四个替换参数值
例如:资源文件中定义了一个消息:
info.myKey = The numbers entered are {0},{1},{2},{3}
我们可使用下面的消息标记:
<bean:message key=”info.myKey” arg0=”5” arg1=”6” arg2=”7” arg3=”8”/>
这个信息标记输出到JSP页会显示为:The numbers entered are 5,6,7,8
4.2 逻辑标记
逻辑库的标记能够用来处理外观逻辑而不需要使用scriptlet。Struts逻辑标签库包含的标记能够有条件地产生输出文本,在对象集合中循环从而重复地产生输出文本,以及应用程序流程控制。它也提供了一组在JSP页中处理流程控制的标记。这些标记封装在文件名为struts-logic.tld的标记包中。逻辑标记库定义的标记能够执行下列三个功能:
l 条件逻辑
l 重复
l 转发/重定向响应
4.2.1 条件逻辑
struts有三类条件逻辑。第一类可以比较下列实体与一个常数的大小:
l cookie
l 请求参数
l bean或bean的参数
l 请求标头
以下列出了这一类标记:
标记
功能
<equal>
如果常数与被定义的实体相等,返回true
<notEqual>
如果常数与被定义的实体不相等,返回true
<greaterEqual>
如果常数大于等于被定义的实体,返回true
<lessEqual>
如果常数小于等于被定义的实体,返回true
<lessThan>
如果常数小于被定义的实体,返回true
<greaterThan>
如果常数大于被定义的实体,返回true
这一类的所有标记有相同的属性
属性
描述
Value
要进行比较的常数值
Cookie
要进行比较的HTTP cookie的名称
Header
要进行比较的HTTP请求标头的名称
parameter
要进行比较的HTTP请求参数的名称
Name
如果要进行比较的是bean或bean的属性,则这个属性代表bean的名称
property
要进行比较的bean属性的名称
Scope
Bean的作用域,如果没有指定作用域,则它的搜索范围是从页到应用程序
例如:
<logic:equal parameter=”name” value=”SomeName”>
The entered name is SomeName
</logic:equal>
判断名为”name”的请求参数的值是否是”SomeName”。
<logic:greaterThan name=”bean” property=”prop” scope=”page” value=”7”>
The value of bean.Prop is greater than 7
</logic:greaterThan>
判断在页的作用域中是否有一个名为”bean”的bean,它有一个prop属性,这个属性的值是否大于7。如果这个属性能够转化为数值,就进行数值比较,否则就进行字符串比较。
第二类条件标记定义了两个标记:
l <logic:present>
l <logic:notPresent>
它们的功能是在计算标记体之前判断特定的项目是否存在。标记的属性和属性值决定了要进行检查的项目。
属性
描述
Cookie
由这个属性指定的cookie将被检查是否存在
Header
由这个属性指定的请求标头将被检查是否存在
parameter
由这个属性指定的请求参数将被检查是否存在
Name
如果没有设置property属性,那么有这个属性指定的bean将被检查是否存在。如果设置了,那么bean和bean属性都将被检查是否存在。
property
检查有name属性指定的bean中是否存在指定的属性
Scope
如果指定了bean的名称,这就是bean的作用域。如果没有指定作用域,搜索的范围从页到应用程序作用域。
Role
检查当前已经确认的用户是否属于特殊的角色
User
&nb