一:要点
1.掌握struts的MVC原理
2.掌握struts的中心控制器ActionServlet的工作原理
3.掌握Action类及其相关类的用法
4.掌握ActionForm类的用法
5.掌握ActionMapping的用法
6.掌握ActionForward的用法
7.掌握ActionErrors和ActionMessage的用法
8.掌握struts-config.xml的主要元素及其属性
9.掌握struts的自定义标签库
------------------------------------------------------------------------------------------------------------------------------
1.struts的MVC原理
2.struts的中心控制器ActionServlet的工作原理
Struts框架中ActionServlet类型只会产生一个对象,由它来接受所有客户的请求信息,所以在web.xml文件中作出以下配置:
……
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
……
(1)当ActionServlet类第一次加载的时候,init()方法将调用,来完成用户响应前的初始化任务。
ActionServlet 类中init方法初始化流程:
1、调用initInternal方法,初始化Struts框架内在消息资源。如日志、通知、错误。
2、调用initOther方法,从web.xml中加载初始化参数。如config参数。
3、调用initServlet方法,从web.xml中加载映射信息,并注册相关DTD文件。
4、调用initModuleConfig方法,从struts-config.xml加载模块并创建ModulConfig对象,把它存储在ServletContext中。
5、调用initModuleMessageResources方法,初始化消息资源对象(MessageResources)。
6、调用initModuleDataSources方法,加载DataSources对象。
7、调用initModulePlugIns方法,加载插件。
(2)完成初始化任务后,当ActionServlet实例接收到HTTP请求,将会调用process()方法。在ActionServlet的doGet/doPost中会调用process方法而最终会调用RequestProcessor类的process方法。而在RequestProcessor类的process又调用了17个 processXXX其它方法来完成工作。例如:
1.调用processMultipart()方法,如果HttpServletRequest是POST方式,且请求为multipart/form-data ,Struts框架将请求对象包装成处理multipart请求专用的请求对象,否则,只是简单地返回原有的请求对象。一般来说,除非需要处理文件上传,否则不用关心multipart 功能的具体细节。
2.调用processPath()方法,该方法用来从请求URL中获应用取路径部分。获取到的信息在稍后的步骤中用于选择合适的Struts Action调用。
3.调用processLocale()方法,处理一些国际化的事务。
4.调用方法processContent(),来决定请求的content type编码(encoding)方式。content type可以配合在配置文件中,也可以在jsp文件中配置,默认为text/html。
5.根据noCache属性的设置调用processNoCache()方法,如果noCache设置为true。则添加合适的响应头到响应对象中,使得页面保留在浏览器的Cache中。这些响应头包含Pragma, Cache-Control, 和Expires 。
6.调用processPreprocess()方法,这个方法在这儿设置一个钩子,方法的默认实现只是简单地返回true,这样给了自定义处理器的开发者提供了一个合适的地方让你添加自己的业务逻辑。因为这个方法在调用Action之前被调用,如果你重载这个方法,只需要返回false,则Action就不会被调用。例如,你可以重载这个方法用户检查客户session,如果不通过就返回false。
7.调用processMapping()方法,根据客户请求信息中的path信息来决定是否返回ActionMapping对象实例。如果不能够找到path的映射,则客户将会得到一个error 响应。
8.通过调用processRoles()方法,检查是否为Action配置了安全角色。
如果配置了角色要求,则请求对象的isUserInRole()方法被调用,如果用户属于这些角色,则客户会得到显示一个error 响应。
9.调用processActionForm()方法,检查是否存在为ActionMapping配置的ActionForm 。如果存在,则在有效区域内查找是否存在该ActionForm 的实例,存在,则复用,不存在,则创建一个实例。然后将实例保存与再配置文件中配置好的有效区域(request,session,application)内,并用Action元素的name属性作为该实例的关键字。
10.调用processPopulate()方法,如果存在为ActionMapping配置的ActionForm,则封装请求对象中的数据到ActionForm中,在进行封装之前,先调用ActionForm 的reset()方法进行属性值的默认化。
11.调用processValidate()方法,如果ActionForm被配置好,并且action元素的属性validate被设置为true,则进一步调用validate()方法进行规则校验。如果validate()方法校验失败,就会保存一个ActionErrors对象到请求区域中,请求将会自动重定向到action映射的input属性所指定的页面中。如果校验通过或在action 映射中没有配置ActionForm,则继续处理请求。
12.根据action 映射是否配置了forward属性或include属性来决定下一步操作。如果配置了任意一个,则相应地调用RequestDispatcher对象的forward()方法或include()方法,调用后,对客户请求的处理结束。否则,继续处理请求。
13.调用processActionCreate()方法,创建或获取一个Action对象实例处理请求。processActionCreate()方法会在缓存中查找是否存在已经创建好的Action实例,如果存在,则复用,否则,则重新创建并将其村于缓存中。
14.调用processActionPerform()方法,该方法用于在一个try/catch代码块中调用action实例的execute()方法,这样确保action的execute()方法一旦发生执行异常能够被RequestProcessor捕获。
15.调用processActionForward()方法,并传入action的execute()方法所返回的ActionForward对象实例,方法通过检查ActionForward对象实例,决定采用redirect或forword方式进行重定向。究竟采用redirect还是forword取决于forward元素的redirect属性值。
Struts框架只允许应用中存在一个ActionServlet类,但是可以存在多个客户化的RequestProcessor类,每个子应用模块都可以有单独的RequestProcessor类, ActionServlet主要负责初始化,以及介绍请求并找到合适的RequestRrocessor,之后真正干活的是RequestProecssor和Action。
对于RequestProcessor这个类,有的人可能很陌生,毕竟它不象ActionSerlvet那样,在我们的面前频繁的出现。但是,RequestProcessor用的要远比ActionServlet多,那么RequestProcessor到底是干什么的呢?当ActionServlet接收到客户请求后,会进行一连串的初始化操作,然后,就会将客户请求转交给合适的处理器进行处理,这个合适的处理器就是org.apache.struts.action.RequestProcessor。