零基础学Struts
上QQ阅读APP看书,第一时间看更新

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标签分类