struts html:link标签的用法

struts html:link标签的用法(转)

关于<html:link>标签在URI后面传参数的问题
在struts标签<html:link>的page属性指定的URI后面传递参数可以有几种方式:

 

1.若明确参数名和参数值则直接在URI后输出,

如:<html:link page="/test.do?action=add">add</html:link>

2.对于参数值不确定的,paramName和paramProperty来输出,用paramId属性指定参数名。

对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来说,是从Action类传过来的,作为request的属性之一(requst.setAttribute("name",object))。

如果paramName指定的对象是action的ActionForm,则无需使用request.setAttribute方法。

例:<html:link page="/test.do" paramId="userid" paramName="uid">uname</html:link>

若参数值是一个bean对象的属性值(比如ActionForm,或者集合中存放的对象)则:

<html:link page="/test.do" paramId="userid" paramName="user" paramProperty="uid">uname</html:link>

3.若两个参数,一个确定一个不确定,则是以上两种方法的结合,即:

<html:link page="/test.do?action=modify" paramId="userid" paramName="uid">modify</html:link>

4.对于多个参数的问题,可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式,paramName属性值指定为该HashMap集合对象即可。

举例:

<%

//代码理想的位置应该是在action中

//可以在jsp页面测试

java.util.HashMap pms = new java.util.HashMap();

pms.put("code", "001002");

pms.put("name", "tester");

pms.put("alias", new String[]{"matin","jack"});

request.setAttribute("params", pms);

%>

<html:link action="/test.do" name="params" >test</html:link>

编译后的结果:<a href="/test.do?code=001002&name=tester&alias=matin&alias=jack">test</a>

这种方式虽然可以解决传多参数的问题,但是实现起来也比较麻烦,特别是对记录集中的数据逐条列出的时候

5.针对有的网友在<html:link>标签中嵌入使用jsp脚本(scriptlet)的问题,

例如:

<html:link page="/test.do?code=<%=varible%>">add</html:link>,这种写法是错误的,是无法编译的。

有的网友认为在struts标签内是不允许使用jsp脚本的,这种说法也不准确。如果前面的写法改成:

<html:link page="<%="/test.do?code="+varible%>">add</html:link>,就可以被执行,但是要注意URL相对路径的问题。

虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用,但是有时在委曲求全的情况下也只能如此了,除非使用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只读的,就可以用嵌入jsp脚本来实现:

<%

boolean rdonly=false;

if(2==2) rdonly=true;

%>

<html:text property="userid" readonly="<%=rdonly%>" />

6.另外一种比较变态的方法,既不是真正意义上的struts,也不符合xml规范。那就是在<a>标签中用<bean:write>标签输出参数值。

如:<a href="test.do?uid=<bean:write name="user" property="userid"/>&name=<bean:write name="user" property="username"/>">test</a>

了解到这里之后,感觉到一丝遗憾,因为如果只有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()));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值