- 浏览: 516868 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
一、 Struts 2 标签库概述
Struts 2 标签库大大简化了数据输出,也提供了大量标签来生成页面效果。
1.1 标签的优势
JSP 页面里大量嵌套 Java 脚本时,整个页面可读性下降,可维护性也下降。
从 JSP 规范 1.1 版以后,JSP 增加了自定义标签库的规范,通过自定义标签库,可以在简单的标签中封装复杂的功能,从而避免了 JSP 嵌套 Java 脚本
注意: 自定义标签库是一种表现层技术,这是其与 Servlet 最大的差别之处,虽然自定义标签库也需要提供一个 Java 类,但这个 Java 类不应该封装数据访问逻辑、控制器逻辑,它仅能封装数据标签逻辑,因为它是表现层技术。虽然 JSTL (JSP Standar Tag Library,JSP 标准标签库)也提供了 SQL 标签库,但不推荐使用。
开发自定义标签相对复杂,开发自定义标签需要如下步骤:
① 开放自定义标签处理类,标签处理类需要继承 TagSupport 类或其子类
② 建立一个 *.tld 文件,每个 tld 文件对应一个标签库,每个标签库对应多个标签
③ 在 web.xml 文件中增加自定义标签的定义
④ 先在 JSP 文件中使用 taglib 编辑指定导入标签库,然后才能使用自定义标签
JSP 规范制定了一个标准的标签库--- JSTL (JSP Standard Tag Library ),即 JSP 标准标签库。
自定义标签的优势:
● 标签使用更加简单,无需 Java
语言知识,即可开发 JSP
,通过简单的标签完成复杂了逻辑
● 避免了 JSP
页面中嵌套 JSP
脚本,因此开发 JSP
无需 Java
知识,有利于团队协作
● JSP 页面不再嵌套 JSP 脚本,可读性提高,有利于页面的后期维护、升级。
从 JSP 2.0 规范开始,JSP 引入了简化自定义标签的规范,开发自定义标签更加简单,步骤如下:
①
开发自定义标签处理类,统一继承 SimpleTagSupport 类,无需分别继承 TagSupport,或者 BodyTagSupport 类。
②
建立一个 *.tld 文件,每个 tld 文件对应一个标签库,每个标签库对应多个标签。 Web 应用自动加载 *.tld 文件,避免在 web.xml 文件中增加自定义标签定义
③ 先在 JSP 文件中使用 taglib 编辑指定导入标签库,然后才可以使用自定义标签
1.2 Struts 2 的标签分类
Struts 2 标签库的巨大改进之处:不依赖任何表现层技术,可以在各种表现层技术中使用,包括 JSP 、Velocity 、 FreeMarker 等模版技术中使用
Struts 2 标签分类: 大致分 3 类
● UI
(User Interface
用户界面)标签: 主要用于生成 HTML
元素的标签
● 非 UI
标签: 主要用于数据访问、逻辑控制等的标签
● Ajax
标签: 用于 Ajax
(Asynchronous JavaScript And XML
)支持的标签
UI 标签,又分如下 2 类
● 表单标签: 用于生成 HTML 页面的 form 元素,以及普通表单元素的标签
● 非表单标签: 用于生成页面上的树、Tab 页等标签。
非 UI 标签,也分如下 2 类
● 流程控制标签: 主要包含用于实现分支、循环等流程控制的标签
● 数据访问标签: 只要包含用于输出 ValueStack 中的值,完成国际化等功能的标签
二、 Struts 2 标签入门
Struts 2 内建了大量标签。除此之外,还提供例如 Dojo 、YUI 插件等,它们包含的标签还提供 Ajax 功能
2.1 使用 Struts 2 标签的准备
打开 struts2-core-2.2.1.jar 文件,
在 META-INF 路径下找到 struts-tags.tld :
struts-tags.tld 片段:
<display-name>"Struts Tags"</display-name> <tlib-version>2.2</tlib-version> <!-- 标签库默认的短名 --> <short-name>s</short-name> <!-- 标签库默认的 URI --> <uri>/struts-tags</uri>
<uri> 元素是该标签库唯一的标识
在 JSP 中 使用 Struts 2 标签必须导入标签库 :
<%@taglib prefix="s" uri="/struts-tags"%>
2.2 Struts 2 的 OGNL 表达式语言
Struts 2 利用内建的 OGNL (Object Graph Navigation Language ) 表达式语言支持,大大加强了 Struts 2 的数据访问功能,XWork 在原有的 OGNL 的基础上,增加了对 ValueStack 支持
在传统的 OGNL
表达式求值中,系统会假设系统只有一个“根”对象,下面是标准 OGNL
表达式求值,如果系统的 Stack Context
中包含 2 个对象: foo
对象,它在 Context
中的名字为 foo
; bar
对象,它在 Context
中的名字是 bar
。并将 foo
对象设置成 Context
的根对象
//返回 foo.geetBlah() 方法的返回值 #foo.blah //返回 bar.getBlah() 方法的返回值 #bar.blah //因为 foo 是根对象,所以默认是取得 foo 对象的 blah 属性, //即返回 foo.getBlah() 方法的返回值 blah
如有语法:
#bar.foo.blah
上面代码意味着返回 bar.getFoo().getBlah() 方法的返回值。
Struts 2 提供一个特殊的 OGNL PropertyAccessor (属性访问器),它可以自动搜寻 Stack Context 的所有实体(从上到下) ,直到找到与求值表达式匹配的属性。
例如 Stack Context 中包括 2 个根实例: Animal 和 Person ,这 2 个实例中包含 "name " 属性,而且 Animal 还有一个 "species " 属性,而 Person 有一个 "salary " 属性,其中 Animal 是栈顶元素,Person 在其后面。如下:
//返回 animal.getSpecies() 返回值 species //返回 person.getSalary() 返回值 salary //返回 animal.getName() 返回值,因为 Struts 2 先找到 Animal 实例 name //如果要取得 Person 实例的 name 属性,必须如下 person.name
除此之外,还可以通过索引 来访问 Stack Context 中的对象:
//返回 animal.getName() 返回值,因为从第一个开始找,就会先找到 Animal 实例 [0].name //返回 person.getName() 返回值,因为从第二个开始找,就会先找到 Person 实例 [1].name
上面使用索引的方式并不是直接取得指定元素,而是从指定索引开始向下搜索
重要: Struts 2 使用标准的 Context 来进行 OGNL 表达式语言求值,OGNL 的顶级对象是一个 Context ,这个 Context 对象就是一个 Map 类型实例,其根对象就是 ValueStack ,如果需要访问 ValueStack 里的属性,可用如下方法:
#取得 ValueStack 中的 bar 属性 ${bar}
Struts 2
还提供了一些命名对象,这些命名对象与根无关,它们只是存在与 Stack Context
中。所以,访问这些对象时需要使用 #
前缀来指明
●
parameters
: 用于访问 HTTP
请求参数。如:#parameters['foo']
或 #parameters.foo
, 用于返回调用 HttpServletRequest
的 getParameter("foo")
方法的返回值
●
request
: 用于访问 HttpServletRequest
的属性,如:#request['foo']
或
#request.foo
,用于返回调用
HttpServletRequest
的 getAttribute("foo")
方法的返回值
● session
: 用于访问 HttpSession
的属性。如:#session['foo']
或 #session.foo
,用于返回调用 HttpSession
的 getAttribute("foo")
方法的返回值
● application
: 用于访问 ServletContext
的属性。如:#application['foo']
或 #application.foo
,用于返回调用 ServletContext
的 getAttribute("foo")
方法的返回值
● attr : 该对象将依次搜索 PageContext 、HttpServletRequest 、HttpSession 、ServletContext 对象中的属性
注意: 当系统创建了 Action 实例后,该 Action 实例已经被保存到 ValueStack 中,所以无需书写 # 即可访问 Action 属性
注意: 可以在任意页面增加 <s:debug/> 标签,该标签生成一个链接,可以查看 ValueStack 和 Stack Context 里的数据。该标签用于辅助开发者进行调试
2.3 OGNL 中的集合操作
使用 OGNL 表达式可以之间创建集合对象。
List 创建:
{e1,e2,e3}
Map 创建:
#{key1:value1,key2:value2}
对于集合,OGNL 提供了 2 个元素符: in 和 not in
i n : 判断某个元素是否在指定集合中
not in : 判断某个元素是否不在指定集合中
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <s:if test="'foo' in {'foo','bar'}">包含 'foo'</s:if> <s:else>不包含 'foo'</s:else> <br/> <s:if test="'foo' not in {'foo','bar'}">包含 'foo'</s:if> <s:else>不包含 'foo'</s:else> </body> </html>
除此之外,OGNL 还允许通过某个规则取得集合的子集, 3 个操作符 :
● ? : 取出所有符合选择逻辑的元素
● ^ : 取出符合选择逻辑的第一个元素
● $ : 取出符合选择逻辑的最后一个元素
如下:
person.relatives.{? #this.gender == 'male'}
上面代码,.{} 运算符表明用于取出该集合的子集 ,在 {} 内使用 ? 表明取出所有符合选择逻辑的元素 ,而 #this 代表集合里元素 。
上面代码含义: 取出 person 的所有性别为 male 的 relatives (亲戚) 集合。
2.4 访问静态成员
OGNL 表达式还提供了一种访问静态成员 (包括调用静态方法 、访问静态 Field ) 的方式
Struts 2 默认关闭此功能 ,只允许通过 OGNL 访问静态 Field 。为了让 OGNL 访问 静态成员,要在 Struts 2 应用中把 struts.ognl.allowStaticMethodAccess 设置为 true
struts.xml 片段:
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
设置了以上常量,OGNL 可以通过如下语法访问静态成员:
@className@staticField
@className@staticMethod(val...)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>使用Struts 2标签访问静态成员和静态方法</title> <meta name="website" content="http://www.crazyit.org" /> </head> <body> 访问系统环境变量: <s:property value="@java.lang.System@getenv('JAVA_HOME')" /> <br /> 圆周率的值: <s:property value="@java.lang.Math@PI" /> </body> </html>
2.5 Lambda(γ) 表达式
OGNL 支持基本的 Lambda(γ) 表达式语法,可以让 OGNL 语言使用一些简单的函数
假设有如下 :
if n ==0 return 0; elseif n==1 return 1; else return fib(n-2) + fib(n-1);
给定 fib(0) = 0 , fib(1) = 1 ,如果希望根据上面数列规则求 fib(11) 的值。
可以使用 OGNL
:
<s:property value="#fib=:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2) + #fib(#this-1)],#fib(11)"/>
#fib=:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2) + #fib(#this-1)] 表示定义一个简单函数,上面可输出 fib(11) 的值
发表评论
文章已被作者锁定,不允许评论。
-
Struts1 与 Struts2 的12点区别
2011-11-16 11:14 7381) 在Action实现类方面 ... -
Struts 2 的 Ajax 支持(四)
2011-03-14 16:21 17355.4 tabbedpanel 标签 ... -
Struts 2 的 Ajax 支持(三)
2011-02-11 13:18 24255.2 submit 和 a 标签 ... -
Struts 2 的 Ajax 支持(二)
2011-01-27 14:08 2390四、 基于 Dojo 的 pub-sub 事件模型 ... -
Struts 2 的 Ajax 支持(一)
2011-01-20 14:55 2481一、 Ajax 概述 ... -
Struts 2 的拦截器(三)
2011-01-20 13:09 2904六、 拦截器示例 : 实现权限控制 权限检 ... -
Struts 2 的拦截器(二)
2011-01-12 16:38 1623四、 开发自己的拦截器 Struts 2 ... -
Struts 2 的拦截器(一)
2010-12-31 16:53 2014一、 理解拦截器 ... -
Struts 2 的标签库(五)
2010-12-29 11:35 11346.8 select 标签 以下代码 都是基 ... -
Struts 2 的标签库(四)
2010-12-24 16:21 1637六、 表单标签 表单标签,分为 2 种 : f ... -
Struts 2 的标签库(三)
2010-12-20 14:15 1965四、 数据标签 数据标签主要 ... -
Struts 2 的标签库(二)
2010-12-15 16:21 2025三、 控制标签 Str ... -
Struts 2 的国际化(二)
2010-12-09 13:25 2253二、 Struts 2 的国际化入门 ... -
Struts 2 的国际化(一)
2010-12-06 22:44 1300一、 程序国际化简 ... -
Struts2 上传和下载文件(三)
2010-12-03 14:58 1788三、 同时上传多个 ... -
Struts2 上传和下载文件(二)
2010-11-29 13:37 1976二、 Struts 2 的文件上传 ... -
Struts2 上传和下载文件(一)
2010-11-17 22:28 2074一、 文件上传的原理 1. 表单元 ... -
struts2 输入校验 (四)
2010-11-15 22:43 1208六、 手动完成输入校验 对于一些特殊的检验 ... -
struts2 输入校验 (三)
2010-11-08 13:25 1714五、 内建校验器 S ... -
struts2 输入校验 (二)
2010-10-28 11:01 2375二、 基本输入校验 MVC ...
相关推荐
Struts2 提供了一个强大的标签库,用于简化 Web 应用程序的开发过程。这些标签可以分为两类:通用标签和 UI 标签。下面,我们将详细介绍 Struts2 标签库的使用。 4.1 通用标签 通用标签用来控制页面的执行过程,并...
Struts2标签库是Struts2框架中的一个重要组件,它提供了一系列的标签,帮助开发者快速构建Web应用程序。在Struts2标签库中,标签可以分为UI标签和非UI标签两大类。UI标签用于生成HTML控件,如文本框、列表框、复选框...
Struts1 标签库是 Apache Jakarta 的一个著名的开源项目,目标是为构建基于 Java 的 web 应用程序提供一个框架。Struts 提供了非常多的标签,依据功能和使用习惯的不同被分到了五个标签库中:Bean Tags、HTML Tags、...
有关、相关、类似这样的Struts 2标签库的详细介绍。
Struts2标签库的组成 Struts2框架的标签库可以分为以下三类: 用户界面标签(UI标签):主要用来生成HTML元素的标签。 表单标签:主要用于生成HTML页面的FORM元素,以及普通表单元素的标签。 非表单标签:主要用于生成...
Struts2标签库是Java开发Web应用程序时常用的一个强大工具,尤其在构建MVC(Model-View-Controller)架构的应用程序中发挥着重要作用。Struts2框架提供了丰富的自定义标签库,极大地简化了视图层的开发,使得开发者...
在Struts2中,标签库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更加专注于业务逻辑而不是繁琐的HTML代码。本篇文章将深入探讨Struts2的标签库,并通过具体案例进行讲解。 首先,Struts2标签库...
Struts2标签库的核心在于提供了一种声明式编程的方式,使得开发者可以更专注于业务逻辑,而不是繁琐的JSP代码。下面将详细介绍几个关键的Struts2标签: 1. `s:textfield`: 这个标签用于创建HTML输入字段,它自动...
Struts 2 标签的使用注意事项 Struts 2 是一个基于MVC架构的...使用Struts 2标签需要注意配置Struts 2的核心Filter和导入Struts 2标签库。同时,Struts 2标签的用法非常广泛,包括表单标签、验证标签、数据标签等。
Struts1标签库是Java Web开发中的一种工具,主要用于简化基于MVC模式的Struts框架下的JSP页面开发。尽管目前Struts1已逐渐被更新的版本如Struts2取代,但了解其标签库仍然有助于理解Web应用的历史发展和基础概念。 ...
Struts2 框架提供了一个强大的标签库,用于简化 JSP 页面的开发。Struts2 标签库提供了多种标签,例如文本标签、表单标签、逻辑标签等。这些标签可以帮助开发者快速构建 JSP 页面,并且可以与 Struts2 框架的其他...
Struts2标签库是Java Web开发中的重要组成部分,它极大地简化了视图层的构建,提高了开发效率。Struts2框架提供了丰富的标签集合,这些标签主要用于JSP页面,帮助开发者处理常见任务,如数据展示、表单处理、逻辑...
在Struts2框架中,标签库是其一大特色,它提供了丰富的自定义标签,使得开发者能够更加便捷地创建动态页面。这些标签极大地简化了JSP页面的编写,提高了代码的可读性和可维护性。 1. **Struts2核心标签库**: - `s...