Struts 原理
Struts 应用中包含 3 类 组件: 控制器组件 , 模型组件 和视图组件 。
控制器组件包括 ActionServlet(核心控制器), 自定义Action (代表用户的一个操作)
模型组件包括定义业务逻辑的接口和 实现该接口的类 。
视图组件包括 JSP 页面 , Struts标签 和 ActionForm
ActionServlet 是Struts 最核心的组件,在Web 容器启动的时候 , ActionServlet被初始化, 加载struts-config.xml配置文件 , (这也是为什么当Struts
配置文件修改的时候需要重新启动Web 容器 ) 。 Struts处理请求如下:
1 . 当客户端浏览器发起请求到ActionServlet时 , ActionServlet首先对请求进行一系列处理 : 根据请求的路径和配置信息找到对应的Action Bean 和
Form Bean , (这2个东西就是在 struts-config.xml 中配置的 ) , 哦 原来说 我们 敲入一个 URL 是 ****/add.do ActionServlet会根据struts-config.xml
中的配置信息找到 path 为 /add.do 的 Action Bean , 在从 Action 配置信息中 找到了 name 是 addForm (也就是与 Action Bean关联的 Action Form)
从而找到ActionForm 的实例 .
2 . 在确定将要调用的 Action Bean 和 对应的 Form Bean 后 ,就将 请求中包含的值 填充到 Form Bean 中 ( Action 可以不关联任何 Action Form)
在调用Action的execute方法之前 , ActionServlet还需要准备好ActionMapping 参数 ,ActionMapping 中包含 了 该Action 的配置信息 . (这个配置信息就是
struts-config.xml中 <action-mapping> 中的 <forward> 中 配置了 )
3 . 然后 Struts 将请求分发 至 相应的 Action Bean 处理 ,
ActionMapping , ActionForward ,request 和 response 都作为参数 传递进 处理请求的Action Bean 的 execute方法中 .
4 . Action 调用业务逻辑方法, 得到返回值, 并返回ActionForward 对象 .
5 . 控制权重新回到ActionServlet , ActionServlet根据Action 返回的ActionForward对象转发到相应的JSP页面 .
6 . 处理结果返回浏览器
需要注意的三点是:
1 . ActionServlet 将控制权转到页面的时候, 使用的转发的方式 (request.getRequestDispatcher(url).forward(request,response) )
所以转发到 页面的 request 和 我们在 action 中的request 是同一个的 , 数据可以通过request 的attribute 属性进行传递 .
2 . ActionForm 根据对应的Action 的scope 属性配置不同 而生命周期不同 . 一般情况下, scope 属性设为request , 则每次请求 , 则每次请求开始时ActionServlet创建新的ActionForm 对象 , 保存在request对象的attribute 属性中 . 所以可以在Action 中 设置ActionForm的值 , 在页面中取出 .
3 . 当需要采取重定向的方式转到新的页面的时候 , 可以在Action代码中使用"response.sendRedirect(url)"语句, 并返回null .