Struts控制器组件负责接收用户的请求,更新模型.以及选择合适的视图组件返回给客户端.控制器组件有助于将模型和视图分离,有了这种分离可以在同一个模型的基础上得心应手的开发多种模型的视图.主要是ActionServlet框架中央控制器,RequestProcessor每个子应用的模块处理器,Action负责处理具体的业务的组件.Struts采用ActionServlet和RequestProcessor组件进行集中控制,并且采用Action组件来完成具体的业务单项处理.控制器组件的控制机制:主要认识是接受用户请求,根据用户的请求调用合适的模型来执行业务逻辑,获取业务逻辑的结果,根据当前状态以及业务逻辑执行结果选择合适的视图组件返回给客户端.
ActionServlet类:是Struts框架的核心控制器组件,所有的用户请求都先由它来处理,然后再由它把请求转发给其他组件.容器启动的时候或者用户首次请求ActionServlet的时候加载ActionServlet类在这两种情况下,容器都会在ActionServlet被加载后立即执行它的init()方法,这可以保证当ActionServlet处理用户请求的时候已经被初始化.至于具体的初始化方法我们不用去管,下面研究一下ActinServlet的process()方法.当主控制器实例接收到Http请求后,在doGet()或者doPost()方法中都会调用process()方法来处理请求.在这个方法中首先调用selectModule()方法,这个方法选择负责处理用于请求的子应用模块.然后把子应用模块相关的ModuleConfig和MessageResources对象存储到request范围内,这使得框架的其余组件可以方便地从request范围内读取这些对象.从而获取应用配置信息和消息资源.ActionServlet是可以派生子类的但是感觉没什么意义了,多数的功能都被移动到了RequestProcessor类中,以便减轻ActionServlet的负担.
RequestProcessor类:对于应用模块,每个子应用模块都由各自的RequestProcessor实例.在ActionServlet的process()方法中一旦选择了正确的子应用模块,就会调用子应用的模块的RequestProcessor类,每个子应用模块都可以拥有单纯的RequestProcessor类.开发人员可以很方便的创建客户化的RequestProcessor类.
Action类:是用户请求和业务逻辑之间的桥梁,每个Action充当客户的一项业务代理.在RequestProcessor类预处理请求的时候.在创建了Action的实例后,就调用自身的processActionPerForm()方法,该方法调用Action的execute()方法.为了确保线程安全thread-safe,在一个应用的生命周期中.Struts框架只会为每个Action类创建一个Action实例.所有的客户请求共享同一个Action实例.并且所有的请求线程可以执行它的execute方法.Action类的execute()方法返回一个ActionForward对象,代表了Web资源的逻辑对象,这里的Web资源可以是JSP页面,JAVA servlet或者Action.从execute()方法返回的对象有两种方法:创建一个动态的ActionForward实例和在配置文件的action元素里的子元素<forward>元素.在execute()方法只需要调用mapping实例参数的findForward()方法,来获得特定的ActionForward对象.<action>元素的roles属性是指定这个Action的用户必须具备的安全角色.多个角色之间以逗号隔开.
利用Token解决重复提交:在某些情况下,如果用户对同一个HTML表单多次提交,Web应用必须能够判断用户的重复提交的行为,以做出相应的处理.可以利用同步令牌Token机制来解决Web应用重复提交的问题.Struts给出了一个参考实例.Action类中提供了一系列和Token相关的方法判断存储在当前用户会话中的令牌值和请求参数中的令牌是否匹配,如果匹配返回true.否则返回false.方法是protected boolean isTokenValid(request).
实用类:RequestUtils类:org.apache.struts.util.RequestUtlis为Struts框架提供了一些处理请求的通用的方法.ModuleUtils类:org.apache.strtus.taglib.ModuleUtils类提供了处理子应用应用模块的实用方法.Globals类:org.apache.struts.Globals类提供了一组公共类型的静态常量.
控制器组件的核心技术可以说就是Servlet,控制器也是Struts的灵魂也是MVC模式的核心,所以如果想学好Struts就必须彻底的了解控制器的运行原理.(网友们的支持,是我继续写技术文章的动力!)
posted on 2005-10-24 14:45
我心依旧 阅读(1422)
评论(2) 编辑 收藏