zoukankan      html  css  js  c++  java
  • struts2:标签库图示,控制标签

    目录

    一、struts2标签库图示
    二、控制标签
    1. 条件判断标签(if/elseif/else)
    2. 迭代标签(iterator)
      2.1 遍历List
      2.2 遍历Map
      2.3 遍历List(Action中的属性,List包含Bean)
      2.4 遍历Map(Action中的属性,Map包含Bean)
    3. 集合标签(append/merge/subset/sort)
      3.1 append标签
      3.2 merge标签
      3.3 subset标签
      3.4 sort标签
    4. 分隔标签(generator)
    三、完整代码

    一、struts2标签库图示

    二、控制标签

    1. 条件判断标签(if/elseif/else)

        <%
        Random rnd = new Random();
        int age = rnd.nextInt(100);
        pageContext.setAttribute("age", age);
        %>
        <s:if test="#attr.age>60"> 
            老年人 
        </s:if>
        <s:elseif test="#attr.age>35"> 
            中年人 
        </s:elseif>
        <s:elseif test="#attr.age>15"> 
            青年人 
        </s:elseif>
        <s:else> 
            少年 
        </s:else>

    输出(随机):

    青年人

    2. 迭代标签(iterator)

    用于循环数组,集合和Map。属性:

    • value:数组,集合或Map
    • var:当前元素
    • status:当前元素的状态
    • index,count,even,odd,first,last

    2.1 遍历List

        <TABLE border="1" width="300">
        <s:iterator value="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" var="book" status="it">
            <TR <s:if test="#it.odd"> style="background-color:#bbbbbb" </s:if>>
                <TD><s:property value="book" /><BR/></TD>
            </TR>
            <s:if test="#it.last">
                <TR <s:if test="#it.even"> style="background-color:#bbbbbb" </s:if>>
                    <TD><s:property value="#it.count" />本书 </TD>
                </TR>
            </s:if>
        </s:iterator>
        </TABLE>

    输出:

    2.2 遍历Map

    <s:iterator value="#{1: '中国', 2: '美国', 3: '日本'}" var="cur">
        <s:property value="#cur.key"/>
        <s:property value="#cur.value"/><br/>
    </s:iterator>

    输出:

    1     中国
    2     美国
    3     日本

    2.3 遍历List(Action中的属性,List包含Bean)

        <s:iterator value="listJavaBean" var="studentJavaBean"> 
            姓名:<s:property value="#studentJavaBean.name" />
            年龄:<s:property value="#studentJavaBean.age" /><BR/>
        </s:iterator>

    输出:

    姓名:张三        年龄:6
    姓名:李四        年龄:4
    姓名:赵五        年龄:5
    姓名:王三三 年龄:5
    姓名:李天一        年龄:0

    2.4 遍历Map(Action中的属性,Map包含Bean)

        <s:iterator value="listMapJavaBean" var="studentJavaBean"> 
            id:  <s:property value="#studentJavaBean.key" />
            姓名:<s:property value="#studentJavaBean.value.name" />
            年龄:<s:property value="#studentJavaBean.value.age" /><BR/>
        </s:iterator>

    输出:

    id: 3         姓名:赵五        年龄:7
    id: 2         姓名:李四        年龄:1
    id: 1         姓名:张三        年龄:1
    id: 5         姓名:李天一     年龄:3
    id: 4         姓名:王三三     年龄:4

    3. 集合标签(append/merge/subset/sort)

    3.1 append标签

        <s:append var="books1">
            <s:param value="#{'C++入门经典':'清华出版社','Java编程思想':'清华出版社'}"/>
            <s:param value="#{'Ajax权威指南','Ruby元编程','C#高级编程'}" />
        </s:append>
        <s:iterator value="books1">
            <s:property value="key" />|<s:property value="value" /><BR/>
        </s:iterator>

    输出:

    C++入门经典|清华出版社
    Java编程思想|清华出版社
    Ajax权威指南|
    Ruby元编程|
    C#高级编程|

    3.2 merge标签

        <s:merge var="books2">
            <s:param value="#{'C++入门经典','Java编程思想'}"/>
            <s:param value="#{'Ajax权威指南':'电子出版社','Ruby元编程':'电子出版社','C#高级编程':'清华出版社'}" />
        </s:merge>
        <s:iterator value="books2">
            <s:property value="key" />|<s:property value="value" /><BR/>
        </s:iterator>

    输出:

    C++入门经典|
    Ajax权威指南|电子出版社
    Java编程思想|
    Ruby元编程|电子出版社
    C#高级编程|清华出版社

    注意:merge用法和append相同, 合并的结果元素相同,但顺序可能不一样。

    3.3 subset标签

    从集合中取出一个子集。属性:

    • source: 集合
    • start: 起始索引
    • count: 子集中元素个数

    3.3.1 访问自定义变量,subset示范

    <s:subset source="{'中国', '美国', '印度', '德国', '泰国', '新加坡'}" start="1" count="3">
        <s:iterator>
            <s:property />
        </s:iterator>
    </s:subset>

    输出:

    美国    印度     德国

    3.3.2 访问Action中的属性(List包含Bean),subset示范

        <s:subset source="listST1" var="newSubList" count="2" start="0">
            <s:iterator var="stBean" value="#attr.newSubList">
                <s:property value="#stBean.name" />
            </s:iterator>
        </s:subset>

    输出:

    张三    李四

    3.4 sort标签

        <s:bean var="sortRef" name="com.clzhang.ssh.demo8.SortAge"></s:bean>
        <s:sort source="listST1" var="newSortList" comparator="#sortRef">
            <s:iterator var="stBean" value="#attr.newSortList"> 
                姓名:<s:property value="#stBean.name" />
                年龄:<s:property value="#stBean.age" /><BR/>
            </s:iterator>
        </s:sort>

    输出:

    姓名:张三            年龄:3
    姓名:李天一         年龄:7
    姓名:赵五            年龄:7
    姓名:李四            年龄:8
    姓名:王三三         年龄:9 

    4. 分隔标签(generator)

    将一个字符串按照指定分隔符分割成一个字符串数组。属性:

    • separator: 分隔符
    • val(value): 字符串
    • count:字符串數組中元素個數(可选)

    4.1 在标签内部使用generator

        <TABLE width="300" border="1">
        <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator=",">
            <s:iterator status="bs">
                <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
                    <TD><s:property /></TD>
                </TR>
            </s:iterator>
        </s:generator>
        </TABLE>

    输出:

    4.2 在标签外部使用generator

        <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator="," var="books"></s:generator>
        <TABLE border="1" width="300">
        <s:iterator value="#books" status="bs">
            <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
                <TD><s:property /></TD>
            </TR>
        </s:iterator>
        </TABLE>

    输出同上

    三、完整代码

    1. labelOfControl.jsp(显示页面)

    <%@ page language="java" import="java.util.*,com.clzhang.ssh.demo8.SortAge" pageEncoding="utf-8"%>
    <%@ page isELIgnored="false"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE>struts2控制标签示范</TITLE>
    <STYLE type="text/css">
    <!--
    .STYLE1 {font-size: 14px}
    .STYLE3 {color: #FF0000}
    -->
    </STYLE>
    </HEAD>
    <BODY>
        <P class="STYLE1"><STRONG>一. 条件判断标签(if/elseif/else):</STRONG></P>
        <P class="STYLE1">1.访问自定义变量的值</P>
        <%
        Random rnd = new Random();
        int age = rnd.nextInt(100);
        pageContext.setAttribute("age", age);
        %>
        <s:if test="#attr.age>60"> 
            老年人 
        </s:if>
        <s:elseif test="#attr.age>35"> 
            中年人 
        </s:elseif>
        <s:elseif test="#attr.age>15"> 
            青年人 
        </s:elseif>
        <s:else> 
            少年 
        </s:else>
        <P class="STYLE1">2.访问Action实例中的属性</P>
        <s:if test="cityId==1">北京</s:if>
        <s:elseif test="cityId==2">上海</s:elseif>
        <s:else>辽宁</s:else>
        <BR>
        <P class="STYLE1"><SPAN class="STYLE3">注意:</SPAN>在这里if中使用的是#age,因为set标签在Stack Context中定义了一个age属性;而cityId是在Action中定义的,所以不需要“#”。</P>
        <P class="STYLE1"><STRONG>二. 迭代标签(iterator):</STRONG></P>
        <P class="STYLE1">1.访问自定义变量的值(List)</P>
        <TABLE border="1" width="300">
        <s:iterator value="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" var="book" status="it">
            <TR <s:if test="#it.odd"> style="background-color:#bbbbbb" </s:if>>
                <TD><s:property value="book" /><BR/></TD>
            </TR>
            <s:if test="#it.last">
                <TR <s:if test="#it.even"> style="background-color:#bbbbbb" </s:if>>
                    <TD><s:property value="#it.count" />本书 </TD>
                </TR>
            </s:if>
        </s:iterator>
        </TABLE>
        <P class="STYLE1">2.访问自定义变量的值(Map)</P>
        <s:iterator value="#{1: '中国', 2: '美国', 3: '日本'}" var="cur">
            <s:property value="#cur.key"/>
            <s:property value="#cur.value"/><br/>
        </s:iterator>    
        <P class="STYLE1">3.访问Action实例中的属性,String[]</P>
        <s:iterator value="studentList" var="studentName">
            <s:property value="studentName" /><BR/>
        </s:iterator>
        <P class="STYLE1">4.访问Action实例中的属性,List包含的Bean,访问的第一种方式</P>
        <s:iterator value="listJavaBean"> 
            姓名:<s:property value="name" />
            年龄:<s:property value="age" /><BR/>
        </s:iterator>
        <P class="STYLE1">5.访问Action实例中的属性,List包含的Bean,访问的第二种方式</P>
        <s:iterator value="listJavaBean" var="studentJavaBean"> 
            姓名:<s:property value="#studentJavaBean.name" />
            年龄:<s:property value="#studentJavaBean.age" /><BR/>
        </s:iterator>
        <P class="STYLE1">6.访问Action实例中的属性,Map包含的String</P>
        <s:iterator value="listMapString" var="studentJavaBean"> 
            键:<s:property value="#studentJavaBean.key" />
            值:<s:property value="#studentJavaBean.value" /><BR/>
        </s:iterator>
        <P class="STYLE1">7.访问Action实例中的属性,Map包含的Bean</P>
        <s:iterator value="listMapJavaBean" var="studentJavaBean"> 
            id:  <s:property value="#studentJavaBean.key" />
            姓名:<s:property value="#studentJavaBean.value.name" />
            年龄:<s:property value="#studentJavaBean.value.age" /><BR/>
        </s:iterator>
        <P class="STYLE1"><SPAN class="STYLE3">提示:</SPAN>当使用了status属性后,除了使了上面的event、odd、count、last用于判断奇偶,个数和判断是否为最后一个方法外还可使用index用于得到迭代元素的索引。</P>
        <P class="STYLE1"><STRONG>三. 集合标签(append/merge/subset/sort):</STRONG></P>
        <s:append var="books1">
            <s:param value="#{'C++入门经典':'清华出版社','Java编程思想':'清华出版社'}"/>
            <s:param value="#{'Ajax权威指南','Ruby元编程','C#高级编程'}" />
        </s:append>
        <s:merge var="books2">
            <s:param value="#{'C++入门经典','Java编程思想'}"/>
            <s:param value="#{'Ajax权威指南':'电子出版社','Ruby元编程':'电子出版社','C#高级编程':'清华出版社'}" />
        </s:merge>
        <P class="STYLE1">1.append标签合并的结果</P>
        <s:iterator value="books1">
            <s:property value="key" />|<s:property value="value" /><BR/>
        </s:iterator>
        <P class="STYLE1">2.merge标签合并结果</P>
        <s:iterator value="books2">
            <s:property value="key" />|<s:property value="value" /><BR/>
        </s:iterator>
        <P class="STYLE1">3.访问Action实例中的属性,merge标签合并结果</P>
        <s:merge var="newAppendList">
            <s:param value="listST1"></s:param>
            <s:param value="listST2"></s:param>
        </s:merge>
        <s:iterator var="stBean" value="newAppendList"> 
            姓名:<s:property value="#stBean.name" />
            年龄:<s:property value="#stBean.age" /><BR/>
        </s:iterator>
        <P class="STYLE1">4.访问自定义变量,subset结果</P>
        <s:subset source="{'中国', '美国', '印度', '德国', '泰国', '新加坡'}" start="1" count="3">
            <s:iterator>
                <s:property />
            </s:iterator>
        </s:subset>
        <P class="STYLE1">5.访问Action实例中的属性,subset结果</P>
        <s:subset source="listST1" var="newSubList" count="2" start="0">
            <s:iterator var="stBean" value="#attr.newSubList">
                <s:property value="#stBean.name" />
            </s:iterator>
        </s:subset>
        <P class="STYLE1">6.访问Action实例中的属性,sort结果</P>
        <s:bean var="sortRef" name="com.clzhang.ssh.demo8.SortAge"></s:bean>
        <s:sort source="listST1" var="newSortList" comparator="#sortRef">
            <s:iterator var="stBean" value="#attr.newSortList"> 
                姓名:<s:property value="#stBean.name" />
                年龄:<s:property value="#stBean.age" /><BR/>
            </s:iterator>
        </s:sort>
        <P class="STYLE1"><SPAN class="STYLE3">提示:</SPAN><BR>
            1.merge后的值,与append相比,只是顺序不同(各取第一个值,各取第二个值......);<BR>
            2.由于subset的var是放在page页面级的变量,所以要使用attr将page级中的newSubList获取出来再进行遍历。<BR>
            3.sort同样如此。 </P>
        <P class="STYLE1"><STRONG>四. 分隔标签(generator):</STRONG></P>
        <P class="STYLE1">1.在标签内部使用</P>
        <TABLE width="300" border="1">
        <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator=",">
            <s:iterator status="bs">
                <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
                    <TD><s:property /></TD>
                </TR>
            </s:iterator>
        </s:generator>
        </TABLE>
        <P class="STYLE1">2.在标签外部使用</P>
        <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator="," var="books"></s:generator>
        <TABLE border="1" width="300">
        <s:iterator value="#books" status="bs">
            <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
                <TD><s:property /></TD>
            </TR>
        </s:iterator>
        </TABLE>
        <P class="STYLE1"><SPAN class="STYLE3">提示:</SPAN>使用generator标签时,sparator属性是必须的。除了这些属性处还有可选属性count,它用于指定集合元素的总数;可选元素converter用于指定转换器。 </P>    
    
    </BODY>
    </HTML>
    View Code

    2. LabelOfControlAction.java(控制类)

    package com.clzhang.ssh.demo8;
    
    import java.util.*;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * struts2控制标签类
     * @author Administrator
     *
     */
    public class LabelOfControlAction  extends ActionSupport{
        public static final long serialVersionUID = 1;
        
        // 下面的这些值,是提供给前台显示页面使用的,都具有setter/getter
        private int cityId;
        private String[] studentList = new String[3];
        private List<StudentInfo> listJavaBean = new ArrayList<StudentInfo>();
        private LinkedHashMap<String, String> listMapString = new LinkedHashMap<String, String>();
        private Map<String, StudentInfo> listMapJavaBean = new HashMap<String, StudentInfo>();
        private List<StudentInfo> listST1 = new ArrayList<StudentInfo>();
        private List<StudentInfo> listST2 = new ArrayList<StudentInfo>();
        
        // 存放测试数据
        private List<String> lstString = new ArrayList<String>();
        
        public LabelOfControlAction() {
            lstString.add("张三");
            lstString.add("李四");
            lstString.add("赵五");
            lstString.add("王三三");
            lstString.add("李天一");
        }
    
        public int getCityId() {
            return cityId;
        }
        public void setCityId(int cityId) {
            this.cityId = cityId;
        }
    
        public String[] getStudentList() {
            return studentList;
        }
        public void setStudentList(String[] studentList) {
            this.studentList = studentList;
        }
    
        public List<StudentInfo> getListJavaBean() {
            return listJavaBean;
        }
        public void setListJavaBean(List<StudentInfo> listJavaBean) {
            this.listJavaBean = listJavaBean;
        }
    
        public LinkedHashMap<String, String> getListMapString() {
            return listMapString;
        }
        public void setListMapString(LinkedHashMap<String, String> listMapString) {
            this.listMapString = listMapString;
        }
        
        public Map<String, StudentInfo> getListMapJavaBean() {
            return listMapJavaBean;
        }
        public void setListMapJavaBean(Map<String, StudentInfo> listMapJavaBean) {
            this.listMapJavaBean = listMapJavaBean;
        }
    
        public List<StudentInfo> getListST1() {
            return listST1;
        }
        public void setListST1(List<StudentInfo> listST1) {
            this.listST1 = listST1;
        }
    
        public List<StudentInfo> getListST2() {
            return listST2;
        }
        public void setListST2(List<StudentInfo> listST2) {
            this.listST2 = listST2;
        }
    
        public String execute() {
            // 下面是设置一些值的代码,用于在前台显示
            
            // int
            this.setCityId(2);
            
            // String[]
            for(int i=0; i<studentList.length; i++) {
                studentList[i] = lstString.get(i);
            }
            
            // List包含Bean
            for(String str: lstString) {
                StudentInfo studentInfo1 = new StudentInfo();
                studentInfo1.setName(str);
                studentInfo1.setAge((int)(Math.random()*10));
    
                listJavaBean.add(studentInfo1);
            }
            
            // Map包含String
            int count = 1;
            for(String str: lstString) {
                listMapString.put(""+count++, str+count);
            }
            
            // Map包含Bean
            count = 1;
            for(String str: lstString) {
                StudentInfo studentInfo1 = new StudentInfo();
                studentInfo1.setName(str);
                studentInfo1.setAge((int)(Math.random()*10));
    
                listMapJavaBean.put(""+count++, studentInfo1);
            }
            
            // 集合append/merge/subset/sort等使用
            for(String str: lstString) {
                StudentInfo studentInfo1 = new StudentInfo();
                studentInfo1.setName(str);
                studentInfo1.setAge((int)(Math.random()*10));
    
                listST1.add(studentInfo1);
                listST2.add(studentInfo1);
            }
    
            return "showLC";
        }
    }
    View Code

    3. StudentInfo.java(实体类)

    package com.clzhang.ssh.demo8;
    
    public class StudentInfo {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    View Code

    4. SortAge.java(排序类)

    package com.clzhang.ssh.demo8;
    
    import java.util.Comparator;
    
    @SuppressWarnings("rawtypes")
    public class SortAge implements Comparator {
        public int compare(Object arg0, Object arg1) {
            if (((StudentInfo) arg0).getAge() > ((StudentInfo) arg1).getAge())
                return 1;
            else
                return -1;
        }
    }
    View Code

    5. 还需要在struts.xml中加入:

            <action name="labelC" class="com.clzhang.ssh.demo8.LabelOfControlAction">
                <result name="showLC">/ssh/demo8/labelOfControl.jsp</result>
            </action>

    6. 然后打开IE,输入地址:http://127.0.0.1:8080/st/labelC.action即可。

    更多阅读:

    struts2:数据标签

    struts2:表单标签

    struts2:表单标签续(datetimepicker标签)

    struts2:非表单标签

  • 相关阅读:
    Asp.net MVC 利用 Nopi 导出 Excel
    React 中 调用 Asp.net WebApi
    Node.js mysql 连接池使用事务自动回收连接
    __far和__near的小问题
    注册博客园了,以后在这里写写随笔。
    Electron客户端开发入门必备的知识点
    公司组织构架的三大类型
    经济学中的人性抉择(下)
    经济学中的人性抉择(上)
    模拟音乐播放器播放条样式
  • 原文地址:https://www.cnblogs.com/nayitian/p/3470842.html
Copyright © 2011-2022 走看看