zoukankan      html  css  js  c++  java
  • Struts源码阅读心得之html:link篇

    Struts中的html:link标签是一个很常用的标签,其功能也比较明显:生成<a href="yoururl"></a>这样的HTML代码
    在刚开始接触这个标签的时候,我知道这个标签可以这样用:

    =========================================================
    Code: Select all
    <html:link page="/html-link.do" paramId="stringProperty" paramName="newValue">
                  String via paramId and paramName
          </html:link>

    =========================================================

    这个newValue一般就是一个String类型的变量,上述的代码将生成这样的HTML代码:
    <a href="String'>http://serverip:portno/projectcontextname/html-link.do?stringProperty=$newValue">String via paramId and paramName</a>
    其中$newValue表示的是newValue这个变量的值

    也可以这样用:

    =========================================================
    Code: Select all
    <html:link page="/html-link.do"
                  paramId="booleanProperty"
                paramName="testbean" paramProperty="booleanProperty">
            Boolean via paramId, paramName, and paramValue
          </html:link>

    =========================================================

    这里多了一个paramProperty属性,这里的name属性和property属性和bean:write标签一样,一般来说name的值是一个被绑定在
    request、session、application或page范围内的对象的绑定key值,Property属性的值则是这个对象的一个成员变量的名称
    使用了name和Property之后,struts将在上述四种范围内,以name变量值为key查找对象,并将对象读出后,取出Property定义的
    成员变量的值。
    所以以上的标签被转化成HTML代码之后如下:
    <a href="http://serverip:portno/projectcontextname/html-link.do?booleanProperty=$testbean.booleanProperty"> Boolean via paramId, paramName, and paramValue</a>

    OK,了解到这里之后,感觉到一丝遗憾,因为如果只有paramId,paramName,paramProperty这三个属性的话,那么对于html:link标签来说,就永远只能
    自定义一个参数,如果需要定义多个参数,如http://serverip:portno/projectcontextname/html-link.do?a=3&b=5&y=9这样的链接URL来说,就无能为力了
    如果要定义多个参数,就需要手动拼URL,定义在page属性里面,这就失去了使用标签的意义了。

    在此情况下,怀着失望的心情,打开了Struts的源码,开始查看这个标签的源码,忽然发现,这个标签完全是可以自定义多个参数的,关键就在name属性上
    首先来看一段如何自定义多个参数的代码,如下:

    =========================================================
    Code: Select all
    <% 
      java.util.HashMap newValues = new java.util.HashMap();
      newValues.put("floatProperty", new Float(444.0));
      newValues.put("intProperty", new Integer(555));
      newValues.put("stringArray", new String[]
       { "Value1", "Value2", "Value3" });
      pageContext.setAttribute("newValues", newValues);
    %>

         <html:link page="/html-link.do" name="newValues">
            Float, int, and stringArray via name (Map)
          </html:link>

    =========================================================

    原来使用name属性就可以将一个Map类型的变量放入request、session、application、page四种范围的容器内,然后取个key值,填在name属性里就可以了
    Struts将自动读取这个Map类型对象的所有key和key所定义的对象,然后自动生成HTML代码
    好比上述的例子,将生成如下的HTML代码:
    <a href="http://serverip:portno/projectcontextname/html-link.do?stringArray=Value1&stringArray=Value2&stringArray=Value3&floatProperty=444.0&intProperty=555">
    Float, int, and stringArray via name (Map)</a>

    愿望终于达到了,也充分证明了Struts的实力,但在这段实现中,查找name定义的对象这点在前面几次的源码剖析中已经很明确了(使用的是TagUtils.java中的lookup方法)
    但得到这个对象后,Struts是如何读出key值集合和key值对应的对象的呢?代码在此:

    =========================================================
    Code: Select all
    // Add the required request parameters
                boolean question = temp.indexOf('?') >= 0;
         //这里的params变量就是我们输入的Map类型的对象
         //就是这句代码可以得到key值集合
                Iterator keys = params.keySet().iterator();
                while (keys.hasNext()) {
                    String key = (String) keys.next();
                    Object value = params.get(key);
                    if (value == null) {
                        if (!question) {
                            url.append('?');
                            question = true;
                        } else {
                            url.append(separator);
                        }
                        url.append(this.encodeURL(key));
                        url.append('='); // Interpret null as "no value"
                    } else if (value instanceof String) {
                        if (!question) {
                            url.append('?');
                            question = true;
                        } else {
                            url.append(separator);
                        }
                        url.append(this.encodeURL(key));
                        url.append('=');
                        url.append(this.encodeURL((String) value));
                    } else if (value instanceof String[]) {
                        String values[] = (String[]) value;
                        for (int i = 0; i < values.length; i++) {
                            if (!question) {
                                url.append('?');
                                question = true;
                            } else {
                                url.append(separator);
                            }
                            url.append(this.encodeURL(key));
                            url.append('=');
                            url.append(this.encodeURL(values));
                        }
                    } else /* Convert other objects to a string */ {
                        if (!question) {
                            url.append('?');
                            question = true;
                        } else {
                            url.append(separator);
                        }
                        url.append(this.encodeURL(key));
                        url.append('=');
                        url.append(this.encodeURL(value.toString()));
                    }
                }

    =========================================================

    已经不用再做多余的解释了,代码已经说明一切。
    其实在PropertyMessageResource.java中,也有类似的代码,就是将property文件读出的一段代码,在ActionServlet初始化时被调用
    在bean:message标签研究一文中可以找到这段代码
  • 相关阅读:
    codevs1288 埃及分数
    codevs1792 分解质因数
    dp
    JAVA大数贪心
    求最长不重叠子串
    初识后缀数组
    dp
    两数相除,判断小数位是否有限位
    构造二分图匹配
    建立多个树状数组
  • 原文地址:https://www.cnblogs.com/super119/p/1988612.html
Copyright © 2011-2022 走看看