9.1 初涉Struts 2标签库
9.1.1 使用标签的优势
在前面曾经介绍过如何使用Struts 2的表单标签,那为什么要使用这些标签呢?
使用标签是有很大好处的,其中最大的好处就是在JSP页面中大大地减少了Java脚本代码。下面来看一个简单的示例,通过这个示例就能明白使用标签的好处了。首先在Action中添加strs属性至request范围中,代码如下所示。
package net.hncu.action; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class GetAction extends ActionSupport{ public String execute() throws Exception { String[] strs={"Java", "JSP", "Struts 2"}; ServletActionContext.getRequest().setAttribute("strs", strs); return SUCCESS; } }
通过Java脚本代码输出request范围中的strs属性值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Java脚本示例</title> </head> <body> <! -- 使用Java脚本获得request范围内的strs属性值 --> <% String[] strs = (String[])request.getAttribute("strs"); for(String str : strs) { out.println(str + "<br>"); } %> </body> </html>
如图9.1所示,程序执行能够输出strs属性中的值,但是发现在HTML代码中嵌套了许多的Java代码,后期维护起来非常麻烦。
图9.1 输出strs属性中的值
下面增加一个需求,要求输出的文字颜色为红色,这时就必须添加用于控制文本颜色的HTML代码,代码如下所示。
<% String[] strs = (String[])request.getAttribute("strs"); for(String str : strs) { out.println("<font color=' red' >" + str + "</font><br>"); } %>
这时发现又在Java代码中嵌套了许多的HTML代码,HTML代码和Java代码混在一起了。可以以‘<%= %>’表达式取代out.println()方法进行输出,代码如下所示。
<% String[] strs = (String[])request.getAttribute("strs"); for(String str : strs) { %> <font color=' red' ><%=str %></font><br> <% } %>
经过修改后,Java代码中不再嵌套HTML代码,但是还是在HTML代码中嵌套了Java代码。整个页面看起来显得比较凌乱,修改起来非常繁忙,如果输入稍微有错就会导致错误和异常。
这时可以使用标签库,如JSP规范提供的JSTL标签库、Struts 2标签库等。当然,这里使用的是Struts 2框架,所以这里的重点是来学习Struts 2的标签,至于JSTL标签库大家可以利用其他时间进行学习。下面通过使用Struts 2标签来改写JSP页面,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Struts 2标签库示例</title> </head> <body> <! -- 使用Struts 2标签改写应用 --> <s:set name="strs" value="#request.strs"></s:set> <s:iterator value="#strs" id="str"> <font color="red"><s:property value="#str"/></font><br> </s:iterator> </body> </html>
运行该应用,在JSP页面中成功地输出strs属性中的值,一起将文本颜色设置成了红色,如图9.2所示。
图9.2 输出strs属性中的值
通过查看使用Struts 2标签改写的代码发现,在代码中没出现一个Java脚本代码,而全部都是一些标签。标签的功能非常强大,完全取代了Java脚本代码。使用标签来开发可以使得页面更加整洁且容易维护,同样,可以减少代码量以及开发时间。
9.1.2 使用标签库以及标签分类
如果使用的Web容器支持的是Servlet 2.3规范,那么需要在“web.xml”文件中添加taglib来定义Struts 2的URI以及标签库定义文件(TLD)的路径,代码如下所示。
... <taglib> <taglib-uri>/struts-tags</taglib-uri> <taglib-location>/WEB-INF/lib/struts2-core-2.0.11.1.jar</taglib-location> </taglib> ...
如果使用Web容器支持的是Servlet 2.4及以上的规范,则无需在“web.xml”文件中添加taglib,因为Web应用会自动读取该TLD文件信息。
注意
本书中所有的范例都是基于Apache Tomcat 6.0版本,其支持Servlet 2.5规范。
如果要使用Struts 2的标签,还必须在JSP页面中使用taglib指令来导入Struts 2的标签,代码如下所示。
<%@ taglib prefix="s" uri="/struts-tags" %>
通过上面的配置就可以在JSP页面中使用Struts 2提供的标签了。
Struts 2提供的标签非常多,其大致分为两类:一类是用户界面标签,也称为UI标签。一类是非用户界面标签,也称为非UI标签。其中非UI标签主要用于数据访问和逻辑控制,按其功能又分为两类:一类是数据访问标签,一类是逻辑控制标签。表9.1中包含了所有的非UI标签以及其分类。
表9.1 非UI标签分类
UI标签主要用来生成HTML元素,分为3类:一类是表单标签、一类是非表单标签、另一类是AJAX标签。表9.2中包含了所有的UI标签以及其分类。
表9.2 UI标签分类