参考文档:
>
mybatis自定义拦截器(一)基本使用
mybatis自定义拦截器(二)对象详解
1 不同拦截类型执行顺序:
2 多个插件拦截的顺序?
需要注意的是,因为拦截器Aa和拦截器Bb均是拦截的StatementHandler对象,所以拦截器B在此获取StatementHandler的时候,获取的是代理对象。
3 多个插件plugin()和intercept()方法的执行顺序
先执行每个插件的plugin方法,若是@Intercepts注解标明需要拦截该对象,那么生成类型对象的代理对象。(即使该插件需要拦截该类型对象,但是依旧会执行下一个插件的plugin方法)。知道执行完毕所有的plugin方法。在执行每个Intercept方法。
自定义拦截器必须使用mybatis提供的注解来声明我们要拦截的类型对象。
Mybatis插件都要有Intercepts [in特赛婆斯] 注解来指定要拦截哪个对象哪个方法。我们知道,Pluginwrap方法会返回四大接口对象的代理对象,会拦截所有的方法。在代理对象执行对应方法的时候,会调用InvocationHandler处理器的invoke方法。
具体规则如下:
如果我们的拦截器需要一些变量对象,而且这个对象是支持可配置的。
类似于Spring中的@Value("${}")从 applicationproperties 文件中获取。
使用方法:
方法中获取参数: propertiesgetProperty("username");
问题:但是为什么不直接使用@Value("${}") 获取变量?
解答:因为mybatis框架本身就是一个可以独立使用的框架,没有像Spring这种做了很多的依赖注入。
这个方法的作用是就是让mybatis判断,是否要进行拦截,然后做出决定是否生成一个代理。
需要注意的是:每经过一个拦截器对象都会调用插件的plugin方法,也就是说,该方法会调用4次。根据@Intercepts注解来决定是否进行拦截处理。
解答:判断是否拦截这个类型对象(根据@Intercepts注解决定),然后决定是返回一个代理对象还是返回原对象。
故我们在实现plugin方法时,要判断一下目标类型,是本插件要拦截的对象时才执行Pluginwrap方法,否则的话,直接返回目标本身。
我们知道,mybatis只能拦截四种类型的对象。而 intercept 方法便是处理拦截到的对象。比如我们要拦截 StatementHandler#query(Statement st,ResultHandler rh) 方法,那么 Invocation 就是这个对象, Invocation 中有三个参数。
orgapacheibatisreflectionSystemMetaObject#forObject :方便的获取对象中的值。
案例:将参数拼接到sql语句。
因为已经执行了ParameterHandler拦截器,故Statement对象已经是完全拼接好的SQL语句。
一个MappedStatement对象对应Mapper配置文件中的一个select/update/insert/delete节点,主要描述的是一条sql语句。其属性为:
>
Ognl是独立的项目,不是Struts2的一部分,只是经常和Struts2一起使用,获取值栈的数据。如果想要使用Ognl首先导入包。
El表达式,在jsp页面中获取域对象里面的数据,显示到页面中。
使用ognl和Struts2标签一起做下面的 *** 作
值栈是数据的中转战,类似于域对象,之前 *** 作,可以向域对象里面设置值,可以从域对象里面获取值。向域对象设置值,从域对象获取值。获取值栈的数据,可以通过struts2标签和ognl表达式获取。
每次访问action的时候,都会创建action实例,每个action实例里面只有一个值栈对象(valueStack对象)
在action实例中,值栈是如何存在的?
Struts2框架将把ValueStack对象保存在名为"strutsvalueStack",的请求属性中,request中RequestsetAttribute("strutsvalueStack")
从request域对象里面使用getAttribute获取,名称为strutsvalueStack
得到ActionContext,使用ActionContext里面的方法得到
值栈包含两部分内容
在action里面把数据放到域对象里面,这个数据存到context里面,context里面的Map结构,key名称为request、session、Application、attr、parameters
实现原理:首先增强request里面的getAttribute方法,而getAttribute方法获取域对象里面的值
增强逻辑:首先调用getAttribute获取域对象里面的值,如果获取了值,直接返回;如果获取不到域对象的值,获取到值栈对象,从值栈中把值取出来,赋值给域对象中的参数数据。所以,通过EL表达式就可以获取值栈数据。
用来获取值栈里面context里面的数据
一般使用在Struts2的表单标签里面
ognl不是Struts2表达式的一部分,是独立的项目,经常和Struts2的标签一起使用,获取值栈
类似域对象,数据的中转站,存值和取值
每个Action对象里面都只有一个值栈对象,在值栈request域里面
获取context里面数据,ognl之前写#
Root是list集合;Context是Map集合;Struts2里面默认 *** 作数据都在Root里面,把数据放到域对象里面存到context里面
Html中表单标签
Form :属性 action、method、enctype
在form里面有很多的输入项
大部分在input里面 type=””
text : 普通输入项
password :密码输入项
radio :单选输入项
checkbox:复选框
file: 文件上传项
hidden:隐藏项
button:普通按钮
submit: 提交按钮
reset: 重置按钮
select : 下拉输入框
textarea:文本域
struts2的表单标签对应的输入项,没有文件上传输入项
现象: 只是校验其中的一个输入项是否为空,但是把其他的输入项也清空了
(1) 获取隐藏项里面的uuid值
(2) 获取session域对象里面的uuid值
(3) 比较这两个值是否相同,如果相同,获取表单其他值进行 *** 作
(4) *** 作完成之后,把session域里面的值清空
(5) 如果这两个值,不相同,不进行 *** 作
使用struts2里面拦截器实现,token,这个token拦截器不是默认执行的拦截器
token拦截器不是默认的所以要声明拦截器 strutsxml
额,1楼在误导LZ,楼主根本没学过struts,所以就别再让他使用ActionForm啦!而且用ActionForm的话,还得自己去建form的po,很麻烦。 还有2楼的朋友,你看看他贴出来到代码,他用的是struts1而不是struts2,所以不会有那些属性的get和set方法了。
你要取得表单的值,直接在execute方法里面用requestgetParameter()这个方法去取就行了,比如:
String userName = requestgetParameter("userName");
后面的那个userName是页面表单组件里面的name属性,比如:
<input type="text" name="userName" size="30" />
其它的值都是以此类推的。 在Java中取得form表单里的值是很简单的,只是你不熟悉而已,熟悉了就知道了。 希望对你能有所帮助!
spring mvc 的工作流程:
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
SpringMVC是一种web层的mvc框架,用于替代servlet(处理响应请求,获取表单参数,表单验证等)。
MVC即Model-View-Controller,将应用按照Model(模型)、View(视图)、Controller(控制)这样的方式分离。
视图(View):代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。
一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。
模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。
MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。
MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性。
控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。
划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。
以上就是关于jq AJAX拦截器全部的内容,包括:jq AJAX拦截器、什么是拦截器,如何配置拦截器,如何使用拦截器、mybatis(3)—自定义拦截器(上)基础使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)