Struts2面试准备

本文详细介绍了Struts2的工作流程,包括请求处理机制、拦截器与过滤器的区别、使用Struts2的原因及其优点。此外还讲解了如何访问HTTP域对象、ValueStack的作用以及Struts2的默认拦截器等内容。

简述 Struts2 的工作流程

  1. 请求发送给 StrutsPrepareAndExecuteFilter
  2. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请求
  3. 若该请求是一个 Struts2 请求,则 StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy
  4. ActionProxy 创建一个 ActionInvocation 的实例,并进行初始化
  5. ActionInvocation 实例在调用 Action 的过程前后,涉及到相关拦截器(Intercepter)的调用
  6. Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果
  7. 把结果发送到客户端

Struts2 拦截器 和 过滤器 的区别

  1. 过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
  2. Struts2 拦截器只能对 Action 请求起作用,而过滤器则可以对几乎所有请求起作用
  3. 拦截器可以访问 Action 上下文(ActionContext)、值栈里的对象(ValueStack),而过滤器不能
  4. 在 Action 的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次

为什么要使用 Struts2 & Struts2 的优点

  1. 基于 MVC 架构,框架结构清晰
  2. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法
  3. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器是可配置与重用的
  4. 多种表现层技术. 如:JSP、FreeMarker、Velocity 等

Struts2 如何访问 HttpServletRequest、HttpSession、ServletContext 三个域对象

  • 与 Servlet API 解耦的访问方式
  • -->通过 ActionContext 访问域对象对应的 Map 对象
  • -->通过实现 Aware 接口使 Struts2 注入对应的 Map 对象
  • 与 Servlet API 耦合的访问方式
  • -->通过 ServletActionContext 直接获取 Servlet API 对象
  • -->通过实现 ServletXxxAware 接口的方式使 Struts2 注入对应的对象

Struts2 中的默认包 struts-default 有什么作用

  1. struts-default 包是 struts2 内置的,它定义了 struts2 内部的众多拦截器和 Result 类型,而 Struts2 很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了 struts-default包才能使用struts2为我们提供的这些功能。
  2. struts-default 包是在 struts-default.xml 中定义,struts-default.xml 也是 Struts2 默认配置文件。Struts2 每次都会自动加载 struts-default.xml文件。
  3. 通常每个包都应该继承 struts-default 包

说出 struts2 中至少 5 个的默认拦截器

exception;fileUpload;i18n;modelDriven;params;prepare;token;tokenSession;validation 等

谈谈 ValueStack

  1. ValueStack 贯穿整个 Action 的生命周期,保存在 request 域中,所以 ValueStack 和 request 的生命周期一样. 当 Struts2 接受一个请求时,会迅速创建 ActionContext,ValueStack,Action. 然后把 Action 存放进 ValueStack,所以 Action 的实例变量可以被 OGNL 访问。请求来的时候,Action、ValueStack 的生命开始;请求结束,Action、ValueStack的生命结束
  2. 值栈是多实例的,因为Action 是多例的(和 Servlet 不一样,Servelt 是单例的),而每个 Action 都有一个对应的值栈,Action 对象默认保存在栈顶
  3. ValueStack 本质上就是一个 ArrayList(查看源代码得到)
  4. 使用 OGNL 访问值栈的内容时,不需要#号,而访问 request、session、application、attr 时,需要加#号
  5. Struts2 重写了 request 的 getAttribute 方法,所以可以使用 EL 直接访问值栈中的内容

ActionContext、ServletContext、pageContext的区别

  1. ActionContext 是 Struts2 的 API:是当前的 Action 的上下文环境
  2. ServletContext 和 PageContext 是 Servlet 的 API

Struts2 有哪几种结果类型

参看 struts-default.xml 中的相关配置:dispatcher、chain、redirect 等

拦截器的生命周期与工作过程

  1. 每个拦截器都是需要实现 Interceptor 接口
  2. init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化
  3. intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次
  4. destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次

如何在 Struts2 中使用 Ajax 功能

JSON plugin、 DOJO plugin

Struts2实现文件上传

  1. 使用标签,指定name属性
  2. 表单enctype类型设置为:multipart/form-data;请求方式设置为post
  3. 对应Action新增三个属性:File,name,type

附注

author:sheng    time:9/25/2016 10:59:30 PM

转载于:https://www.cnblogs.com/lemon-tree-sheng/p/5907788.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值