通过前面的几节的介绍,我们已经明白了Struts 2 MVC框架的基本数据流,已经完成了Struts 2应用中模型、控制器、视图3个组件的开发。但应用中的视图组件:JSP页面非常丑陋,特别是输出Action返回信息的JSP页面,使用了大量的Java脚本来控制输出,下面将会使用Struts 2的标签来改善整个应用视图组件。
为了控制输出Struts 2的ValueStack中封装的值,Struts 2提供了大量的标签。其中比较常用的标签有:
— if:该标签支持标签体,如果if标签里判断的表达式返回真,则输出标签体内容。
— else:该标签不能独立使用,它需要与if标签结合使用,如果if标签内判断的表达式返回假,则输出该标签里的标签体。
— iterator:主要用于迭代输出某个集合属性的各个集合元素。
— property:该标签用于输出指定属性值。
关于Struts 2标签库更深入的使用,第10章还会深入介绍,故此处不再详细讲解。通过使用上面的几个标签,替换showBook.jsp页面中的Java脚本,修改后的showBook.jsp页面代码如下:
<%@ page language="java" contentType="text/html; charset=GBK" %>
<!-- 导入Struts 2的标签库 -->
<%@taglib prefix="s" uri="/struts-tags"%>
<head>
<title>作者李刚的图书</title>
</head>
<table border="1" width="360">
<caption>作者李刚的图书</caption>
<!-- 迭代输出ValueStack中的books对象,其中status是迭代的序号 -->
<s:iterator value="books" status="index">
<!-- 判断序号是否为奇数 -->
<s:if test="#index.odd == true">
<tr style="background-color:#cccccc">
</s:if>
<!-- 判断迭代元素的序号是否不为偶数 -->
<s:else>
<tr>
</s:else>
<td>书名:</td>
<td><s:property/></td>
</tr>
</s:iterator>
</table>
上面的JSP页面使用了Struts 2的标签库,因此必须在JSP页面的首部添加taglib指令,该taglib指令用于导入标签库。
提示 如果需要使用某个标签库中的标签,则必须在页面的开始导入该标签库。
页面中使用Struts 2的iterator标签迭代输出ValueStack中的books数组,并为每个数组元素定义了一个序号:index。通过判断序号是否为奇数,如果行序号为奇数,则输出一个有背景色的表格行;否则输出一个无背景色的表格行。
在浏览器中再次向getBooks.action发送请求(发送请求之前,必须先登录本系统),将看到如图2.6所示的界面。

图2.6 使用Struts 2标签改善后的输出界面
上面页面的输出效果与图2.5并没有太大的不同,只是使用不同颜色来分隔了记录行。这也得益于Struts 2标签库的简洁。
关键在于2.5.4节中的JSP页面代码与本节页面代码的差异:前面JSP页面使用了大量的Java脚本,让整个页面的代码看起来非常凌乱,降低了可阅读性、可维护性。但本页面中仅使用Struts 2脚本控制输出,完全消除了页面中的Java脚本,降低了该页面的后期维护成本。
前面已经提到过,Struts 2的一个重要组件就是标签库。Struts 2标签库中不仅提供了前面所示的基本控制、数据输出等功能,还提供了非常丰富的UI组件,除了提供系列的主题相关标签外,还提供了一系列的表单相关的标签。
Struts 2为常用表单域都提供了对应的标签,下面是常用的表单域标签。
— form:对应一个表单元素。
— checkbox:对应一个复选框元素。
— password:对应一个密码输入框。
— radio:对应一个单选框元素。
— reset:对应一个重设按钮。
— select:对应一个下拉列表框。
— submit:对应一个提交按钮。
— textarea:对应一个多行文本域。
— textfield:对应一个单行文本框。
关于这些界面相关的标签,同样将在第10章详细介绍。下面将使用Struts 2的表单相关标签简化用户登录的login.jsp页面,修改的login.jsp页面的代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<head>
<title>登录页面</title>
</head>
<!-- 使用form标签生成表单元素 -->
<s:form action="Login">
<!-- 生成一个用户名文本输入框 -->
<s:textfield name="username" label="用户名"/>
<!-- 生成一个密码文本输入框 -->
<s:textfield name="password" label="密 码"/>
<!-- 生成一个提交按钮 -->
<s:submit value="登录"/>
</s:form>
将该页面与前面的表单页面进行对比,我们发现该页面的代码简洁多了。因为使用了Struts 2的表单标签,定义表单页面也更加迅速。在浏览器中浏览该页面,看到如图2.7所示的界面。

图2.7 使用Struts 2表单标签后的表单页
当然,Struts 2的标签还有许多功能,此处先不详述,本书的第10章将会详细介绍Struts 2标签的用法。