struts2拦截器

合集下载

基于AOP理念的Struts2拦截器的研究与应用

基于AOP理念的Struts2拦截器的研究与应用

中图 分 类 号 : P l T3】
文 献标 识 码 : A
文 章编 号 : 6 4 6 3 ( 0 0 0 一 0 8 0 17 — 26 2 1 ) l0 0 — 2
Re e r h a pp i a i n o r t 2 i t r e t r b s d o o o fAO P s a c nd a lc to fSt u s n e c p o a e n l g s o
安 全 验 证 、 日志 等 功 能往 往水 平 散 布 在 所 有 对 象 层 次 中 , 而
与 其 所 散 布 到 的 对象 核心 功能 没有 关 系 。这些 散 布 在各 处 的 代 码 被 称 为 横 切 代 码 , O P设 计 中 , 们 造 成 大 量 代 码 的 在 O 它 重 复 , 利 于各 个 模 块 的 复 用 。而 A P则 可 以 减 少 系统 中 的 不 O
n e e a d fe i lt fit r e t n s l i h r blm s ine n xbii o n e c pori o vngt e p o e . l y
Ke r s s e tO ine Po rmmig AOP) cos ut gc n en s a ;nec po y wo d :A p c— re td rga n( ; rsc tn o c r; w p itre tr i
增 多 和应 用 范 的扩 大 , 渐 暴 露 其 不 足和 局 限性 . 逐 . 比如一 个 系统 中有 几 十 个 或 几 百 个 数据 库 查 询 函数 .每 个 地 方 都 要
O P不 能 为 分 散 的对 象 引 入 公 共 行 为 。也 就 是 O P允许 定 O O
义 从 上 到 下 的关 系 , 并 不 适 合 定 义 从 左 到 的 关 系 。例 如 但

软件开发框架(J2EE)Struts 2拦截器习题与答案

软件开发框架(J2EE)Struts 2拦截器习题与答案

1.以下属于struts2的控制器组件是()。

A.ActionB.ActionFormC.ActionServletD.dispatchAction2.以下属于struts2的体系结构的是()。

A.struts2控制器组件B.struts2配置文件C.FilterDispathcerD.Action3.以下属于struts2配置文件中的配置元素是()。

A.<package>B.<action>C.<form-beans>D.<action-mappings>4.关于struts1和struts2对比的说法正确的是()。

A.Struts1要求Action类继承Struts1框架中的Action父类,Struts2中则不一定需要继承,可以是POJO类B.struts1中的Action不是线程安全的,而struts2中的Action是线程安全的C.struts1和struts2中都使用ActionForm对象封装用户的请求数据D.struts1使用OGNL表达式语言来支持页面效果,struts2通过ValueStack技术使标签库访问值5.以下关于ValueStack说法正确的是()。

A.每个Action对象实例拥有一个ValueStack对象B.每个Action对象实例拥有多个ValueStack对象C.Action中封装了需要传入下一个页面的值,这些值封装在ValueStack对象中D.ValueStack会在请求开始时被创建,请求结束时消亡6.关于struts2配置文件说法正确的是()。

A.必须在WEB-INF/classes目录下B.名字必须为struts.xmlC.配置Action时,必须配置包信息D.使用<forward>元素配置转发7.在struts2配置中用()元素来配置常量。

B.<constants>C.<constant>D.<constant-mapping>8.关于struts2包的说法正确的是()。

struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库第一篇:struts2拦截器--将用户操作日志存入数据库struts2拦截器--将用户操作日志存入数据库1.建表,如下所示:2.新建OperationLogModel.java,其具有上述属性。

3.自动生成PO4.在struts.xml中配置拦截器:5.如下例子中的用户登录和修改密码,要在相应xml文件中加入,即:indexchangePasswordPre6.在项目中新建文件夹log,在其下新建类LogInterceptor .java,如下:package com.bfw.crms.log; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import ng.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.bfw.crms.action.BulletinAction; import com.bfw.crms.action.SystemAction; import com.bfw.crms.model.EmployeeModel; import com.bfw.crms.model.OperationLogModel; import com.bfw.crms.po.OperationLog; import com.bfw.crms.util.BeanUtil; import com.bfw.crms.util.DateTimeUtil; import com.ninetowns.framework.dao.ObjectDao; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;@SuppressWarnings("serial")public class LogInterceptor extends AbstractInterceptor{ private String logName;private String logContent;protected Logger log = Logger.getLogger(getClass()); protected HttpSession getSession(){return getRequest().getSession();}protected HttpServletRequest getRequest(){return ServletActionContext.getRequest();}public void init() {}private ObjectDao objectDao = null;public ObjectDao getObjectDao(){return objectDao;}public void setObjectDao(ObjectDao objectDao){this.objectDao = objectDao;}@Overridepublic String intercept(ActionInvocation ai) throws Exception {Object action= ai.getAction();String method= ai.getProxy().getMethod();try{if(StringUtils.isBlank(method)) method = "method";EmployeeModel sysUser (EmployeeModel)this.getSession().getAttribute("employee");String userName = "";if(sysUser!=null) userName = sysUser.getName();=String currentTime = DateTimeUtil.getDateTime();String logContentHead = "用户"+userName+currentTime;ai.invoke();//执行被拦截actionif (action instanceof BulletinAction) {if(method.equals("save")){logName = "保存部门";logContent = logContentHead+"保存部门:"+ai.getStack().findValue("Name");(logContent);addSysLog(logName,logContent);}if(method.equals("delete")){logName = "删除部门";logContent = logContentHead +""+((String[])(ai.getStack().findValue("flag_id"))).length+"条部门信息";(logContent);addSysLog(logName,logContent);}}if (actioninstanceof SystemAction) {if(method.equals("login")){logName = "登录系统";logContent = logContentHead;(logContent);addSysLog(logName,logContent);}if(method.equals("changePassword")){logName = "修改密码";logContent = logContentHead +"删除1条单位信息";(logContent);addSysLog(logName,logContent);}}}catch(Exception e){e.printStackTrace();}return Action.SUCCESS;}/*** 插入系统日志 model2po()* @param logName* @param logContent*/删除private void addSysLog(String logName,String logContent){ OperationLogModel operationModel = new OperationLogModel();OperationLog operationPO = new OperationLog();operationModel.setOperation(logContent);BeanUtil.model2po(operationModel, operationPO);this.getObjectDao().saveObject(operationPO);}} OK第二篇:Struts2中的拦截器与过滤器学习拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,response 提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do 的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。

paginationinnerinterceptor使用

paginationinnerinterceptor使用

paginationinnerinterceptor使用分页是在网站开发中非常常见的功能之一,可以帮助用户更方便地查看和导航大量的数据。

为了实现分页功能,我们通常会使用一些第三方的库或者插件,来简化开发过程。

而在Java开发中,Struts2框架提供了一个名为paginationinnerinterceptor的拦截器,可以很方便地实现分页功能。

paginationinnerinterceptor是Struts2框架中的一个拦截器,它的作用是拦截Action请求,并对分页参数进行处理。

使用paginationinnerinterceptor可以将分页参数直接映射到Action的属性上,从而实现分页功能。

下面我们来看一下如何使用paginationinnerinterceptor来实现分页功能。

首先,我们需要在Struts2的配置文件struts.xml中配置paginationinnerinterceptor。

我们可以定义一个全局的拦截器栈,在拦截器栈中添加paginationinnerinterceptor拦截器。

具体的配置如下所示:```xml<package name="default" namespace="/" extends="struts-default"><interceptors><interceptor-stack name="paginationStack"><interceptor-ref name="defaultStack" /><interceptor-ref name="paginationinnerinterceptor" /></interceptor-stack></interceptors><default-interceptor-ref name="paginationStack" />...</package>```接下来,我们需要在Action中定义用于接收分页参数的属性。

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三⼤器之拦截器(Interceptor)的实现原理及代码⽰例1,拦截器的概念java⾥的拦截器是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。

在AOP中,拦截器⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或者之后加⼊某些操作。

⽬前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不⽤深究,知道即可。

2,拦截器的原理⼤部分时候,拦截器⽅法都是通过代理的⽅式来调⽤的。

Struts2的拦截器实现相对简单。

当请求到达Struts2的ServletDispatcher时,Struts2会查找配置⽂件,并根据配置实例化相对的拦截器对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的拦截器。

Struts2的拦截器是可插拔的,拦截器是AOP的⼀个实现。

Struts2拦截器栈就是将拦截器按⼀定的顺序连接成⼀条链。

在访问被拦截的⽅法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进⾏调⽤。

3,⾃定义拦截器的步骤第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。

第⼆步:在配置⽂件中注册定义的拦截器。

第三步:在需要使⽤Action中引⽤上述定义的拦截器,为了⽅便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

4,过滤器与拦截器的区别过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是⽅法调⽤,⽐如拦截敏感词汇。

4.1,拦截器是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。

(有⼈说,拦截器是基于动态代理来实现的)4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。

struts2框架特征

struts2框架特征

struts2框架特征Struts2框架特征Struts2是一种流行的Java Web应用程序开发框架,其特征使其成为许多开发者的首选。

本文将介绍Struts2框架的特征,包括MVC 架构、强大的标签库、拦截器、数据验证、国际化支持以及灵活的配置等。

一、MVC架构Struts2采用了MVC(Model-View-Controller)架构,将应用程序的业务逻辑、数据模型和用户界面分离。

这种架构使开发者能够更好地组织代码、提高代码的可维护性,并能够更容易地进行代码重用和测试。

在Struts2中,Model代表数据模型,可以是POJO(Plain Old Java Object)或者是与数据库交互的实体类;View代表用户界面,通常是JSP页面;Controller则负责处理用户请求、调用业务逻辑,并将处理结果返回给用户。

二、强大的标签库Struts2提供了丰富的标签库,使开发者能够更轻松地构建用户界面。

这些标签库包括表单标签、数据展示标签、控制流标签等,可以大大简化页面开发的工作量。

例如,开发者可以使用Struts2的表单标签库来生成表单,并自动处理表单的数据绑定、验证和错误提示。

这样,开发者无需手动编写大量的HTML和JavaScript代码,能够更快速地完成表单开发。

三、拦截器Struts2的拦截器是其核心特性之一,可用于在请求到达Controller之前和之后执行一些通用的处理逻辑,如日志记录、权限验证、异常处理等。

开发者可以通过配置拦截器栈,将多个拦截器按照特定的顺序组合起来,实现复杂的请求处理流程。

拦截器的使用使得开发者能够将通用的处理逻辑从业务逻辑中分离出来,提高了代码的可维护性和重用性。

同时,Struts2还提供了许多内置的拦截器,如参数封装拦截器、文件上传拦截器等,方便开发者处理不同类型的请求。

四、数据验证在Web应用程序中,数据验证是一项重要的任务。

Struts2提供了强大的数据验证机制,开发者可以通过简单的配置实现对表单数据的验证。

struts2常见面试题

struts2常见面试题

struts2常见面试题Introduction:Struts2是一种用于开发Java Web应用程序的开源Web应用框架。

在软件工程领域,Struts2常常是面试中的热门话题。

本文将介绍一些常见的Struts2面试题,并提供详细解答和示例。

Question 1: 什么是Struts2框架?它的主要特点是什么?Struts2是一个基于MVC设计模式的Web应用框架。

它通过集成多个核心组件(如拦截器、过滤器、表单验证等)提供了一套丰富的功能,用于简化开发和管理Java Web应用程序。

Struts2的主要特点包括:1. 松耦合:Struts2使用基于配置的方式来管理组件之间的依赖关系,降低了模块之间的耦合。

2. 灵活性:开发人员可以根据自己的需求进行扩展和定制,以适应不同的项目需求。

3. 可测试性:Struts2的组件松耦合特点使得单元测试变得容易,并且可以方便地模拟用户请求进行测试。

Question 2: Struts2的核心组件有哪些?Struts2的核心组件包括:1. Action:处理用户请求的核心组件,负责接收请求并执行相应的业务逻辑。

2. Interceptor:用于对请求进行预处理和后处理的拦截器组件。

3. Result:负责生成响应结果,可以是页面视图或其他格式的数据(如JSON、XML等)。

4. FilterDispatcher:负责将请求分发给合适的Action处理。

5. ValueStack:用于存储Action处理的结果数据,支持OGNL表达式以便于数据的访问和操作。

Question 3: 如何定义一个Struts2的Action?在Struts2中,可以通过以下几种方式来定义一个Action:1. 实现Action接口:通过实现Action接口,并提供相应的业务方法来处理请求。

2. 继承ActionSupport类:ActionSupport是一个提供了一些方便方法的抽象类,可以直接继承并实现自己的业务逻辑。

struts2 error处理

struts2 error处理

struts2 error处理Struts2错误处理可以通过以下几种方式进行处理:1. 全局异常处理器(Global Exception Handler):可以通过实现`com.opensymphony.xwork2.Action`接口,并定义`execute()`方法来处理所有的异常。

在struts.xml配置文件中添加如下内容:```xml<global-exception-mappings><exception-mapping exception="ng.Exception"result="error" /></global-exception-mappings>```2. Action级别的异常处理器:每个Action类可以通过实现`com.opensymphony.xwork2.Action`接口,并定义`execute()`方法来处理特定的异常。

在struts.xml配置文件中,为每个使用自定义处理器的Action配置异常处理器:```xml<action name="example" class="com.example.ExampleAction"> <exception-mapping exception="ng.Exception"result="error" /><result name="error">/error.jsp</result><result>/example.jsp</result></action>```3. 拦截器异常处理器:Struts2中的拦截器可以捕获并处理Action方法中的异常。

可以通过自定义拦截器来实现异常处理,然后在struts.xml配置文件中使用:```xml<action name="example" class="com.example.ExampleAction"><interceptor-ref name="exceptionInterceptor" /><result>/example.jsp</result></action>```以上是Struts2错误处理的几种典型方法,可以根据具体需求选择适合的方式进行处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

7
Struts2.0拦截器
加拿大 •亚思晟 (中国 )公司
8
Struts2.0拦截器
实现原理
加拿大 •亚思晟 (中国 )公司
我们好奇,系统如何自动的调用拦截器,而且知道到底调用哪个拦截器的方法? 大部分时候,拦截器方法都是通过代理的方式来调用,JDK的动态代理来调用,AOP的实现 机制。AOP也是spring的核心,我们在spring学习时候具体讲解代理机制。
11
Struts2.0拦截器
应用定义好的拦截器: <interceptor-ref name="拦截器名"/>
加拿大 •亚思晟 (中国 )公司
在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器 时)会自动引用一些拦截器。 这个默认的拦截器引用如下: <default-interceptor-ref name="defaultStack"/> 上面在defaultStack中引用的拦截器都可以在<action>中不经过引用就可以使用
timer是Struts2中最简单的拦截器,这个拦截器对应的类是 com.opensymphony.xwork2.interceptor.TimerInterceptor。 它的功能是记录execute方法和其他拦截器(在timer后面定义的拦截器)的intercept方法执 行的时间总和。 如下面的配置代码所示: <action name="hello" class=“com.ascent.action.HelloAction“> <interceptor-ref name="logger"/> <interceptor-ref name="timer" /> </action> 由于在timer后面没有其他的拦截器定义,因此,timer只能记录execute方法的执行时间, 在访问hello动作时,会在控制台输出类似下面的一条信息: 信息: Executed action [/test/hello!execute] took 16 ms.
拦截器的意义 可以这样理解,拦截器是对上面调用方法的改进。拦截器也是一个类,这个类也包含方法,只 是这个方法比较特殊,它会在目标方法调用之前“自动”执行。 对比,如果不使用拦截器,代码中要显示的通过代码来调用方法,如果使用拦截器,方法调用 是由系统完成。通过对比,不难发现使用拦截器的优势:拦截器提高了更高层次的解耦。 看进一步改进图如下:
14
Struts2.0拦截器
二、params拦截器使用
加拿大 •亚思晟 (中国 )公司
当客户端的一个form向服务端提交请求时,如有textfield,代码如下: <s:form action="login" > username <s:textfield name="username"/> <s:submit/> </s:form> 在提交后,Struts2将会自动调用login动作类中的setXX方法,并将文本框中的值通过setXX 方法的参数传入。 实际上,这个操作是由params拦截器完成的,params对应的类是 com.opensymphony.xwork2.interceptor.ParametersInterceptor。 由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用 params的。
注意:!!!!! 如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的
拦截器,需要在<action>中重新引用。

12
Struts2.0拦截器
下面我们来看几个简单的拦截器的使用方法 一、记录拦截器和execute方法的执行时间(timer)
加拿大 •亚思晟 (中国 )公司
AOP的编程方式中,有三个重要的概念: 目标对象:被代理对象,包含被拦截方法的类对象 被插入的处理方法:定义在拦截器中的方法,会在被拦截方法前后自动执行的方法 代理对象:以目标对象为蓝本,由系统产生的新对象。
9
Struts2.0拦截器
Struts2中的拦截器
加拿大 •亚思晟 (中国 )公司
在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。 如果在struts.xml中配置<package>标签中继承struts-default,则当前package就会自动拥 有struts-default.xml中的所有配置。代码如下: <package name="xxx" extends="struts-default" > ... </package>
16
Struts2.0拦截器
二、params拦截器使用
加拿大 •亚思晟 (中国 )公司
但如果在<action>中引用了其他的拦截器,就必须显示的引用params拦截器,Struts2才能调 用相应的setter方法来初始化参数。如下面的配置代码所示: <action name="login" class=“com.ascent.action.LoginAction"> <interceptor-ref name="timer" /> <interceptor-ref name="logger"/> <interceptor-ref name="params"/> <result>/success.jsp</result> <result name="input">/login.jsp</result> </action> 我们可以不去配置params拦截器,配置timer和logger或任意一个,测试参数username、 password的值,应该是没有得到表单提交的值,因为params拦截器已经不起作用了。
Struts2的拦截器体系是一种AOP(面向切面编程)设计模式。
2
Struts2.0拦截器
如何理解拦截器?
加拿大 •亚思晟 (中国 )公司
拦截器可以动态的拦截发送到指定的Action的请求,通过拦截器机制,可以在Action执行 的前后插入某些代码。通过这种方式,就可以把多个Action中需要重复指定的代码取出, 放在拦截器类中定义,从而提供更好的代码重用。可见,拦截器机制是一种软件代码复用 的原则。
15
<br>
password <s:password name="password" /> <br>
Struts2.0拦截器
二、params拦截器使用
加拿大 •亚思晟 (中国 )公司
如下面的配置代码,在访问login动作时,Struts2是会自动执行相应的setter方法的。 <action name="login" class=“com.ascent.action.LoginAction"> <result>/success.jsp</result> <result name="input">/login.jsp</result> </action> 这样,登录表单中的用户名,密码参数就会在Action类中被set进去,完成登录功能。
3
Struts2.0拦截器
理解DRY规则
加拿大 •亚思晟 (中国 )公司
在软件开发领域,现在有一个非常重要的规则:Don’t Repeat Yourself,就是所谓的DRY 规则,意思就是不要写重复的代码。
我们可以看下面几个图,理解DRY规则:
4
Struts2.0拦截器
加拿大 •亚思晟 (中国 )公司

Struts2.0拦截器
中国北京: 电话:(010) 82780848/62969799 地址:北京市海淀区创业中路36号 留学人员创业园306室
CONFIDENTIAL
Struts2.0拦截器
加拿大 •亚思晟 (中国 )公司
拦截器体系是Struts2的重要组成部分,可以说是核心。对于Struts2框架可以理解为一 个大的空的容器,正是大量的内建的拦截器来完成了该框架的大部分操作。比如,params 拦截器将Http请求中的参数解析出来设置Action中的属性值,servlet-config拦截器直接将 Http请求中的request和response实例传入Action等等。 Struts2的拦截器是可以动态配置的,所以开发者可以方便的扩展Struts2框架。还可以 开发自己的拦截器来配置使用。
17
Struts2.0拦截器
三、使用拦截器栈
加拿大 •亚思晟 (中国 )公司
为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一 个整体来引用。 拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定义。 可以象使用拦截器一样使用拦截器栈, <package name="demo" extends="struts-default" > <interceptors> <interceptor-stack name="mystack"> <interceptor-ref name="timer" /> <interceptor-ref name="logger" /> <interceptor-ref name="params" /> </interceptor-stack> </interceptors> <action name="login" class="com.ascent.action.LoginAction"> <interceptor-ref name="mystack"/> </action> </package>
相关文档
最新文档