Struts框架提供了一组非常丰富的框架组件,同时也提供了一组标签库用于和这些组件交互,主要介绍以下三类:
struts标签库中包括很多标签,其中html标签是最常用的标签之一,该标签库包含的标签可以用来创建Struts输入表单和用户界面。
这类标签实际上就是普通的html标签,Struts设计者主要是为了和Struts框架统一,对普通的html标签做了一个封装,它的本质仍然是html标签。
使用struts的html标签,在文件的开头要使用如下语句引入标签库:
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
举几个简单的例子:
(1)<html:button>标签
这个标签就相当于HTML中的<input type="button">
标签,它的property属性就相当于<button>
的name
属性
<html:button property="button1" value="提交"></html:button>
(2)<html:image>
标签和<html:img>
标签
<html:image>
这个标签是一个图片按钮,而并不是一个单纯的图片。
<html:img>
标签是一个单纯的图片。
<html:image src="images/psb.jpg"></html:image>
<html:img src="images/psb.jpg"/>
(3)<html:link>
标签
超链接标签。它可以通过href
属性链接到当前应用外的链接,也可以通过page
属性链接到当前应用下的某个资源。
<html:link href="http://www.sohu.com">链接到Sohu</html:link>
<html:link page="/login.jsp">Login</html:link>
所以,在href
属性中要写全路径,而在page
属性中要写基于当前应用的路径。
使用struts的link标签有一个好处是:它自动帮我们做了URL重写的工作,所以我们不用再担心客户端禁用了Cookie。
在html标签库中form标签是最重要的标签,它和struts框架紧密结合。form标签和一个ActionForm对应,当form的各个字段与ActionForm的属性匹配时,那么当客户把Form提交后,struts框架将用户的输入保存到对应的ActionForm中。这样就完成了标签与组件的交互工作。
所以,<html:form>
标签的action属性值所指的struts动作在struts-config.xml文件中必须正确配置,否则会报错。
下面主要介绍一下form标签,以及其常用的子标签。
(1)<html:form>
标签
用法如下:
<html:form action="/login.do(struts动作)" method="post/get">
(2)<html:text>
标签
该标签是最常用的HTML标签,它对应于HTML中的<input type="text">
标签,它的property属性对应于<input type="text">
标签的name属性,而且,它的property属性和其对应的ActionForm对象实例绑定,也就是说,property属性的值必须和ActionForm子类中相应的属性拥有同样的名字。否则,该标签将会抛出异常。
<html:text property="name"/>
该标签的其他用法和<input type="text">
这个标签的用法完全一致。
(2)<html:radio>
标签
<html:radio>
标签对应于HTML中的<input type=radio>
标签,如性别选项对应两个<html:radio>
标签:
男<html:radio property="sex" value="0"/>
女<html:radio property="sex" value="1"/>
这里的两个radio标签中的property属性值必须都为一样的”sex”,这个名字和其对应的ActionForm子类中的属性值一致。每个value表示选中当前选项后,提交给服务器的值,也就是通过ActionForm的子类实例对象的相应属性可以获得的值。
(3)<html:checkbox>
标签
<html:checkbox>
标签对应于HTML中的<input type=checkbox>
标签,它的基本用法如下:
<html:checkbox property="student" value="true"/>
其中的value属性表示勾选这个复选框时提交给服务端的值。
(4)<html:multibox>
标签
<html:multibox>
标签也对应于HTML中的<input type=checkbox>
标签,但是<html:multibox>
标签和<html:checkbox>
标签在映射到ActionForm子类实例对象的相应属性的映射方式不同。所有property属性值相同的<html:multibox>
标签被映射到同一个property所指的属性中,并且这个属性是一个数组类型。而<html:checkbox>
标签值对应了一个值。
<html:multibox>
标签的基本用法如下:
香蕉<html:multibox property="fruits" value="香蕉"/>
苹果<html:multibox property="fruits" value="苹果"/>
西瓜<html:multibox property="fruits" value="西瓜"/>
桃子<html:multibox property="fruits" value="桃子"/>
其中,value属性也表示选中当前复选框的返回值。
(5)<html:select>
和<html:option>
标签
<html:select>
和<html:option>
标签组合对应了HTML中的<select><option>
组合,基本用法如下:
<html:select property="address">
<html:option value="北京"/>
<html:option value="上海"/>
<html:option value="深圳"/>
<html:option value="广州"/>
</html:select>
其中,value属性表示在下拉列表框中选择某一项时像服务端提交的值。
(6)<html:submit>
和<html:reset>
标签
这两个标签分别对应了HTML中的<input type="submit">
和<input type="submit">
标签,用法如下:
<html:submit value="提交"/>
<html:reset value="重置"/>
除了上述所介绍的之外,Struts1的HTML标签库还有其他的标签,这里不再一一赘述。
Bean标签库为访问Bean和它的属性提供了方便的机制:
1.该标签库包含的标签可以用来创建bean、访问bean和访问bean的属性。
2.提供了依据cookies、headers和parameters的值创建相关bean的能力。
使用struts的bean标签库,也需要在文件的开头引入:
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
我们常用的主要是<bean:write>
标签和<bean:message>
标签,下面也主要介绍这两种标签。
(1)<bean:write>
标签
该标签主要用来输出,与JSTL中的<c:out>
标签类似,但是用法略有不同,如下:
<% request.setAttribute("abc","Hello World!"); Cat cat = new Cat("小花猫",5); request.setAttribute("cat1", cat); %>
<!-- bean:write 用于输出信息 -->
<h1>输出变量</h1>
<bean:write name="abc" scope="request"/>
<h1>输出对象的属性值</h1>
<bean:write name="cat1" property="name" scope="request"/>
<bean:write name="cat1" property="age" scope="request"/>
(2)<bean:message>
标签
该标签通常和资源文件配合使用,可以更加方便地输出信息,这些信息在资源文件中配置。
所谓的资源文件,就是指struts自动为我们配置的ApplicationResource.properties文件:
比如,我们在资源文件中配置如下:
key1 = welcome {0}
在JSP页面,我们可以做如下输出:
<bean:message key="key1" arg0="John"/>
此时,界面会输出 welcome John
这个标签通常用于国际化,在资源文件中用不同的语言配置不同的提示语,在界面上判断输出。
logic标签库主要用于管理和条件相关的输出,都某些对象进行迭代和输出,和流程管理。
同样的,引入logic标签库:
<%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %>
(1)<logic:iterate>
循环标签
与jstl中的<c:forEach>
标签类似,使用方法如下:
<% Cat cat1 = new Cat("小黑", 5); Cat cat2 = new Cat("小花", 6); Cat cat3 = new Cat("小灰", 7); ArrayList<Cat> al = new ArrayList<Cat>(); al.add(cat1); al.add(cat2); al.add(cat3); request.setAttribute("cats", al); %>
<logic:iterate id="cat" name="cats" scope="request">
<bean:write name="cat" property="name" />
<bean:write name="cat" property="age" />
<br>
</logic:iterate>
这里,循环的对象为request域中的cats,每次将对象赋给id=cat的变量,然后再调用bean:write标签输出。
其实更简单的,这里也可以直接用EL表达式输出,效果是一样的:
<logic:iterate id="cat" name="cats" scope="request">
${cat.name}
${cat.age }<br>
</logic:iterate>
(2)<logic:greaterThan>
标签
该标签用于判断一个变量是否大于一个值。如下,我们可以循环判断哪一只猫的年龄大于5岁:
<logic:iterate id="cat" name="cats">
<logic:greaterThan name="cat" value="5" property="age">
${cat.name}的年龄大于5岁!<br>
</logic:greaterThan>
</logic:iterate>
与此类似的,还有<logic:equal>
,<logic:greaterEqual>
,<logic:lessThan>
标签等等。
(3)<logic:empty>
和<logic:notEmpty>
标签
这两个标签用于判断在一个域对象中是否存在某一个属性,如下例:
<logic:empty name="ee" scope="request">
ee属性在request域对象中不存在<br>
</logic:empty>
<logic:notEmpty name="cats" scope="request">
cats属性在request域对象中存在<br>
</logic:notEmpty>
到这里,我们已经知道了很多不同的标签,有HTML原生标签,JSTL标准标签,EL表达式和Struts标签,其中有很多标签的功能是一样的,这里给出一个选择使用标签的原则:
JSTC -> EL -> Struts
即,优先使用JSTL和EL表达式,最后再选择使用struts标签库。