认识拦截器

认识拦截器

  什么是拦截器

    拦截器也是一个类

    拦截器可以在Action被调用之前和之后执行代码

    框架的很多核心功能是拦截器实现的

  拦截器特点

    拦截器*组合,增强了灵活性、扩展性,有利于系统解耦

    拦截器可以拦截Action请求

    在访问的Action执行之前和执行之后执行代码实现某项功能

  在哪儿使用拦截器

    Struts2:

      大部分功能是在拦截器中实现的

      如:接收输入的参数、数据验证、文件上传、国际化等

    应用程序:

      需要在Action执行的前后执行特定功能时

      Action执行时间统计,Action访问权限管理

    Action添加功能

       Action的代码不动,使用拦截器实现功能

拦截器工作方式

  拦截器的执行过程是一个递归的过程

  做一些Action执行前的预处理

  将控制交给后续拦截器或返回结果字符串

  做一些Action执行后的处理

自带拦截器

  自带拦截器

  params拦截器

  负责将请求参数设置为Action属性

  servletConfig拦截器

  将源于Servlet API的各种对象注入到Action

  fileUpload拦截器

  对文件上传提供支持

  modelDriven拦截器

  如果Action实现了ModelDriven接口,则将getModel()返回的结果压入值栈

  validation拦截器

  调用验证框架进行数据验证

  workflow拦截器

  调用Action类的validate(),执行编码验证

拦截器栈

  拦截器栈

  从结构上看,拦截器栈就是一组拦截器

  从功能上看,拦截器栈也是拦截器

默认拦截器

u 默认拦截器

nstruts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器

n只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器

默认拦截器

<interceptors>

<interceptor name="params" class="..."/>

<interceptor name="workflow" class="..."/>

<interceptor-stack name="defaultStack">

<interceptor-ref name="exception"/>

<interceptor-ref name="alias"/>

</interceptor-stack>

<default-interceptor-ref name="defaultStack"/>

</interceptors>

配置拦截器

u 配置拦截器

 

<package name="packName" extends="struts-default" >

<interceptors>

<!-- 定义拦截器 -->

<interceptor name="interceptorName" class="interceptorClass" />

<!-- 定义拦截器栈 -->

<interceptor-stack name="interceptorStackName">

<!--指定引用的拦截器-->

<interceptor-ref name="interceptorName|interceptorStackName" />

</interceptor-stack>

</interceptors>

<!--定义默认的拦截器引用-->

<default-interceptor-ref name="interceptorName|interceptorStackName" />

<action name="actionName" class="actionClass">

<!--为Action指定拦截器引用-->

<interceptor-ref name="interceptorName|interceptorStackName" />

<!--省略其他配置-->

</action>

</package>

使用拦截器

u 小经验:

n拦截器栈有多个<interceptor-ref>,谁在前,谁先起作用

n拦截器起作用的顺序(先<action>,再本包,再父包)

u 拦截器示例:计算Action的执行时间

n执行之前获取开始时间

n执行Action

n执行完毕后获取结束时间,通过计算得到执行时间

u 实现方法

n通过继承AbstractInterceptor实现拦截器类

n重写intercept()方法

自定义拦截器

u 开发自定义拦截器的方法

n实现Interceptor接口

lvoid init():初始化拦截器所需资源

lvoid destroy():释放在init()中分配的资源

lString intercept(ActionInvocation ai) throws Exception:实现拦截器功能

n继承AbstractInterceptor抽象类

l提供了init()和destroy()方法的空实现

l只需要实现intercept()方法即可

n继承MethodFilterInterceptor类

l指定拦截的方法

l指定不拦截的方法

拦截器与过滤器

u 相似点

n功能类似

n原理类似

n方法类似

u 不同点

n拦截器用于拦截对Action请求,而过滤器几乎可以过滤所有的请求

n拦截器中可以获取Action的当前执行状态,而过滤器不可以

n过滤器是Servlet中概念,在web.xml中配置;拦截器是Struts2/Webwork中概念,在struts.xml中配置

小结

u 什么是拦截器

u 拦截器开发步骤

n 继承AbstractInterceptor实现拦截器类

n struts.xml中定义拦截器

l<interceptor name="..." class="..."/>

n <action>引用拦截器

l 单独引用:引用自定义和默认拦截器

l 拦截栈引用:定义拦截器栈包含自定义和默认拦截器

文件上传

u 实现步骤:

n1、在JSP页面实现在客户端选择上传文件

n2、配置struts.xml,拦截器会自动接收上传的文件

n3、在Action中写代码把上传的文件存入服务器中

n4、跳转至新页面展示上传的文件

u参考帮助文档

文件上传小结

u 关键点:

n<form>需要添加enctype="multipart/form-data"属性

n在Action中添加接收文件的成员,成员的setter命名规则如下:(X为上传文件的name)

l setX(File file)

l setXContentType(String contentType)

l setXFileName(String fileName)

n设置文件保存路径的时候使用ServletActionContext.getServletContext().getRealPath("/")  取得项目真实路  

    径

限制上传文件的大小

u 为什么要限制上传文件的大小:

n客户端上传的文件过大会影响服务器的性能,消耗服务器的存储空间

u 实现方法:

n在<struts>节点下配置常量:

n在<action>下配置拦截器:

限制上传文件的大小

<constant name="struts.multipart.maxSize" value= "5000000" />

可实现对所有action的文件上传大小限制

<interceptor-ref name="fileUpload">

<param name="maximumSize">5000000</param>

</interceptor-ref>

<interceptor-ref name="defaultStack">

限制上传文件的类型

u 为什么要限制上传文件的类型:

n 某些特殊类型的文件类型如exe文件可能包含病毒程序

n 某些特定业务只需要上传特定文件类型,如上传照片只需要上传图片类型文件

u 实现方法:

n在<action>下配置如下拦截器,可以限制<action>的

文件上传类型

限制上传文件的类型

<interceptor-ref name="fileUpload">

<param name="allowedTypes">image/pjpeg,image/jpeg</param>

</interceptor-ref>

<interceptor-ref name="defaultStack">

限制上传文件的经验

u在Action中判断文件大小后再限制上传,这是一种错误做法在Action中判断文件大小后再限制上传这是一种错误做法

n因为上传是在拦截器中完成的,它运行在Action之前,到了Action中再限制上传已经迟了

ustruts.multipart.maxSize常量默认值为2M,上传大于2M的文件一定要修改该值struts.multipart.maxSize常量默认值为2M,上传大于2M的文件一定要修改该值

u由于不同浏览器对文件类型的定义有区别,实现文件类型控制时需要考虑兼容性由于不同浏览器对文件类型的定义有区别,实现文件类型控制时需要考虑兼容性

n如JPG文件需要在allowedTypes参数中定义image/pjpeg,image/jpeg两种类型

u 配置拦截器时,不要忘记配置<interceptor-refname=“defaultStack”>这个拦截器栈

实现Ajax

u Ajax

njQuery

nJSON

u Struts2

njson-lib

nstruts2-json-plugin

 

 

public class DataAction extends ActionSupport {

private String name;

private int age;

private User user;

private List<User> users;

//处理请求的方法

public String getData(){

//代码省略

return SUCCESS;

}

//省略getter和setter

}

 

<package name="data" namespace="/" extends="json-default">

<action name="getData" class="action.DataAction" method="getData">

<result type="json">

<param name="includeProperties">

name,user.*

</param>

</result>

</action>

</package>