`

使用Struts2的标签

阅读更多
 说明:本文大部分内容翻译自struts-2.0.8-all\struts-2.0.8\docs\docs\using-tags.html,并将struts2的标签作为附录补充,标签尚有部分未补充完。

 在上篇(Hello World篇)中,我们呈现了一个简单的欢迎界面。在本篇中,我们将创建链接到应用其他Action的链接。

 Web应用程序与传统的Web站点有所不同,在Web应用程序中我们可以创建动态的返回。为了更容易的在页面上获得动态数据,本框架提供了一些标签集。其中有些标签模拟了标准的HTML标签,但是提供了一些额外功能。还有一些框架提供了非标准的、但非常有用的控制功能。

 Struts标签的一个使用是创建一个到另外的Web资源的访问链接,特别是到本地的其他资源的链接。

说明:虽然HTML为创建超链接提供了简单的标签,HTML标签常常需要我们包括一些冗余的信息。并且HTML标签不能很容易的得到本框架的动态数据。

一.             链接标签

 Web应用程序中的一个常用的功能是链接到其他页面,现在让我们为前面章节的欢迎界面添加到其他Action的链接。

二.             代码

  

显示注册与登录的jsp的代码如下:

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Welcome</title>
    <link href="<s:url value="/css/tutorial.css"/>" rel="stylesheet"
          type="text/css"/>
</head>
<body>
<h3>Commands</h3>
<ul>
    <li><a href="<s:url action="Register"/>">Register</a></li>
    <li><a href="<s:url action="Logon"/>">Sign On</a></li>
</ul>
</body>
</html>

 运行效果如下:

 

 另一个常用的功能是使用链接来改变语言,在前章的HelloWorld页面中,让我们改变用户的语言,并根据对应的应用程序资源来呈现信息。代码如下:

<body>
<h2><s:property value="message"/></h2>
<h3>Languages</h3>
<ul>
    <li>
        <s:url id="url" action="HelloWorld">
            <s:param name="request_locale">en</s:param>
        </s:url>
        <s:a href="%{url}">English</s:a>
    </li>
    <li>
        <s:url id="url" action="HelloWorld">
            <s:param name="request_locale">es</s:param>
        </s:url>
        <s:a href="%{url}">Espanol</s:a>
    </li>
</ul>
</body>

 运行效果如下:

 

一.             代码是如何工作的?

 上述例子中的“%{url}”将会被s:url标签来求得对应的值。在WelcomeHelloWorld页中,我们使用了两种不同的链接标签。我们可以创建如下标签:

l         资源链接

l         直接的链接

l         带参数的链接

 下面让我们分别看一下它们的使用:

1.       资源链接

首先在jspHEAD元素中,我们使用url标签来将资源引入到页面中,代码如下:

<link href="<s:url value="/css/tutorial.css"/>" 
  rel="stylesheet" type="text/css"/>

注意:引用时绝对的。我们可以移动该页面到其他路经而不用担心相对路径。

2.直接链接

 我们可以使用链接标签来定向到Action,实例代码如下:

<li><a href="<s:url action="Register"/>">Register</a></li>

 当链接运作的时候,链接标签能够自动追加正确的扩展,因此我们不需要在应用程序中嵌入。这个标签也将会用会话id来编码链接的URL,因此Java的会话在请求之间能够保持。

3.带有参数的链接

 在上述的有关改变语言的HelloWorld页中,我们可以使用带有参数信息的url标签来创建带有参数的链接,该段代码如下:

 <s:url id="url" action="Welcome">
 <s:param name="request_locale">en</s:param>
</s:url>
<s:a href="%{url}">English</s:a>

 param标签将会在WelcomeActionurl后增加信息:“?request_locale=en”。这个标签接着将“url”引用注入到超链接中。

 说明:通过增加param标签能够增加任意数量的标签。

二.             通配符映射

 在上述例子的Welcome页面中,除了链接之外尚未添加任何内容,我们不需要添加Action类。但是,我们仍然需要添加一个映射,以便我们可以使用action URI(如果我们向映射到action,而不是页面,我们在后面也可以很容易的添加Action类),映射代码如下:

<action name="Welcome" >
 <result>/tutorial/Welcome.jsp</result>
</action>

 当我们创建应用程序的时候,我们常常需要直接链接到页页面,为了使原型更加容易,我们可以将Welcome的进入改为通配符,修改后的映射如下:

 <action name="*" >
 <result>/tutorial/{1}.jsp</result>
</action>

 这是代码是如何工作的呢?

 如果找不到映射,本框架将会做如下工作:

l         将“Welcome”映射为星号

l         将“Welcome”代替result中对应的“{1}

 同样的,如果在映射文件中找不到“Login”的映射,将会映射到“/tutorial /Login.jsp”页面。

 说明:通配符映射能够使得你能够创建你自己的规约,以便你能够避免冗余的配置。

三.             数据输入表单

 大多数应用程序都使用一些数据进入表单。Struts标签使得输入表单更加容易,代码如下:

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
 <title>Login</title>
</head>
<body>
<s:form action="Logon"> 
  <s:textfield label="User Name" name="username"/>
 <s:password label="Password" name="password" />
 <s:submit/>
</s:form>
</body>
</html>

 执行效果如下:

 

 代码是如何工作的呢?

l         JSP标签在页面顶部引入了Struts的标签库

l         Struts标签:textfieldpasswordsubmit,每一个都写出了正确的Lable和控制类型

四.             需要记住的东西

 编写web应用程序的最难的一部分是编写页面。本框架通过提供一系列的Struts标签使得编写页面更加容易。Struts标签能够获得框架提供的动态数据。标签减少了用来创建页面所需做的工作。

                                                                                               附录一

——标签使用指南

一.             通用标签

 通用标签被用来在页面执行的时候,来控制执行流。这些标签同样允许数据不是从Action或者值栈中提取,例如本地化、JavaBeans、包括额外的URLaction执行。

l         控制类标签提供了控制流,例如ifelseiterator

l         数据类标签允许数据操作或创建,例如beanpushi18n

 控制类标签有ifelseIf elseappendgeneratoriteratormergesortsubset

 数据类标签有aactionbeandatedebugi18nincludeparampushsettexturlproperty

 分别介绍如下:

1.       控制类标签

1ifelseifelse

描述:执行基本的控制流,if能单独使用,也可与elseelseif标签搭配使用。

参数:

名称

必选

默认值

求值

类型

描述

id

 

String

id用来引用元素。对于UI或者form标签,它的意义等同于HTMLid属性

test

 

Boolean

用来决定标签体师是否显示的表达式

使用举例:

<s:if test="%{false}">
    <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
    <div>Will Be Executed</div>
</s:elseif>
<s:else>
    <div>Will Not Be Executed</div>
</s:else>

2append

该标签的工作是追加迭代器来,

例如,如果有三个迭代器(每个迭代器有三个元素)需要追加,下面展示了这个追加迭代器是如何排列的。

   首先是进入第一个迭代器的第一个元素;

   第二步是进入第一个迭代器的第二个元素;

   第三步是进入第一个迭代器的第三个元素;

   第四步是进入第二个迭代器的第一个元素;

   第五步是进入第二个迭代器的第二个元素;

   第六步是进入第二个迭代器的第三个元素;

   第七步是进入第三个迭代器的第一个元素;

   第八步是进入第三个迭代器的第二个元素;

   第九步是进入第三个迭代器的第三个元素。

参数:

名称

必选

默认值

求值

类型

描述

id

 

String

如果提供了该id的值,将会具有追加迭代器存储到堆栈上下文中的合成结果

使用举例:

Action类的代码:


public class AppendIteratorTagAction extends ActionSupport {
 
private List myList1;
 
private List myList2;
 
private List myList3;
 
 
 
public String execute() throws Exception {
     myList1 
= new ArrayList();
     myList1.add(
"1");
     myList1.add(
"2");
     myList1.add(
"3");
 
     myList2 
= new ArrayList();
     myList2.add(
"a");
     myList2.add(
"b");
     myList2.add(
"c");
 
     myList3 
= new ArrayList();
     myList3.add(
"A");
     myList3.add(
"B");
     myList3.add(
"C");
 
     
return "done";
 }

 
 
public List getMyList1() return myList1; }
 
public List getMyList2() return myList2; }
 
public List getMyList3() return myList3; }

 jsp页面的代码:

 <s:append id="myAppendIterator">
     <s:param value="%{myList1}" />
     <s:param value="%{myList2}" />
     <s:param value="%{myList3}" />
</s:append>
<s:iterator value="%{#myAppendIterator}">
     <s:property />
</s:iterator>

 3generator

 描述:创建一个基于提供的值的迭代器。

   注意:产生的迭代器将常常被推入堆栈顶部,而在标签结束的时候被推出。

 参数:

名称

必选

默认值

求值

类型

描述

converter

 

org.apache.struts2.util.IteratorGenerator.Converter

将从值中分析的字符串转换为一个对象的转换器

count

 

Integer

在迭代器中的最大值

id

 

String

如果提供了id,它将会用来存储产生的迭代器到页面上下文

separator

 

String

分隔符用来将迭代器中的值分开

val

 

String

用来解析成迭代器的源

 举例:

 1:
<pre>
例一:
产生一个简单的迭代器
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>
</pre>
这里产生了一个迭代器,并且使用iterator标签将它打印出来
例二:
<pre>
产生一个带有count属性的迭代器
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>
</pre>
这里产生了一个迭代器,但是只有其中的三个元素是可用的,这三个分别是aaabbbccc
例三:
<pre>
产生一个带有id属性的迭代器
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" />
<%
 Iterator i = (Iterator) pageContext.getAttribute("myAtt");
 while(i.hasNext()) {
     String s = (String) i.next(); %>
     <%=s%> <br/>
<%    }
%>
</pre>
产生了一个迭代器,并且将它存入页面上下文的指定的idmyAtt)属性中。
例四:
<pre>
带有converter属性的generator标签
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>
public class GeneratorTagAction extends ActionSupport {
 ....
 public Converter getMyConverter() {
     return new Converter() {
         public Object convert(String value) throws Exception {
             return "converter-"+value;
         }
     };
 }
 ...
}
</pre>
产生的这个迭代器,它的每个元素由提供的转换器获得。在这个转换器中,只是为每个元素增加了“converter-”。
this converter, it simply add "converter-" to each entries.

 4iterator

 描述:迭代器将会迭代值。一个可迭代的值可以是java.util.Collection,也可以是java.util.Iterator

 参数:

名称

必选

默认值

求值

类型

描述

id

 

String

id用来引用元素。对于UI和表单标签,它与HTMLid标签相当

status

Boolean

如果该值被指定,一个迭代状态的实例将会在每一个迭代中被推入堆栈中

value

 

String

用来进行迭代的迭代源,否则对象本身将会被放入新的产生的列表中

 举例:

 下面的例子取回在值栈中的当前对象的getDays()所返回的值,<s:property/>标签打印出当前迭代器的值,代码如下:

<s:iterator value="days">

 <p>day is: <s:property/></p>

</s:iterator>

   在下面的例子中使用Bean标签并且将它存入ActionContext中。iterator标签将会从ActionContext中取回对象而后调用它的getDays()方法。状态属性常常用来创建IteratorStatus对象,在这个例子中,它的odd()方法用来改变行的颜色。

<s:bean name="org.apache.struts2.example.IteratorExample" id="it">
 <s:param name="day" value="'foo'"/>
 <s:param name="day" value="'bar'"/>
</s:bean>
<p/>
<table border="0" cellspacing="0" cellpadding="1">
<tr>
 <th>Days of the week</th>
</tr>
<p/>
<s:iterator value="#it.days" status="rowstatus">
 <tr>
    <s:if test="#rowstatus.odd == true">
      <td style="background: grey"><s:property/></td>
    </s:if>
    <s:else>
      <td><s:property/></td>
    </s:else>
 </tr>
</s:iterator>
</table>

 下个例子将进一步展示status属性的使用,使用通过OGNLaction类取得的DAO,成员的迭代以及它们的使用(在安全的上下文中),last()方法中指明了当当前的对象是迭代器的最后一个可用的对象,如果不是,我们需要使用逗号来分隔用户,代码如下:

<s:iterator value="groupDao.groups" status="groupStatus">
     <tr class="<s:if test="#groupStatus.odd == true ">odd</s:if><s:else>even</s:else>">
         <td><s:property value="name" /></td>
         <td><s:property value="description" /></td>
         <td>
             <s:iterator value="users" status="userStatus">
                 <s:property value="fullName" /><s:if test="!#userStatus.last">,</s:if>
             </s:iterator>
         </td>
     </tr>
 </s:iterator>

 下一个例子在一个action collection上迭代,并且将每一个迭代的值传给另一个action。这里的诀窍在于使用”[0]”。它获得当前的值并且将值传入edit action。使用”[0]”与使用<s:property/>具有相同的效果(但是,后者,在param标签内部不起作用)。代码如下所示:

<s:action name="entries" id="entries"/>
     <s:iterator value="#entries.entries" >
         <s:property value="name" />
         <s:property />
         <s:push value="...">
             <s:action name="edit" id="edit" >
                 <s:param name="entry" value="[0]" />
             </s:action>
         </push>
     </s:iterator>

  下例使用iterator标签来模拟一个简单的循环,循环了5次,代码如下:

<s:iterator status="stat" value="{1,2,3,4,5}" >
   <!—获得当前的index(从0开始) -->
   <s:property value="#stat.index" />
 
   <!— 获得当前堆栈的值 -->
   <!—当前的迭代值(0, 1, ... 5) -->
   <s:property value="top" />
</s:iterator>

5merge

  描述:它是MergeIterator标签的组件,它的工作是合并迭代器和对合并后的迭代器的后续调用,它将使得每一个合并的迭代器有机会展示它的元素,接着下一个调用将会允许下一个迭代器来展示它的元素。一旦最后一个迭代器已展示完它的所有元素,第一个迭代器又能够开始展示它的元素(除非元素已经用尽)。

 从内部来说,任务将委托给MergeIteratorFilter去做。

 下面展示了3个列表的合并,其中每个列表有3个元素,步骤如下:

1. 展示第一个列表的第一个元素;

2. 展示第二个列表的第一个元素;

3. 展示第三个列表的第一个元素;

4. 展示第一个列表的第二个元素;

5. 展示第二个列表的第二个元素;

6. 展示第三个列表的第二个元素;

7. 展示第一个列表的第三个元素;

8. 展示第二个列表的第三个元素;

9. 展示第三个列表的第三个元素;

 参数:

名称

必选

默认值

求值

类型

描述

id

 

String

合并后的迭代器的值将会存储在堆栈上下文的id

 举例:

 Action类代码:

public class MergeIteratorTagAction extends ActionSupport {
 
 private List myList1;
 private List myList2;
 private List myList3;
 
 public List getMyList1() {
     return myList1;
 }
 
 public List getMyList2() {
     return myList2;
 }
 
 public List getMyList3() {
     return myList3;
 }
 
 
 public String execute() throws Exception {
 
     myList1 = new ArrayList();
     myList1.add("1");
     myList1.add("2");
     myList1.add("3");
 
     myList2 = new ArrayList();
     myList2.add("a");
     myList2.add("b");
     myList2.add("c");
 
     myList3 = new ArrayList();
     myList3.add("A");
     myList3.add("B");
     myList3.add("C");
 
     return "done";
 }
}

 jsp页代码:

<s:merge id="myMergedIterator1">
     <s:param value="%{myList1}" />
     <s:param value="%{myList2}" />
     <s:param value="%{myList3}" />
</s:merge>
<s:iterator value="%{#myMergedIterator1}">
     <s:property />
</s:iterator>

 

二.             UI标签

 

三.             主题与模板标签

 

四.             标签引用

 

五.             Ajax标签

分享到:
评论

相关推荐

    使用Struts 2标签的注意事项

    Struts 2 标签的使用注意事项 Struts 2 是一个基于MVC架构的Java Web应用程序框架,它提供了一系列的标签来简化Web开发。然而,在使用Struts 2标签时,需要注意一些重要的事项。 首先,在使用Struts 2标签之前,...

    struts2标签使用例子

    在压缩包中的"example"文件可能包含了一个或多个使用Struts2标签的实际示例,可以参考这些示例来理解和学习Struts2标签的用法。通过实践,你会更好地掌握这些标签的功能和用法,从而在开发过程中更加得心应手。

    struts2官方例子3--使用Struts2标签

    本教程将深入讲解Struts2官方例子3,主要关注如何使用Struts2提供的标签。 一、Struts2标签库概述 Struts2的标签库是基于JSP标准标签库(JSTL)的扩展,提供了丰富的标签来处理表单、验证、国际化等功能。这些标签...

    struts2标签库例子

    下面,我们将详细介绍 Struts2 标签库的使用。 4.1 通用标签 通用标签用来控制页面的执行过程,并从 Action 或值堆栈中取得数据。这些标签可以分为控制标签、数据标签和其他标签。 控制标签用来控制程序的执行,...

    Struts2标签使用及API文档

    `struts2标签用法.doc`和`标签详解`文件可能包含更深入的标签用法和实例,例如如何使用`s:form`创建表单,如何利用`s:action`执行Action,以及如何使用`s:debug`标签进行调试等。 5. **Struts2标签的高级用法** -...

    struts2标签使用方法

    Struts2 标签使用方法 Struts2 标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,Struts2 的主题、模板都提供了很好的扩展性。Struts2 允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂...

    struts-tags.tld Eclipse使用struts2标签库tld文件

    Eclipse使用struts2标签库tld文件

    struts2标签库

    在使用Struts2标签库前,需要在JSP页面中引入相应的标签库,通常使用`&lt;%@taglib&gt;`指令,如`&lt;%@taglib uri="/struts-tags" prefix="s"%&gt;`。对于Servlet2.3之前的版本,可能还需要在web.xml中配置标签库的定义,但...

    基于struts2 自定义标签 分页

    在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...

    struts2标签库及国际化的使用例子

    Struts2 标签库及国际化的使用案例 Struts2 框架提供了强大的标签库和国际化功能,本实验旨在掌握 Struts 2 标签库和国际化功能的使用,并实现用户注册页面的国际化显示。 一、Struts2 标签库 Struts2 框架提供了...

    Struts 2标签的应用

    利用Struts 2标签创建ex3.jsp页面,此页面提交给tag.action,在structs.xml中配置这个action的转发视图为result.jsp在result.jsp页面中显示ex3.jsp页面控件的值。(源代码和实验报告)

    struts2标签+ tiles lib

    本文将深入探讨Struts2标签和Tiles库的使用,以及它们在实际开发中的应用。 1. **Struts2标签** Struts2提供了丰富的标签库,这些标签使得开发者能够在JSP页面中方便地实现业务逻辑和控制流程。例如: - `s:...

    一个用struts2写的注册登录的页面

    4. **Struts2的标签库**:掌握如何在JSP页面中使用Struts2标签,例如表单标签、数据绑定和错误处理。 5. **数据验证**:学习使用Struts2的内置验证框架,或者自定义验证规则,确保用户输入的有效性。 6. **Session...

    struts2 标签 tags API 参考文档

    参考文档是开发者理解和使用Struts2标签的关键资源,它详细阐述了每个标签的功能、属性、用法及示例,有助于快速学习和掌握Struts2的视图层开发。 通过深入学习和实践Struts2的标签API,开发者可以有效地提升Web...

    struts2标签库struts2标签库struts2标签库

    在Struts2标签库中,还有许多其他的标签,如、、等,每个标签都有其特定的使用场景和应用。 Struts2标签库提供了一系列的标签,帮助开发者快速构建Web应用程序,并提高了开发效率。但是,为了充分发挥Struts2标签库...

    Struts标签库 Struts 标签库

    下面将详细阐述Struts2标签库的使用、功能和优势。 1. **Struts2标签库介绍** Struts2框架中的标签库是基于JSP标准标签库(JSTL)的扩展,它提供了一系列与动作、结果、表单和国际化相关的标签。这些标签能够帮助...

    struts2标签api

    在使用Struts2标签API时,需要注意以下几点: - 标签的命名空间:通常以`s:`开头,表示它是Struts2提供的标签。 - 动态属性:很多标签都支持动态属性,允许我们根据Action类的状态动态设置属性值。 - 表单标签的...

    struts2标签的使用代码

    在本文中,我们将深入探讨如何使用Struts2标签来实现迭代输出、表格美化、集合输出以及日期树节点标签的使用。 1. 迭代输出 在Struts2中,`&lt;s:iterator&gt;`标签是最常用的迭代标签,用于遍历集合或数组。例如,你可以...

Global site tag (gtag.js) - Google Analytics