Struts是Apache Jakarta的一个著名的开源项目,目标是为构建基于Java的web应用程序提供一个 框架。Struts提供了非常多的标签,依据功能和使用习惯的不同被分到了
五个标签库中:
-
Bean Tags:该标签库包含的标 签可以用来创建bean、访问bean和访问bean的属性。同时提供了依据cookies、 headers和parameters的值创建相关bean的能力。
-
HTML Tags:该标签库包含的标签可以用来创建Struts输入表单。
-
Logic Tags:该标签库包含的标签可以用来进行逻辑判断 、集合迭代和流程控制。
-
Nested Tags:该标签库建立在 前三个标签库的基础上,具有前三个标签库的所有功能,只是允许标签间的嵌套 。
-
Tiles Tags:该标签库包含的标签可以用来创建tiles 样式的页面。
标签的公共特征
&nbs p;
属性 | 说明 |
id | 命名自 定义标签创建时的脚本变量名。 |
name | 指出关键字值, 在该关键字下可以找到一个存在的bean 。如果给出了scope属性, 则仅仅在scope中查找。否则,根据标准的顺序在各种 scope中查找: (page, request, session, or application)。 |
property | 指出bean 中的某 个属性,可以在其中检索值。如果没有标明,则使用对象本身的值。 |
scope | 定义了 Bean在哪个范围(page, request, session, or application)中 被查找。如果没有标明按顺序查找。脚本变量(见id)将在相 同的范围中创建。 |
Html 标签库
Struts HTML标签和HTML元素对照表
html:html
它有两个属性:locale和 xhtml,两者都不是必需的。
<html:html locale=/"true/">
此行代码解析后:
<html lang=/"en/">locale生成的结果取决于Struts应用程 序所位于的服务器的locale。如果你将应用程序部署到一个不同
locale的服务器,你不 需要改变代码,Locale会自动调整。
html:base
表示所包含页面的绝对位置。这个标签只有内嵌在head标签中 才有效。
<html:base/>
此行代 码解析后:
<base href=/"http://www.mymain.com/myStrutsApp/te sting.jsp/">
html:img
最重要的属性 page:图象文件的路径,前面必须带有一个斜线。其它属性:heignt、width、alt。
<html:img page=/"/logo.gif/&quo t; height=/"50/" width=/"200 /" alt=/"Web Logo/"/>
html:form
html:password使用<form>标签时必须遵循一些规则:
1. 标签中必须包含一个action属性,它是这个标签中唯一必需的属性。如果不具备该属性则JSP页面会抛出一个异常。之后你必须给这个action属性指定一个有效值。一个有效值是指应用程序的Struts配置文件中元素里的任何一个子元素的访问路径。而且相应的元素中必须有一个name属性,它的值是form bean的名称。
<html:form action=/"/login/&quo t; >
如果你有上述一个标 签 ,那么你的Struts配置文件的元素中必须有一个如下显示为 粗体的元素:
<action-mappings>
<action path=/"/login/&qu ot;
type=/"com.javapro.struts.L oginAction/"
name=/"loginForm/"
scope=/"request/"
input=/"/login.jsp/"&g t;
<forward name=/"suc cess/" path=/"/mainMenu.jsp/"/>
</action>
.
.
.
</action-mappings> // 这就是说一个form标签是和 form bean相关联的。2 任何包含在<form>中用来 接收用户输入的标签(<text>、<password>、 <hidden>、<textarea>、 <radio>、<checkbox>、 <select>)必须在相关的form bean中有一个指定的属性值。比如, 如果你有一个属性值被指定为“username”的<text>标 签,那么相关的form bean中也必须有一个名为“username”的属性。输入 <text>标签中的值会被用于生成 form bean的userName属性。<form> 标签还有一些不是必须但很有用 的 “ 次要 ” 属性。
比如,你可以用 focus 属性来生成 JavaScript ,它会 “ 定焦 ” ( focus )到该 form 所包含的一个元素上 。使用 focus 属性时你需要给它指定元素的名称。
<body>
<html:form action=/"/login/" focus=/&qu ot;password/">
User Name: <html:text property=/"userNa me/"/>
<br>Password: <html:text property=/"pa ssword/"/>
<br><html:submit/>
</html:form>
</body>
代码解析后:
<body>
<form name=/"loginForm/" method=/" post/" action=/"/myStrutsApp/login.do/">
User Name: <input type=/"text/"&nb sp;name=/"userName/" value=/"/">
<br>Password: <input type=/"text/" ; name=/"password/" value=/"/">
<br><input type=/"submit/" value=/"Submit/">
</form>
<script language=/"JavaScript/" type=/"text/javascript/">
<!--
if (document.forms[/"loginForm/"].elements [/"password/"].type != /"hidden/")
document.forms [/"loginForm/"].elements[/"password/"].focus()
// -->
</script>
</body>有没有看到这个标签库是如何建立 JavaScript来定焦到password元素上的? 这也是 该库让人着迷的地方之一。你不用担心如何在客户端进行编程,它会帮你自动 生成。
还可以看到, <form> 标签中 method 属性的缺省值是 POST 。
<text> 标签、 <hidden> 标签、 <textarea> 标 签、 <radio> 标签、 <checkbox> 标 签、 <submit> 标签、 <reset> 标 签:
都有一个 property 属性,最后会被转换成 HTML 中的 name 属性,当然还有 name 和 value 属性。
<html:password property=/"passw ord/" redisplay=/"false/"/> 该标签中的一个很重要的属性是 "redisplay",它用于重新显示以 前输入到这个区域中的值。该属性的缺省值为true。然而,为了使 password
不能被重新显示,你或许希望将该属性的值设为 false。
html:cancel
html:cancel标签生成一个取消按 钮。当点击该按钮后action servlet会绕过相应的form bean的validate()方法 ,同时将控制权交给相应的action。在该action中可以使用 Action.isCancelled(HttpServletRequest)方法判断是否被取消了。如果返回 true表示这个action被取消了,否则表示这个action没有被取消。
请注 意,如果您修改了html:cancel标签的property属性值,那么struts提供的 cancel探测机制就失效了,您自己必须提供类似的机制。
下面是可取消 的action的配置文件,注意<set-property property="cancellable" value="true"/>这一行,如 果不添加Struts会抛出org.apache.struts.action.InvalidCancelException异 常。这是我在完成本指南的过程中发现的唯一向下不兼容的地方。
<action path="/cancel" type="org.solo.struts.action.CancelAction" name="cancelForm" scope="request"> <set-property property="cancellable" value="true"/> <forward name="success" path="/cancel.jsp" /> </action>下面是html:cancel标签的代码:
<html:cancel>取消 </html:cancel>下面是对应的action中的代码:
if(isCancelled (request)){ //action被取消时要做的事情写在这里 return mapping.findForward("cancel"); }else{ //action没有被取消时要做的事情写在这里 return mapping.findForward("success"); }
html:select
html:select标签生成一个select元素。是单选 还是多选取决于该标签的multiple属性。如果指定了 multiple="true"则为多选,此时对应的属性应该是一个数组。如果 没有指定multiple="true"则为单选,此时对应的属性应该是标量。
注意:为了正确的处理没有做任何的选择的情况,在ActionForm中的 reset()方法中必须将标量属性设置为默认值而将数组的长度置为0。
另 外的一个重要问题就是struts如何生成option元素了,这个任务struts交给了 html:option、html:options和html:optionsCollection三个标签。
html:option
html:option标签生成一个HTML的option元素。 该标签必须嵌在html:select标签中。它的显示文本来自其标签体,也可以来自 于资源文件。它的value属性用来指定什么值将要被提交。
<html:option value="one">one</html:option> <html:option value="two">two</html:option>html:options标签
html:options标签生成多个HTML的option元 素。该标签必须嵌在html:select标签中。而且工作方式有些特殊,它的name与 property属性和其它标签的name与property属性意义不一致,让我们具体看一下 它的工作方式。
- 指定collection属性
- 没有指定 collection属性
指定collection属性
让我通过示例来介 绍在指定collection属性时该标签的工作方式,首先要说明selectForm中的 persons和listForm中的persons完全一致。请参见bean:define标签。
下 面的代码先利用bean:define标签将selectForm中的persons取到page作用域中, 然后html:options标签再依据collection="personCollection"选中 这个persons并将其中的每一个对象(Person类型)生成一个option元素。该标签 的property="id"表示persons中的对象(Person类型)的id属性将作为 option元素的value值。该标签的labelProperty="name"表示persons 中的对象(Person类型)的name属性将作为option元素的label值。
当这个 select提交时所选择的值将被提交到selectForm (name="selectForm")中的person对象(这是在SelectForm中声明的一 个Person类型的域专门用来接收提交的值)的id属性中 (property="person.id")。
<bean:define id="personCollection" name="selectForm" property="persons"/> <html:select name="selectForm" property="person.id" size="1"> <html:options collection="personCollection" property="id" labelProperty="name"/> </html:select>没有指定collection属性
让我通过示例来介绍没有指定 collection属性时该标签的工作方式,先来看看ids和names的定义:
private List<String> ids = null; private List<String> names = null;上面的代码来自SelectForm,其中ids是一个String的列表,names也 是一个String的列表。我们暂时假定这两个列表含有相同数目的元素。有了这些 让我们开始介绍下面的代码。html:options标签用ids中的第i个值作为option元 素的value值同时使用names中相同位置的值(第i个值)作为option元素的label值 。如果ids比names长那么多出的ids中的值将即作为option的value又作为option 的label。如果ids比names短那么多出的names的值会被丢掉。
当这个 select提交时所选择的值将被提交到selectForm (name="selectForm")中的person对象(这是在SelectForm中声明的一 个Person类型的域专门用来接收提交的值)的id属性中 (property="person.id")。
<html:select name="selectForm" property="person.id" size="1"> <html:options property="ids" labelProperty="names"/> </html:select>html:optionsCollection标签
html:optionsCollection标签生 成多个HTML的option元素。该标签必须嵌在html:select标签中。它的功能和 html:options标签的相同,但是它的name与property属性和其它标签的name与 property属性意义一致,理解起来比较自然。
让我通过示例来介绍 html:optionsCollection标签的用法。首先依据name="selectForm" 和property="persons"取到selectForm中的persons列表,然后将列 表中的对象(Person类型)的id属性作为option元素的value值 (value="id"),将列表中的对象(Person类型)的name属性作为option 元素的label值(label="name")。
<html:select name="selectForm" property="person.id" size="1"> <html:optionsCollection name="selectForm" property="persons" label="name" value="id"/> </html:select>下面是一个多选的示例,虽然示例中使用了html:options标签,但是 html:option和html:optionsCollection也能够用来多选。而且您还必须意识到 html:option、html:options和html:optionsCollection这三个标签可以同时使 用。代码中的personIds是SelectForm中声明的一个String[]类型的数组用来接 收提交的多个值。
<html:select name="selectForm" property="personIds" multiple="true" size="2"> <html:options property="ids" labelProperty="names"/> </html:select>
html:check标签生成一个checkbox 。这里的value值可以是true,yes或on。如果您要提交其它的值(如某种形式的 标识)应该考虑使用html:multibox标签。
注意:为了正确的处理没有选中 的checkbox您必须在reset()中设置对应的属性为false。
下面的代码示 例了html:checkbox标签的用法,其中CheckboxForm中声明了三个boolean类型的 域,如下:
private boolean one = false; private boolean two = false; private boolean three = false;<html:checkbox name="checkboxForm" property="one"> One </html:checkbox> <html:checkbox name="checkboxForm" property="two"> Two </html:checkbox> <html:checkbox name="checkboxForm" property="three"> Three </html:checkbox>如果选中后被提交则相应的属性的值为true。
html:radio
html:radio标签生成一个radio。主要的用法有 两种,下面我们通过代码来示例。
下面的代码示例了html:radio标签的 一般用法,如果被提交则选中的radio的value值将被提交到radioForm中的id中 。
<html:radio name="radioForm" property="id" value="00001"> One </html:radio> <html:radio name="radioForm" property="id" value="00002"> Two </html:radio>下面的代码示例了html:radio标签的典型用法,其中的persons和 bean:define标签中的一致,您可以参考bean:define标签。我只介绍这个 <html:radio idName="person" property="id" value="id">,idName指定html:radio要使用的bean(这里为 person),value="id"表示person的id属性将作为radio元素的value 值而property="id"表示提交时选中的radio的值将被提交给 radioForm中的id属性。
<logic:notEmpty name="radioForm" property="persons"> <logic:iterate id="person" name="radioForm" property="persons"> <html:radio idName="person" property="id" value="id"> <bean:write name="person" property="name"/> </html:radio> </logic:iterate> </logic:notEmpty>
html :multibox标签生成多个checkbox。当您要使用大量的checkbox时使用这个标签 非常方便,可以使您避免在ActionForm中声明大量的boolean类型的变量,带之 以一个数组就行了。
注意:为了正确的处理没有选中的checkbox您必须在 reset()中设置数组的长度为0。
下面的代码示例了html:multibox标签的 一般用法,如果被提交则选中的所有checkbox的value值将被提交到 multiboxForm中的selectedItems中,这是一个String[]数组。
<html:multibox name="multiboxForm" property="selectedItems" value="00001"/> <html:multibox name="multiboxForm" property="selectedItems" value="00002"/>下面的代码示例了html:multibox标签的典型用法:
<logic:iterate id="person" name="multiboxForm" property="persons"> <html:multibox property="selectedItems"> <bean:write name="person" property="id"/> </html:multibox> <bean:write name="person" property="name"/> </logic:iterate>
html:javascript标签生成用于校验 的javascript脚本代码。
下面的代码片段示例了html:javascript标签的 基本用法,其中formName属性的值是在validation.xml文件的<formset> 中定义的form的名称。有一点值得注意的是在确定<formset>时要使用合 适的language属性值。
<html:javascript formName="dataForm"/>
html:xhtml标签在页面中一出现就是告诉该页 的所有其它的Struts html标签以XHTML1.0兼容的形式输出。这和将html:html标 签的xhtml属性值指定为true有些类似。如果上述情况都没有出现,Struts html 标签将以html4.01兼容的形式输出。