zoukankan      html  css  js  c++  java
  • 论 <%@taglib prefix="s" uri="/struts-tags" %> 的重要性

    前段时间在做项目的时候,碰到这个问题

    结果是相应的内容显示不出来,原来是忘了这句很关键的引入:<%@taglib prefix="s" uri="/struts-tags" %>

    1,Struts2只有一个标签库s

    引入它的方式为:<%@taglib prefix="s" uri="/struts-tags"%>

    Struts2的标签不依赖于任何表现层技术,也就是说,Struts2提供的大部分标签,可以在各种表现层技术中使用,包括最常用的JSP页面,也可以在Velocity和FreeMarker等模块技术中使用。

    2、Struts2的控制标签用法介绍

    控制标签可以完成输出流程控制,例如分支,循环等操作,也可以完成对集合的合并,排序等操作。

    1,if/elseif/else标签

    只有if标签可以单独使用,其它两个要与if组合才能使用。

     1 contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>s:if标签测试</title>
     6 </head>
     7 <body>
     8 <s:set name="age" value="29"/>
     9 <s:if test="${age > 60}">
    10     老年人
    11 </s:if>
    12 <s:elseif test="${age > 35}">
    13     中年人
    14 </s:elseif>
    15 <s:elseif test="${age > 15}" id="wawa">
    16 青年人
    17 </s:elseif>
    18 <s:else>
    19     少年
    20 </s:else>
    21 </body>
    22 </html>

    2,iterator标签

         iterator迭代List代码如下:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:itertor标签迭代List</title>
     6 </head>
     7 <body>
     8 <table border="1" width="200">
     9 <s:iterator value="{'Spring2.0','J2EE','Ajax'}" id="name"> 
    10 <tr>
    11    <td><s:property value="#st.count"/><s:property value="name"/></td>
    12 </tr>
    13 </s:iterator>
    14 </table>
    15 </body>
    16 </html>

       还可以在迭代时根据迭代元素的属性来进行更多的控制。看如下代码:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:itertor标签迭代List</title>
     6 </head>
     7 <body>
     8 <table border="1" width="200">
     9 <s:iterator value="{'Spring2.0','J2EE','Ajax'}" id="name" status="st"> 
    10 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    11    <td><s:property value="name"/></td>
    12 </tr>
    13 </s:iterator>
    14 </table>
    15 </body>
    16 </html>

       iterator迭代Map代码如下:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:itertor标签迭代Map</title>
     6 </head>
     7 <body>
     8 <table border="1" width="240">
     9 <tr>
    10    <th>书名</th>
    11    <th>作者</th>
    12 </tr>
    13 <s:iterator value="#{'Spring2.0:'李' , 'J2EE':'李','Ajax':'李'}" id="score" status="st">
    14 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    15    <td><s:property value="key"/></td>
    16    <td><s:property value="value"/></td>
    17 </tr>
    18 </s:iterator>
    19 </table>
    20 </body>
    21 </html>

       append标签

       append标签可以将多个集合对象拼接起来,组成一个新的集合。拼接后,从而允许通过一个iterator标签就可以完成对多个集合的迭代。

       append对多个List对象的拼接

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:append标签拼接两个集合</title>
     6 </head>
     7 <body>
     8 <s:append id="newList">
     9 <s:param value="{'Spring2.0','J2EE','Ajax'}" />
    10 <s:param value="{'培训', '职业教育'}" />
    11 </s:append>
    12 
    13 <table border="1" width="240">
    14 <s:iterator value="#newList" status="st">
    15 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    16    <td><s:property/></td>
    17 </tr>
    18 </s:iterator>
    19 </table>
    20 </body>
    21 </html>

     append还可以拼接多个Map对象,还可以将Map和List混合拼接,见如下代码:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:append标签拼接集合和Map</title>
     6 </head>
     7 <body>
     8 <s:append id="newList">
     9 <s:param value="#{'Spring2.0':'李','J2EE':'李','Ajax':'李'}" />
    10 <s:param value="#{'培训', '职业教育'}" />
    11 </s:append>
    12 
    13 <table border="1" width="240">
    14 <s:iterator value="#newList" status="st">
    15 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    16    <td><s:property value="key"/></td>
    17    <td><s:property value="value"/></td>
    18 
    19 </tr>
    20 </s:iterator>
    21 </table>
    22 </body>
    23 </html>

    generator标签

    使用generator标签可以将指定的字符串按指定分隔符隔成多个子串,临时生成的多个子串可以使用iterator标签来进行迭代输出。临时生成的集合将在此标签内部有效,出了标签就消亡。该标签有几个有用的属性,介绍如下:

    id:这是一个可选属性,指定id后,则生成的标签在pageContext属性中

    count:这是一个可选属性,该属性指定生成集合中元素的总数,多余的丢弃

    separator:这是一个必填属性,指定用于解析的分隔符

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:generator生成集合</title>
     6 </head>
     7 <body>
     8 <table border="1" width="240">
     9 <s:generator val="'Spring2.0,J2EE,Ajax'" separator=",">
    10 <s:iterator status="st">
    11 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    12    <td><s:property/></td>
    13 </tr>
    14 </s:iterator>
    15 </s:generator>
    16 </table>
    17 </body>
    18 </html>

    指定id和count后使用方式如下:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:generator生成集合</title>
     6 </head>
     7 <body>
     8 <s:generator val="'Spring2.0,J2EE,Ajax'"
     9 separator="," id="books" count="2"/>
    10 <table border="1" width="240">
    11 <%
    12 java.util.Iterator i = (java.util.Iterator) pageContext.getAttribute("books");
    13 while(i.hasNext())
    14 {
    15    String s = (String) i.next(); %>
    16    <tr>
    17    <td><%=s%></td>
    18    </tr>
    19 <%
    20 }
    21 %>
    22 </table>
    23 </body>
    24 </html>

    merge标签

    merge标签同样用于将多个集合元素拼接成一个集合元素。它的用法和功能同append很相似,只是生成的元素内容的顺序不同。

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:merge标签迭代Map</title>
     6 </head>
     7 <body>
     8 <s:merge id="newList">
     9 <s:param value="#{'Spring2.0':'李','J2EE':'李','Ajax':'李'}" />
    10 <s:param value="#{'培训', '职业教育'}" />
    11 </s:merge>
    12 
    13 <table border="1" width="240">
    14 <s:iterator value="#newList" status="st">
    15 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    16    <td><s:property value="key"/></td>
    17    <td><s:property value="value"/></td>
    18 
    19 </tr>
    20 </s:iterator>
    21 </table>
    22 </body>
    23 </html>

    subset标签

    subset标签用于取得集合的子集,该标签的底层通过org.apache.Struts2.util.Subset.IteratorFilter类提供实现。使用subset标签可以指定如下几个属性:

    count:可选属性,指定子集中元素的个数,默认取得源集合的所有元素

    source:可选属性,指定源集合,如果不指定,默认取得valueStack栈顶的集合,一般都会指定

    start:可选属性,指定从源集合的第几个元素开始截取,,默认从第一个元素(即start=0)开始

    decider:可选属性,由开发者自己决定是否选中该元素

    一般用法如下:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:subset标签截取集合元素</title>
     6 </head>
     7 <body>
     8 <table border="1" width="200">
     9 <s:subset source="{'Java','Spring2.0','J2EE','Ajax','WebWork'}" 
    10 start="1" count="3">
    11 <s:iterator status="st"> 
    12 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    13    <td><s:property/></td>
    14 </tr>
    15 </s:iterator>
    16 </s:subset>
    17 </table>
    18 </body>
    19 </html>

    上面的代码的source属性指定的集合包含了5个元素,通过subset从第2个元素开始截取,只取出其中3个元素。

    此外,Struts2还允许开发者决定截取标准,开发者只需要实现一个Decider类,实现SubsetIteratorFilter.Decider接口中的boolean decide(Object element)方法,如果该方法返回真,则表明该元素将被选入子集中。看如下代码:

    package lee;
    
    import org.apache.struts2.util.SubsetIteratorFilter;
    public class MyDecider implements SubsetIteratorFilter.Decider
    {
    public boolean decide(Object element) throws Exception
    {
       String str = (String)element;
       return str.indexOf("J2EE") > 0;
    }
    }

    这里要求过滤不包含“J2EE”的元素,JSP页面代码如下:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:subset标签截取集合元素</title>
     6 </head>
     7 <body>
     8 <s:bean id="mydecider" name="lee.MyDecider"/>
     9 <table border="1" width="200">
    10 <s:subset 
    11 source="{'Java','Spring2.0','J2EE','Ajax','WebWork'}" 
    12 decider="#mydecider">
    13 <s:iterator status="st"> 
    14 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    15    <td><s:property/></td>
    16 </tr>
    17 </s:iterator>
    18 </s:subset>
    19 </table>
    20 </body>
    21 </html>

    Sort标签

    sort标签用于对指定的集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的Comparator,需要实现java.util.Comparator接口。使用sort标签时可指定如下几个属性:

    comparator:必填属性,指定排序的Comparator实例

    source:可选属性,指定被排序的集合,如果不指定则对valueStack栈顶的集合进行排序

    JAVA代码如下:

     1 package lee;
     2 
     3 import java.util.Comparator;
     4 public class MyComparator implements Comparator
     5 {
     6 public int compare(Object element1, Object element2)
     7 {
     8    return element1.toString().length() - element2.toString().length();
     9 }
    10 }

    上面的方法,如果返回一个大于0的数,则第一个元素大于第二个元素;返回0则表示两个元素相等,返回小于0的数,则第一个元素小于第二个元素。

    JSP页面如下:

     1 <%@ page contentType="text/html; charset=GBK" language="java"%>
     2 <%@taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>使用s:sort对集合元素进行排序</title>
     6 </head>
     7 <body>
     8 <s:bean id="mycomparator" name="lee.MyComparator"/>
     9 <table border="1" width="200">
    10 <s:sort 
    11 source="{'J2EE','Ajax','Spring2.0'}" 
    12 comparator="#mycomparator">
    13 <s:iterator status="st"> 
    14 <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
    15    <td><s:property/></td>
    16 </tr>
    17 </s:iterator>
    18 </s:sort>
    19 </table>
    20 </body>
    21 </html>
  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5720465.html
Copyright © 2011-2022 走看看