`
zengbo0710
  • 浏览: 416982 次
社区版块
存档分类
最新评论

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标签详解 (实例 很详细(war))

    本压缩包文件包含了关于Struts标签的详细解释和源码,非常适合学习和参考。 1. **HTML标签**: HTML标签主要用于生成常见的HTML元素,如表单元素(`&lt;html:form&gt;`)、文本输入(`&lt;html:text&gt;`)、复选框(`...

    struts标签使用war

    实践中,你需要解压文件,导入到 IDE,运行并观察每个页面的效果,同时查阅源码了解标签背后的逻辑。 总之,熟练掌握 Struts 标签库能极大地提高开发效率,使你的 Java Web 应用程序更加规范和易于维护。通过实际...

    孙卫勤struts-htmltaglibs

    这个源码库,由孙卫勤提供,是学习和理解Struts1框架如何处理和扩展HTML标签的一个宝贵资源。Struts是一个开源的Java MVC框架,它极大地简化了Java Web应用程序的开发工作。 在Struts中,HTML TagLib库是一组定制的...

    struts高级实战进阶-传智播客

    此外,&lt;html:link&gt;标签是Struts提供的一个便利工具,它可以简化超链接的创建,自动处理URL重写和参数编码,使得开发者无需关心具体的Web应用程序路径和ActionServlet的映射。 防止表单重复提交是Web开发中的一个...

    Struts2中使用标签实现组合查询和带分页的例子

    本篇将重点讲解如何利用`sx:`标签实现组合查询和带分页功能。 首先,让我们了解下Struts2的`sx:`标签。它扩展了Struts2的OGNL(Object-Graph Navigation Language)表达式,使得在JSP页面中可以直接访问Action类中...

    struts_tag

    对于想要深入了解Struts标签库的开发者,可以研究其源码。Struts的源码提供了一个学习MVC模式和JSP标签实现的好机会。通过阅读源码,可以理解标签如何与控制器交互,以及如何处理用户输入。 **8. 结合工具使用** 在...

    张孝祥广州讲座-struts高级实战进阶.ppt

    【Struts高级实战进阶】讲座内容主要涵盖了Struts框架的高级使用技巧和核心概念,由知名讲师张孝祥主讲。以下是对这些知识点的详细...通过对Struts源码的分析,开发者可以更好地定制和扩展框架,以满足特定项目的需求。

    jsp源码-网络交易系统

    &lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="h"%&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; List&lt;Index&gt; plist = (List) request.getAttribute("plist"); Users us = (Users) request....

    张孝祥09年struts高级实战进阶PPT

    `&lt;html:link&gt;`是Struts标签库中的一个元素,主要用于创建链接。它可以简化URL路径的处理,自动附加jsessionid参数进行URL重写,并且能对参数进行URL编码。此外,它还支持paramID和paramName等属性来设置参数,实现...

    Struts2整合Spring、JPA

    Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...

    Struts2 JQuery 文件上传 进度条

    &lt;link rel="stylesheet" href="/struts2-jquery-file-upload/css/fileupload.css"&gt; &lt;script src="/webjars/jquery/3.6.0/jquery.min.js"&gt;&lt;/script&gt; &lt;script src="/webjars/jquery-ui/1.12.1/jquery-ui.min.js"&gt; ...

    strut标签实现 属性菜单。

    在本篇文章中,我们将深入探讨如何使用Struts2标签实现属性菜单,以及与之相关的源码和工具。 首先,`struts2`标签库的核心思想是将业务逻辑与表现层分离,通过自定义标签来简化JSP页面,使得开发者能够更专注于...

    09年struts高级实战进阶PPT.ppt

    对于HTML元素的使用,PPT中提到了&lt;html:link&gt;标签,它是Struts提供的标签库中的一个元素,可以简化URL的构造,自动处理jsessionid,进行URL编码,并且方便地传递参数。相比直接使用标签,&lt;html:link&gt;更适应Struts...

    EJB3.0+Struts2工程

    2. **实体Bean(Entity Beans)**:EJB 3.0 提供了基于JPA(Java Persistence API)的实体管理,允许开发者使用ORM(对象关系映射)框架,如Hibernate或EclipseLink,将Java对象与数据库表进行映射。 3. **会话Bean...

    JSP+Struts+JSTL+EL新闻发布系统jsp

    前台制作采用标签制,分为系统标签和用户自义义标签两种,系统标签是自代的,用户不可以修改,而自定义标签则是用户根据相应的功能自己定制出来的,固此,可以自行删除或修改! 4、秉承JAVA开源理念,本新闻发布系统...

    integer with spring struts hibernate mybatis jpa

    标题 "integer with spring struts hibernate mybatis jpa" 提示了这个压缩包包含的是一个集成多种技术的Java Web开发框架。这些技术包括Spring、Struts、Hibernate、MyBatis和JPA,它们都是Java领域中非常重要的...

    Struts 2 + Spring 2 + JPA + AJAX

    - **AJAX与Struts 2集成**:通过Struts 2提供的AJAX标签库,实现前端页面与后端服务的异步通信,提升用户体验。 ### 结论 通过以上介绍可以看出,Struts 2 + Spring 2 + JPA + AJAX的技术组合为开发者提供了一个...

Global site tag (gtag.js) - Google Analytics