html:link 的用法

<html:link> 标签用于生成HTML <a> 元素。<html:link> 在创建超链接时,有两个优点:
(1) 允许在URL 中以多种方式包含请求参数。
(2) 当用户浏览器关闭Cookie 时,会自动重写URL,把SessionID 作为请求参数包含在URL 中,用于跟踪用户的Session 状态。

<html:link> 标签有以下重要属性:
(1) forward:指定全局转发链接。
(2) href:指定完整的URL 键接。
(3) page:指定相对于当前网页的URL。

        <html:rewrite> 用于输出超链接中的URI部分,但它并不生成HTML <a> 元素。URI指的是URL 中协议、主机和端口以后的内容。URI 用于指定具体的请求资源。例如,对于URL:HTTP://localhost:8080/HtmlBasic.do,它的URI为 /HtmlBasic.do

<%@ page language="java" contentType="text/html; charset=GB18030"
 pageEncoding="GB18030"%>
<%@page import="cn.qun.vo.Person;"%>
<%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd ">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
  <title>Insert title here</title>
 </head>
 <body>
  <%
   String id = "123";
   pageContext.setAttribute("id", id);

   Person p = new Person("feifei");

   pageContext.setAttribute("p", p);

   java.util.HashMap<String,Object> name = new java.util.HashMap<String,Object>();
   name.put("floatProperty", new Float(444.0));
   name.put("intProperty", new Integer(555));
   name.put("stringArray", new String[] { "Value1", "Value2",
     "Value3" });
   pageContext.setAttribute("name",name);
  %>
  <html:link page="/test.do" paramId="id" paramName="id">test.do</html:link>
  <br />
  <html:link href="test.do" paramId="id" paramName="p"
   paramProperty="name">ss</html:link>
   <br/>
  <html:link href="test.do" name="name">dddd</html:link>
 </body>
</html>

 

在提交的时候会生成相应的url

第一个超链接的URL

http://localhost:8080/test/test.do;jsessionid=538BBAC052EB7AC229307DE950F018D5?id=123

 

第二个超链接的URL

http://localhost:8080/test/test.do?id=feifei

 

第三个超链接的URL

http://localhost:8080/test/test.do?stringArray=Value1&stringArray=Value2&stringArray=Value3&floatProperty=444.0&intProperty=555

 

在action中,则可以相应的取到值

 

String name = request.getParameter("id");
  System.out.println(name);

  System.out.println(request.getParameter("floatProperty"));

  String str[] = request.getParameterValues("stringArray");
 
  Enumeration e=request.getParameterNames();
 
  while(e.hasMoreElements()){
   System.out.println(e.nextElement());
  }

 

 注意:在html:link中也可以这样写的

        <html:link href="*.do?id1=1&id2=2&id3=3">send</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="String'>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的源码写的相当的优秀,不停的学习对提高自身的水平是很有裨益的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值