新書推薦:
《
山西寺观艺术壁画精编卷
》
售價:HK$
1725.0
《
中国摄影 中式摄影的独特魅力
》
售價:HK$
1127.0
《
山西寺观艺术彩塑精编卷
》
售價:HK$
1725.0
《
积极心理学
》
售價:HK$
57.3
《
自由,不是放纵
》
售價:HK$
56.4
《
甲骨文丛书·消逝的光明:欧洲国际史,1919—1933年(套装全2册)
》
售價:HK$
277.8
《
剑桥日本戏剧史(剑桥世界戏剧史译丛)
》
售價:HK$
207.0
《
中国高等艺术院校精品教材大系:材料的时尚表达??服装创意设计
》
售價:HK$
78.2
編輯推薦:
1.本书构建一个完整的知识体系,全面介绍了Java EE 开发的基础知识,并在此基础上详细的介绍了SSH框架技术,知识点全面,由浅入深。2.同时本书中配备丰富的案例,对每个知识点都以案例做为支撑,让读者通过理论联系实际的方式轻松掌握知识点。3.本书综合考虑了自学与教学两方面因素,不仅适合高等学校教学,学生自学,同时也适应有一定开发经验的程序员作为技术参考使用。
內容簡介:
本书共分为4部分11章,通过理论和实际相结合的方式讲述Java EE技术的相关知识和框架的整合应用。内容包括Java EE技术概述,开发工具的安装与配置,Web相关基础知识;Struts2 的体系结构,Struts2 的安装与配置,Struts2框架的主要配置文件;Action类的实现、配置及使用;拦截器的原理、自定义拦截器和应用;Struts2的验证框架技术、OGNL表达式和Struts2标签的使用;国际化应用、文件的上传下载;Hibernate框架的安装与配置,常用的HQL查询;Spring框架的基础与使用。 本书在编写过程中综合考虑了自学与教学两方面的需要,不仅适合高校教学、学生自学,也适用有一定开发经验的程序员作为技术参考使用。
目錄 :
第一部分 Java EE开发基础篇
第1章 Java EE概述2
1.1 Java EE简介2
1.1.1 Java EE概念2
1.1.2 Java EE的优势4
1.1.3 体系结构4
1.2 开发环境的安装与配置7
1.2.1 JDK 1.87
1.2.2 Tomcat12
1.2.3 MyEclipse15
1.2.4 MySQL23
思考与练习35
第2章 Web基础知识36
2.1 HTML536
2.1.1 HTML5基础36
2.1.2 案例41
2.2 CSS345
2.2.1 CSS3基础45
2.2.2 案例50
2.3 JSP53
2.3.1 JSP基础53
2.3.2 案例60
2.4 Servlet63
2.4.1 Servlet基础63
2.4.2 案例65
2.5 数据库操作68
2.5.1 数据库连接68
2.5.2 案例70
2.6 Ajax74
2.6.1 Ajax基础74
2.6.2 XMLHttpRequest对象76
2.6.3 案例79
思考与练习82
第二部分 Struts2篇
第3章 Struts2开发84
3.1 Struts2结构84
3.1.1 Struts2体系结构84
3.1.2 工作流程86
3.1.3 安装与配置87
3.2 配置文件web.xml91
3.2.1 文件的作用91
3.2.2 常用属性92
3.2.3 案例95
3.3 配置文件struts.properties97
3.3.1 文件的作用97
3.3.2 常用属性99
3.4 配置文件struts.xml102
3.4.1 文件的作用102
3.4.2 常用属性102
3.4.3 案例105
思考与练习107
第4章 业务控制器Action108
4.1 Action概述108
4.2 Action类的实现109
4.2.1 简单POJO109
4.2.2 实现Action接口111
4.2.3 继承ActionSupport类112
4.2.4 案例116
4.3 Action配置119
4.3.1 Action配置119
4.3.2 案例123
4.4 Action传值方式124
4.4.1 属性驱动124
4.4.2 模型驱动126
思考与练习127
第5章 拦截器128
5.1 拦截器概述128
5.1.1 AOP简介128
5.1.2 拦截器原理129
5.1.3 内置拦截器130
5.1.4 案例132
5.2 自定义拦截器133
5.2.1 拦截器类的编写133
5.2.2 拦截器的配置134
5.2.3 默认拦截器137
5.2.4 案例138
思考与练习142
第6章 视图篇143
6.1 验证框架的应用143
6.2 OGNL146
6.2.1 OGNL表达式146
6.2.2 案例149
6.3 Struts2标签库156
6.3.1 标签库概述156
6.3.2 控制标签157
6.3.3 数据标签165
6.3.4 表单UI标签169
6.3.5 非表单UI标签174
思考与练习178
第7章 高级应用篇179
7.1 国际化179
7.2 文件上传183
7.2.1 上传单个文件184
7.2.2 上传多个文件187
7.3 文件下载189
7.4 Struts2应用实例192
思考与练习196
第三部分 Hibernate篇
第8章 Hibernate开发198
8.1 Hibernate结构198
8.1.1 ORM简介198
8.1.2 Hibernate体系结构200
8.1.3 工作流程201
8.1.4 安装与配置203
8.2 Hibernate文件剖析212
8.2.1 POJO类212
8.2.2 Hibernate.cfg.xml配置文件214
8.2.3 HibernateSessionFactory215
8.2.4 Hibernate核心接口217
8.2.5 案例219
思考与练习224
第9章 HQL查询225
9.1 基本查询225
9.1.1 语法介绍225
9.1.2 案例227
9.2 条件查询227
9.2.1 语法介绍227
9.2.2 案例229
9.3 分页查询231
9.3.1 语法介绍231
9.3.2 案例232
思考与练习232
第四部分 Spring篇
第10章 Spring开发234
10.1 Spring结构234
10.1.1 Spring简介234
10.1.2 Spring体系结构235
10.1.3 工作流程239
10.1.4 安装与配置241
10.1.5 案例244
10.2 Spring IoC245
10.2.1 IoC简介246
10.2.2 案例249
10.3 Spring AOP253
10.3.1 AOP简介253
10.3.2 案例254
思考与练习257
第11章 综合案例258
11.1 系统分析258
11.2 系统功能设计259
11.3 数据库设计261
11.4 系统框架整合264
11.5 系统实现274
思考与练习283
参考文献284
內容試閱 :
Java EE技术继承了Java平台无关性的优点,成为当今电子商务的最佳解决方案。使用Struts2、Hibernate和Spring框架进行整合开发是最为流行和最受欢迎的框架搭配,本书主要介绍Java EE的相关知识,以及如何将这些框架整合起来应用到实际的解决方案中。
1.本书内容 本书共分为4部分11章,通过理论和实际相结合的方式讲述Java EE技术的相关知 识和实际应用。
第一部分包括第1、2章。第1章介绍什么是Java EE技术,为什么要学习Java EE 技术,以及Java EE体系结构是什么。然后通过案例的方式介绍Java EE开发工具的安装与配置过程。JavaEE是一个综合的开发平台,开发人员需要掌握网页设计相关技术,因此第2章介绍Web基础知识,包括HTML5、CSS3、JSP的基础知识,以及数据库操作和AJAX等技术。
第二部分包括第3~7章。第3章主要介绍Struts2 的体系结构,通过案例的方式讲述Struts2 的安装与配置,并以实例讲解Struts2框架的主要配置文件。第4章主要介绍Struts2 的Action类的实现、Action类的配置、动态方法调用以及常用的两种传值方式。第5章主要介绍Struts2的拦截器的原理、内置拦截器的使用、自定义拦截器和它的应用。第6章主要介绍Struts2的验证框架技术、OGNL表达式和Struts2标签的分类,然后以实例形式讲解Struts2的常用标签。第7章主要介绍国际化应用、文件的上传下载,并以添加学生信息为例,演示了Struts2框架的应用。
第三部分包括第8、9章。第8章主要介绍Hibernate框架,通过案例的方式讲解 Hibernate框架的安装与配置。然后讲解Hibernate框架的配置文件和核心接口。第9章主要通过实例讲解常用的HQL查询。
第四部分包括第10、11章。第10章主要概述Spring框架技术,通过案例的方式介绍Spring框架的安装与配置,通过入门实例讲解Spring IoC的应用和Spring AOP的应用。第11章通过酒店管理系统实例讲解Struts2、Hibernate和Spring框架的整合过程。
2.本书特色 本书采用大量的实例进行讲解,力求通过实例帮助读者更容易理解Java EE技术,快速掌握Struts2、Hibernate和Spring框架的理论和实际应用。
(1)示例典型,应用广泛。书中大量的示例都是在实际开发中的经验总结而来,可以直接使用。
(2)基于理论,注重实践。本书理论基础与实践应用相结合,让读者更加形象地掌握相应知识点,提高实际应用能力。
(3)本书为任课教师免费提供教学PPT和源代码。
(4)本书难度适中,内容由浅入深,覆盖面广,实用性强。
3.读者对象 本书可作为Struts2、Hibernate和Spring开发的入门书籍,也可以帮助有一定基础的读者提高技能,适用于Java Web开发人员,Java EE框架开发人员,正在培训的读者,在校中专、高职、大专和大学生,也适用于参加工作或自学编程的读者。
4.开发环境 本书开发环境为Windows XP、MySQL5.1、MyEclipse 2015和Tomcat 7.0。
由于笔者水平有限,编写时间仓促,书中难免有疏漏之处,恳请各位读者、老师批评指正,在此表示衷心的感谢。
编者 ?
2017年4月
拦 截 器 拦截器是动态拦截Action调用的对象,在执行Action的方法之前或之后,Struts2会首先执行struts.xml中引用的拦截器。拦截器是Struts2框架的基石,许多功能的实现都是构建在拦截器的基础之上的。
拦截器的编写 拦截器的配置 拦截器的应用 5.1拦截器概述 在软件开发阶段,往往由于前期设计不合理,或者缺乏预见性,可能会导致系统在多个地方需要使用相同的代码,这会造成代码的重复编写,更重要的是给软件日后升级与维护带来极大的不便。例如,有些Action需要输入验证,有的文件上传需要预处理,有的需要禁止重复提交,有的需要下拉列表等,利用拦截器可以很好地解决这些问题。
拦截器指在AOP中用于在某个方法或字段被访问之前或之后,进行拦截然后加入某些操作,这是Struts2框架的一种通用解决方案。
5.1.1AOP简介 AOP(Aspect Oriented Programming)是面向切面编程,也叫面向方面编程,是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
应用AOP主要的目的是将日志记录、性能统计、安全控制、事务处理、异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,将它们独立到方法中,进而在改变这些行为的时候不影响业务逻辑的代码。
使用Java的开发人员比较熟悉OOP(面向对象编程)的方法,那么OOP和AOP有什么区别呢?OOP针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
如果说面向对象编程是关注将需求功能划分为不同的并且相对独立、封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;面向切面编程则是将需求功能从不相关的类中分离出来,使得很多类共享一个行为,一旦发生变化,不必修改很多类,只需修改这个行为就可以。
5.1.2拦截器原理 拦截器处理机制来源于WebWork,在WebWork的中文文档中的解释为拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发人员定义在一个Action执行的前后执行的代码,也可以在一个Action执行前阻止其执行。同时也是提供了一种可以提取Action中可重用部分的方式。
拦截器是AOP的一种实现策略。当用户请求Action时,Struts2框架会激活Action对象。如果定义了拦截器,在Action对象被执行前,激活程序会被另一个对象拦截。在Action执行完毕之后,激活程序同样可以被拦截。Struts2拦截器体系可以动态拦截Action调用的对象,开发人员只需要提供拦截器的实现类,并将其配置在struts.xml文件中即可。
当一个Action需要定义多个拦截器时,通常可以将多个拦截器按一定的顺序连接成一条链,在访问被拦截的方法或者字段时,拦截器链中的拦截器会按照定义的顺序被调用。如图5.1所示。
图5.1 拦截器的工作时序图
Struts2的拦截器一层一层地把Action包裹在最里面,每个Action请求都包装在拦截器内部,整个结构就如同一个堆栈,Action位于堆栈的底部,由于堆栈后进先出的特性,如果试图把Action拿出来执行,必须首先把位于Action上端的Interceptor拿出来执行。拦截器可以在Action执行之前做准备操作,也可以在Action执行之后做回收操作,这样整个执行就形成了一个递归调用。Action既可以将操作转交给下面的拦截器,也可以直接退出操作,返回客户已经定义好的视图资源。每个位于堆栈中的Interceptor,除了需要完成它自身的逻辑,还需要完成一个特殊的执行职责。这个执行职责有以下三种选择。
(1)终止整个执行,直接返回一个字符串。
(2)通过递归调用负责调用堆栈中下一个Interceptor的执行。
(3)如果在堆栈内已经不存在任何的Interceptor,调用Action。
拦截器的执行是通过代理的方式来实现的,当请求到达Struts2框架时,Struts2会查找配置文件,并根据配置实例化相应的拦截器对象,然后将这些对象串成一个列表,最后逐个调用列表中的拦截器。拦截器和Action之间的关系如图5.2所示。
图5.2 拦截器与Action的关系
5.1.3内置拦截器 Struts2内建了大量的拦截器,例如解析请求参数、参数类型转换、将请求参数值赋给Action的属性和数据校验等。这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中,name是拦截器的名字,就是以后使用该拦截器的唯一标识;class则指定了该拦截器的实现类,常用的内置拦截器如下。
(1)alias:实现在不同请求中相似参数别名的转换。
(2)autowiring:这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的 Bean。
(3)chain:构建一个Action链,使当前Action可以访问前一个Action的属性,一般和type="chain" ...一起使用。
(4)conversionError:这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误。
(5)createSession:该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。
(6)debugging:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。
(7)execAndWait:后台执行Action,负责将等待画面发送给用户。
(8)exception:这个拦截器负责处理异常,它将异常映射为结果。
(9)fileUpload:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。
(10)i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。
(11)logger:这是一个负责日志记录的拦截器,主要是输出Action的名字。
(12)model-driven:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel方法的结果堆入ValueStack中。
(13)scoped-model-driven:如果一个Action实现了一个ScopedModelDriven接口,这个拦截器负责从指定生存范围中找出指定的Model,并将通过setModel方法将该Model传给Action实例。
(14)params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
(15)prepare:如果Action实现了Preparable接口,将会调用该拦截器的prepare方法。
(16)static-params:这个拦截器负责将XML中标签下标签中的参数传入Action。
(17)scope:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
(18)servlet-config:如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合。
(19)roles:这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action。
(20)timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。
(21)token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
(22)token-session:这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中。
(23)validation:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
(24)workflow:这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图。
大部分时候,开发人员无须手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,所以只需要在struts.xml文件中通过将struts-default.xml文件包含进来,并继承其中的struts-default包,最后在定义Action时,使用引用拦截器或拦截器栈,就可以使用相应的拦 截器。
5.1.4案例 案例1.本例演示拦截器timer的用途,用于显示执行某个Action方法的耗时,在实际开发中,开发人员能够借此做一个粗略的性能调试。
首先,新建Action类TimerInterceptorAction.java,代码见例5.1。
例5.1TimerInterceptorAction.java
package com;
import com.opensymphony.xwork2.ActionSupport;
public class TimerInterceptorAction extends ActionSupport {
public String execute {
try {
模拟耗时的操作
Thread.sleep 500 ;
} catch Exception e {
e.printStackTrace;
}
return SUCCESS;
}
}
例5.1struts.xml
index.jsp
运行该程序,控制台输出结果见图5.3。在不同的环境中执行Timer!execute的耗时,可能时间有些不同,这取决于PC的性能。但是无论如何,而且第一次加载Timer时,需要进行一定的初始工作,时间可能会多些,当再次重新请求Timer.action时,时间就会变为500ms。
图5.3 拦截器timer的使用
5.2自定义拦截器 作为框架,可扩展性是不可或缺的。虽然Struts2提供如此丰富的拦截器实现,但是这并不意味就失去了创建自定义拦截器的能力,恰恰相反,Struts2自定义拦截器是相当容易的一件事。
5.2.1拦截器类的编写 Struts2提供了Interceptor接口,Struts2规定用户自定义拦截器必须直接或间接实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口的定义如下所示。
public interface Interceptor extends Serializable {
void destroy;
void init;
String interceptActionInvocation invocation throws Exception;
}
通过上面的代码可以看出,该接口中有以下三个方法。
(1)init:该方法在拦截器被实例化之后、拦截器执行之前调用。对于每个拦截器而言,该方法只被执行一次,主要用于初始化资源,例如数据库连接参数等。
(2)interceptActionInvocation invocation:该方法用于实现拦截的动作,方法会返回一个字符串作为逻辑视图。该方法的参数ActionInvocation包含被拦截的Action的引用,用该参数调用其invoke方法,将控制权交给下一拦截器,或者交给Action类的方法。
(3)destroy:该方法与init方法对应,拦截器实例被销毁之前调用,用于销毁在init方法中打开的资源。
另外,Struts2 提供了一个抽象拦截器类AbstractInterceptor,这个类提供了init和destroy方法的空实现,因此继承该类实现拦截器类是更加简单的一种方式,因为并不是每次实现拦截器都要申请资源,那么只需要实现intercept方法就可以。
类AbstractInterceptor代码片段如下。
public abstract class AbstractInterceptor implements Interceptor {
public void init {
}
public void destroy {
}
public abstract String interceptActionInvocation invocation throws Exception;
}
下面使用继承父类AbstractInterceptor的方式开发一个简单的拦截器,代码如下。
public class InterceptorTest extends AbstractInterceptor
{
public String interceptActionInvocation invocation throws Exception {
System.out.println"Action执行前插入 代码";
执行目标方法 调用下一个拦截器, 或执行Action
final String res = invocation.invoke;
System.out.println"Action执行后插入 代码";
return res;
}
}
通过上面的代码可以看出,开发人员要自定义拦截器类,只需要继承AbstractInterceptor类,然后重写intercept方法就可以了。
注意:拦截器必须是无状态的,换句话说,在拦截器类中不应该有实例变量。这是因为Struts2对每一个Action的请求使用的是同一个拦截器实例来拦截调用,如果拦截器有状态,在多个线程(客户端的每个请求将由服务器端的一个线程来服务)同时访问一个拦截器实例的情况下,拦截器的状态将不可预测。
5.2.2拦截器的配置 使用拦截器需要在struts.xml中配置拦截器,相关的配置元素如表5.1所示。
表5.1拦截器配置元素
元素名称
元素含义
用来定义拦截器,所有拦截器与拦截器栈都在此元素下定义。可以包含子元素和,分别用来定义拦截器和拦截器栈
用来定义拦截器,需要指定拦截器的名字和拦截器的类
用来定义拦截器栈,可以引入其他拦截器或拦截器栈
用来引用其他拦截器或拦截器栈,作为和元素的子元素
用来为拦截器指定参数,可以作为或的子元素
1.拦截器的配置 拦截器的配置主要是在struts.xml文件中来定义的。定义拦截器使用元素。其基本语法格式为:
例如:
例子中使用元素配置拦截器,拦截器名为checkLogin,具体实现的拦截器类是放在com包下的LoginInterceptors.java文件中。
2.传递参数 如果调用拦截器时需要传递参数,只要在与之间配置子元素即可传入相应的参数。其格式如下。
参数值
例如:
1008
上例中调用拦截器类时传递了一个参数,参数名为workNum,参数值为1008。
3.拦截器栈 拦截器栈就是将拦截器按一定的顺序连接成一个集合。
拦截器栈示例如下。
...
例如:
上例中配置了两个拦截器BookInter1和BookInter2,如果想让两个拦截器都使用,那么就配置一个拦截器栈BookInterStack,包含两个拦截器,然后只要应用拦截器栈BookInterStack,拦截器BookInter1和BookInter2都会被调用。
4.Action中应用拦截器 一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截Action了。使用元素在Action类中应用拦截器,其配置的语法与在拦截器栈中引用拦截器的语法完全一样,语法如下。
类名"class="action类路径"
结果"运行的文件
示例如下。
welcome.jsp
hello.jsp
hello.jsp
拦截配置在result后面 --
使用系统默认拦截器栈 --
配置拦截器 --
示例中定义了一个拦截器myInterceptor,在Action元素中应用调用该拦截器进行拦截操作。注意配置拦截器,一般放在result元素之后。
5.拦截器方法过滤 默认的情况下,如果为某个Action配置拦截器,则该拦截器会拦截Action中的所有方法。但是有时并不想拦截所有的方法,而是只需要拦截其中的某几个方法,此时就需要使用Struts2中的拦截器方法过滤特性。
Struts2提供一个MethodFilterInterceptor抽象类,该类是AbstractInterceptor类的子类,重写了interceptActionInvocation invocation方法,但是提供了一个doInterceptActionInvocation invocation抽象方法。因此,开发人员实现过滤器方法过滤的特性,需要重写doIntercept方法。另外,MethodFilterInterceptor类中增加了如下两个方法。
public void setExcludeMethodsStringexcludeMethods:排除需要过滤的方法,设置方法的黑名单,所有在excludeMethods中列出的方法都不会被拦截。
public void setIncludeMethodsStringincludeMethods:设置需要过滤的方法,设置方法的白名单,所有在includeMethods中列出的方法都会被拦截。
如果一个方法同时在excludeMethods和includeMethods中出现,则该方法会被拦截。
示例代码如下。
execute,login
test
上面配置文件中粗体代码设置了方法的过滤,includeMethods属性指定了execute和login方法会被拦截,方法名之间以英文逗号隔开。excludeMethods属性指定test方法不会被拦截器拦截。
5.2.3默认拦截器 1.系统默认拦截器栈 在struts-default.xml文件中定义了系统的默认拦截器栈defaultStack。Struts2框架的大部分功能都是通过这个默认拦截器栈来实现的,例如,开发人员没有配置参数解析的拦截器,但是系统却具有对客户端的请求参数进行解析等各种功能。这是因为如果开发人员没有为Action指定拦截器,系统就会以默认拦截器栈defaultStack来拦截Action。如果开发人员为Action指定拦截器,那么系统就不再使用默认拦截器栈,需要开发人员手动配置。
success.jsp
error.jsp
如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以粗体代码为手动引入了系统的默认拦截器。
2.自定义默认拦截器 用户在struts.xml文件中配置一个包时,可以为其指定默认拦截器,一旦为某个包指定了默认拦截器,如果该包中的某些Action没有显式指定其他拦截器,则默认拦截器就会起作用。
自定义默认拦截器语法:
拦截器(或拦截器栈)的名字"
配置用户自定义的默认拦截器需要使用元素,此元素为元素的子元素,配置该元素时,需要指定name属性,该name属性值必须是已经存在的拦截器名字,表明将该拦截器设置为默认的拦截器。
示例:
success.jsp
error.jsp
该例中定义myInterceptor为默认拦截器,在中没有显式配置其他的拦截器,那么在调用strutsAction时,会默认执行myInterceptor拦截器。
在一个包中只能配置一个默认拦截器,如果配置多个默认拦截器,那么系统就无法确认到底哪个才是默认拦截器,但是如果需要把多个拦截器都配置为默认拦截器,可以把这些拦截器定义为一个拦截器栈,然后把这个栈配置为默认拦截器。
5.2.4案例 案例1.文字过滤拦截器实例
网上论坛要求会员发帖的文字信息要文明,通常会进行过滤,如果发现不文明或者敏感的词语,会用*来代替。在Struts2框架中可以使用拦截器来实现这个功能。
例如在某论坛中,网友们可以自由评论,如果出现不文明的字样,就通过拦截器对其过滤,以*显示出来。发表评论页面见例5.2。
例5.2news.jsp
论坛
网友评论
标题" size="45" style="vertical-align: top"标题:
内容" cols="40" rows="5" style="vertical-align: top"内容:
提交"
重置"
该页面表单中定义两个控件,标题title与评论的内容content,单击【提交】按钮,就将表单中的内容提交给Action类来处理。
例5.2 PublishAction类
package com;
import com.opensymphony.xwork2.*;
public class PublishAction extends ActionSupport {
public PublishAction {
}
private String title;
private String content;
public String getTitle {
return title;
}
public void setTitleString title {
this.title = title;
}
public String getContent {
return content;
}
public void setContentString content {
this.content = content;
}
public String execute {
return SUCCESS;
}
}
Action类中,定义了两个属性title和content,分别与表单的控件名一一对应,每个属性都有一对set和get方法,在execute方法中没有进行具体操作,直接返回一个SUCCESS的逻辑视图。
例5.2MyInterceptor类
package com;
import com.PublishAction;
import java.util.*;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor{
public String interceptActionInvocation act throws Exception {
Object object = act.getAction;
if object != null {
if object instanceof PublishAction {
PublishAction action = PublishAction object;
String content = action.getContent;
if content.contains"不文明" {
content = content.replaceAll"不文明", "*";
action.setContentcontent;
}
return act.invoke;
} else {
return Action.LOGIN;
}
} else {
return Action.LOGIN;
}
}
}
MyInterceptor拦截器类中重写了intercept方法,这个方法有一个参数ActionInvocation对象,它是由框架传递过来的,通过这个对象可以获得相关联的Action对象。另外需要引用系统的默认拦截器栈defaultStack,这样,用户提交的数据都被保存在Action的属性中,那么就可以检查属性content中是否包含需要过滤的文字,如果有,就替换成*,然后把替换后的结果赋值给content。运行结果见图5.4和图5.5。
例5.2struts.xml
success.jsp
success.jsp
图5.4 发表评论页面
图5.5 文字过滤效果
思考与练习 1.简述什么是拦截器,它有什么作用。
2.如何编写拦截器?
3.什么是默认拦截器?