struts html:link 详细使用方法

Struts中的html:link标签是一个很常用的标签,其功能也比较明显:生成<a   href="yoururl"></a>这样的HTML代码  
  在刚开始接触这个标签的时候,我知道这个标签可以这样用:  
   
  =========================================================  
  <html:link   page="/html-link.do"   paramId="stringProperty"   paramName="newValue">  
  String   via   paramId   and   paramName  
  </html:link>  
  =========================================================  
   
  这个newValue一般就是一个String类型的变量,上述的代码将生成这样的HTML代码:  
  <a   href="http://serverip:portno/projectcontextname/html-link.do?stringProperty=$newValue">String   via   paramId   and   paramName</a>  
  其中$newValue表示的是newValue这个变量的值  
   
  也可以这样用:  
   
  =========================================================  
  <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属性上  
  首先来看一段如何自定义多个参数的代码,如下:  
   
  =========================================================  
  <%    
  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值对应的对象的呢?代码在此:  
   
  =========================================================  
  //   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[i]));  
  }  
  }   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标签研究一文中可以找到这段代码  
   
  最后想说的是,Struts的源码写的相当的优秀,不停的学习对提高自身的水平是很有裨益的  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值