Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 235|回复: 0

[struts学习]Struts2学习进阶:使用Struts2的标签

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 05:12:13 | 显示全部楼层 |阅读模式
      说明:本文大部分内容翻译自struts-
         
          2.0.8
          -allstruts-2.0.8docsdocsusing-tags.HTML,并将struts2的标签作为附录补充,标签尚有部分未补充完。       在上篇(Hello World)中,我们呈现了一个简单的欢迎界面。在本篇中,我们将创建链接到应用其他Action的链接。        Web应用程序与传统的Web站点有所不同,在Web应用程序中我们可以创建动态的返回。为了更容易的在页面上获得动态数据,本框架提供了一些标签集。其中有些标签模拟了标准的HTML标签,但是提供了一些额外功能。还有一些框架提供了非标准的、但非常有用的控制功能。  Struts标签的一个使用是创建一个到另外的Web资源的访问链接,特别是到本地的其他资源的链接。
      
       
       
         
       

         
       
      


         说明:虽然HTML为创建超链接提供了简单的标签,HTML标签常常需要我们包括一些冗余的信息。并且HTML标签不能很容易的得到本框架的动态数据。
    一.链接标签
         在Web应用程序中的一个常用的功能是链接到其他页面,现在让我们为前面章节的欢迎界面添加到其他Action的链接。
    代码
    显示注册与登录的jsp的代码如下:
    1. <%@ taglib prefix="s" uri="/struts-tags" %>
    复制代码

    1. <html>
    复制代码

    1. <head>
    复制代码

    1.     <title>Welcome</title>
    复制代码

    1.     <link href="<s:url value="/css/tutorial.css"/>" rel="stylesheet"
    复制代码

    1.           type="text/css"/>
    复制代码

    1. </head>
    复制代码

    1. <body>
    复制代码

    1. <h3>Commands</h3>
    复制代码

    1. <ul>
    复制代码

    1.     <li><a href="<s:url action="Register"/>">Register</a></li>
    复制代码

    1.     <li><a href="<s:url action="Logon"/>">Sign On</a></li>
    复制代码

    1. </ul>
    复制代码

    1. </body>
    复制代码

    1. </html>
    复制代码

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

    1. <h2><s:property value="message"/></h2>
    复制代码

    1. <h3>Languages</h3>
    复制代码

    1. <ul>
    复制代码

    1.     <li>
    复制代码

    1.         <s:url id="url" action="HelloWorld">
    复制代码

    1.             <s:param name="request_locale">en</s:param>
    复制代码

    1.         </s:url>
    复制代码

    1.         <s:a href="%{url}">English</s:a>
    复制代码

    1.     </li>
    复制代码

    1.     <li>
    复制代码

    1.         <s:url id="url" action="HelloWorld">
    复制代码

    1.             <s:param name="request_locale">es</s:param>
    复制代码

    1.         </s:url>
    复制代码

    1.         <s:a href="%{url}">Espanol</s:a>
    复制代码

    1.     </li>
    复制代码

    1. </ul>
    复制代码

    1. </body>
    复制代码

      运行效果如下:
      
    代码是如何工作的?
      上述例子中的“%{url}”将会被s:url标签来求得对应的值。在Welcome和HelloWorld页中,我们使用了两种不同的链接标签。我们可以创建如下标签:
       资源链接     直接的链接      带参数的链接
      下面让我们分别看一下它们的使用:
    1. 资源链接
    首先在jsp的HEAD元素中,我们使用url标签来将资源引入到页面中,代码如下:
    1. <link href="<s:url value="/css/tutorial.css"/>"
    复制代码

    1.   rel="stylesheet" type="text/css"/>
    复制代码

    注意:引用时绝对的。我们可以移动该页面到其他路经而不用担心相对路径。
    2.直接链接
      我们可以使用链接标签来定向到Action,实例代码如下:
    1. <li><a href="<s:url action="Register"/>">Register</a></li>
    复制代码

      当链接运作的时候,链接标签能够自动追加正确的扩展,因此我们不需要在应用程序中嵌入。这个标签也将会用会话id来编码链接的URL,因此java的会话在请求之间能够保持。
    3.带有参数的链接
      在上述的有关改变语言的HelloWorld页中,我们可以使用带有参数信息的url标签来创建带有参数的链接,该段代码如下:
    1. <s:url id="url" action="Welcome">
    复制代码

    1. <s:param name="request_locale">en</s:param>
    复制代码

    1. </s:url>
    复制代码

    1. <s:a href="%{url}">English</s:a>
    复制代码

      param标签将会在Welcome的Action的url后增加信息:“?request_locale=en”。这个标签接着将“url”引用注入到超链接中。
      说明:通过增加param标签能够增加任意数量的标签。
    二.  通配符映射
      在上述例子的Welcome页面中,除了链接之外尚未添加任何内容,我们不需要添加Action类。但是,我们仍然需要添加一个映射,以便我们可以使用action URI(如果我们映射到action,而不是页面,我们在后面也可以很容易的添加Action类),映射代码如下:
    1. <action name="Welcome" >
    复制代码

    1. <result>/tutorial/Welcome.jsp</result>
    复制代码

    1. </action>
    复制代码

      当我们创建应用程序的时候,我们常常需要直接链接到页页面,为了使原型更加容易,我们可以将Welcome的进入改为通配符,修改后的映射如下:
    1. <action name="*" >
    复制代码

    1. <result>/tutorial/{1}.jsp</result>
    复制代码

    1. </action>
    复制代码

      这是代码是如何工作的呢?
      如果找不到映射,本框架将会做如下工作:
         将“Welcome”映射为星号
         l将“Welcome”代替result中对应的“{1}”
      同样的,如果在映射文件中找不到“Login”的映射,将会映射到“/tutorial /Login.jsp”页面。
      说明:通配符映射能够使得你能够创建你自己的规约,以便你能够避免冗余的配置。
    三.数据输入表单
      大多数应用程序都使用一些数据进入表单。Struts标签使得输入表单更加容易,代码如下:
    1. <%@ taglib prefix="s" uri="/struts-tags" %>
    复制代码

    1. <html>
    复制代码

    1. <head>
    复制代码

    1. <title>Login</title>
    复制代码

    1. </head>
    复制代码

    1. <body>
    复制代码

    1. <s:form action="Logon">
    复制代码

    1.   <s:textfield label="User Name" name="username"/>
    复制代码

    1. <s:password label="Password" name="password" />
    复制代码

    1. <s:submit/>
    复制代码

    1. </s:form>
    复制代码

    1. </body>
    复制代码

    1. </html>
    复制代码

      执行效果如下:
      
      代码是如何工作的呢?
        JSP标签在页面顶部引入了Struts的标签库
         Struts标签:textfield、password和submit,每一个都写出了正确的Lable和控制类型
    四.需要记住的东西
      编写web应用程序的最难的一部分是编写页面。本框架通过提供一系列的Struts标签使得编写页面更加容易。Struts标签能够获得框架提供的动态数据。标签减少了用来创建页面所需做的工作。
                                                                                                   附录一
    ――标签使用指南
    一.  通用标签
      通用标签被用来在页面执行的时候,来控制执行流。这些标签同样允许数据不是从Action或者值栈中提取,例如本地化、JavaBeans、包括额外的URL或action执行。
         控制类标签提供了控制流,例如if,else和iterator
         数据类标签允许数据操作或创建,例如bean、push和i18n
      控制类标签有if、elseIf、 else、append、generator、iterator、merge、sort、subset。
      数据类标签有a、action、bean、date、debug、i18n、include、param、push、set、text、url、property。
      分别介绍如下:
    1. 控制类标签
    1)if、elseif和else
    描述:执行基本的控制流,if能单独使用,也可与else、elseif标签搭配使用。
    参数:
      
       
       
        名称
        必选
        默认值
        求值
        类型
        描述
       
       
        id
        否
          
        是
        String
        id用来引用元素。对于UI或者form标签,它的意义等同于HTML的id属性
       
       
        test
        是
          
        是
        Boolean
        用来决定标签体是否显示的表达式
       
       
      
    使用举例:
    1. <s:if test="%{false}">
    复制代码

    1.     <div>Will Not Be Executed</div>
    复制代码

    1. </s:if>
    复制代码

    1. <s:elseif test="%{true}">
    复制代码

    1.     <div>Will Be Executed</div>
    复制代码

    1. </s:elseif>
    复制代码

    1. <s:else>
    复制代码

    1.     <div>Will Not Be Executed</div>
    复制代码

    1. </s:else>
    复制代码

    2)append
    该标签的工作是追加迭代器,
    例如,如果有三个迭代器(每个迭代器有三个元素)需要追加,下面展示了这个追加迭代器是如何排列的。
        首先是进入第一个迭代器的第一个元素;
        第二步是进入第一个迭代器的第二个元素;
        第三步是进入第一个迭代器的第三个元素;
        第四步是进入第二个迭代器的第一个元素;
        第五步是进入第二个迭代器的第二个元素;
        第六步是进入第二个迭代器的第三个元素;
        第七步是进入第三个迭代器的第一个元素;
        第八步是进入第三个迭代器的第二个元素;
        第九步是进入第三个迭代器的第三个元素。
    参数:
      
       
       
        名称
        必选
        默认值
        求值
        类型
        描述
       
       
        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页面的代码:
    1. <s:append id="myAppendIterator">
    复制代码

    1.      <s:param value="%{myList1}" />
    复制代码

    1.      <s:param value="%{myList2}" />
    复制代码

    1.      <s:param value="%{myList3}" />
    复制代码

    1. </s:append>
    复制代码

    1. <s:iterator value="%{#myAppendIterator}">
    复制代码

    1.      <s:property />
    复制代码

    1. </s:iterator>
    复制代码

      3)generator
      描述:创建一个基于提供的值的迭代器。
        注意:产生的迭代器将常常被推入堆栈顶部,而在标签结束的时候被推出。
      参数:
      
       
       
        名称
        必选
        默认值
        求值
        类型
        描述
       
       
        converter
        否
          
        是
        org.apache.struts2.util.IteratorGenerator.Converter
        将从值中分析的字符串转换为一个对象的转换器
       
       
        count
        否
          
        是
        Integer
        在迭代器中的最大值
       
       
        id
        否
          
        是
        String
        如果提供了id,它将会用来存储产生的迭代器到页面上下文
       
       
        separator
        是
          
        是
        String
        分隔符用来将迭代器中的值分开
       
       
        val
        是
          
        是
        String
        用来解析成迭代器的源
       
       
      
      举例:
    1. 例1:
    复制代码

    1. <pre>
    复制代码

    1. 例一:
    复制代码

    1. 产生一个简单的迭代器
    复制代码

    1. <s:generator val="%{"aaa,bbb,ccc,ddd,eee"}">
    复制代码

    1. <s:iterator>
    复制代码

    1.      <s:property /><br/>
    复制代码

    1. </s:iterator>
    复制代码

    1. </s:generator>
    复制代码

    1. </pre>
    复制代码

    1. 这里产生了一个迭代器,并且使用iterator标签将它打印出来
    复制代码

    1. 例二:
    复制代码

    1. <pre>
    复制代码

    1. 产生一个带有count属性的迭代器
    复制代码

    1. <s:generator val="%{"aaa,bbb,ccc,ddd,eee"}" count="3">
    复制代码

    1. <s:iterator>
    复制代码

    1.      <s:property /><br/>
    复制代码

    1. </s:iterator>
    复制代码

    1. </s:generator>
    复制代码

    1. </pre>
    复制代码

    1. 这里产生了一个迭代器,但是只有其中的三个元素是可用的,这三个分别是aaa、bbb和ccc
    复制代码

    1. 例三:
    复制代码

    1. <pre>
    复制代码

    1. 产生一个带有id属性的迭代器
    复制代码

    1. <s:generator val="%{"aaa,bbb,ccc,ddd,eee"}" count="4" separator="," id="myAtt" />
    复制代码

    1. <%
    复制代码

    1. Iterator i = (Iterator) pageContext.getAttribute("myAtt");
    复制代码

    1. while(i.hasNext()) {
    复制代码

    1.      String s = (String) i.next(); %>
    复制代码

    1.      <%=s%> <br/>
    复制代码

    1. <%    }%>
    复制代码

    1. </pre>
    复制代码

    1. 产生了一个迭代器,并且将它存入页面上下文的指定的id(myAtt)属性中。
    复制代码

    1. 例四:
    复制代码

    1. <pre>
    复制代码

    1. 带有converter属性的generator标签
    复制代码

    1. <s:generator val="%{"aaa,bbb,ccc,ddd,eee"}" converter="%{myConverter}">
    复制代码

    1. <s:iterator>
    复制代码

    1.      <s:property /><br/>
    复制代码

    1. </s:iterator>
    复制代码

    1. </s:generator>
    复制代码

    1. public class GeneratorTagAction extends ActionSupport {
    复制代码

    1. ....
    复制代码

    1. public Converter getMyConverter() {
    复制代码

    1.      return new Converter() {
    复制代码

    1.          public Object convert(String value) throws Exception {
    复制代码

    1.              return "converter-"+value;
    复制代码

    1.          }
    复制代码

    1.      };
    复制代码

    1. }
    复制代码

    1. ...
    复制代码

    1. }
    复制代码

    1. </pre>
    复制代码

    1. 产生的这个迭代器,它的每个元素由提供的转换器获得。在这个转换器中,只是为每个元素增加了“converter-”。
    复制代码

    1. this converter, it simply add "converter-" to each entries.
    复制代码

      4)iterator
      描述:迭代器将会迭代值。一个可迭代的值可以是java.util.Collection,也可以是java.util.Iterator。
      参数:
      
       
       
        名称
        必选
        默认值
        求值
        类型
        描述
       
       
        id
        否
          
        是
        String
        id用来引用元素。对于UI和表单标签,它与HTML的id标签相当
       
       
        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()方法用来改变行的颜色。
    1. <s:bean name="org.apache.struts2.example.IteratorExample" id="it">
    复制代码

    1. <s:param name="day" value=""foo""/>
    复制代码

    1. <s:param name="day" value=""bar""/>
    复制代码

    1. </s:bean>
    复制代码

    1. <p/>
    复制代码

    1. <table border="0" cellspacing="0" cellpadding="1">
    复制代码

    1. <tr>
    复制代码

    1. <th>Days of the week</th>
    复制代码

    1. </tr>
    复制代码

    1. <p/>
    复制代码

    1. <s:iterator value="#it.days" status="rowstatus">
    复制代码

    1. <tr>
    复制代码

    1.     <s:if test="#rowstatus.odd == true">
    复制代码

    1.       <td style="background: grey"><s:property/></td>
    复制代码

    1.     </s:if>
    复制代码

    1.     <s:else>
    复制代码

    1.       <td><s:property/></td>
    复制代码

    1.     </s:else>
    复制代码

    1. </tr>
    复制代码

    1. </s:iterator>
    复制代码

    1. </table>
    复制代码

      下个例子将进一步展示status属性的使用,使用通过OGNL从action类取得的DAO,成员的迭代以及它们的使用(在安全的上下文中),last()方法中指明了当当前的对象是迭代器的最后一个可用的对象,如果不是,我们需要使用逗号来分隔用户,代码如下:
    1. <s:iterator value="groupDao.groups" status="groupStatus">
    复制代码

    1.      <tr class="<s:if test="#groupStatus.odd == true ">odd</s:if><s:else>even</s:else>">
    复制代码

    1.          <td><s:property value="name" /></td>
    复制代码

    1.          <td><s:property value="description" /></td>
    复制代码

    1.          <td>
    复制代码

    1.              <s:iterator value="users" status="userStatus">
    复制代码

    1.                  <s:property value="fullName" /><s:if test="!#userStatus.last">,</s:if>
    复制代码

    1.              </s:iterator>
    复制代码

    1.          </td>
    复制代码

    1.      </tr>
    复制代码

    1. </s:iterator>
    复制代码

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

    1.      <s:iterator value="#entries.entries" >
    复制代码

    1.          <s:property value="name" />
    复制代码

    1.          <s:property />
    复制代码

    1.          <s:push value="...">
    复制代码

    1.              <s:action name="edit" id="edit" >
    复制代码

    1.                  <s:param name="entry" value="[0]" />
    复制代码

    1.              </s:action>
    复制代码

    1.          </push>
    复制代码

    1.      </s:iterator>
    复制代码

       下例使用iterator标签来模拟一个简单的循环,循环了5次,代码如下:
    1. <s:iterator status="stat" value="{1,2,3,4,5}" >
    复制代码

    1.    <!―获得当前的index(从0开始) -->
    复制代码

    1.    <s:property value="#stat.index" />
    复制代码

    复制代码

    1.    <!― 获得当前堆栈的值 -->
    复制代码

    1.    <!―当前的迭代值(0, 1, ... 5) -->
    复制代码

    1.    <s:property value="top" />
    复制代码

    1. </s:iterator>
    复制代码

    5)merge
       描述:它是MergeIterator标签的组件,它的工作是合并迭代器和对合并后的迭代器的后续调用,它将使得每一个合并的迭代器有机会展示它的元素,接着下一个调用将会允许下一个迭代器来展示它的元素。一旦最后一个迭代器已展示完它的所有元素,第一个迭代器又能够开始展示它的元素(除非元素已经用尽)。
      从内部来说,任务将委托给MergeIteratorFilter去做。
      下面展示了3个列表的合并,其中每个列表有3个元素,步骤如下:
    1. 展示第一个列表的第一个元素;
    2. 展示第二个列表的第一个元素;
    3. 展示第三个列表的第一个元素;
    4. 展示第一个列表的第二个元素;
    5. 展示第二个列表的第二个元素;
    6. 展示第三个列表的第二个元素;
    7. 展示第一个列表的第三个元素;
    8. 展示第二个列表的第三个元素;
    9. 展示第三个列表的第三个元素;
      参数:
      
       
       
        名称
        必选
        默认值
        求值
        类型
        描述
       
       
        id
        否
          
        是
        String
        合并后的迭代器的值将会存储在堆栈上下文的id
       
       
      
      举例:
      Action类代码:
    1. public class MergeIteratorTagAction extends ActionSupport {
    复制代码

    1. private List myList1;
    复制代码

    1. private List myList2;
    复制代码

    1. private List myList3;
    复制代码

    1. public List getMyList1() {
    复制代码

    1.      return myList1;
    复制代码

    1. }
    复制代码

    1. public List getMyList2() {
    复制代码

    1.      return myList2;
    复制代码

    1. }
    复制代码

    1. public List getMyList3() {
    复制代码

    1.      return myList3;
    复制代码

    1. }
    复制代码

    1. public String execute() throws Exception {
    复制代码

    1.      myList1 = new ArrayList();
    复制代码

    1.      myList1.add("1");
    复制代码

    1.      myList1.add("2");
    复制代码

    1.      myList1.add("3");
    复制代码

    1.      myList2 = new ArrayList();
    复制代码

    1.      myList2.add("a");
    复制代码

    1.      myList2.add("b");
    复制代码

    1.      myList2.add("c");
    复制代码

    1.      myList3 = new ArrayList();
    复制代码

    1.      myList3.add("A");
    复制代码

    1.      myList3.add("B");
    复制代码

    1.      myList3.add("C");
    复制代码

    1.      return "done";
    复制代码

    1. }
    复制代码

    1. }
    复制代码

      jsp页代码:
    1. <s:merge id="myMergedIterator1">
    复制代码

    1.      <s:param value="%{myList1}" />
    复制代码

    1.      <s:param value="%{myList2}" />
    复制代码

    1.      <s:param value="%{myList3}" />
    复制代码

    1. </s:merge>
    复制代码

    1. <s:iterator value="%{#myMergedIterator1}">
    复制代码

    1.      <s:property />
    复制代码

    1. </s:iterator>
    复制代码

    二.             UI标签
    三.             主题与模板标签
    四.             标签引用
    五.             Ajax标签
    六.             标签语法

      



      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 07:15 , Processed in 0.391354 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表