Struts2框架学习之五:通用标签详解

前言

Struts2框架为我们提供了很多标签,这些标签总体上可以分为两类:通用标签和UI标签。而较常使用的又是通用标签,所以文章的内容也是围绕通用标签展开的。通用标签分为两类:数据标签和控制标签。数据标签用于访问值栈中数据,控制标签用于控制呈现页面时数据执行流程。如果需要使用Struts 2框架的标签库,需要在页面的首部引入以下代码:<%@ taglib uri="/struts-tags" prefix="s"%>下面将分别对这两种标签进行说明。

数据标签

数据标签主要用于访问ActionContext和值栈中数据,数据标签包括:

  • property
  • set
  • push
  • param
  • bean
  • action
  • include
  • url
  • a
  • i18n
  • text
  • date
  • debug

1、property标签

property标签用于输出值栈中对象的属性值,value属性就是要输出的值。如果没有执行value属性,那么默认就会输出栈顶对象

property标签的属性包括:

名称是否必需说明
default如果value属性是null,则输出default的值
value进行求值的表达式

2、set标签

set标签是将一个值赋给指定范围的变量。如下前面的OGNL表达式文章中就多次使用了set标签。set标签的属性包括:

名称是否必需说明
name变量的名字
value指定一个表达式,将计算的结果赋给变量。如果没有执行value属性,默认将栈顶对象赋给变量
scope变量的范围,有application、session、request、page和action(默认值)

注意的是,在使用默认scope的值,即action范围的时候,value属性值会保存在request和OgnlContext(OGNL上下文)中。比如下面的例子:

action:

package com.rhwayfun.struts2.action;

import com.rhwayfun.struts2.bean.User;

public class SetTagAction {

    private User user;
    public String execute(){
        user = new User();
        user.setName("刘备");
        return "success";
    }

    public User getUser() {
        return user;
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>set标签测试</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>

  <body>
    <p>action范围中获取值</p>
    <p>
        <s:set name="name" value="user.name"></s:set>
        <s:property value="#name"/>
    </p>
    <p>request范围中获取</p>
    <p>
        <s:property value="#request.name"/>
    </p>
    <p>session范围中获取</p>
    <p>
        <s:set name="name" value="user.name" scope="session"></s:set>
        <s:property value="#session.name"/>
    </p>
  </body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

最后的测试结果:
结果

3、push标签

push标签的作用是将一个对象放入值栈中,所以push对象位于栈顶,但是push标签结束之后,栈顶的元素将会被删除,因此需要访问push的对象需要在push标签的内部访问。push标签只有属性value,这也是一个必需提供的属性。那么具体在开发中push标签有什么作用呢?答案是简化对属性的访问。比如需要访问一个User对象的name属性和age属性,正常在jsp页面使用Struts 2标签库进行访问的方式是#request.user.name#request.user.age(假设是request范围),而使用push标签,访问name属性的方式是:

<s:push value="#request.user">
    姓名:<s:property value="name"/>
    年龄:<s:property value="age"/>
</s:push>
 
 
  • 1
  • 2
  • 3
  • 4

4、param标签

param标签通常是作为其他标签的子标签,用于为其他标签提供参数。param标签有两个非必需属性name和value。其中的name属性是要设置参数的名字,value则是该参数的值。使用param标签有两种方式:<param name="username" value="zhangsan"/><param name="username">zhangsan</param>。在第一种方式中,value属性并不会作为name属性的值,而是表达式对待,因此如果zhangsan属性是空的话,将得到null ,所以需要把value改成%{'zhangsan'}。第二种访问方式是没有什么问题的。所以这种方式也是推荐的写法。

5、bean标签

bean标签相当于jsp中的useBean标签,bean标签通常用于实例化一个JavaBean对象,一个bean标签内部可以有多个param标签,用于为bean实例设置属性值(要求有set方法)。bean标签有两个属性:name和id。其中的name属性是要实例化的bean的完整类名,id用于指定一个名字,用于引用放入OgnlContext中的JavaBean对象。这里需要注意的是,出了bean标签,放入栈顶的实例(用bean标签创建的JavaBean对象会放入栈顶)会被移除。但是如果指定了id属性,在bean标签的外部就可以访问了。此时需要使用#符号。因此如果需要创建在bean实例可以在bean标签的外部也可以访问到,就需要指定id属性。

6、action标签

通过指定action的名字和可选的命名空间,action标签允许在jsp页面直接访问action。如果将action标签的executeResult属性设置为true,那么action对应的输出结果也会包含在本页面中。由于这种方式并不常用,而且在实际开发中使用的场合比较少,这里就不详细说明了。

7、include标签

该标签类似于jsp中<jsp:include></jsp:include>标签。在标签的内部可以包含多个param标签,用于向被包含的页面传递参数。include标签只有一个value属性,用于指定被包含的jsp或者Servlet。比如下面的代码:

includeTag.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>include标签测试</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>

  <body>
    <p>使用include标签包含另一个页面,并传递参数</p>
    <p>
        <s:include value="includeJsp.jsp">
            <s:param name="username">刘备</s:param>
            <s:param name="age">52</s:param>
        </s:include>
    </p>
  </body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

includeJsp.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>includeJsp.jsp</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>

  <body>
    姓名:${param.username }<br>
   年龄:${param.age }
  </body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

最后的访问includeTag.jsp,可以看到如下的结果:

结果

8、其他标签

其中的url标签用于创建一个url,在标签内部可以提供url附加的参数信息。i18n标签和text标签主要用于国际化的支持。i18n标签把一个资源包放入值栈中,text标签用于从资源包中获取消息。date标签主要用于格式化日期的输出。

控制标签

控制标签用于在呈现页面的时候控制程序的执行流程。常用的控制标签包括:

  • if/elseif/else
  • iterator
  • generator

1、if/elseif/else 标签

下面是这个标签使用的一个例子:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>if/elseif/else标签</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>

  <body>
    <s:set name="score" value="75"></s:set>
        成绩等级:
    <s:if test="#score < 60">不及格</s:if>
    <s:elseif test="#score < 80">良好</s:elseif>
    <s:else>优秀</s:else>
  </body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

2、iterator标签

iterator标签用于迭代一个集合的元素,在迭代的过程中,会暂时把迭代的对象压入栈顶,这样在标签的内部可以访问对象的属性值了。访问结束之后,会把栈顶的迭代对象移除,并把下一次迭代的对象压入栈顶。这样一直到所有的对象迭代完毕。iterator标签有三个属性:id、value和status。id属性几乎不使用,value属性用于指定迭代的集合,status属性可以获取迭代中的一个状态信息(比如索引值、是否是奇数、偶数等),其所有的方法如下:

  • public int getCount():得到迭代元素的总数
  • public int getIndex():得到当前迭代元素的索引
  • public boolean isEven():判断当前迭代的元素的顺序是否是偶数
  • public boolean isOdd():判断当前迭代的元素的顺序是否是奇数
  • public boolean isFirst():判断当前迭代的元素是否是第一个元素
  • public boolean isLast():判断当前迭代的元素是否是最后一个元素

比如下面的例子:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>iterator标签测试</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    

  </head>

  <body>
    <s:iterator value="{'刘备','张飞','关羽'}" status="s">
        <p>当前元素:<s:property /></p>
        <p>当前元素总数:<s:property value="#s.count"/></p>
        <p>当前元素索引:<s:property value="#s.index"/></p>
        <p>当前元素是否为偶数:<s:property value="#s.even"/></p>
        <p>当前元素是否是奇数:<s:property value="#s.odd"/></p>
        <p>当前元素是否是第一个数:<s:property value="#s.first"/></p>
        <p>当前元素是否是最后一个数:<s:property value="#s.last"/></p>
        <hr>
    </s:iterator>
  </body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

3、generator标签

generator标签主要是根绝分隔符对元素进行处理,该标签一般和iterator标签使用,在generator标签的内部可以使用iterator标签对处理之后的元素进行迭代,下面是一个例子:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>generator标签</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  </head>

  <body>
    <s:generator separator="," val="'刘备,张飞,关羽'">
        <s:iterator>
            <s:property/>
        </s:iterator>
    </s:generator>
  </body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

generator标签中上述的separator属性和val属性是必需的,如果指定了id属性,那么将以id属性的值作为key,将生成的迭代器保存在pageContext对象中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts 2 标签库(文档手册) Tags-API-CLSW-JSP <%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-----超链接,类似于html里的<a></a> 3. <s:action name=""></s:action>-----执行一个view里面的一个action 4. <s:actionerror/>-----如果action的errors有值那么显示出来 5. <s:actionmessage/>-----如果action的message有值那么显示出来 6. <s:append></s:append>-----添加一个值到list,类似于list.add(); 7. <s:autocompleter></s:autocompleter>-----自动完成<s:combobox>标签的内容,这个是ajax B: 1. <s:bean name=""></s:bean>-----类似于struts1.x中的,JavaBean的值 C: 1. <s:checkbox></s:checkbox>-----复选框 2. <s:checkboxlist list=""></s:checkboxlist>-----多选框 3. <s:combobox list=""></s:combobox>-----下拉框 4. <s:component></s:component>-----图像符号 D: 1. <s:date/>-----获取日期格式 2. <s:datetimepicker></s:datetimepicker>-----日期输入框 3. <s:debug></s:debug>-----显示错误信息 4. <s:div></s:div>-----表示一个块,类似于html的<div></div> 5. <s:doubleselect list="" doubleName="" doubleList=""></s:doubleselect>-----双下拉框 E: 1. <s:if test=""></s:if> 2. <s:elseif test=""></s:elseif> 3. <s:else></s:else>-----这3个标签一起使用,表示条件判断 F: 1. <s:fielderror></s:fielderror>-----显示文件错误信息 2. <s:file></s:file>-----文件上传 3. <s:form action=""></s:form>-----获取相应form的值 G: 1. <s:generator separator="" val=""></s:generator>----和<s:iterator>标签一起使用 H: 1. <s:head/>-----在<head></head>里使用,表示头文件结束 2. <s:hidden></s:hidden>-----隐藏值 I: 1. <s:i18n name=""></s:i18n>-----加载资源包到值堆栈 2. <s:include value=""></s:include>-----包含一个输出,servlet或jsp页面 3. <s:inputtransferselect list=""></s:inputtransferselect>-----获取form的一个输入 4. <s:iterator></s:iterator>-----用于遍历集合 L: 1. <s:label></s:label>-----只读的标签 M: 1. <s:merge></s:merge>-----合并遍历集合出来的值 O: 1. <s:optgroup></s:optgroup>-----获取标签组 2. <s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右选择框 P: 1. <s:param></s:param>-----为其他标签提供参数 2. <s:password></s:password>-----密码输入框 3. <s:property/>-----得到'value'的属性 4. <s:push value=""></s:push>-----value的值push到栈中,从而使property标签的能够获取value的属性 R: 1. 2. <s:radio list=""></s:radio>-----单选按钮 3. <s:reset></s:reset>-----重置按钮 S: 1. <s:select list=""></s:select>-----单选框 2. <s:set name=""></s:set>-----赋予变量一个特定范围内的值 3. <s:sort comparator=""></s:sort>-----通过属性给list分类 4. <s:submit></s:submit>-----提交按钮 5. <s:subset></s:subset>-----为遍历集合输出子集 T: 1. <s:tabbedPanel id=""></s:tabbedPanel>-----表格框 2. <s:table></s:table>-----表格 3. <s:text name=""></s:text>-----I18n文本信息 4. <s:textarea></s:textarea>-----文本域输入框 5. <s:textfield></s:textfield>-----文本输入框 6. <s:token></s:token>-----拦截器 7. <s:tree></s:tree>-----树 8. <s:treenode label=""></s:treenode>-----树的结构 U: 1. <s:updownselect list=""></s:updownselect>-----多选择框 2. <s:url></s:url>-----创建url ___________________________________________________ struts2框架标签库分为三类: 用户标签:生成HTML元素 非用户标签:数据访问、逻辑控制等。 AJAX标签:支持AJAX技术。 用户界面标签又分两类: 表单标签:生成HTML页面的from元素 非表单标签:生成页面上的Tab、Tree等 非界面标签又分为数据访问标签和流程控制标签。 控制标签: if/elseif/else标签:控制流程分支。 iteratot标签:对集合属性迭代(属性类型:List、Map、数组)。 append标签:将多个集合对象拼接在一起,组成一个新的集合。将多个集合使用一个<iterator/>标签完成迭代。 generatot标签:将指定的字符串按照规定的分隔符分解成多个子字符串。 merge标签:将多个集合拼接在一起。 subset标签:获取某个集合的子集合。 sort标签:多指定的集合元素进行排序。 数据标签: action:直接调用一个Action,根据executeResult参数,可以将Action的处理结果包含到页面中。 bean:创建一个JavaBean实例。。 date:格式化输出一个日期属性。 debug:生成一个调试链接,当单击该链接时,可以看到当前栈值中的内容。 i18n:指定国际化资源文件的baseName。 include:包含其他的页面资源。 param:设置参数。 property:输出某个值。可以输出值栈、StackContext 、ActionContext中的值。 push:将某个值放入值栈。 set:设置一个新的变量。 text:输出国际化信息。 url:生成一个URL地址。 表单标签: checkbox标签:复选框。 checkboxlist标签:根据一个集合属性创建一系列的复选框。 combobox标签:生成一个单选文本框和一个下拉列表框的组合。 doubleselect标签:生成一个相互关联的列表框,该标签由两个下拉选择框组成。 datetimepicker标签:生成一个日期、时间下拉列表框。 head标签:生成HTML页面的HEAD部分。 file标签:在页面上生成一个上传文件元素。 hidder标签:生成一个不看见的用户输入元素。 select标签:生成下拉列表框。 optiontransferselect标签:创建两个选项以及转移下拉列表项,该标签生成两个下拉列表框,同时生成相应的按钮,这些按钮可以控制选项在两个下拉列表之间移动、排序。 radio标签:单选框。 optgroup标签:生成一个下拉列表框的选择组,下拉列表框中可以包含多个选择组。 token标签:防用户多次提交表单。 textarea标签:文本域。 updownselct标签:支持选项内容的上下移动。 password表单:密码表单域。 textfield标签:单行文本输入框。 非表单标签: actionerror标签:输出Action中getActionErrors()方法返回的异常信息。 actionmessage标签:输出Action中getActionErrors()方法返回的信息。 component标签:生成一个自定义的组件。 div标签:AJAX标签,生成一个div片段。 fielderror标签:输出异常提示信息。 tabbedPanel:AJAX标签,生成HTML中的Tab页。 tree标签:生成一个树形结构。 treenode标签:生成树形结构的节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值