Struts2知识整理

参考(http://www.cnblogs.com/wang-meng/)

Struts2框架的大致处理流程如下:

1、加载类(FilterDispatcher)

2、读取配置(struts配置文件中的Action)

3、派发请求(客户端发送请求)

4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action )

5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)

6、处理业务(回调Action的execute()方法)

7、返回响应(通过execute方法将信息返回到FilterDispatcher)

8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROER,将跳转到哪个jsp页面)

9、响应用户(jsp--->客户浏览器端显示)

10、struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大)

我们在书写Action的时候有哪几种方式?他们有什么区别?

有三种方式:

①普通POJO(简单Java对象),这种方式我们不需要继承任何父类,实现任何接口。Struts2框架读取struts.xml文件,获得完整的action类名。

  1. obj =Class.forName("完整类名").newInstance();
  2. Method m =Class.forName("完整类名").getMethod("execute");
  3. m.invoke(obj);//通过反射 执行execute()方法

②编写Action实现Action接口

  1. Action接口中,定义默认五种逻辑视图名称
  2. // 数据处理成功 (成功页面)
  3. publicstatic final String SUCCESS ="success";
  4. // 页面不跳转 return null; 效果一样
  5. publicstatic final String NONE ="none";
  6. // 数据处理发送错误 (错误页面)
  7. publicstatic final String ERROR ="error";
  8. // 用户输入数据有误,通常用于表单数据校验 (输入页面)
  9. publicstatic final String INPUT ="input";
  10. // 主要权限认证 (登陆页面)
  11. publicstatic final String LOGIN ="login";

③编写Action继承ActionSupport(推荐)

在Action中使用表单校验、错误信息设置、读取国际化信息三个功能

  1. 代理模式,控制目标对象访问
  2. /hello.action 请求时StrutsPrepareAndExecuteFilter的 doFilter一定执行
  3. //判断配置文件中有没有对应Action
  4. ActionMapping mapping = prepare.findActionMapping(request, response,true);
  5. //根据配置创建代理对象
  6. ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, method, extraContext,true,false);
  7. 执行时:先执行interceptor的intercept拦截方法,最后指向action的execute

Action的相关配置?

1)必须要为<action>元素 配置<package>元素  (struts2 围绕package进行Action的相关配置 )

配置package 三个常用属性

<packagename="default"namespace="/"extends="struts-default">

①name包名称,在struts2的配置文件中,包名不能重复,name并不是真正包名,只是为了管理Action

②namespace和 <action>的name属性,决定 Action的访问路径  (以/开始 )

namespace=""        :默认的名称空间 
        namespace="/"       :根名称空间 
        namespace="/aa/"    :带有名称空间的路径

③extends继承哪个包,通常开发中继承struts-default包  (struts-default包在 struts-default.xml中定义 )【可以使用包中默认的拦截器和结果集】

2)Action是通过<action>元素配置

<action name="hello"class="cn.itcast.struts2.demo1.HelloAction" method="execute">

①<action>的name和 <package>的namespace属性共同决定 Action的访问路径

②class:类全路径

③method:执行的方法,默认为execute()方法

例如:

<package name="default"namespace="/user" extends="struts-default">

    <action name="hello"class="cn.itcast.struts2.demo1.HelloAction">

        <result name="success">/demo1/success.jsp</result>

    </action>

</package>

Action访问Servlet API有哪几种方式,简单的介绍一下

①.方式一:使用ActionContext对象(在Action中解耦合方式间接访问Servlet API)

在struts2中Action API已经与Servlet API 解耦合(没有依赖关系),开发简单,便于测试。

Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据

②.方式二:使用接口注入的方式操作Servlet API(藕合)

通过Aware接口,在构造Action时,自动注入需要操作Servlet对象(需要哪个对象就实现哪个Aware接口)

③.方式三:在Action中直接通过 ServletActionContext 获得Servlet API

静态方法返回request,不会有线程问题(使用了ThreadLocal来实现的)

总结:理论来说,第一种方式最好,实现了解耦和,但是第三种我们使用最为简单,企业中没有很大的限制,自己熟悉哪种就使用哪种。

如何防止表单重复提交?

哪些情况会导致重复提交?

服务器处理服务后,转发页面,客户端点击刷新(重定向)

客户端网络过慢,按钮连续点击(按钮点击一次后,禁用按钮)

使用令牌机制

拦截器和过滤器有什么区别?

1、①拦截器是基于java的反射机制的,而过滤器是基于函数回调

2、②过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3、③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

4、④拦截器可以访问action上下文、值栈里的对象,而过滤器不能

5、⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

拦  拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

Struts2请求流程

1、客户端发送请求

2、请求先通过ActionContextCleanUp-->FilterDispatcher

3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action

4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行

5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类

6、ActionProxy创建一个ActionInvocation的实例

7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用

8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。

时间: 2024-10-09 12:43:18

Struts2知识整理的相关文章

struts2知识系统整理

1.MVC 和 JSP Model 2 **   a.:M-Model 模型 包含两部分:业务数据和业务处理逻辑  b.V-View 视图:视图(View)的职责是负责显示界面和用户交互(收集用户信息).  c.C-Controller 控制器 项目中写的ActionServlet.--------------------------------------------------2.我们写的模式被我们称为JSP Model1,在其中我们有模型层(M),但是视图层(V)的  JSP中包含了业务逻

Web网站服务及知识整理(二)

Web网站服务及知识整理(二)

Java基础知识整理(一)

概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以便于自己的学习.作为个.NET程序猿也可以学习Java ,毕竟技多不压身,学习多也要精通. 开发工具 eclipse ,开发java类似.NET 需要装JDK类似.NET Framework. Java开发工具eclipse设置 1.设置字体:window设置: 2.设置快捷键:window--ke

Linux动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序, 动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执 行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以 整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. //elfhash.h #include <stdio.h> unsign

数据库知识整理

关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数据的安全性 1.2基本概念: 对于任何数据库来说,表之间的关联关系存在三种基本的关系类型:一对一,一对多,多对多仅此三种. 目前流行的关系型数据库服务器管理系统有:微软-MS SQL Server.甲骨文-Oracle.IBM-DB2.开源的MySql和PostgreSQL等.(在面试中有被问到过)

DIV+CSS网页布局常用的一些基础知识整理

CSS命名规范一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/ID命名规范页 眉:header内 容:content容 器:container页 脚:footer 版 权:copyright 导 航:menu主导航:mainMenu子导航:subMenu 标 志:logo标 语:banner标 题:title侧边栏:sidebar 图 标:Icon注 释:note

WIFI基本知识整理

WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总结和整理,便于后续的学习.因为无线网络中涉及术语很多,并且许多协议都是用英文描述,所以有些地方翻译出来会有歧义,这种情况就直接英文来描述了. 主要内容: 一.基本概述 二.实践基础 三.一些原理 四.补充 五.其它 一.基本概述 ============================ 1.有线和无线网络 目前有线网络中最著名的是以太网(Ethenet),但是无线网络WLAN是一个很有前景的发展领域,虽然可能不会

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网络上传输的数据量. TCP协议 TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议. 连接建立 TC

Linux进程管理知识整理

Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) TASK_INTERRUPTIBLE(可中断等待状态) TASK_UNINTERRUPTIBLE(不可中断等待状态) TASK_STOPPED(进程被其它进程设置为暂停状态) TASK_TRACED(进程被调试器设置为暂停状态) TASK_DEAD(退出状态) 进程由于所需资源得不到满足,从而进入