Struts2是怎样通过struts.xml进行前后台交互呢?

     首先在项目启动的时候,项目下的Struts.xml文件会被dom4j工具解析;而当我们发送一个请求时,这个请求被StrutsPrepareAndExecuteFilter 拦截,而我们配置了struts处理url的拦截表达式,比如在<filter- maping>中我们配置<url -pattern> 为 /* 或 *.do的通配符。这样当你发送一个请求的时候就被拦截器给拦截下来了。

        而针对这样的请求其实是由 struts的过滤器处理的。这个过滤器我在看源代码的时候,发现它是在生命周期初始化的时候,在一个init()方法中 利用 filterConfig的对象,找到了项目中的struts.xml配置文件,然后通过InitOperations() 和 Dispatcher 把 struts.xml 文件转换成 ActionMapping对象进行的解析。

        当我们在客户端发送一个请求的时侯PrepareOperations类里面 的   prepare.createActionContext(request, response)方法会帮我们封装 request和response ,并且创建 ValueStack(值栈对象);struts用  dispatcher 对象 的 createContextMap 方法 把 上面request和session 还有用户传递过来的所有数据,通过request.getParameterMap()先获取到前台,然后全部封装到了 ActionContext 和ValueStack 中,所以我们在struts2中获取 request和session等对象的时候有一个解耦合的方式 ActionContext.getContext().get("request")就能获取到request和session等的对象;

        比如用户发送了一个usermanager的请求,那么在之前封装好的ActionMapping中会有一个与这个请求一一对应的属性值,通过在代码中执行一个 findActionMapping(request, response, true)的方法,来得到一一对应的关系,那是因为在ActionMapping中本身就包含着我们的业务Action的路径。

        ActionProxyFactory 会生成一个 ActionProxy 对我们的业务Action进行一个反射的代理操作。所以我们Action并不是一个Servlet,但是却能达到servlet的效果,是因为serlvet的操作都是 StrutsPrepareAndExecuteFilter的dofilter方法执行的。它通过刚才说的 ActionProxy  反射执行我们  Action中的业务方法,然后返回的值string和 ActionMapping中的Result对象进行匹配,最后在让StrutsPrepareAndExecuteFilter 帮我们执行跳转或转发的功能。

                                                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值