zoukankan      html  css  js  c++  java
  • JustForFly struts2标签<s:generator>

    有的时候,我们在数据库中,会在一个字段存放多个值,之间用特殊字符分割。
    比如,需要某个字段存放了用户个人使用的编程语言(可以多选)
    1.Java
    2.C
    3.PHP
    如果用户选择了1和2,那么,在数据库中的"编程语言"一栏里,可能会写入"1,2"(此处以逗号分隔).

    当在查询页面需要显示编程语言时,我们不能直接显示"1,2",而是需要转换成"Java、C"。
    方案1:我们可以在后台得到查询结果后转义,这个需要在后台遍历查询的结果集,效率不高。
    方案2:我们可以使用struts2的标签<s:generator>实现上面的功能

    <s:generator val="languageItem" separator="," converter="%{languageItemConverter}">
        <s:iterator status="row_languageItem">
            <s:if test="#row_languageItem.index != 0">
                、<s:property />
            </s:if>
            <s:else>
                <s:property />
            </s:else>
        </s:iterator>
    </s:generator>    

    val="languageItem":为后台保存"1,2"的变量;
    separator=",":标明变量的分隔符;
    converter="%{languageItemConverter}":指明languageItem的转换方法,我们需要在对应的Action中添加方法public org.apache.struts2.util.IteratorGenerator.Converter getLanguageItemConverter(){}。

    <s:generator>内部需要嵌套使用<s:iterator>来遍历后台转换后产生的结果集,然后使用特定的方式显示(例子中是通过"、"来分隔显示转义后的字符)。

    下面是此方法Action的部分代码:
         *Action.java

        /**
         * 转义数据库中存放的用户个人使用的编程语言
         * @return
         */
        public Converter getLanguageItemConverter(){
            return new Converter() {
                public Object convert(String value) throws Exception {
                    String result = "";
                    switch (Integer.parseInt(value)) {
                        case 1:
                            result = "Java";
                            break;
                        case 2:
                            result = "C";
                            break;
                        case 3:
                            result = "PHP";
                            break;
                    }
                    return result;
                }
            };
        }

    通过以上代码,页面上最终将显示的结果是:
    Java、C

    最后再提一下<s:generator>标签中的可选属性count,它是用来指定所生成迭代器中元素的数量。
    以上面为例,如果设置count="1",页面将只显示:Java;
    如果设置count="3",页面将显示:Java、C、Java;
    也就是说,如果count的值大于转换后的结果集个数,他将会从头循环结果集,直到填满count设置的数量,
    所以,如没有特殊要求,我们一般不设置此属性。

     <s:generator separator=";" val="news.affix">
                  <s:iterator status="file" id="url">
                          <div style="" class="xing5" id="updiv${file.count }">
                          <span style="" id="upfiled2">
                              <span>
                                  &nbsp;&nbsp;&nbsp;&nbsp;
                                  <s:generator separator=":" val="url">
                                  <s:iterator status="file1" >
                                      <s:if test="#file1.count == 2">  
                                          <a style="font-weight:bold" href="<s:property />">
                                          <s:generator separator=":" val="url">
                                              <s:iterator status="file1" >
                                                  <s:if test="#file1.count == 1">  
                                                      <s:property />
                                                  </s:if>
                                              </s:iterator>
                                         </s:generator>
                                          </a>
                                      </s:if>
                                  </s:iterator>                   
                </s:generator>                                                    </span>
                          </span>
                      </div>
                    </s:iterator>
              </s:generator>

  • 相关阅读:
    学习进度(6)
    学习进度(5)
    学习进度(4)
    学习进度(第十周)
    学习进度(第九周)
    关于返回一个整数数组中最大子数组的和的问题(续03)
    学习进度(第八周)
    代码大全阅读笔记03
    NABCD分析——生活日历
    学习进度(第七周)
  • 原文地址:https://www.cnblogs.com/weipeng/p/2725453.html
Copyright © 2011-2022 走看看