jsp程序设计入门第12章-Struts2框架基础.ppt

上传人:za****8 文档编号:7186040 上传时间:2020-03-15 格式:PPT 页数:235 大小:1.70MB
返回 下载 相关 举报
jsp程序设计入门第12章-Struts2框架基础.ppt_第1页
第1页 / 共235页
jsp程序设计入门第12章-Struts2框架基础.ppt_第2页
第2页 / 共235页
jsp程序设计入门第12章-Struts2框架基础.ppt_第3页
第3页 / 共235页
点击查看更多>>
资源描述
第12章Struts2框架基础 此文档下载自官网 除本页 其余未修改 可直接删除本页 本章内容 Struts2是基于MVC设计模式的Web应用程序开发框架 它是由Struts和WebWork发展而来的 本章首先讨论Struts2框架的体系结构 Action类的使用 OGNL表达式语言 Struts2标签 接下来介绍Struts2的国际化和用户输入校验 最后介绍了使用Tiles插件构建页面布局 本章内容 12 1Struts2框架概述12 2注册 登录系统12 3OGNL12 4Struts2常用标签12 5Struts2的国际化12 6用户输入校验12 7用Tiles实现页面布局 12 1Struts2框架概述 ApacheStruts是用于开发JavaWeb应用程序的开源框架 Struts提供了Web应用开发的优秀框架 是世界上应用最广泛的MVC框架 然而 随着Web应用开发需求的日益增长 Struts已不能满足需要 修改Struts框架成为必要 ApacheStruts小组和另一个JavaEE框架WebWork联手共同开发一个更高级的框架Struts2 12 1Struts2框架概述 Struts2结合了Struts和WebWork的共同优点 对开发者更友好 具有支持Ajax 快速开发和可扩展等特性 它已成为构建 部署和维护动态的 可扩展的Web应用框架 Struts2并不是Struts的简单升级 可以说Struts2是一个既新又不新的MVC框架 Struts2的设计思想和核心架构与WebWork是完全一致的 同时它又吸收了Struts的一些优点 也就是说 Struts2是集WebWork和Struts两者设计思想之优点而设计出来的新一代MVC框架 12 1 1Struts2框架的组成 Struts2框架是基于MVC设计模式的Web应用开发框架 它主要包括控制器 Action对象 视图JSP页面和配置文件等 如图12 1所示 图12 1Struts2的MVC架构 控制器 控制器由过滤器 拦截器或Action组件实现 模型 模型由JavaBeans实现 它可实现业务逻辑 视图 通常由JSP页面实现 也可以由VelocityTemplate FreeMarker或其他表示层技术实现 配置文件 Struts2框架提供一个名为struts xml配置文件 使用它来配置应用程序中的组件 Struts2标签 Struts2提供了一个功能强大的标签库 该库提供了大量标签 使用这些标签可以简化JSP页面的开发 12 1 2Struts2开发环境的构建 运行Struts2的平台必须满足下面需求 ServletAPI2 4 JSPAPI2 0 Java5 1 下载Struts2库文件 开发Struts2应用程序必须安装Struts2库文件 可以到ApacheStrutsWeb站点下载库文件包 地址为 http struts apache org downloads html 目前的最新版本是2 3 8 假设这里下载的是struts 2 3 8 all zip 它是完整发布软件包 其中包括示例应用程序 文档 所有的库文件和源代码 将该文件解压到一个临时目录中 其中lib目录中存放的是Struts2的所有库文件 将下列文件复制到WEB INF lib目录中 1 下载Struts2库文件 asm 3 3 jarasm commons 3 3 jarasm tree 3 3 jarcommons fileupload 1 2 2 jarcommons io 2 0 1 jarcommons lang3 3 1 jar 1 下载Struts2库文件 freemarker 2 3 19 jarjavassist 3 11 0 GA jarognl 3 0 6 jarstruts2 core 2 3 8 jarxwork core 2 3 8 jar 1 下载Struts2库文件 要使Web应用程序支持Struts2功能 需要在web xml文件中声明一个核心过滤器类和映射 代码如下 2 在web xml中添加过滤器 struts2org apache struts2 dispatcher ng filter StrutsPrepareAndExecuteFilterstruts2 2 在web xml中添加过滤器 配置文件用来指定URL Java类和视图页面 如index jsp 之间的关系 在开发环境下配置文件应保存在src目录中 下面是struts xml文件代码 3 创建struts xml配置文件 index jsp 3 创建struts xml配置文件 提示 可以将Struts2自带的一个名为struts2 blank应用程序导入到Eclipse中 在该应用程序中已经完成了各种配置 在此基础上进行开发会更方便 3 创建struts xml配置文件 12 1 3Struts2应用的开发步骤 开发Struts2应用程序大致需3个基本步骤 创建Action动作类 创建结果视图 修改配置文件struts xml 动作类在Struts2中充当控制器 由它处理用户的动作 当用户在视图页面中触发一个动作时 点击超链接或提交表单 请求将经由过滤器发送到一个Action动作类 Struts将根据配置文件struts xml中的信息确定要执行的Action对象 1 创建Action动作类 Action对象调用execute 方法执行业务逻辑或数据访问逻辑 Action类执行后根据结果选择一个资源发送给客户 资源可以是服务器视图页面 也可能是PDF文件 Excel电子表格等 当客户请求URL与某个动作名匹配时 Struts2将使用struts xml文件中的映射处理请求 动作映射在struts xml文件中使用标签定义 1 创建Action动作类 视图用来响应用户请求 输出处理结果 视图通常使用JSP页面实现 2 创建视图页面 struts xml文件主要用来建立动作Action类与视图的映射 在其中为每个动作定义一个映射 它根据动作名确定执行哪个Action类 根据Action类的执行结果确定请求转发到哪个视图页面 3 修改struts xml配置文件 12 1 4一个简单的应用程序 假设创建一个向客户发送一条消息的应用程序 应完成下面3步 1 创建一个Action类 控制器 控制与用户 模型和视图的交互 2 创建一个服务器页面表示消息 视图 3 在struts xml文件中建立Action类与视图的映射 动作是客户单击HTML页面中的超链接向Web服务器发送一个特定请求 动作类的execute 方法被执行并返回SUCCESS结果 Struts根据该结果返回一个视图页面 本例中是hellouser jsp 下面是HelloUserAction类的定义 1 创建Action动作类 packagecom action importcom opensymphony xwork2 ActionSupport publicclassHelloUserActionextendsActionSupport privateStringmessage 动作属性 省略getter方法和setter方法 OverridepublicStringexecute throwsException setMessage HelloStrutsUser returnSUCCESS 1 创建Action动作类 程序12 2index jsp该页面中使用了Struts的标签 要使用Struts的标签 应该使用taglib指令导入标签库 该指令指定了Struts标签的prefix和uri属性值 Struts标签以前缀 s 开头 如标签用来产生一个URL 它的action属性用来指定动作名 这里是hello 当用户点击该链接时将向容器发送hello action请求动作 2 创建视图页面 创建下面的JSP页面hellouser jsp来显示HelloUserAction动作类的message属性值 代码如下 程序12 3hellouser jsp页面中标签显示HelloUserAction动作类的message属性值 通过在value属性中的message告诉Struts框架调用动作类的getMessage 2 创建视图页面 index jsp页面BasicStruts2Application WelcomeWelcomeToStruts2 HelloUser hellouser jsp页面HelloUser 编辑struts xml文件 在元素中添加定义 修改后的代码如下 index jsp hellouser jsp 3 修改struts xml配置文件 访问index jsp页面 当用户单击该页面中的 HelloUser 链接 4 程序的运行 1 容器接收对资源hello action的请求 根据web xml文件的配置将所有请求转发到org apache struts2 dispatcher ng filter StrutsPrepareAndExecuteFilter过滤类 该类对象是进入框架的入口点 2 Struts框架在struts xml文件中查找名为hello的动作映射 发现该映射对应于HelloUserAction类 Struts实例化该类 然后调用其execute 方法 3 在execute 方法中调用setMessage 方法设置message属性值并返回SUCCESS 框架检查struts xml文件中的动作映射 并告诉容器执行结果页面hellouser jsp 4 在处理hellouser jsp页面时 标签将调用HelloUserAction对象的getMessage 方法 返回message的值 将响应发送给浏览器 5 程序的执行过程 假设在index jsp页面中通过表单提供用户名信息 在hellouser jsp页面中显示用户名 在index jsp页面中添加下面的表单标签 6 显示个性化信息 HelloUserAction类必须定义一个名为userName的成员变量和一个名为setUserName 的public方法 Action对象会自动接收表单域的值 privateStringuserName publicStringgetUserName returnuserName publicvoidsetUserName StringuserName this userName userName 6 显示个性化信息 在execute 方法设置message属性值 if userName null setMessage getMessage userName 访问index jsp页面 在用户名文本框中输入Hacker 单击 提交 按钮 显示的页面如下 6 显示个性化信息 12 1 5Action动作类 Struts2应用程序可以完成的每一个操作都称之为一个动作 例如 点击一个超链接是一个动作 输入表单数据后点击提交按钮也是一个动作 创建各种动作是Struts2开发中最重要的任务 有些动作很简单 例如把控制权转交给一个JSP页面 而有些动作需要进行一些逻辑处理 这些逻辑需要写在动作类里 处理这些动作使用动作类 动作类其实质就是Java类 它们可以有属性和方法 但必须遵守下面规则 每个属性都必须有一个getter方法和一个setter方法 动作属性的名字必须遵守与JavaBeans属性名同样的命名规则 动作的属性可以是任意类型 而不仅仅是String类型 12 1 5Action动作类 动作类必须有一个不带参数的构造方法 如果没有提供构造方法 Java编译器会自动提供一个默认构造方法 每个动作类至少有一个方法供Struts2在执行这个动作时调用 一个动作类可以包含多个动作方法 在这种情况下 动作类可以为不同的动作提供不同的方法 例如 一个名为UserAction的动作类可以有login 和logout 方法 并让它们分别对应User login和User logout动作 12 1 5Action动作类 Struts2定义了一个com opensymphony xwork2 Action接口 所有的动作类都可以实现该接口 该接口中定义了5个常量和一个execute 方法 如下所示 1 Action接口 publicinterfaceAction publicfinalstaticStringSUCCESS success publicfinalstaticStringERROR error publicfinalstaticStringINPUT input publicfinalstaticStringLOGIN login publicfinalstaticStringNONE none publicStringexecute throwsException 1 Action接口 编写动作类通常继承ActionSupport类 它是Action接口的实现类 该类还实现了Validateable接口 TextProvider等接口 设置校验错误的方法 返回校验错误的方法 设置和返回动作消息的方法 返回国际化信息的方法 2 ActionSupport类 ActionSupport类是Struts2的默认动作处理类 即如果配置的Action没有指定class属性 系统自动使用ActionSupport类作为动作处理类 在Struts2中 动作类不一定必须实现Action接口 任何普通的Java对象 PlainOldJavaObjects POJO 只要定义execute 方法就可以作为动作类使用 2 ActionSupport类 下面的MyAction类是最简单的动作类 publicclassMyAction publicStringexecute throwsException 执行某些操作return success 注意 MyAction类没有实现任何接口和扩展任何类 动作执行将调用这里的execute 方法 该方法不带参数 返回一个String对象 2 ActionSupport类 12 1 6配置文件 struts xml文件主要用来建立动作Action类与视图的映射 该文件是以为根元素的XML文件 允许出现在和之间的直接子元素包括package constant bean和include 这些元素还可包含若干子元素 12 1 6配置文件 struts xml文件DTD的完整定义在struts2 core 2 3 8 jar文件中 文件名为struts 2 3 dtd 下面对几个比较重要的元素进行讨论 1 package元素 元素用来把动作组织成不同的包 package 一个典型的struts xml文件可以有一个或多个包 package元素的作用是对配置的信息进行逻辑分组 使用该元素可以将具有类似特征的action等配置信息定义为一个逻辑配置单元 这样可以避免重复定义 1 package元素 package元素的常用属性name是指定该包的名称 其他包可使用此名称引用该包extends指定当前包继承哪一个已经定义的包namespace为这个包指定一个URL映射地址abstract指定当前包为抽象的 即该包中不能包含action的定义 1 package元素 在package中可以配置的信息包括actionresultinterceptor example HelloWorld jsp example Login jspMenu example 1 jsp 用于定义一个动作 每个动作都必须有一个名字属性 name指定动作名称class指定动作完整类名 缺省为ActionSupport类method指定执行动作的方法名 缺省为execute 方法 2 action元素 如果动作有与之对应的动作类 则必须使用class属性指定动作类的完整名称 此外 还可以指定执行动作类的哪个方法 下面是一个例子 2 action元素 如果给出了class属性但没有给出method属性 动作方法的名字将默认为execute 下面两个action元素的含义是等价的 2 action元素 用来指定结果类型 即定义在动作完成后将控制权转到哪里 元素对应动作方法的返回值 动作方法在不同的情况下可能会返回不同的值一个元素可能会有多个元素 每个对应着动作方法的一种返回值 3 result元素 比如 若某个方法有 success 和 input 两种返回值 就必须提供两个元素 例如 下面的元素包含两个元素 jsp Confirm jsp jsp Product jsp 3 result元素 如果省略元素的name属性 其默认值是 success 如果省略了type属性 默认结果类型是Dispatcher 下面两个元素的含义是相同的 jsp Confirm jsp jsp Confirm jsp 3 result元素 元素可以包含一个元素 其中包含一些通用的结果 如果某个动作在它的动作声明中不能找到一个匹配的结果 它将搜索元素 如果有这个元素的话 下面是元素的一个例子 jsp GenericErrorPage jsplogin jsp 4 global results元素 5 constant元素 元素用来定义常量或覆盖default properties文件里定义的常量 如下所示的元素将把struts DevMode项设置为true 6 include元素 元素的作用是包含其他的Struts2配置文件 这样 通过元素就可以轻松地把Struts2的配置文件分解为多个文件 元素是的直接子元素 下面是一个例子 12 2注册 登录系统 本节实现一个注册 登录系统 按照MVC设计模式 可以将应用组件分成如下 模型层包括存放用户信息的JavaBean类 持久层包括数据库表 DAO类等 控制层包括Action动作类 表示层包括JSP页面 12 2注册 登录系统 12 2 1定义持久化类12 2 2持久层实现12 2 3定义Action动作类12 2 4创建结果视图12 2 5修改struts xml配置文件12 2 6运行应用程序 12 2 1定义持久化类 为了封装表单数据 定义一个简单的User类 该类遵循JavaBeans规范 包含下面4个属性 privateStringusername privateStringpassword privateintage privateStringemail 程序12 4User java 12 2 2持久层实现 用户数据存放在一个名为userinfo的数据表中 该表有username password age和email字段 CREATETABLEuserinfo usernamevarchar 20 PRIMARYKEY 用户名passwordvarchar 8 NOTNULL 口令ageint 年龄emailvarchar 50 UNIQUE Email地址 这里持久层实现使用Hibernate 需将库文件添加到WEB INF lib目录中 User类的映射文件User hbm xml如下 程序12 5User hbm xml在配置文件hibernate cfg xml中增加下面一行 12 2 2持久层实现 12 2 3定义Action动作类 下面的RegisterAction java程序是一个动作类 在该类中声明了一个User类型的属性user 并为该属性定义了setter方法和getter方法 user对象与JSP页面表单域使用的user名匹配 程序12 6RegisterAction java 12 2 3定义Action动作类 当表单提交时 Struts动作类首先使用User类的默认构造方法创建user属性对象 然后用表单域的值填充该user对象的每个属性 这个过程发生在execute 执行之前 该类定义了register 和login 分别用来处理注册和登录动作 在各自的方法体中创建一个Session对象 然后使用save user 将user对象写入数据库 使用Query的list 检索数据库中是否存在user对象 从而实现注册和登录功能 12 2 4创建结果视图 为了将表单数据收集到User对象中 定义下面的页面register jsp 其中包含一个表单用来接收用户输入数据 程序12 7register jsp 12 2 4创建结果视图 当用户点击 提交 按钮时系统执行Register动作 将表单数据提交给动作对象 因此需要在struts xml文件中定义动作名称 注意 4个输入域的name属性值对应于User类的4个属性 这里用对象名user来引用4个属性 当我们创建Action类处理该表单时 必须在Action类中指定该对象 12 2 4创建结果视图 页面中的和标签用来显示动作错误和域校验的错误 该应用程序还包括登录页面login jsp用来显示用户登录信息 代码如下 程序12 8login jspsuccess jsp是注册成功显示的页面 代码如下 程序12 9success jsp 12 2 4创建结果视图 success jsp是注册成功显示的页面 代码如下 程序12 9success jsp该页面通过标签显示user对象的信息 它将调用User类的toString 输出结果 welcome jsp页面用于显示登录成功欢迎消息 代码如下 程序12 10welcome jsp 12 2 5修改struts xml配置文件 register jsp login jsp welcome jsp error jsp success jsp error jsp 12 2 6运行应用程序 在index jsp页面中添加下列代码定义两个动作 用户注册 用户登录在index jsp页面中单击 用户注册 链接 打开register jsp页面 如图12 4所示 在该页面中输入用户信息 单击 注册 按钮 则显示如图12 5所示页面 12 2 6运行应用程序 12 3OGNL OGNL Object GraphNavigationLanguage 称为对象 图导航语言 它是一种简单的 功能强大的表达式语言 使用OGNL表达式语言可以访问存储在ValueStack和ActionContext中的数据 12 3 1ValueStack栈 对应用程序的每一个动作 Struts在执行相应的动作方法前会先创建一个ValueStack对象 称为值栈 ValueStack用来保存该动作对象及其属性 JSP页面能够访问ValueStack 12 3 1ValueStack栈 在ValueStack栈的内部有两个逻辑组成部分 分别是ObjectStack和StackContext 如图12 6所示 12 3 2读取ObjectStack中对象属性 要访问ObjectStack中对象的属性 可以使用以下几种形式之一 object propertyNameobject propertyName object propertyName 若栈顶动作对象有一个message属性 则可以用下面形式引用 0 message 0 message 0 message 如果从栈顶对象开始搜索 则可以省略下标部分 例如 0 message可直接写成message的形式 还可以使用下面的语法访问动作类的getMessage 方法 示例 定义SampleAction动作类publicclassSampleAction privateStringmessage privateUserBeanuser newUserBean user setUsername 王小明 publicStringexecute setMessage 世界 你好 return success 示例 在struts xml文件中使用下面元素定义动作 sample jsp 示例 在index jsp页面中添加下面代码定义一个超链接引发sample动作 SampleJSP 示例 sample jsp 0 user username user username message getMessage 12 3 3读取StackContext对象的属性 在StackContext中包含下列对象 application session request parameters attr 这些对象都是Map类型的对象 可在其中存储 键 值 对数据 12 3 3读取StackContext对象的属性 application中包含当前应用的Servlet上下文属性session中包含当前会话级属性request中包含当前请求级属性parameters中包含当前请求的请求参数attr用于在request session和application作用域中查找指定的属性 12 3 3读取StackContext对象的属性 要访问StackContext中的对象需要给OGNL表达式加上一个前缀字符 可以使用以下几种形式之一 object propertyName object propertyName object propertyName 这里object为上述5个对象之一 propertyName为对象中的属性名 例如 12 3 5使用OGNL访问数组元素 若动作类SampleAction中声明一个String数组属性 在JSP页面中可以使用标签访问 privateString cities publicStringexecute cities newString 北京 上海 天津 重庆 return success 12 3 5使用OGNL访问数组元素 在JSP页面中可以使用OGNL按如下方式访问数组元素 cities cities length cities 0 top cities 12 3 6使用OGNL访问List类型的属性 privateListfruitList newArrayList fruitList add 苹果 fruitList add 橘子 fruitList add 香蕉 publicStringexecute return success 12 3 6使用OGNL访问List类型的属性 在JSP页面中可以使用OGNL按如下方式访问ArrayList的元素 fruitList fruitList size fruitList 0 12 3 7使用OGNL访问Map类型的属性 privateMapcountryMap newHashMap countryMap put China 北京 countryMap put American 纽约 countryMap put Australia 堪培拉 publicStringexecute return success 12 3 7使用OGNL访问Map类型的属性 在JSP页面中可以使用OGNL按如下方式访问Map的元素 countryMap countryMap size countryMap 1 12 4Struts2常用标签 Struts2框架提供了一个标签库使得Web应用程序可以很容易地在页面中引用动态数据 创建动态响应 有些标签模仿标准的HTML标签 还有些标签用于创建非标准的控件 Struts2的标签可以分为两大类 通用标签用户界面 UI 标签 12 4Struts2常用标签 12 4 1通用标签 1 标签2 标签3 标签4 标签5 标签6 标签7 标签8标签9标签10 标签 1 标签 用于在页面中输出一个动作属性值 例如 下面标签将输出customerId动作属性的值 下面这个标签将输出会话作用域中名为userName的属性值 1 标签 如果没有给出value属性 将输出ValueStack栈顶对象的值 通常 EL语言可以提供更简洁的语法 例如 下面的EL表达式同样可以输出customerId动作属性的值 customerId 2 标签 标签用于把一个参数传递给包含它的标签 如 等 它有两个属性 name 值为参数名value 值为参数值 2 标签 如果要传递一个String类型的字符串作为参数值 必须把它用单引号括起来 例如 也可以将value属性值写在标签的开始标签和结束标签之间 如下所示 JohnSmith 3 标签 标签用于创建JavaBean实例 并把它压入ValueStack栈的StackContext 这个标签的功能与JSP的动作很相似 下面定义一个ConverterBean用来实现摄氏温度和华氏温度的相互转换 3 标签 publicclassConverterBean privatedoublecelcius privatedoublefahrenheit publicdoublegetCelcius return fahrenheit 32 5 9 publicvoidsetCelcius doublecelcius this celcius celcius publicdoublegetFahrenheit returncelcius 9 5 32 publicvoidsetFahrenheit doublefahrenheit this fahrenheit fahrenheit 3 标签 下面的tagDemo jsp页面中使用了和标签 BeanTagExample3737F 4 标签 标签用来在指定作用域中定义一个属性并为其赋值 然后将其存储到StackContext中 使用标签定义popLanguage变量并赋值 然后访问该变量 name属性指定变量名 value属性指定变量值 PopularLanguageis 5 标签 标签与标签类似 区别是标签把一个对象压入ValueStack而不是ContextMap 标签的另一个特殊的地方是 它的起始标签把一个对象压入栈 结束标签将弹出该对象 标签只有一个value属性 它指定将被压入ValueStack栈中的值 5 标签 假设有一名为Employee的JavaBean类 该类有name和age两个属性 在JSP中可使用下列代码创建一个bean实例并将其压入ValueStack 姓名 年龄 姓名 年龄 6 标签 标签用来创建一个超链接 指向其他Web资源 尤其是本应用程序的资源 例如 HelloWorld该标签通过action属性指定引用的资源 当程序运行时 将鼠标指向链接 可以看到链接的目标是hello action 它相对于Web应用程序的根目录 6 标签 在标签内可以使用标签为URL提供查询串 例如 BrucePhillipsHelloBrucePhillips这里 使用为请求提供一个查询参数 userName为参数名 标签内的值为参数值 7 标签 标签用于在JSP页面中直接调用一个Action 8标签 标签用来对Java语言的一个Date对象进行格式化 用户可以指定一种输出格式 如 dd MM yyyyhh mm 还可以产生易读的格式 如 2小时 14分钟 privateDatecurrentDate publicStringexecute throwsException setCurrentDate newDate returnSUCCESS 9标签 标签用于将一个JSP页面 或者一个Servlet的输出包含到本页面中 该标签只有一个必须的value属性 用于指定需要包含的JSP页面或Servlet 在标签体中还可以使用子标签为被包含的JSP页面或Servlet传递参数 9标签 IncludeTag DataTags Example Hello World 10 标签 在JSP页面中可以使用标签 它将生成一个 Debug 链接 单击该链接可以显示ValueStack和StackContext中有关信息 如图12 10所示 12 4 2控制标签 1 和标签2 标签3 标签4 标签5 标签6 标签 1 和标签 这3个标签用来进行条件测试 它们的用途与Java语言中的if else和elseif结构类似 和标签必须带一个test属性 用来设置测试条件 例如 下面这个标签用来测试name请求参数是否为空值null 1 和标签 下面例子使用标签测试会话属性loggedIn是否存在 若不存在显示一个登录表单 若存在显示欢迎信息 publicStringexecute if username null 1 和标签 请输入用户名和口令Welcome 2 标签 标签可以遍历一个数组 一个Collection或一个Map对象并把其中的每一个元素压入和弹出ValueStack栈 表12 10标签的属性 2 标签 标签在开始执行时 会先把org apache struts2 views jsp IteratorStatus类的一个实例压入ContextMap并在每次遍历时更新它 可以将一个指向这个IteratorStatus对象的变量赋给status属性 2 标签 表12 11IteratorStatus对象的属性 2 标签 下面的例子在IteratorAction动作类中定义了一个List属性和一个Map属性 并向其中添加了一些元素 iteratorTag jsp页面演示了如何使用标签访问这些集合对象的元素 程序12 15IteratorAction java下面是iteratorTag jsp页面代码 程序12 16iteratorTag jsp 2 标签 2 标签 标签的value属性值也可以通过常量或使用标签指定值 例如 2 标签 3 标签 标签用于将多个集合对象拼接起来 形成一个新的集合 这样就可以通过一个标签实现对多个集合的迭代 使用标签需要指定一个var属性 该属性值用来存放拼接后生成的集合对象 新集合被放入StackContext中 3 标签 标签可以带多个标签 每个标签用来指定一个需要拼接的集合 子集合中的元素是以追加的方式拼接 即后面集合的元素追加到前面集合元素的后面 3 标签 3 标签 4 标签 标签是将多个集合的元素合并 该标签与标签类似 新集合的元素完全相同 但不同的是 标签是以交叉的方式合并集合元素 5 标签 标签可以将指定字符串按指定分隔符分割成多个子串 临时生成的子串可以使用标签迭代输出 在该标签体内 生成的集合位于ValueStack的顶端 一旦该标签结束 该集合将被移出ValueStack 标签的作用有点类似于String类的split 方法 但它比split 方法的功能更强大 5 标签 表12 12标签的属性 5 标签 6 标签 用来对一个可遍历对象里的元素进行排序 表12 13列出了它的属性 6 标签 下面的例子在SortTagAction类中定义了一个ArrayList对象存放Student对象 一个myComparator的比较器对象 使用该对象对学生集合进行排序 程序12 17SortTagAction java在JSP页面中使用标签对学生对象使用指定的比较器进行排序 结果可存入一个变量中 然后使用标签迭代输出 程序12 18sortDemo jsp 12 4 3表单UI标签 表单UI标签主要用来在HTML页面中显示数据 UI标签的使用非常简单 UI标签可以根据选定的主题自动生成HTML代码 默认情况下 使用XHTML主题 该主题使用表格定位表单元素 1 表单标签的公共属性 在HTML语言中 表单中的元素拥有一些通用的属性 如id属性 name属性以及JavaScript中的事件等 与HTML中相同 Struts2提供的表单标签也存在通用的属性 而且这些属性比较多 1 表单标签的公共属性 1 表单标签的公共属性 2 标签 标签用来创建表单 它使得创建输入表单更容易 Struts2表单标签模拟普通的表单标签 每个标签带有多个属性 action属性用来指定动作 3 和标签 标签用来生成HTML的单行输入框 标签用来生成HTML的口令输入框 这两个标签的公共属性如表12 15所示 3 和标签 下面是一段简单的表单代码 3 和标签 Struts2表单标签最终都转换成HTML标准标签 查看页面的源文件 标签转换后的代码 4 标签 标签用来生成HTML的文本区 该标签的常用属性如表12 16所示 4 标签 例如 下面代码生成一个8行35列的文本区 5 和标签 标签用来生成HTML的提交按钮 根据其type属性的值 这个标签可以有3种显示效果 下面是type属性的合法取值 input 把标签呈现为button 把标签呈现为image 把标签呈现为 5 和标签 标签用来生成HTML的重置按钮 根据其type属性的值 这个标签可以有两种显示效果 下面是type属性的合法取值 input 把标签呈现为button 把标签呈现为 5 和标签 表12 17标签和标签的属性 6 标签 标签用来生成HTML的复选框元素 该标签返回一个布尔值 若被选中返回 true 否则返回 false 例如 标签还有一个非常有用的属性fieldValue 它指定的值将在用户提交表单时作为被选中的实际值发送到服务器 fieldValue属性可以用来发送一组复选框的被选中值 7 标签 标签用来生成HTML的单选按钮组 单选按钮的个数与程序员通过该标签的list属性提供的选项个数相同 通常使用标签实现 多选一 的应用 除了具有表单标签共同的属性外 标签还提供了如表12 18所示的常用属性 7 标签 表12 18标签的属性 7 标签 例如 list listKey和listValue属性对标签 标签 标签 标签和标签来说非常重要 因为它们可以帮助程序员更有效率地管理和获取这些标签的选项 8 标签 标签将呈现为一组复选框 它的属性如表12 20所示 8 标签 标签将被映射到一个字符串数组或一个基本类型的数组 如果它提供的复选框一个也没被选中 相应的属性将被赋值为一个空数组而不是空值 下面的代码演示了标签的用法 9 标签 标签用来生成HTML的下拉列表框元素 它的属性如表12 19所示 9 标签 9 标签 下面是标签一个例子 12 4 4实例 UI标签使用 下面实例演示了几个UI标签的使用 动作类RegisterAction的代码如下 12 4 4实例 UI标签使用 12 4 4实例 UI标签使用 12 4 4实例 UI标签使用 下面实例演示了几个UI标签的使用 动作类RegisterAction的代码如下 下面是register jsp页面代码 success jsp页面的代码如下 RegisterAction register jsp success jsp 12 4 4实例 UI标签使用 在struts xml文件中添加下面的action定义 register jsp register jsp success jsp 12 4 5模板与主题 Struts2标签库的每一个标签都将呈现为一个或多个HTML元素 Struts2允许我们选择这些元素以何种方式呈现 例如 在默认情况下 标签将呈现为HTML的一个form元素和一个table元素 每一种输入标签 如textfield checkbox和submit 都将呈现为一个带标号的输入元素 这个输入元素将被包含在一个tr元素和一个td元素内 12 4 5模板与主题 默认情况下表单标签被排版成表格的形式 但在某些场合 我们可能希望按照自己的想法来进行排版 例如 如果希望元素呈现为一个单独的标签 而不是一个包含在和标签中的输入元素 12 4 5模板与主题 12 4 5模板与主题 用户名 12 4 5模板与主题 每种UI标签都有多种呈现模板 template 可供选择 例如 一种模板把呈现为一个元素和一个元素 而另一种模板只把一个标签呈现为一个表示元素 不增加部分 这些模板是用FreeMarker编写的 但使用这些模板不需要熟悉FreeMarker 12 4 5模板与主题 风格相近的模板被打包为一个主题 theme 所谓主题就是为了让所有的UI标签能够产生同样的视觉效果而汇集到一起的一组模板 Struts2目前提供了4种主题 simpel simple主题里的模板将把UI标签翻译成最简单的HTML对应元素 并且会忽视行标属性 例如 如果使用了这个主题 一个标签将呈现为一个不带元素的元素 而一个标签将呈现为一个不带任何修饰的元素 xhtml xhtml主题是默认的主题 这个主题里的模板通过使用一个布局表提供了一种自动化的排版机制 css xhtml 这个主题里的模板与xhtml主题里的模板类似 但它们将使用CSS来进行布局和排版 ajax 这个主题里的模板以xhtml主题里的模板为基础 但增加了一些高级的Ajax功能 12 4 5模板与主题 下面来看一下如何为UI标签设置一种主题 从前面例子中可以看到 如果没有为UI标签明确地指定一种主题 Struts2就将使用xhtml主题里的模板 为某个UI标签指定主题使用这个标签的theme属性 例如 下面这个标签使用simple主题 12 4 5模板与主题 在表单里 如果没有给出一个UI标签的theme属性 它将使用所在表单的主题 例如 下面这些标签中 除最后一个标签使用simple主题外 其他的都使用css xhtml主题 本章内容 12 1Struts2框架概述12 2注册 登录系统12 3OGNL12 4Struts2常用标签12 5用户输入校验12 6Struts2的国际化12 7用Tiles实现页面布局 12 5用户输入校验 一个健壮的Web应用程序必须确保用户输入是合法的 例如 在把用户输入的信息存入数据库之前通常需要进行一些检查用户选择的口令达到一定长度 如不少于6个字符 Email地址是合法的出生日期在合理的范围内等 通常需要编写有关代码实现输入数据校验 在Struts2中有多种方法实现用户输入校验 12 5用户输入校验 1 使用Struts2校验框架 这种方法是Struts2的基于XML的简单的校验方法 可以对用户输入数据自动校验 甚至可以使用相同的配置文件产生客户端脚本 2 在Action类中执行校验 这是最强大和灵活的方法 Action中的校验可以访问业务逻辑和数据库等 但是 这种校验可能需要在多个Action中重复代码 并要求自己编写校验规则 而且 需要手动将这些条件映射到输入页面 12 5用户输入校验 3 使用注解实现校验 可以使用Java5的注解功能定义校验规则 这种方法的好处是不用单独编写配置文件 所配置的内容和Action类放在一起 这样容易实现Action类中的内容和校验规则保持一致 4 客户端校验 客户端校验通常是指通过浏览器支持的各种脚本来实现用户输入合法性的校验 这其中最经常使用的就是JavaScript 在Struts2中可以通过有关标签产生客户端JavaScript校验代码 12 5 1使用Struts2校验框架 Struts2的校验框架是内建校验程序 它大大简化了输入校验工作 使用该校验框架不需要编程 程序员只要在一个XML文件中对校验程序应该如何工作作出声明就行了 需要声明的内容包括 哪些字段需要进行校验 在校验失败时把什么信息发送到浏览器 12 6 1使用Struts2校验框架 在12 2节的用户注册和登录的例子中 对用户输入的数据没有提供任何校验功能 假设要求为用户输入定义下面的规则 必须提供用户名和口令字段值 口令不能少于6个字符 必须提供一个合法的Email地址 用户年龄必须在16到60之间 12 5 1使用Struts2校验框架 校验程序配置工作的核心是编写校验程序配置文件 配置文件名格式为 validation xml若要为RegisterAction动作类的属性进行校验 则配置文件名为RegisterAction validation xml 该文件应保存在与动作类相同的目录中 程序12 19RegisterAction validation xml 12 5 1使用Struts2校验框架 当输入校验失败后 Struts2自动返回 input 的结果 因此需要在struts xml文件中配置 input 的结果 如下代码所示 success jsp register jsp error jsp 12 5 1使用Struts2校验框架 增加了上面的修改后 就为动作的各字段添加了校验规则 而且指定了校验失败后跳转到的register jsp页面 接下来在register jsp页面中添加来输出错误提示 当动作类执行时系统会自动加载配置文件 Struts2会自动根据用户请求进行校验 当输入不满足校验规则时 就会看到如图12 14所示的界面 12 5 1使用Struts2校验框架 Struts2提供了大量的内建校验器 这些内建的校验器可满足大部分应用的校验需求 开发者只需使用这些校验器即可 如果应用有特别复杂的校验需求 而且该校验有很好的复用性 开发者可以开发自己的校验器 12 5 1使用Struts2校验框架 在xwork core VERSION jar中的com opensymphony xwork2 validator validators路径下的default xml文件中可以看到Struts2的默认的校验器注册文件 里面定义了Struts2所支持的全部校验器 表12 23列出了常用的内置校验器 12 5 1使用Struts2校验框架 12 5 1使用Struts2校验框架 12 5 1使用Struts2校验框架 上面文件中定义的校验器使用的是字段校验器语法 在Struts2中还可以使用普通校验器的方法 如下所示 user email邮件地址不合法 12 5 1使用Struts2校验框架 在上面的数据校验中 校验失败的提示信息通过硬编码的方式写在配置文件中 这显然不利于程序的国际化 在Struts2中 数据的校验提示信息也可以实现国际化 这可通过为元素提供key属性实现 例如 为user username字段指定的校验规则可以使用key属性 12 5 1使用Struts2校验框架 true上述代码元素指定了一个key属性 表明当user username字段违反校验规则时 提示信息key为username required的国际化消息 12 5 2使用客户端校验 Struts2的校验框架还可实现客户端校验 即产生客户端的JavaScript代码校验表单数据 使用客户端校验非常简单 只要满足下面两个要求即可 1 输入页面的表单元素使用Struts2的标签生成 2 在元素增加validate true 属性 将JSP页面进行了上述修改后即可实现客户端校验 这里使用的校验配置文件仍然是RegisterAction validator xml 12 5 2使用客户端校验 当输入数据校验失败时显示的页面与服务器端校验效果相同 Struts2将自动为JSP页面生成JavaScript校验代码并随响应数据一起发送到客户端 当在客户端打开页面时可以右击页面 从 查看源文件 中看到JavaScript校验代码 12 5 2使用客户端校验 注意 使用客户端校验并不支持所有的校验器 客户端校验仅支持下面的校验器 required requiredstring stringlength regex email url int和double校验器 12 5 3编程实现校验 前面介绍的校验方法是声明性的 即先声明 后使用 要校验的字段 使用的校验器和校验失败显示的信息都在XML配置文件中声明 在某些场合 校验规则可能过于复杂 把它们写成一个声明性校验会非常复杂 因此Struts2还提供了通过编程方式实现校验的功能 12 5 3编程实现校验 Struts2提供了Validateable接口 该接口只定义了validate 方法 在动作类中可以实现该接口以提供编程校验功能 由于ActionSupport类已经实现
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!