第11章 Struts2框架技术 Struts框架,提供了一种基于MVC体系结构的Web程序的开发方法,具有组件模块化、灵活性和重用性等优点,使基于MVC模式的程序结构更加清晰,同时也简化了Web应用程序的开发。本章主要介绍Struts2框架的使用方法及其使用Struts2开发Web程序的过程及其设计案例。

Slides:



Advertisements
Similar presentations
第 4 章 配合 例子源代码一起使用 Power point 制作:耿祥义 张跃平 普通高等教育 “ 十一五 ” 国家级规划教材 JSP 内置对象.
Advertisements

第二章 JSP 编译指令. 课程目标  JSP 编译指令  JSP 页面的表达式  JSP 页面的注释  JSP 页面的声明  Scriptlets.
Java Web 开发 授课人:张鸽. 第三讲 JSP 内置对象  JSP 有以下九种内置对象,包括:  ·request ,请求对象  ·response ,响应对象  ·pageContext ,页面上下文对象  ·session ,会话对象  ·application ,应用程序对象.
LOGO 第 9 章 Java Servlet 和 JSP 编程 孙焘. 重点: servlet 编程原理 1 servlet 的基础类与编程实现 2 JSP 编程原理 3 JSP 的常用语法 4.
第 9 章 测试部署  9.1 测试  9.2 部署. 9.1 测试  应用测试:使用 JUnit 单元测试框架 测试的目的是检验开发结果是否满足规定需求,测试是保证软件质量的一个重要手段, 在软件开发过程中是不可缺少的组成部分。 单元测试与集成测试分别有各自的定义:在实际开发中,两者之间的界定是模糊的。
第 7 章 配合 例子源代码一起使用 Power point 制作:耿祥义 张跃平 普通高等教育 “ 十一五 ” 国家级规划教材 JSP 与 JavaBean.
Power point 制作 耿祥义 张跃平 配合 例子源代码一起使用. 第 5 章 JSP 与 JavaBean JavaBean 是一个可重复使用的软件组件, 是遵循一定标准、用 Java 语言编写的一 个类,该类的一个实例称为一个 JavaBean ,简称 bean.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
动态Web开发技术--JSP.
第 4 章 PHP 基本語法.
第一章 JSP概述.
第五章 JSP内置对象 第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。 学习目标 熟悉主要内置对象的概念 理解主要内置对象的作用域和生命期 理解主要内置对象的作用和关系 熟悉主要内置对象的使用方法.
基于JSP搭建Web应用程序.
上节课我们是讲解了request, response, session, application 等内置对象,有了它们,我们就可以编写一个完整的应用程序了。 我们来看ebank这个小应用程序的编写。
SAE Java 实际应用 在这里写上你的标题 作者名字/日期
基于SSH的web开发 AND 企业级WEB应用开发新技术
张孝祥IT课堂 -深入体验Java Web开发内幕
JSTL标签库 讲师:梁 桐 北京传智播客教育 1。缓存数据 2。处理字符乱码 3。监听器中的定时器
《Java程序设计之网络编程》 教学课件 重庆大学计算机学院
第一页是课程的标题 Spring入门示例.
MVC Servlet与MVC设计模式.
攻击JAVA WEB 阿里巴巴集团安全中心 周拓.
Part 2 開發Android應用程式的流程
J2EE Struts 和Spring 的区别.
第二章 JAVA语言基础.
Ch07 PHP程式基礎 網頁程式設計.
Hello World 體驗實作第一個JSP程式.
第9章 过滤器和监听器技术 过滤器(Filter)和监听器(Listener)是两种特殊的Servlet技术。过滤器可以对用户的请求信息和响应信息进行过滤,常被用于权限检查和参数编码统一设置等。监听器可以用来对Web应用进行监听和控制的,增强Web应用的事件处理能力。 本章主要介绍过滤器和监听器的编程接口、基本结构、信息配置、部署和运行,最后通过案例说明过滤器和监听器的典型应用。
第四章 網頁表單與資料傳遞.
JSP程式設計 基本概論 歐陽芳泉 Fang-Chuan Ou Yang
软件设计模式与体系结构课程设计 周 宇 College of Information Science and Technology
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
AJAX基础.
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
物件導向程式設計 (Object-Oriented rogramming)
专题4:JSP脚本和指令.
Arena System Technology Architecture 系统技术架构 1、Database V2(Lotus Notes)V3(Oracle8i) 2、Application Server SilverStream2.53 (Java as server side programming.
JSP自定义标签技术的分析与应用 ----Custom Tag 的分析与应用
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
第一章: Java Web 开发技术概述.
進階 WWW 程式設計 -- PHP Regular Expression 靜宜大學資訊管理學系 蔡奇偉副教授 2004
Struts2 讲师:黎活明 北京传智播客教育
第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载
JavaScript 靜宜大學 資管系 楊子青.
第12章 JSP的檔案與電子郵件處理 12-1 伺服端的檔案處理 12-2 伺服端檔案的讀取與寫入 12-3 客戶端的檔案上傳
简单的介绍,简单的配置,简单的扩展 By jfm
DWR WEB开发交流 1、自我介绍 2、DWR概述 3、DWR DEMO介绍 4、DWR实现机制 5、DWR配置说明 6、JS开发注意事项.
第一讲 J2EE基础 博和利初级培训 —开发技能.
郑晟 昆明理工大学 云南省计算机技术应用重点实验室
第11章 Android客户端与服务器交互.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Ajax编程技术 第六章 调试与错误处理.
Ch09 在網頁之間傳遞資訊 網頁程式設計.
JSP程序设计 第9章 Servlet简介.
第十二章 过滤器.
C# 基本語法、變數.
Java Server Faces 参考书籍 Java Server Faces 核心编程.
HTML 103 互動式網頁 助教:黃毓瑩.
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第2章 Java语言基础.
第二章 Java基础语法 北京传智播客教育
第21章 Spring 的MVC框架 Spring不但一个很好的集成框剪,它还提供了构建Web应用程序的全功能MVC模块。Spring 的MVC框架非常强大并不逊色于其他专业的Web框架,如Struts、WebWork。但在国内Spring MVC应用的并不是特别多,原因可能是Struts太深入人心的缘故吧。
第4章 JSP动态网页设计基础 教学目标 教学重点 教学过程 2019年10月21日.
第17章 PHP應用實例探討 17-1 PHP應用實例探討 17-2 圖片版的訪客計數 17-3 訪客留言簿 17-4 聊天室
Presentation transcript:

第11章 Struts2框架技术 Struts框架,提供了一种基于MVC体系结构的Web程序的开发方法,具有组件模块化、灵活性和重用性等优点,使基于MVC模式的程序结构更加清晰,同时也简化了Web应用程序的开发。本章主要介绍Struts2框架的使用方法及其使用Struts2开发Web程序的过程及其设计案例。

第11章 Struts2框架技术 11.1 Struts2简介 11.2 Struts2的配置文件 11.3 Struts2的业务控制器——Action类设计 11.4 Struts2的OGNL表达式、标签库、国际化 11.5 Struts2的拦截器 11.6 Struts2的文件上传和下载 11.7 Struts2的输入验证 本章小结

11.1 Struts2简介 11.1.1 Struts2的组成与工作原理 11.1.2 搭建Struts2开发环境 11.1.3 Struts2入门案例 ——基于Struts2任意两数据的代数和 11.1.4 Struts 2的中文乱码问题处理

11.1.1 Struts2的组成与工作原理 Struts2是基于MVC模式的Web框架,Struts2框架按照MVC的思想主要有,控制器层,模型层,视图组件。

(1)模型组件: 模型组件是实现业务逻辑的模块,由JavaBean或者EJB构成。 (2)视图组件: 视图组件主要有:HTML、JSP和Struts2标签,以及FreeMarker、Velocity等模板视图技术。 (3)控制器组件: 控制器组件主要由一个StrutsPrepareAndExecuteFilter核心控制器和业务控制器Action组成。

Struts2的处理流程图 当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action。Struts2对用户的每一次请求都会创建一个Action,Action是线程安全的。

11.1.2 搭建Struts2开发环境 1.下载Struts2 在搭建Struts2环境前,首先下载Struts2包文件。下载网站为:http://struts.apache.org/download,下载压缩文件struts-2.x.x-all.zip(目前最新的版本为Strut-2.3.8-all-zip)。 下载后,解压该文件,其目录下包含4个子目录: •apps:该文件夹下包含了基于Struts2的示例应用,这些示例应用对于学习者是非常有用的资料。 •docs:该文件夹下包含了Struts 2的相关文档,包括Struts 2的快速入门、Struts 2的文档,以及API文档等内容。 •lib:该文件夹下包含了Struts 2框架的核心类库,以及Struts 2的第三方插件类库,在可发应用程序时,要将需要到的jar文件,导入工程中。 •src:该文件夹下包含了Struts 2框架的全部源代码。

2.搭建Struts2环境 对于一个应用程序(Web工程),搭建其所需要的Struts2环境,一般需要以下2步工作: 首先,找到开发Struts2应用所需要使用到的jar文件,并导入工程中; 其次,修改配置web.xml文件,在web.xml文件中加入Struts2 MVC框架启动配置。

(1)导入开发Struts2应用所依赖的jar文件 开发Struts 2应用程序最少需要的Jar包: •struts2-core-2.x.x.jar:Struts 2框架的核心类库。 •xwork-core-2.x.x.jar:XWork类库。 •ognl-2.6.x.jar:对象图导航语言,struts2框架通过其读写对象的属性。 •freemarker-2.3.x.jar:Struts 2的UI标签的模板使用FreeMarker编写。 •commons-logging-1.x.x.jar:支持Log4J和JDK 1.4以上的日志记录。 •commons-fileupload-1.2.1.jar:文件上传组件。 •javassist-3.11.0.GA.jar:对象图导航语言类库 •commons-validator-1.3.1.jar:验证类库

(2)在配置文件Web.Xml中配置Struts2的启动信息 Struts2通过StrutsPrepareAndExecuteFilter过滤器来启动,在web.xml文件中添加如下配置: <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <url-pattern>/*</url-pattern> </filter-mapping>

(3)建立一个Struts2应用的配置文件 Struts2默认的配置文件为struts.xml(对于MyEclipse开发环境,需要建立在scr子目录下)。对于刚建立的Web应用程序,struts.xml文件的配置信息模版: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> 各种配置信息 </struts> 在以后的设计中,需要对该文件进行修改,添加有关的配置信息

11.1.3 Struts2入门案例 ——基于Struts2任意两数据的代数和 【例12-1】设计一个简单的Web程序,其功能是让用户输入两个整数,并提交给Action,在Action中计算这两个数的代数和,如果代数和为非负数,则跳转到ch11_1_Positive.jsp页面,否则跳转到ch11_1_Negative.jsp页面。

【分析】该问题可设计3个大组件,视图组件、模型组件和控制组组件,但由于该问题较简单,只需要视图组建和控制组建。其中,视图组建有3个Jsp页面:输入两个数据的提交页面(ch11_1_Input.jsp)、代数和为非负数,跳转到ch11_1_Positive.jsp页面,否则跳转到ch11_1_Negative.jsp页面;控制器有一个Action:Ch11_1_Action,该类有三个属性(int x,int y,int sum),分别存放加数、被加数以及和值。其逻辑关系,如图所示。

【测试程序】 【设计步骤】 由上面的分析,该程序的开发步骤为: (1)建立Web工程并在web.xml中配置核心控制器。 (2)设计和编写视图组件(使用JSP编写页面)。 (3)编写视图组件对应的业务控制器组件Action。 (4)配置业务控制器Action,即修改struts.xml配置文件,配置Action。 (5)部署及其运行程序。 【系统的实现】按设计步骤,依次实现。 【测试程序】

【实现】创建工程,导入Struts2必须包:然后依次进行如下操作: (0)修改web. xml配置文件,在web 【实现】创建工程,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_1_Input.jsp (2)设计Action:Ch11_1_Action.java (3)配置Action信息:struts.xml (4)正数显示页面ch11_1_Positive.jsp (5)负数显示页面ch11_1_Negative.jsp 【测试程序】《运行程序》

【系统的实现】按设计步骤,依次实现: (1)在MyEclipse中创建Web工程ch11_1_StrutsAdd(注意:在创建Web工程时,最好选用JavaEE规范),并导入Struts2必需的jar包。 (2)修改web.xml配置文件,在web.xml中添加如下的配置信息: <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <url-pattern>/*</url-pattern> </filter-mapping>

(3)编写JSP页面 由图11-3可知,该系统需要3个页面: ch11_1_Input. jsp ch11_1_Positive (3)编写JSP页面 由图11-3可知,该系统需要3个页面: ch11_1_Input.jsp ch11_1_Positive.jsp ch11_1_Negative.jsp

① 提交数据页面:ch11_1_Input. jsp代码: <%@ page language="java" import="java ① 提交数据页面:ch11_1_Input.jsp代码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>提交两数据页面</title> </head> <body> <form action= "add" method="post"> 请输入两个整数:<br><br> 加数:<input name="x"/><br><br> 被加数:<input name="y"/><br><br> <input type="submit" value="求和"> </form> </body> </html>

② 代数和为非负数时要跳转到页面ch11_1_Positive ② 代数和为非负数时要跳转到页面ch11_1_Positive.jsp代码: <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>显示页面——代数和为非负整数</title> </head> <body> 代数和为非负整数:<s:property value="sum"/> </body> </html>

③ 代数和为负数时要跳转到页面ch11_1_Negative ③ 代数和为负数时要跳转到页面ch11_1_Negative.jsp代码: <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>显示页面——代数和为负整数</title> </head> <body> 代数和为负整数:<s:property value="sum"/> </body> </html>

属性x、y用于接受用户提交的数据,而sum用于保存计算结果,package Action; (4)设计控制类(Action类):Ch11_1_Action.java 属性x、y用于接受用户提交的数据,而sum用于保存计算结果,package Action; public class Ch11_1_Action { private int x; private int y; private int sum; public int getX() {return x;} public void setX(int x) {this.x = x;} public int getY() {return y;} public void setY(int y) {this.y = y;} public int getSum() {return sum;} public String execute() { sum=x+y; if(sum>=0) return "+"; else return "-"; }

(5)修改struts.xml配置文件,配置Action <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="add" class="Action.Ch11_1_Action"> <result name="+">/ch11_1_Positive.jsp </result> <result name="-">/ch11_1_Negative.jsp</result> </action> </package> </struts>

(6)部署该程序到服务器Tomcat中,运行。 【测试程序】

11.1.4 Struts 2的中文乱码问题处理 中文乱码问题一般指的是当请求参数有中文时,无法再Action中得到正确的中文。 Struts2中有两种方法可以解决这个问题: (1)设置JSP页面的pageEncoding="UTF-8",就不会出现中文乱码。 (2)如果JSP页面的pageEncoding="GBK",那么需要在源包(src)下,建立一个属性文件struts.properites,并在该文件内填写如下内容,修改有关的属性值: struts.locale=zh_CN struts.i18n.encoding=gbk 思考:修改例11-1,实现两个汉字字符串的连接,当连接后的串长度大于10,就显示连接结果并显示“串太长”;当连接串的长度小于10,则显示连接结果并显示“串长度较短”。

11.2 Struts2的配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- Bean配置--> <bean name="Bean的名字" class="自定义的组件类"/> <!-- 常量配置--> <constant name="struts.custom.i18n.resources" value="messageResource"/> <!--导入配置文件--> <include file="example.xml"/> <!--包配置--> <package name="p1" extends="struts-default"> <!--对Action的配置,可以有多对--> <action name="login" class="ch01Action.LoginAction"> <!-- 定义逻辑视图和物理资源之间的映射--> <result name="error">/login/login.jsp</result> .............. </action> </package> </struts>

包配置: 配置格式如下: <package name="包名称" namespace="/包的命名空间名" extends="struts-default"> 在该包下的Action配置 </package> 其中: (1)name属性:必须指定name属性,该name属性值可以任意取名。 (2)namespace属性:namespace属性用于定义该包的命名空间,命名空间作为访问该包下Action的路径的一部分。 (3)extends属性:通常每个包都应该继承struts-default包,当包继承了struts-default才能使用struts2提供的核心功能。struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载 struts-default.xml文件。

Action配置 Struts2中Action类的配置能够让Struts2知道Action的存在,并可以通过调用该Action来处理用户请求。Struts2使用包来组织和管理Action。 Action的一般配置格式: <action name="名称" class="Action对应的类" method="Action中某方法名" > <result name="success">/page/hello.jsp</result> </action> <action>元素的常用属性有: •name:指定客户端发送请求的地址映射名称,必选项。 •class:指定Action对应的实现类,默认值为:ActionSupport类。 •method:指定Action类中处理方法名,默认值为Action中的execute方法。 •converter:指定Action类型转换器的完整类名,可选项。

结果配置: Action的result子元素用于配置Action跳转的目的地,结果配置格式: <result name="resultName" type="resultType"> 跳转的目的地 </result> <result>元素的常用属性有: •name:指定Action返回的逻辑视图,默认值为“success”。 •type:指定结果类型定向到其他文件,可以是JSP文件或者Action类,默认值为JSP页面程序。

result类型——type属性及其属性值 type可以有多种选择,Struts2支持各种视图技术,例如JSP、JSF、XML等,默认的是JSP页面的转发。常见的type类型配置有:dispatcher、redirect、chain、redirectAction。 (1)dispatcher: dispatcher是默认类型,表示转发到JSP页面。 (2)redirect:表示重定向。 (3)chain:表示转发到action。 (4)redirectAction:表明是重定向Action, (5)其他类型:除上述类型外,Struts2还支持如下的result类型:  char:用于整合JFreeChar的result类型。  freemarker:用于整合FreeMarker的result类型。  httpheader:用于处理特殊http行为的result类型。  jasper:用于整合jasperReport的result类型。  jsf:用于整合JSF的result类型。  tiles:用于整合Tiles的result类型。  velocity:用于整合Velocity的result类型。  xslt:用于整合XML/XSLT的result类型。

如何访问Action: 包配置和Action配置后,实际上就制定了访问使用action的方式。 访问struts2中action的URL路径由两部分组成:包的命名空间+action的名称。 例如下面的配置信息: <package name="abcd" namespace="/xyz" extends="struts-default"> <action name="helloworld" class="Action对应的类" >…</action> </package> 其访问URL路径为:/xyz/helloworld 注意: 完整路径为:http://localhost:端口/内容路径/xyz/helloworld)。 另外,可加上.action后缀访问此Action,即:/xyz/helloworld.action。

11.3 Struts2的业务控制器 ——Action类设计 开发基于Struts2的Web应用程序时,action是程序的核心,需要编写大量的Action类,并在struts.xml文件中配置Action。Action类中包含了对用户请求的处理逻辑,因此,也把Action称为Action业务控制器。 本节内容: 11.3.1 Action实现类 11.3.2 Action访问Web对象 11.3.3 多方法的Action

11.3.1 Action实现类 Struts2中对Action类没有特殊要求,可以是任意的Java类。 Action类的实现有3种方式: •普通的Java类作为Action •继承ActionSupport实现Action •对象属性驱动的Action

Action设计第一种方式——普通的Java类作为Action 一个普通的Java类可作为Action使用,但该类除所必需的属性外,通常包含一个execute()普通方法,该方法并没有任何参数,并返回字符串类型。 Action中属性定义要符合JavaBean规范,包含Setter方法的属性接受请求参数,Action能自动将请求参数传递给对应的包含Setter方法的属性;包含Getter方法的属性用于将数据转发给视图,需要验证的属性需要定义Getter方法。 【实现案例】 例11-1中所设计的Action:Ch1_1_Action就是一般的Java类,其中,属性x、y用于接受用户提交的数据(请求参数);而sum用于保存计算结果。

——继承ActionSupport实现Action Action接口——》其实现类ActionSupport ——》再创建Action类 (1)Action接口: 定义了Struts2中Action类中应使用的规范。 public interface Action {//声明常量 public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public String execute() throws Exception; //声明方法 }

(2)Action接口提供一个实现类ActionSupport ActionSupport类是一个默认的Action实现类,该类提供了许多默认的方法,其中的3个主要方法: (1)void addFieldError(String fieldname,String errorMessage):添加错误信息。 (2)String exeute():请求时,执行的方法,需要重载。 (3)void validate():用于输入验证。 在编写业务控制器类时,采用继承ActionSupport类,会大大简化业务控制器类的开发,但该类中一般需要重写exeute()方法。 【实现案例】 对例11-1中所设计的Action:Ch1_1_Action修改,使其继承ActionSupport (读者自己设计)。

Action设计第三种方式 ——对象属性驱动的Action Struts2中的Action能自动将请求参数传递给对应的包含Setter方法的属性,但当页面请求参数较多时,把过多的参数属性定义在Action中不符合Struts所倡导的松耦合原则,较好的方法是使用JavaBean来封装参数,在Action中定义该JavaBean对象作为属性,在表单中使用对象的属性作为表单域的名字。 【第3种方式应用案例】 例11-1中的Action:Ch11_1_Action.java,可以这样实现: 首先定义一个包含两数据属性的JavaBean:Add.java; 然后,设计普通的Java类作为Action或利用继承ActionSupport实现Action。

【实现】创建工程:ch11_1_StrutsAdd_gai,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)JavaBean类:Add.java (2)提交信息页面:ch11_1_Input.jsp (3)设计Action:Ch11_1_Action.java (4)配置Action信息:struts.xml (5)正数显示页面ch11_1_Positive.jsp (6)负数显示页面ch11_1_Negative.jsp 【测试程序】《运行程序》

(1)JavaBean类:Add.java package JavaBeans; public class Add { private int x; private int y; public int getX() {return x;} public void setX(int x) {this.x = x;} public int getY() {return y;} public void setY(int y) {this.y = y;} public int sum() {return x+y; } }

(2)重新设计Ch11_1_Action. java,其代码如下: package Action; import JavaBeans (2)重新设计Ch11_1_Action.java,其代码如下: package Action; import JavaBeans.Add; import com.opensymphony.xwork2.ActionSupport; public class Ch11_1_Action extends ActionSupport { private Add s; private int sum; public Add getS() {return s;} public void setS(Add s) {this.s = s;} public int getSum() { return s.sum();} public String execute() throws Exception { sum=s.sum(); if(sum>=0) return "+"; else return "-"; }

(3)修改提交页面,提交信息的属性,采用s. x和s. y ch11_1_Input (3)修改提交页面,提交信息的属性,采用s.x和s.y ch11_1_Input.jsp代码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>提交数据页面</title> </head> <body> <form action="add" method="post"> 请输入两个整数:<br><br> 加  数:<input name="s.x"/><br><br> 被加数:<input name="s.y"/><br><br> <input type="submit" value="求和"> </form> </body> </html> 其他组件都不需要修改,运行情况与例11-1一样。

11.3.2 Action访问Web对象 在Struts2中,Action类和Web对象之间没有直接关系,但可以通过Action访问Web对象。 在Action中访问Web对象有4种方式: •直接访问Web对象——Servler依赖容器方式 •通过ActionContext访问——Map依赖容器方式 •通过IoC访问Servlet对象——Map IoC方式 •通过IoC访问Servlet对象——Servler IoC方式

【例11-2】修改例11-1,将提交的加数x保存到request中,被加数y保存到session中,而和值sum保存在application中,并在显示页面中,分别从request、session和application中获取数据并显示出来。 【分析】对于该题目,需要在Action中访问Web对象,并实现数据的保存,所以,只需要修改例11-1的Action,即,重新设计Ch11_1_Action.java;另外,需要修改显示页面(ch11_1_Positive.jsp和ch11_1_Negative.jsp)。 【实现】由于有4种方式通过Action访问Web对象,所以,可以有4种实现方式,下面分别给出介绍和实现过程。

1、直接访问Web对象——Servlet 依赖容器方式 Struts2框架提供org.apache.struts2.ServletActionContext辅助类来获得web对象。 •HttpServletRequest request = ServletActionContext.getRequest(); •HttpServletResponse response = ServletActionContext.getResponse(); •ServletContext application = ServletActionContext.getServletContext(); •PageContext pagecontext = ServletActionContext.getPageContext(); 而HttpSession session的获取需要两步: HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession();

【例11-2】第一种实现方式 【实现】创建工程:ch11_2_1,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_1_Input.jsp (2)设计Action:Ch11_1_Action.java (3)配置Action信息:struts.xml (4)正数显示页面ch11_1_Positive.jsp (5)负数显示页面ch11_1_Negative.jsp 【测试程序】《运行程序》

对于例11-2,重新设计Action:Ch11_1_Action.java, 其代码如下: 【实现方式1】源代码 【测试程序】 对于例11-2,重新设计Action:Ch11_1_Action.java, 其代码如下: package Action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; public class Ch11_1_Action { private HttpServletRequest request; private HttpSession session; private ServletContext application; private int x, y, sum; public Ch11_1_Action() { request = ServletActionContext.getRequest(); session = request.getSession(); application = session.getServletContext(); }

public int getX() {return x;} public void setX(int x) {this public int getX() {return x;} public void setX(int x) {this.x = x;} public int getY() {return y;} public void setY(int y) {this.y = y;} public int getSum() {return sum;} public String execute() { sum=x+y; request.setAttribute("x2", x); session.setAttribute("y2", y); application.setAttribute("sum2",sum); if sum>= 0) return "+"; else return "-"; }

(2)修改显示页面ch11_1_Positive (2)修改显示页面ch11_1_Positive.jsp,其代码如下: <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>显示页面——代数和为非负整数</title> </head> <body> 代数和为非负整数:<s:property value="sum"/><br> 加数:<s:property value="#request.x2"/><br> 被加数:<s:property value="#session.y2"/><br> 和值:<s:property value="#application.sum2"/><br> </body> </html> (3)对于ch11_1_Negative.jsp的修改与ch11_1_Positive.jsp类似

2、通过ActionContext访问——Map依赖容器方式 ActionContext类提供了一系列相关的方法用于访问保存在 ServletContext、HttpSession、HttpServletRequest中的信息,并将访问结果存储在Map中。 ActionContext类中的常用方法: •public static ActionContext getContext():获得ActionContext 对象。 •public Object get(Object key):在ActionContext中查找key的值。 •public void put(Object key,Object value):向当前ActionContext存入值。 •public void setApplication(Map application):设置application的值。 •public void setSession(Map session):设置session的值。 •public Map getParameters():从请求对象中获取请求参数。 •public Map getApplication():获取ServletContext中保存的Attribute。 •public Map getSession():获取HttpSession中保存的Attribute。 若要实现Web的访问,首先需要获取ActionContext对象,然后利用该对象获取request、session和application三个对象,这三个对象的类型是Map类型的元素。

【例11-2】第二种实现方式 【实现】创建工程:ch11_2_12,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_1_Input.jsp (2)设计Action:Ch11_1_Action.java (3)配置Action信息:struts.xml (4)正数显示页面ch11_1_Positive.jsp (5)负数显示页面ch11_1_Negative.jsp 【测试程序】《运行程序》

3、通过IoC访问访问Servlet对象——Map IoC方式 在Struts2框架中,通过IoC方式将Servlet对象注入到Action中,需要在Action中实现以下接口: (1)org.apache.struts2.interceptor.RequestAware 该接口有void set.Request(Map map)方法,实现该方法的Action可访问HttpSession对象。 (2)org.apache.struts2.interceptor.SessionAware 该接口有void setSession(Map map)方法,实现该方法的Action可访问HttpSession对象。 (3)org.apache.struts2.interceptor.ApplicationAware 该接口有void setApplication(Map map)方法,实现该方法的Action可访问HttpSession对象。

【例11-2】第三种实现方式 【实现】创建工程:ch11_2_3,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_1_Input.jsp (2)设计Action:Ch11_1_Action.java (3)配置Action信息:struts.xml (4)正数显示页面ch11_1_Positive.jsp (5)负数显示页面ch11_1_Negative.jsp 【测试程序】《运行程序》

4、通过IoC访问访问Servlet对象——Servlet IoC方式 在Struts2框架中,通过IoC方式将Servlet对象注入到Action中,需要在Action中实现以下接口: (1)org.apache.struts2.interceptor.ServletContextAware 该接口有void setServletContext(ServletContext servletContext)方法,实现该接口的Action可以直接访问ServletContext对象。 (2)org.apache.struts2.interceptor.ServletRequestAware 该接口有void setServletRequest(HttpServletRequest ruquest),实现该接口的Action可以直接访问HttpServletRequest对象。 (3)org.apache.struts2.interceptor.ServletResponseAware 该接口有void setServleResponse (HttpServletResponse response),实现该接口的Action可以直接访问HttpServletResponse对象。

【例11-2】第四种实现方式 【实现】创建工程:ch11_2_4,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_1_Input.jsp (2)设计Action:Ch11_1_Action.java (3)配置Action信息:struts.xml (4)正数显示页面ch11_1_Positive.jsp (5)负数显示页面ch11_1_Negative.jsp 【测试程序】《运行程序》

11.3.3 多方法的Action 如果为每个业务逻辑定义一个Action,虽然实现方便,但是Action数量多,struts.xml中需要配置的内容也多,使系统非常庞杂。实际上,可以用一个Action处理多个业务请求,并在struts.xml指定业务处理所采用的方法。 有3种方式: •为Action配置method属性 •动态方法调用 •使用通配符映射方式

【例11-3】对于例11-1,只实现了两个整数的求和运算。修改该程序,完成2个整数的四则运算(加减乘除),系统的提交页面如图11-5所示,单击“求和”,系统完成求和运算并显示运行结果,对于其他3个提交按钮类似。 【分析】在提交页面有4个提交按钮,分别完成不同的计算功能,但这4种运算可以在一个Action中定义4个不同的方法来实现,这些方法的格式和execute()方法一样。

1、为Action配置method属性——第一种形式 Struts2中为Action配置method属性是指,每个表单都有method属性,属性值指向在Action中定义的方法名。指定method属性格式: <form action="Action名字" method="方法名字"> 指定method属性需要在struts.xml中配置Action中的每个方法,而且每个Action配置中都要指定method属性,该属性值和表单属性值一致。 在struts.xml中配置格式: <action name="Action名字" class="包名.Action类名" method="方法名字"> <result name="***">/***.jsp</result> …………. </action>

多方法Action配置信息的第一种形式: ——为Action配置method属性 【实现案例】创建工程:ch11_3_1,导入Struts2必须包,然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_3_Input.jsp (2)设计Action:Ch11_3_Action.java (3)配置Action信息:struts.xml (4)显示页面ch11_3_Show.jsp 【测试程序】《运行程序》

对于例11-3的在struts.xml中配置Action,配置内容如下: <struts> <package name="default" namespace="/" extends="struts-default"> <action name="add" class="Action.Ch11_3_Action" method="add"> <result name="show">/ch11_3_Show.jsp</result> </action> <action name="sub" class="Action.Ch11_3_Action" method="sub"> <action name="mul" class="Action.Ch11_3_Action" method="mul"> <action name="div" class="Action.Ch11_3_Action" method="div"> </package> </struts>

设计提交数据页面:ch11_3_Input.jsp,其代码如下: <%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>提交数据页面,并根据不同的按钮选择不同的业务处理</title> <script type="text/javascript"> function sub(){ document.aaa.action="sub";} //动态修改表单的action属性 function mul(){ document.aaa.action="mul";} //动态修改表单的action属性 function div(){ document.aaa.action="div";} //动态修改表单的action属性 </script> </head> <body> <form action="add" method="post" name="aaa"> 请输入两个整数:<br><br> 第1个运算数:<input name="x"/><br><br> 第2个运算数:<input name="y"/><br><br> <input type="submit" value="求和"/> <input type="submit" value="求差" onclick="sub()";/> <input type="submit" value="求积" onclick="mul()";/> <input type="submit" value="求商" onclick="div()";/> </form> </body> </html>

2、动态方法调用——第二种形式 动态方法调用是指采用如下格式调用Action中对应的方法: <form action="Action名字!方法名字"> 在struts.xml中只需配置该Action,而不必配置每个方法,配置格式如下: <action name="Action名字" class="包名.Action类名"> <result name="***">/***.jsp</result> </action>

多方法Action配置信息的第二种形式: ——动态方法调用 【实现】创建工程:ch11_3_2,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_3_Input.jsp (2)设计Action:Ch11_3_Action.java (3)配置Action信息:struts.xml (4)显示页面ch11_3_Show.jsp 【测试程序】《运行程序》

对于例11-3的在struts.xml中配置Action,配置内容如下: <struts> <package name="default" namespace="/" extends="struts-default"> <action name="FourOp" class="Action.Ch11_3_Action"> <result name="show">/ch11_3_Show.jsp</result> </action> </package> </struts>

对于例11-3,首先需要修改提交数据页面,修改的代码如下: <%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>提交数据页面,并根据不同的按钮选择不同的业务处理</title> <script type="text/javascript"> function sub(){ document.aaa.action="FourOp!sub";} function mul(){ document.aaa.action="FourOp!mul";} function div(){ document.aaa.action="FourOp!div"; } </script> </head> <body> 这部分内容与原来的一样。 </body> </html>

3、使用通配符映射方式——第三种形式 在struts.xml文件中配置action元素时,它的name、class、method属性都支持通配符。当使用通配符定义action的name属性时,相当于用一个元素action定义了多个逻辑Action。 配置格式: <action name="Action名字_*" class="包名.Action类名" method="{1}"> <result name="***">/***.jsp</result> …………. </action> 其中,用户请求的URL的模式是“Action名字_*”;同时,method属性值是一个表达式{1},表示它的值为name属性值中第一个“*”的值。

多方法Action配置信息的第三种形式: ——使用通配符映射方式 【实现】创建工程:ch11_3_3导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:ch11_3_Input.jsp (2)设计Action:Ch11_3_Action.java (3)配置Action信息:struts.xml (4)显示页面ch11_3_Show.jsp 【测试程序】《运行程序》

对于例11-3的在struts.xml中配置Action,配置内容如下: <struts> <package name="default" namespace="/" extends="struts-default"> <action name="FourOp_*" class="Action.Ch11_3_Action" method="{1}"> <result name="show">/ch11_3_Show.jsp</result> </action> </package> </struts>

需要对例11-3,修改提交数据页面ch11_3_Input 需要对例11-3,修改提交数据页面ch11_3_Input.jsp,修改的代码如下: <%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>提交数据页面,并根据不同的按钮选择不同的业务处理</title> <script type="text/javascript"> function sub(){ document.aaa.action="FourOp_sub";} function mul(){ document.aaa.action="FourOp_mul";} function div(){ document.aaa.action="FourOp_div"; } </script> </head> <body> <form action=" FourOp_add" method="post" name="aaa"> 其他内容与例11_3_Input.jsp一样 </form> </body> </html>

11.4 Struts2的OGNL表达式、标签库、国际化 Struts视图可以使用JSP、HTML、JavaScript 和样式表等技术外,Struts2框架专门给出自己的标签库,OGNL表达式和国际化处理方式。 本节主要内容: 11.4.1 Struts2的OGNL表达式 11.4.2 Struts2的标签库 11.4.3 Struts2的国际化 11.4.4 Struts2的国际化应用案例

11.4.1 Struts2的OGNL表达式 OGNL(Object-Graph Navigation Language,对象图导航语言),可以通过简单的表达式来访问Java对象中的属性。它是Struts2框架的默认表达式语言。 1. Struts2的OGNL对象、属性及其访问 Struts2框架中的ActionContext是OGNL的根对象,即Action对象是OGNL的根对象。假设在Action中有一个属性类型是对象Student(name, age),变量名是stu,那么访问属性name的OGNL表达式为stu.name。 访问其他Context中的对象的时候,由于不是根对象,在访问时需要加“#”前缀。

(1)application:用于访问ServletContext 如:#application (1)application:用于访问ServletContext 如:#application.userName或者#application['userNamer']。 相当于调用Servlet的getAtrribute("userName")。 (2)session:用于访问HttpSession 如:#session.userName或者#session['userNamer']。 相当于调用session.getAtrribute(" userName")。 (3)request:用于访问HttpServletRequest 如:#request.userName或者#request['userNamer']。 相当于调用request.getAtrribute("userName")。 (4)parameters:用于访问Http的请求参数 如:#parameters.userName或者#parameters['userNamer']。 相当于调用request.getParameter("userName")。 (5)attr:用于按page->request->session->application的顺序访问其属性。 例如:# attr.id。

2. Struts2的OGNL集合及其访问 如果需要一个集合元素时,如List对象或者Map对象,可以使用OGNL集合。 (1)OGNL中使用List对象格式: {e1,e2,e3,…} (2)OGNL中使用Map对象格式: #{key1:value1, key2:value2, key3:value3,…} 该表达式直接生成一个Map对象。 OGNL集合可以使用“in”和“not in”判定元素是否属于该集合。 In:表达式用来判断某个元素是否在指定的集合对象中。 not in:用于判断某个元素是否不在指定的集合对象中。

例如: <s:if test="'a' in {'a', 'b'}"> … </s:if> 或者 <s:if test="'a' not in {'a', 'b'}">

11.4.2 Struts2的标签库 Struts2标签库分为: 表单标签 非表单标签 数据标签 控制标签

1.Struts2的表单标签

2.Struts2的非表单标签 (1)a标签: 用于超链接,例: <s:a href="register.action">注册</s:a> (2)actionerror和actionmessage标签 actionerror标签和actionmessage标签的作用基本一样,这两个标签都是在页面上输出Action中方法添加的信息。 其中: actionerror标签输出Action中addActinErrors()方法添加的信息; actionmessage标签标签输出的是Action中AddActionMessage()方法添加的信息。

(3)action标签:在JSP页面中直接调用Action 常用属性: •id:指定被调用Action的引用ID,可选项。 •name:指定Action的名字,必选项。 •namespace:指定被调用Action所在的namespace,可选项。 •executeResult:指定将Action处理结果包含到当前页面中,默认值为false,即不包含。 •ignoreContextParams:指定当前页面的数据是否需要传给被调用的Action,默认值为false,即默认将页面中的参数传给被调用Action,可选项。

【例11-4】在Action中,利用addActinErrors()方法添加的信息;而在JSP中利用actionerror标签和actionmessage标签输出Action中添加的信息。 【实现】创建工程:ch11_4导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)设计Action:ActionErrorActionMessage (2)配置Action信息:struts.xml (3)显示页面showErrorActionMessage.jsp 【测试程序】《运行程序》 执行路径为:http://localhost:8080/ch11_4/message

//设计添加信息的Action:ActionErrorActionMessage public class ActionErrorActionMessage extends ActionSupport{ public String execute(){ //使用addActionError()方法添加信息 addActionError("使用ActionError添加错误信息!"); addActionMessage("使用ActionMessage添加普通信息!"); return SUCCESS; }

/. 设计JSP:showErrorActionMessage /*设计JSP:showErrorActionMessage.jsp,输出由Action中AddActionMessage()方法添加的信息*/ <%@page contentType="text/html" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>actionerror标签和actionmessage标签的使用</title> </head> <body> <s:actionerror/> <br> <s:actionmessage/> </body> </html>

3.Struts2的数据标签 (1)bean标签:在JSP页面中创建JavaBean实例。可以使用<s:param>标签为JavaBean实例传入参数。常用属性: •name:指定实例化JavaBean的实现类,必选项。 •id:为实例化对象指定id名称,可选项。 (2)include标签:在页面上包含一个JSP页面或者Servlet文件。 格式: <s:include value="文件路径"/> 或格式: <s:include value="文件路径"> <s:param name="" value=""/> </s:include > (3)param标签:用来为其他标签提供参数,如include标签、bean标签等。 (4)set标签:定义新变量,并赋值,同时可指定存取范围,常用属性: •name:指定新变量的名字,必选项。 •scope:指定新变量的使用范围,如action、page、request、response、session、application,可选项。 •value:为新标量赋值,可选项。 •id:指定应用的ID。

(5)property标签:用来输出value属性指定的值。值可以使用OGNL表达式。 (6)url标签:用来在页面中生成一个URL地址。常用属性: •action:指定一个Action作为URL地址。 •method:指定使用Action的方法。 •id:指定该元素的应用ID。 •valu:用来指定生成URL的地址,如果不指定该属性,则使用action属性指定Action作为URL地址。 •encode:指定编码请求方法。 •names:指定名称空间。 •includeContext:指定是否将当前上下文包含在URL地址中,默认值为true。 •includeParams:指定是否包含请求参数,值有none、get、all,默认为get。 (7)date标签:用于格式化一个日期,也计算指定日期和当前时刻之间的时差。常用属性: •format:使用日期格式化。 •nice:指定是否输出指定日期与当前时刻的时差,默认值为false。 •name:指定要格式化的日期值。 •var:指定格式化后的字符串将被放入StacContext中。

4.Struts2的控制标签 控制标签主要用来完成流程的控制,如条件分支、循环操作,也可以实现对集合的排序和合并。 (1)if、elseif和else标签: 这3个标签是用来流程控制的与Java语言中的中的if、elseif、else语句相似 (2)iterator标签: 迭代器,用于遍历集合,集合可以是List、Map、Set和数组。 (3)append标签: 用来将多个集合对象连接起来,组成一个新的集合,从而允许通过一个iterator标签完成对多个集合的迭代。

11.4.3 Struts2的国际化 Struts2框架通过资源文件的方式来实现国际化。 实现国际化的步骤是: (1)建立不同语言的资源文件,并把中文符转化为Unicode代码。 (2)在struts.xml配置文件中配置资源文件。 (3)国际化使用。

【例11-5】假设对登录系统进行国际化处理,要求根据不同的语言环境显示英文和中文用户界面,那么就需要创建英文和中文版本的资源文件,分别取名为globalMessages_GBK.properties和globalMessages_en_US.properties。 【实现源代码】

11.4.4 Struts2的国际化应用案例 【例11-6】基于Struts2,设计一个适应于中英文的登录系统。 【设计】该系统需要设计的组件有: (1)两个页面: 登录页面login.jsp、成功登录页面loginsuccess.jsp。 (2)两个资源文件:支持英文登录的西文编码的资源文件、支持中文登录的汉子编码的资源文件。 (3)登录验证的控制器LoginAction类。该控制器的业务逻辑是:如果验证成功,则跳转到loginsuccess.jsp页面,如果验证不成功,则重新返回到登录页面(login.jsp)。 【实现过程】 (1)建立工程ch11_6_i18n,并在web.xml中配置核心控制器。 (2)编写国际化资源文件并进行编码转换 (3)编写视图组件输出国际化消息 【例11_6源代码】

11.5 Struts2的拦截器 拦截器(Interceptor)是Struts2的核心组成部分。拦截器动态拦截Action调用的对象,它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。 拦截器分为两类:Struts2提供的内建拦截器和用户自定义的拦截器。 本节主要内容: 11.5.1 Struts2的内建拦截器 11.5.2 Struts2拦截器的自定义实现 11.5.3 案例——文字过滤器的设计与应用

11.5.1 Struts2的内建拦截器 拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内 容不变 Chaining Interceptor chain 让前一个Action的属性可以被后一个Action访问,现在和 chain类型的result(<result type=”chain”>)结合使用。 Checkbox Interceptor checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的 内容设定为false,而html默认情况下不提交没有选中的 checkbox。 Cookies Interceptor cookies 使用配置的name,value来是指cookies Conversion Error Interceptor conversionError 将错误从ActionContext中添加到Action的属性字段中。 Create Session Interceptor createSession 自动的创建HttpSession,用来为需要使用到HttpSession的 拦截器服务。 Execute and Wait Interceptor execAndWait 在后台执行Action,同时将用户带到一个中间的等待页面。 Exception Interceptor exception 将异常定位到一个画面 File Upload Interceptor fileUpload 提供文件上传功能 I18n Interceptor i18n 记录用户选择的locale Logger Interceptor logger 输出Action的名字 Message Store Interceptor store 存储或者访问实现ValidationAware接口的Action类出现的 消息,错误,字段错误等。 Model Driven Interceptor model-driven 如果一个类实现了ModelDriven,将getModel得到的结果 放在Value Stack中。

Parameters Interceptor params 将请求中的参数设置到Action中去。 Scoped Model Driven scoped-model- driven 如果一个Action实现了ScopedModelDriven,则这个 拦截器会从相应的Scope中取出model调用Action的 setModel方法将其放入Action内部。 Parameters Interceptor params 将请求中的参数设置到Action中去。 Prepare Interceptor prepare 如果Acton实现了Preparable,则该拦截器调用Action 类的prepare方法。 Scope Interceptor scope 将Action状态存入session和application的简单方法。 Servlet Config Interceptor servletConfig 提供访问HttpServletRequest和HttpServletResponse的 方法,以Map的方式访问。 Static Parameters Interceptor staticParams 从struts.xml文件中将<action>中的<param>中的内容 设置到对应的Action中。 Timer Interceptor timer 输出Action执行的时间 Token Interceptor token 通过Token来避免双击 Validation Interceptor validation 使用action-validation.xml文件中定义的内容校验提交 的数据。 Workflow Interceptor workflow 调用Action的validate方法,一旦有错误返回,重新 定位到INPUT页面

11.5.2 Struts2拦截器的自定义实现 用户自定义一个拦截器一般需要三步: (1)自定义一个实现Interceptor接口(继承AbstractInterceptor或继承MethodFilterIntercepter)的类。 (2)在struts.xml中注册上一步中定义的拦截器。 (3)在需要使用的Action中引用上述定义的拦截器。

11.5.3 案例——文字过滤器的设计与应用 【例11-7】开发一个网上论坛过滤系统,如果网友发表的有不文明的语言,将通过拦截器对不文明的文字进行自动替代。只是给出了一种简单的过滤,过滤是否有“讨厌”文字,若有“讨厌”,则用“喜欢”代替要过滤的内容“讨厌”,形成新的文本内容并显示在论坛上。

【分析】对于该案例,需要编写一个自定义拦截器(MyInterceptor. java),一个发表新闻评论的页面(news 【分析】对于该案例,需要编写一个自定义拦截器(MyInterceptor.java),一个发表新闻评论的页面(news.jsp),其对应的业务控制器PublicAction类,评论成功页面success.jsp页面。 【设计关键】该问题的关键是设计一个拦截器MyInterceptor.java,该拦截器的工作过程是:在页面提交后,获取所提交的请求参数信息,对其进行判定是否含有“讨厌”文字,并进行处理,处理后重新修改请求参数值,然后再执行Action或下一个过滤器。

【实现】创建工程:ch11_7_Interceptor,导入Struts2必须包:然后依次进行如下操作: (0)修改web 【实现】创建工程:ch11_7_Interceptor,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)提交信息页面:news.jsp (2)评论成功显示页面(success.jsp) (3)评论页面对应的业务控制器(PublicAction.java) (4)编写自定义拦截器:MyInterceptor.java (5)配置Action及其拦截器信息:struts.xml 【测试程序】《运行程序》

11.6 Struts2的文件上传和下载 在Struts2框架中,专门提供了实现文件上传、下载功能的两Jar包:commons-fileupload-版本号.jar和commons-io-版本号.jar,在开发Web程序时,需要将两Jar包导入到Web工程中。 本节主要内容: 11.6.1 文件上传 11.6.2 文件下载

11.6.1 文件上传 文件上传,可以按以下步骤实现: (1)编写上传页面,并设置form表单的编码类型。 (2)编写上传文件的Action,在该action中必须定义三个变量:文件、文件名,文件类型。 (3)修改配置文件struts.xml,对Action进行配置。 (4)文件上传过滤。 (5)编写上传成功页面

【实现】创建工程:ch11_UpLoadFile,导入Struts2必须包:然后依次进行如下操作: (0)修改web 【实现】创建工程:ch11_UpLoadFile,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)编写上传页面,并设置form表单的编码类型。 (2)编写上传文件的Action,在该action中必须定义三个变量:文件、文件名,文件类型。 (3)修改配置文件struts.xml,对Action进行配置。 (4)文件上传过滤(在该案例中,没有实现过滤)。 (5)编写上传成功页面 【测试程序】《运行程序》 文件上传后,存放在服务器所在项目的文件夹file下

11.6.2 文件下载 利用Struts2下载文件,一般需要以下3步: (1)编写下载页面。 (2)编写Struts2实现文件下载的Action (3)修改配置文件struts.xml,配置Action。 文件下载案例与实现步骤。

【实现】创建工程:ch11_DownFile,导入Struts2必须包:然后依次进行如下操作: (0)修改web. xml配置文件,在web 【实现】创建工程:ch11_DownFile,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)编写下载文件提示页面。 (2)编写下载文件的Action,在该action中必须定义三个变量:文件、文件名,文件类型。 (3)修改配置文件struts.xml,对Action进行配置。 (4)文件下载过滤(在该案例中,没有实现过滤)。 (5)编写下载成功页面 【测试程序】《运行程序》

11.7 Struts2的输入验证 Struts2提供了安全的服务器验证方法,一种是使用validate()方法,另一种是配置验证(使用配置验证文件)。 本节内容: 11.7.1 使用validate()方法实现验证 11.7.2 使用验证文件实现验证 11.7.3 案例——实现客户注册输入验证

11.7.1 使用validate()方法实现验证 在Struts2框架中,validate()方法是专门用来验证数据的,实现的时候需要继承ActionSupport类,并重写validate()方法来完成输入验证。 具体的应用案例见例11-8

【例11-8】使用validate()方法实现对注册页面进行验证。注册页面如图11-7所示,若输入的数据验证成功,进入验证成功页面(该页面显示注册信息),否则,仍返回注册页面。

【分析】对于该案例,根据Struts2的MVC设计思想,需要设计3部分组件: (1)模型组件: •注册用户的JavaBean:User 【分析】对于该案例,根据Struts2的MVC设计思想,需要设计3部分组件: (1)模型组件: •注册用户的JavaBean:User.Java •实现注册信息添加到数据库的JavaBean:userDbase.java (2)Action控制器的设计:ch11_8_RegisterAction.java,在该控制器中有两个主要方法: •public String register():实现注册 •public void validate():实现注册前的信息验证 (3)设计视图: •注册页面(ch11_8_Regist.jsp):按图11-7所示的页面设计 •注册成功后,显示注册信息的页面:ch11_8_Success.jsp。

【实现】创建工程:ch11_8,导入Struts2必须包:然后依次进行如下操作: (0)修改web. xml配置文件,在web 【实现】创建工程:ch11_8,导入Struts2必须包:然后依次进行如下操作: (0)修改web.xml配置文件,在web.xml中添加Struts2核心控制器的配置信息 (1)模型组件: 注册用户的JavaBean:User.Java 实现注册信息添加到数据库的JavaBean:userDbase.java (2)Action控制器的设计: ch11_8_RegisterAction.java, 配置文件:struts.xml (3)设计视图: •注册页面(ch11_8_Regist.jsp):按图11-7所示的页面设计 •注册成功后,显示注册信息的页面:ch11_8_Success.jsp 【测试程序】《运行程序》

11.7.2 使用验证文件实现验证 Struts2框架还提供了一种基于验证文件的输入验证方式,将验证规则保存在特定的验证文件中。 11.7.2 使用验证文件实现验证 Struts2框架还提供了一种基于验证文件的输入验证方式,将验证规则保存在特定的验证文件中。 1. 验证文件的命名规则 一般情况下,验证文件的命名规则是:Actio类名-validatin.xml。 2. 校验器 Struts2框架提供两种配置校验器的方式:字段校验器配置风格和非字段校验器配置风格。 (1)字段校验器配置风格 (2)非字段校验器配置风格

字段校验器配置风格: <validators> <field name="被校验的字段"> <!--用来指定校验器的类型--> <field-validator type="校验器的类型"> <!--用来向校验器传递参数,可以包含多个param--> <param name="参数名">参数值</param> <!--用来指定校验失败的提示信息--> <message>校验失败提示的信息</message> </field-validator> </field> <! --下一个要验证的字段--> …. </validators>

非字段校验器配置风格: <validators> <!--用来指定校验器的类型--> <validator type="校验器的类型" > <!--用来指定要校验的属性--> <param name="fildName" >需要被校验的字段属性</param> <!--用来向校验器传递的参数,可以包含多个param--> <param name="参数名">参数值</param> <!--用来指定校验失败的提示信息--> <message>校验失败提示的信息</message> </validator> <!--下一个要验证的字段--> </validators>

3.常用的字段检验器 常用的字段校验器及其使用案例格式: 必填校验器:required 必填字符串校验器:requiredstring 字符串长度校验器:stinglength 整数校验器:int 日期校验器:date 邮件地址校验器:email 网址校验器:url 字段表达式校验器:fieldexpression 正则表达式校验器:regex

【例11-9】修改例11-8,使用配置验证文件实现对对注册页面的验证。其设计页面及其验证要求见例11-8中的说明。 【分析】对于该案例,只需要修改业务控制器ch11_8_RegisterAction.java,然后编写验证配置文件即可。 【修改过程】 【测试程序】《运行程序》

本章小结 本章主要介绍Struts2框架的使用方法及其使用Struts2开发Web程序所采用的技术:Struts2框架的结构及其工作原理;Action的设计与配置,Action的调用方法;Struts2标签、国际化、拦截器、文件的上传、下载、输入验证等应用和实现方法。

上机实习 1.采用struts2架构构建一个简单的登录系统。 要求如下: (1)系统功能要求:当用户在登录页面上填写用户名和密码并提交后,系统检查该用户是否已经注册,若注册,系统进入主页面,否则,进入注册页面。 (2)使用javaBean封装提交信息为对象,重新实现所要求的功能。 2.修改题目1,将提交的“用户名信息”保存到request中,“密码信息”保存到session中,而“用户是否已经注册的判定信息”保存在application中,并在显示页面中,分别从request、session和application中获取数据并显示出来。

3.基于Struts2+JDBC+DAO,设计一个简单的网上名片管理系统,实现名片的增、删、改、查等操作。 该名片管理系统包括如下功能: (1)用户登录与注册 用户登录:在登录时,如果用户名和密码正确,进入系统页面。 用户注册:新用户应该先注册,然后再登录该系统。 (2)名片管理 增加名片:以仿真形式(按常用的名片格式)增加名片信息。 修改名片:以仿真形式(按常用的名片格式)修改名片信息。 查询名片:以模糊查询方式查询名片。 删除名片:名片的删除由2种方式,即把名片移到回收站,把名片彻底删除。 (3)回收站管理 还原:把回收站中的名片还原回收。 彻底删除:把名片彻底从回收站删除。 浏览/查询:可以模糊查询、浏览回收站中的名片。