Struts2学习---拦截器+struts的工作流程+struts声明式异常处理
这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面。
这一节的内容是这样的:
- 拦截器的介绍
- 拦截器在struts中的地位
- 拦截器的作用
- 拦截器的配置(自定义拦截器)
- 拦截器实现声明式异常处理
拦截器的介绍:
在看到拦截器的时候我的第一反应就想到了过滤器,在javaweb里面我们可以设置过滤器,request请求想要和服务区建立连接之前都要经过这个过滤器,然后才能访问到服务器。
同样的struts中也自带了一大堆拦截器,这些拦截器都默认的添加到了我们的action之前,在执行完我们自定义的action和result后又要经过这些拦截器。大概就像下图这样:
偷偷告诉你:在struts2中第一个拦截器就是异常拦截器,我怎么知道的?在struts2-core-2.3.34.jar/struts-default.xml文件中里面配置了各种拦截器,这些拦截器被放在一个栈中,打开这个文件你就能看到啦:
这个只是一部分,有兴趣的小伙伴可以自己去查看。
拦截器在struts中的地位:
在讲拦截器在struts地位之前我们有必要知道struts的工作流程(请允许我将struts官网上的流程图贴出):
下面是struts2的整体工作流程:
我们都知道当一个请求来的时候容器(服务器)会检查web.xml,我么在web.xml中配置了:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
这个类里面实现了一个过滤器,来完成一系列struts的操作。
在它的过滤器里面它调用了executeAction方法,然后在executeAction 中调用了dispatcher.serviceAction,然后在serviceAction中用
ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, method, extraContext, true, false);
来创建一个ActionProxy实例对象(这个是Action代理)
然后继续proxy.execute();执行这个实例对象的execute方法。
这个proxy对象其实是StrutsActionProxy的实例对象
execute方法会返回一个 return invocation.invoke();
这个其实就是在调用ActionInvocation中的invoke方法。
这个invoke就是用来调用拦截器的。
最后画的不太好,最后ActionInvocation每次调用完一个拦截器的时候拦截器都会掉用invoke重新调用ActionInvocation的intercept方法调用下一个拦截器。
所以现在大概明白了struts的大概工作流程了吧,然后拦截器在struts中的地位我想也就不需要我多说了。
拦截器的作用有:
Alias Interceptor
alias
在不同请求之间将请求参数在不同名字件转换,请求内容不变
Chaining Interceptor
chain
让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。
Checkbox Interceptor
checkbox
添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
Cookies Interceptor
cookies
使用配置的name,value来是指cookies
Conversion Error Interceptor
conversionError
将错误从ActionContext中添加到Action的属性字段中。
Create Session Interceptor
createSession
自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
Debugging Interceptor
debugging
提供不同的调试用的页面来展现内部的数据状况。
Execute and Wait Interceptor
execAndWait
在后台执行Action,同时将用户带到一个中间的等待页面。
Exception Interceptor
exception
将异常定位到一个画面
File Upload Interceptor
fileUpload
提供文件上传功能
I18n Interceptor
i18n
记录用户选择的locale
Logger Interceptor
logger
输出Action的名字
Message Store Interceptor
store
存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
Model Driven Interceptor
model-driven
如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
Scoped Model Driven
scoped-model-driven
如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
Parameters Interceptor
params
将请求中的参数设置到Action中去。
Prepare Interceptor
prepare
如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
Scope Interceptor
scope
将Action状态存入session和application的简单方法。
Servlet Config Interceptor
servletConfig
提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
Static Parameters Interceptor
staticParams
从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。
Roles Interceptor
roles
确定用户是否具有JAAS指定的Role,否则不予执行。
Timer Interceptor
timer
输出Action执行的时间
Token Interceptor
token
通过Token来避免双击
Token Session Interceptor
tokenSession
和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
Validation Interceptor
validation
使用action-validation.xml文件中定义的内容校验提交的数据。
Workflow Interceptor
workflow
调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
Parameter Filter Interceptor
N/A
从参数列表中删除不必要的参数
Profiling Interceptor
profiling
通过参数激活profile
通过上面的介绍,我们会发现struts的大部分功能都是由拦截器完成的有木有?
拦截器的配置(自定义拦截器):
接下来我们着手配置一个自定义的拦截器:
<package name="test" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="TestStruts1.MyInterceptor"></interceptor>
</interceptors>
<action name="test" class="TestStruts1.TestAction">
<result>/test.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
<interceptor-ref name="defaultStack">上面一定要重写这句,因为我们自定义拦截器会覆盖掉原来默认的拦截器,所以要在我们定义的引用下面重新引用默认拦截器。
这个是对指定的action设置拦截器,如果想要设置一个全局拦截器怎么办?
在struts.xml里面定义全局的配置设置(这里配置的是拦截器栈)
<package name="xxx" extends="struts-default">
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor">
<param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)
</package>
然后在另一个包下配置action就行了:
<package name="LogonAdmin" extends="xxx">(这里继承xxx里面定义的配置就可以了)
然后在这里定义action
</package>
然后接着是写拦截器类,我们只要实现拦截器接口就行了:
public class MyIntercept implements Interceptor {
public void init() {}
public void destroy() {}
public String interceptor(ActionInvocation action) throws Exception{
//进行拦截操作
//可以写其他业务代码,例如session验证,字符编码的设置等。
//如果没有异常则调用ActionInvocation对象,让其继续调用其他拦截器
return action.invoke();
}
}
这样我们的拦截器就学习完毕了。
这样我们继续看看struts的声明式异常处理:
对单个action进行声明:
<package name="xxx" extends="struts-default">
<action name="" class=">
<result name="success">success.jsp</result>
<result name="sql">/sqlError.jsp</result>
<exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping>
</action>
</package>
下面的是全局配置:
<package name="error_default" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
</package>
<package name="admin" namespace="/admin" extends="error_default" >
<action name="index">
<result>/admin/index.html</result>
</action>
</package>
这样就在用于异常捕获的拦截器里面对我们的异常进行处理了。
如有错误欢迎指正。
Struts2学习---拦截器+struts的工作流程+struts声明式异常处理的更多相关文章
- Struts2学习-拦截器2
1.做一个登陆页面(loginView.jsp,才用Action来访问),2.登陆成功后,可以跳转到系统的首页(index.jsp),3.首页有一个链接(testOtherAction访问其它的功能模 ...
- Struts2学习-拦截器
1.新建项目user4,建立好和user3一样的目录,与之相比只是添加几个类,主要是struts.xml和action类的改变,其结果没有太大的变化 struts,xml <?xml versi ...
- Struts2学习-拦截器2续
定义拦截器有2种办法:1.实现Interceptor接口2.集成AbstractInterceptor抽象类 一.方法1 ..... <struts> <package name=& ...
- JavaWeb框架_Struts2_(三)---->Struts2的拦截器
2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...
- (六)Struts2的拦截器
一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- struts2总结六: Struts2的拦截器
一.Struts2的系统结构图
- Struts2自定义拦截器Interceptor以及拦截器登录实例
1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...
- struts2之拦截器
1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...
随机推荐
- 冒泡排序-Python与PHP实现版
Python实现 import random a=[random.randint(1,999) for x in range(0,33)] # 冒泡排序,python中数组是按引用传递的,会直接在原数 ...
- 使用Microsoft.AspNetCore.TestHost进行完整的功能测试
简介 Microsoft.AspNetCore.TestHost是可以用于Asp.net Core 的功能测试工具.很多时候我们一个接口写好了,单元测试什么的也都ok了,需要完整调试一下,检查下单元测 ...
- 解决div里面img标签后面跟着空白符
直接在div里面添加img标签有一个坑,img的高度会莫名添加几个像素的高度,查询之后才知道原来css2出现的问题. 引起这个问题原来是img标签默认基线引起的,vertical-align:base ...
- 安装 Qt 及所需 gcc 等
嫌麻烦,下载离线安装包一次性装好 Qt 及 Qt Creator (Community) Qt 安装包下载地址 http://download.qt.io/official_releases/qt/ ...
- #centos7 创建内网yum源 OpenStack源部署
#centos7 创建内网yum源#centos7 自动化安装 本地 内网 web源创建.更新 createrepo http OpenStack源部署 Elven原创 http://www.cnbl ...
- P1092 虫食算
题目传送:https://www.luogu.org/problem/show?pid=1092 #include <iostream> #include <cstring> ...
- MongoDb安装--yum安装
本帖最后由 草包 于 2017-5-2 09:57 编辑 [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 ...
- postgres 9.5 FDW变化
9.5主要是2个方法有变动: create_foreignscan_path extern ForeignPath *create_foreignscan_path(PlannerInfo *root ...
- Linux Rsync备份服务介绍及部署守护进程模式
rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输 ...
- java 的equals 与== ,null与isempty的区别
1 . == 是为了判断等号两边 变量 所对应 的 内存中的 值 是否 相等, 只是 值 的比较. 2. 假如 String s1 = new String("abc") ...