Struts控制器组件负责接收用户请求、更新模型,以及选择合适的视图组件返回给用户。控制器组件有助于将模型层和视图层分离。Struts控制器组件主要包括:
- ActionServlet组件:充当Struts框架的中央控制器
- RequestProcessor组件:充当每个子应用模块的请求处理器
- Action组件:负责处理一项具体的业务
Struts框架采用ActionServlet和RequestProcessor组件进行集中控制,并采用Action组件来处理单项业务。
Struts的控制器组件主要完成以下任务:
- 接收用户请求
- 根据用户请求,调用合适的模型组件来执行相应的业务逻辑
- 获取业务逻辑执行结果
- 根据当头状态以及业务逻辑招待结果,选择合适的视图组件返回给用户
1ActionServlet类
org.apache.struts.action.ActionServlet类是Struts框架的核心控制器组件,所有的用户请求都先由ActionServlet来处理,然后再由ActionServlet把请求转发给其他组件。Struts框架只允许在一个应用中配置一个ActionServlet类的一个实例,这个ActionServlet实例可以同时响应多个用户请求。
1>.Struts框架初始化过程
Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类。在两种情况下,Servlet容器都会在ActionServlet被加载后立即执行它的init()方法,以下是init()方法完成的初始化流程
(1) 调用initInternal()方法,初始化Struts框架内在的消息资源,如与系统日志相关的通知、警告和错误消息
(2) 调用initOther()方法,从Web.xml文件中加载ActionServlet的初始化参数,如config参数
(3) 调用initServlet()方法,从Web.xml文件中加载ActionServlet的URL映射信息
(4) 调用initModuleConfig()方法,加载并解析默认子应用模块的Struts配置文件;创建ModuleConfig对象,把它存储在ServletContext中
(5) 调用initModuleMessageResources()方法,加载并初始化默认子应用模块的消息资源;创建MessageResource对象,把它存储在ServletContext中
(6) 调用itModuleDataSources()方法,加载并初始化默认子应用模块的数据源。
(7) 调用itModulePlugins()方法,加载并初始化默认子应用模块的所有插件。
(8) 当默认子应用模块被成功初始化后,如果还包括其他子应用模块,将重复流程(4)-(7),分别对其他子应用模块进行初始化。
2>.ActionServlet的process()方法
当ActionServlet实例接收到Http请求后,在doGet()或doPost()方法中都会调用process()方法来处理请求。以下是ActionServlet的process()方法的源代码:
| protected void process(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException {
RequestUtils.selectModule(request, getServletContext());
getRequestProcessor(getModuleConfig(request)).process (request, response);
} |
在process()方法,首先调用org.apache.struts.util.ModuleUtils类的selectModule(),这个方法负责处理当前请求的子应用模块,然后把子应用模块相关的ModuleConfig和MessageResource对象存储到request范围中,第二步完成实际的预处理请求操作。
2 Action类
Action类是用户请求和业务逻辑之间的桥梁。每个Action充当客户的一项业务代理。在RequestProcessor类预处理请求时,在创建了Action的实例后,就调用自身的processActionPerform()方法,该方法再调用Action类execute()方法。
Action的execute()方法调用模型的业务方法,完成用户请求的业务逻辑。然后根据执行结果把请求转发给其他合适的WEB组件。
3 ActionForward类
Action类的execute()方法返回一个ActionForward对象。ActionForward对象代表了Web资源资源的逻辑抽象,这里的Web资源可是JSP页、Java Servlet或Action。从execute()方法中返回了ActionForward对象有两种方法
- 在execute()方法中动态创建一个ActionForward实例: Return new ActionForward(“Failure”,”/failure.jsp”);
- 在Struts配置文件中配置<forward>元素,如return mapping.findForward(“Failure”);
Recent Comments