`

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的源码写的相当的优秀,不停的学习对提高自身的水平是很有裨益的
分享到:
评论

相关推荐

    htmllink标签的使用

    `&lt;html:link&gt;` 标签是Struts框架中用于创建HTML `&lt;a&gt;` 元素的一个组件,它提供了处理请求参数和Session跟踪的功能,尤其在处理动态生成的链接时非常有用。下面我们将深入探讨该标签的特性、用法以及相关的知识点。 ...

    JSP Struts之HTML标签库详解

    5. **Nested标签库**:这个库增强了其他Struts标签的嵌套能力,使得在复杂表单和布局中使用Struts标签更加方便。 Struts标签库的一个重要特性是它们支持属性的嵌套引用,这意味着可以使用`.`来访问对象的深层属性,...

    struts1标签库详解

    Struts 提供了非常多的标签,依据功能和使用习惯的不同被分到了五个标签库中:Bean Tags、HTML Tags、Logic Tags、Nested Tags 和 Tiles Tags。下面将对前三个标签库中的标签进行详细的介绍。 Bean Tags Bean Tags...

    struts1.x标签库详解

    * html:link 标签:生成超链接。 * html:multibox 标签:生成多选框。 * html:radio 标签:生成单选框。 * html:select 标签:生成下拉列表。 * html:write 标签:生成 HTML 输出。 Logic Tags Logic Tags 库包含...

    struts-html标签

    Struts HTML标签是Java开发中使用Struts框架进行Web应用时的重要组成部分,它提供了一系列预定义的JSP标签,简化了HTML表单的处理和与控制器(Action)之间的交互。这些标签使得开发者能够更方便地处理用户输入、...

    Struts标签- HTML标签

    在Struts表单中使用Hibernate实体类作为ActionForm,可以直接通过HTML标签与数据库对象交互,简化数据操作。 7. **Struts 1与Struts 2的区别** 在Struts 2中,HTML标签被替换为更强大的Struts Tags,提供了更多的...

    JSP Struts的HTML标签库详解

    使用Struts的HTML标签库,开发者可以避免在JSP页面中过多地使用脚本语言,使得页面更易于阅读和维护,同时增强了代码的结构化。需要注意的是,虽然Struts标签库支持脚本表达式,但最佳实践是尽量减少脚本的使用,以...

    struts标签中文手册,struts标签中文手册,struts标签中文手册

    7. **servlet标签**:这些标签可以直接调用Servlet,如`&lt;servlet:forward&gt;`和`servlet:include&gt;`,但通常不推荐在现代的Struts应用中使用,因为它们破坏了MVC模式。 8. **html:link**和**html:button**:这两个标签...

    struts html标签例子

    在实际开发中,我们还需要注意Struts配置文件(struts-config.xml)中的设定,比如ActionMapping和FormBean定义,它们是Struts HTML标签能正常工作的基础。通过合理的配置,我们可以实现更复杂的功能,如验证、国际...

    struts1_标签

    在使用Struts1的标签时,开发者还需要配置struts-config.xml文件,这个配置文件定义了ActionForm、Action、Forward等元素,它们与标签库紧密关联,确保标签能够正确地与应用程序的其他部分交互。例如,`&lt;html:link&gt;`...

    struts标签库使用大典

    在JSP页面中使用Struts标签之前,需要在页面头部引入Struts的TLD(Tag Library Descriptor)文件: ```jsp &lt;%@ taglib prefix="html" uri="/tags/html" %&gt; ``` 这里的`prefix`是标签前缀,`uri`是TLD文件的...

    struts标签使用war

    - `.strutshtml`:提供与用户界面交互的标签,如表单元素、链接等。例如,`&lt;html:text&gt;` 用于创建文本输入框,`&lt;html:submit&gt;` 创建提交按钮。 2. **logic 标签库**: - `logic:present` 和 `logic:notPresent`:...

    struts 1.2 标签使用说明

    - **运行时表达式**:所有Struts标签属性都支持运行时表达式,但应避免使用scriptlet,正确使用例如`&lt;html:link href='&lt;%= "/" + name +"/index.jsp"'&gt;`。 3. **Bean标签库的功能**: - **创建脚本变量**:从HTTP...

    struts1的标签

    Nested库增强了其他Struts标签的嵌套功能,使得在复杂结构的数据模型中使用标签更加方便。例如,可以嵌套`&lt;nested:property&gt;`来处理多层属性的访问。 在使用Struts1标签时,有几个共同的特性需要注意,比如`...

    struts标签库

    1)**&lt;html:link&gt;**标签: `&lt;html:link&gt;`标签是Struts中用于创建超链接的标签,它可以等价于HTML的`&lt;a&gt;`标签。以下是一些主要的特性: A)**href**:用于指定链接的目标URL,可以直接链接到静态页面或动态Action。...

    struts标签详解 (实例 很详细(war))

    这个文件可能展示了如何使用HTML错误标签来显示ActionForm中验证失败的信息,帮助用户了解提交表单时出现的问题。 5. `html-file.jsp`: `&lt;html:file&gt;`标签用于创建文件上传输入字段,这对于处理用户上传文件的...

    struts标签大全

    5. **Nested标签库**:增强其他Struts标签的嵌套能力,使得在复杂结构中使用标签更加方便。 Struts标签库中的标签有一些共性特征,比如`id`、`name`、`property`和`scope`属性。`id`用于指定自定义标签的脚本变量名...

    struts标签的使用

    在JSP页面中使用Struts标签之前,需要在页面头部引入Struts标签库。这通常通过`&lt;%@ taglib %&gt;`指令完成,例如: ```jsp &lt;%@ taglib prefix="html" uri="/tags/html" %&gt; ``` 这里,`prefix`定义了标签的前缀...

Global site tag (gtag.js) - Google Analytics