1.struts2中过滤器和拦截器的工作流程:
request-->执行自定义过滤器doFilter方法中的chain.doFilter()方法前的代码-->执行默认过滤器doFilter方法中的chain.doFilter()方法前的代码-->执行默认拦截器-->执行自定义拦截器-->访问服务器资源(action,css,html,jsp...)-->执行自定义拦截器-->执行默认拦截器-->执行默认过滤器的doFilter方法中chain.doFilter()方法后的代码-->执行自定义过滤器doFilter方法中的chain.doFilter()方法后的代码-->客户端开始执行响应response
注:①上面的自定义的过滤器在默认过滤器之前执行只是一个假设的顺序,这其中光光默认的过滤器这个执行过程就有很多细节,这个网上资料或者源码剖析有很多。
②自定义过滤器有多个的话,它的执行顺序和你在web.xml中布置的先后顺序有关,前者先执行。
③注意请求和响应这个来回中,多个过滤器的前后执行和拦截器的前后执行顺序是对称的。
2.ajax的同步是ajax的事没做完前,其他的事不能做,要等着它。异步相反,同时性互不影响地执行。
3.注意起来一个情况:ajax+submit+同步----就是你用ajax请求服务器,而且用的是同步的方式,并且你是通过点击了type类型为submit的按钮来触发这个ajax。
这个时候,首先你点击了submit,它会提交表单,但是由于你用了ajax的同步操作,submit的提交被阻塞,ajax先执行,这个时候,如果你在ajax的回调函数(如:success)中写了document.location.href=‘xxx.html‘,它是执行了,的确是去执行了跳转的,于是ajax完成了,那接下来就要把刚才的submit提交的请求完成。于是呢又要从xxx.html跳回到刚才那个页面(无论你submit有没有提交具体的数据,总之提交了之后如果后台没有执行跳转/重定向,它就要回到原来的页面。)
即:ajax就是如你所想那样执行了,也从A页面跳到了B页面,但是由于submit这种类型的特殊性,又让B页面跳回了A页面,由于这个ajax执行完再执行submit请求的过程处理的很快,你会感到好像没有效果,但是你仔细观察,会发现这个过程页面会刷新的,其实就是B页面跳回到A页面。
所以当用ajax去请求时,我们要用button,而不是submit,更要慎用同步。
4.回调函数理解:
不严谨地用ajax来说吧:ajax提交了一个请求,比如去请求了一个action,这个时候ajax跟这个action说,老哥你帮我办个事呗(我给你个地址,你去帮我拿个东西,然后好了交给我),然后action答应了并且把要处理的业务处理完。这个时候,action想告诉ajax你叫我做的我完成了,并且你跟我要的东西我也准备好了,但是我怎么给你呀??
①:大家想下怎么回头告诉ajax你叫我做的我做好了,并且要把东西给ajax?难道又要弄个请求,去请求这个东西?这样的话,那这个请求怎么知道前面请求了什么,怎么知道要去拿什么?就像ajax在叫他的朋友ajaxBBBB去帮他去到Action那里拿,可是这次ACtion又怎么告诉这个ajaxBBBB说东西在哪,你过来拿。这个又怎么通知ajaxBBBB,难道又要弄个请求,这个请求问问他东西放哪??这不是陷入无限循环了嘛,所以就有了回调函数。
②:回调函数这个函数是存在于ajax里面定义的,只是有了借口能够给别人调用。比如Action完成了请求的业务,于是调用了ajax的success回调函数,把数据回传给ajax,然后success回调函数去处理这些数据。
这就好像:ajax觉得刚才这事不行,很烦。所以他花了大价钱,买了一辆小货车,这个车就是属于ajax的,然后每次ajax叫action办事,他只要跟action说要办的事,然后就在家里等着,action做好了,只要去把ajax的货车开过来,把东西装上,给ajax送过去。这个车就是回调函数,他属于发出请求的一方,而调用他的是被请求的一方,因为回调函数是在请求一方的体内,请求方可以知道可以得到可以访问这个函数,也就可以得到这个函数体内的信息了。
③:为了帮助记忆,用一句话来说。-------A对象有2个方法,一个方法是用于发送请求到B的,另一个是B完成请求去用来传送信息和数据的。A发请求,B接收并完成,B再调用A中的回调函数,A执行这个回调函数。
其实说这个B调用了A中的回调函数是很不严谨甚至错误的,因为B的目的是传回消息和数据给A,B只是说把数据作为回调函数的一个参数,等A执行回调函数的时候用罢了。这个过程还有很多细节。我只是为了大家好理解。
我只是尽力地阐述了我的理解。有不对的地方望指正,至于一些很细很细的源码,过程之类的剖析可以百度,这些网上很多的。