`

struts控制器组件

阅读更多
Struts 控制器组件
Struts控制器组件主要包括:
ActionServlet组件:充当Struts框架的中央控制器
RequestProcessor组件:充当每个子应用模块的请求处理器
Action组件:负责处理一项具体的业务。
Struts框架采用ActionServlet和RequestProcessor组件进行集中控制,并采用Action组件来处理单项业务。
Struts的控制器组件主要完成以下任务:
1. 接收用户请求
2. 根据用户请求,调用合适的模型组件来执行相应的业务逻辑。
3. 获取业务逻辑执行结果
4. 根据当前状态以及业务逻辑执行结果,选择合适的视图组件返回给用户。

1. ActionServlet类
org.apache.struts.action.ActionServlet类是Struts框架的核心控制器组件,所有的用户请求都先由 ActionServlet来处理,然后再由ActionServlet把请求转发给其他组件。Struts框架只允许在一个应用中配置一个 ActionServlet类,在应用的生命周期中,仅创建ActionServlet类的一个实例,这个ActionServlet实例可以同时响应多 个用户请求。
ActionServlet的init()方法的时序图

(1)调用initInternal()方法,初始话Struts框架内在的消息资源,如与系统日志相关的通知、警告和错误消息。
(2)调用initOther()方法,从web.xml文件加载ActionServlet的初始化参数,如config参数。
(3)调用initServlet()方法,从web.xml文件中加载ActionServlet的URL映射信息。此外还会注册web.xml和struts配置文件所使用的DTD文件,这些DTD文件用来验证web.xml和struts配置文件的语法。
(4)调用initModuleConfig()方法,加载并解析默认子应用模块的Struts配置文件;创建ModuleConfig对象,把它存储在ServletContext中。
(5)调用initModuleMessageResources()方法,加载并初始化默认子应用模块的消息资源;创建MessageResources对象,把它存储在ServletContext中。
(6)调用initModuleDataSources()方法,加载并初始化默认子应用模块的数据源。如果在struts配置文件中没有定义<data-sources>元素,就忽略这一流程。
(7)调用initModulePlugins()方法,加载并初始化默认子应用模块的所有插件。
(8)当默认子应用模块被成功初始化后,如果还包括其他子应用模块,将重复流程4-7,分别对其他子应用模块进行初始话。

2.RequestProcessor类
当ActionServlet实例接收到HTTP请求后,在doGet()或doPost()方法中都回调用process()方法来处理请求
以下是ActionServlet的process()方法的源代码:
protected void process(HttpServletRequest request,
        HttpServletResponse response)
        throws IOException, ServletException {
        ModuleUtils.getInstance().selectModule(request, getServletContext());
        ModuleConfig config = getModuleConfig(request);
        RequestProcessor processor = getProcessorForModule(config);
        if (processor == null) {
            processor = getRequestProcessor(config);
        }
        processor.process(request, response);
    }
RequestProcessor类process()方法的部分代码片段
public void process(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        // Wrap multipart requests with a special wrapper
        request = processMultipart(request);

        // Identify the path component we will use to select a mapping
        String path = processPath(request, response);

        if (path == null) {
            return;
        }

        if (log.isDebugEnabled()) {
            log.debug("Processing a '" + request.getMethod() + "' for path '"
                + path + "'");
        }

        // Select a Locale for the current user if requested
        processLocale(request, response);

        // Set the content type and no-caching headers if requested
        processContent(request, response);
        processNoCache(request, response);

        // General purpose preprocessing hook
        if (!processPreprocess(request, response)) {
            return;
        }

        this.processCachedMessages(request, response);

        // Identify the mapping for this request
        ActionMapping mapping = processMapping(request, response, path);

        if (mapping == null) {
            return;
        }

        // Check for any role required to perform this action
        if (!processRoles(request, response, mapping)) {
            return;
        }

        // Process any ActionForm bean related to this request
        ActionForm form = processActionForm(request, response, mapping);

        processPopulate(request, response, form, mapping);

        // Validate any fields of the ActionForm bean, if applicable
        try {
            if (!processValidate(request, response, form, mapping)) {
                return;
            }
        } catch (InvalidCancelException e) {
            ActionForward forward = processException(request, response, e, form, mapping);
            processForwardConfig(request, response, forward);
            return;
        } catch (IOException e) {
            throw e;
        } catch (ServletException e) {
            throw e;
        }

        // Process a forward or include specified by this mapping
        if (!processForward(request, response, mapping)) {
            return;
        }

        if (!processInclude(request, response, mapping)) {
            return;
        }

        // Create or acquire the Action instance to process this request
        Action action = processActionCreate(request, response, mapping);

        if (action == null) {
            return;
        }

        // Call the Action instance itself
        ActionForward forward =
            processActionPerform(request, response, action, form, mapping);

        // Process the returned ActionForward instance
        processForwardConfig(request, response, forward);
}

processMapping()方法,寻找和用户请求的URI匹配的ActioinMapping.如果不存在这样的ActionMapping,则向用户返回适当的错误消息。

processActionForm()方法,先判断是否为ActionMapping配置了ActionForm,就先从ActionForm 的存在范围内寻找该ActionForm实例;如果不存在,就创建一个实例。接下来把他保存在合适的范围中,保存时使用的属性key为 ActionMapping的name属性。

processPopulate()方法。如果为ActionMapping配置了ActionForm,就先调用ActionForm的reset()方法,再把请求中的表单数据组装到ActionForm中。

processValidate()方法。如果为ActionMapping配置了ActionForm,并且ActionMapping的 validate属性为true,就调用ActionForm的validate()方法。如果validate()方法返回的ActionErrors 对象存储在request范围内,再把如果表单验证失败,就把ActionErrors对象中包含ActionMessage对象,说明表单验证失败,就 把ActionErrors对象存储在request范围内,再把请求转发到ActionMapping的input属性指定的web组件。如果 ActionForm的validate()方法执行表单验证成功,就继续执行下一步请求处理流程。

processForward()方法,判断是否在ActionMapping中配置了forward属性。如果配置了这个属性,就调用RequestDispatcher的forward方法,请求处理流程结束,否则继续下一步。

processInclude()方法,判断是否在ActionMapping中配置了include属性。如果配置了这个属性,就调用RequestDispatcher的include方法,请求处理流程结束,否则继续下一步。

processActionCreate()方法,先判断是否在Action缓存中存在这个Action实例,把它保存在Action缓存中。

processActionPerform()方法,该方法再调用Action实例的execute()方法.execute()方法位于try/catch代码中,以便捕获异常。
protected ActionForward processActionPerform(HttpServletRequest request,
        HttpServletResponse response, Action action, ActionForm form,
        ActionMapping mapping)
        throws IOException, ServletException {
        try {
            return (action.execute(mapping, form, request, response));
        } catch (Exception e) {
            return (processException(request, response, e, form, mapping));
        }
    }

调用processActionForward()方法,把Action的execute()方法返回的ActionForward对象作为参数 传给它。processActionForward()根据ActionForward对象包含的请求转发信息来执行请求转发或重定向。

2.Struts Action类
ForwardAction
IncludeAction
DispatchAction
LookupDispatchAction
SwitchAction

(1) ForwardAction
<action
      attribute="test2Form"
      input="/test/test3.jsp"
      name="test2Form"
      path="/testActionForward"
      scope="request"
  parameter="/test/actionForward.jsp "
      type=" org.apache.struts.actions.ForwardAction " />
<action forward="/test/actionForward.jsp" path="/testActionForward"
/>

(2) IncludeAction
<action   
      path="/testIncludeAction"
      scope="request"
name="test2Form"
input="/test/test4.jsp"
  parameter="/test/includeAction.jsp "
      type=" org.apache.struts.actions.IncludeAction " />
<action
include="/test/includeAction.jsp"
scope="request"
name="test2Form"
input="/test/test4.jsp"
path="/testIncludeAction" />
(3) DispatchAction
<action
      name="test3Form"
      path="/testDispatchForward"
      parameter="method"
      scope="request"
      validate="false"
      type="com.webshop.struts.action.test.TestDispatchAction">
      <forward name="success" path="/test/test5.jsp" />
</action>

<html:link page="/testDispatchForward.do?method=add" >DispatchActiontestadd</html:link>

(4) LookupDispatchAction
protected Map getKeyMethodMap() {
Map map=new HashMap();
map.put("button.test1", "test1");
map.put("button.test2", "test2");
return map;
}
<html:submit property="action" ><bean:message key="button.test1"/></html:submit>
<html:submit property="action" ><bean:message key="button.test2"/></html:submit>
public ActionForward test1(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)
<action
      name="test3Form"
      path="/testLookupDispatchAction"
      parameter="action"
      scope="request"
      validate="false"
      type="com.webshop.struts.action.test.TestLookupDispatchAction">
      <forward name="success" path="/test/success.jsp" />
    </action>
分享到:
评论

相关推荐

    Struts1 控制器组件和动态表单详解

    在Struts1中,控制器组件是整个架构的核心,它们负责协调用户请求、业务逻辑和视图之间的交互。本篇将深入探讨Struts1的控制器组件以及动态ActionForm的概念。 **Struts1控制器组件** 1. **ActionServlet组件**: ...

    Struts In Action 电子书 Struts1电子书

    - **Struts控制器组件**:Struts框架中的控制器组件主要负责处理HTTP请求,并根据不同的请求类型调用相应的Action处理类。 - **开发流程**:在使用Struts开发Web应用时,通常会遵循以下步骤: - 定义应用需求 - ...

    struts中文帮助文档

    - **可编程组件**:Struts控制器组件是一组可编程的组件,可以帮助开发者定义应用如何与用户交互。 - **组件实例**:例如,通过Struts可以轻松定义超链接、表单以及自定义的动作,从而简化了与用户交互的过程。 #...

    struts的视图组件介绍

    虽然不是视图组件的一部分,但Struts2的拦截器(Interceptor)在视图展现过程中也起着关键作用。拦截器可以处理用户请求,在Action执行前后进行一些预处理或后处理,比如权限验证、日志记录等。这使得视图组件能专注...

    JSP教程Struts控制器

    Struts控制器,特别是Action,是Struts框架中的核心组件,负责协调用户请求、业务逻辑与视图之间的关系。理解并熟练运用Action,能有效提高Java Web应用的开发效率和质量。通过配置Action,结合模型和视图,可以构建...

    Struts_lesson3.ppt

    本课件主要讲解了Struts框架中的控制器组件及其相关概念。 **第二章 Struts 控制器** 1. **Struts 控制器组件** - **ActionServlet**: 是Struts框架的核心,它是Servlet的子类,处理HTTP请求。ActionServlet负责...

    Struts在行动2

    Struts控制器组件主要包括以下几部分: - **超链接和表单**:开发人员可以通过定义超链接和表单来实现用户与Web应用程序的交互。这些超链接和表单通常指向特定的动作。 - **定制动作**:每个动作都是一个实现了`...

    Struts In Action

    2. **Struts控制器组件** 在这一部分,读者将了解到Struts的核心组件——ActionServlet和ActionForm,它们在处理用户请求和更新模型数据方面的作用。ActionServlet作为Web应用的入口点,负责接收请求并转发到相应的...

    Struts in Action 中文版.pdf

    - **Struts控制器组件**:Struts的核心是其控制器组件,它负责处理HTTP请求并将数据传递给模型对象或视图组件。 - **Struts开发Web应用流程**: - 用户通过浏览器发送请求到服务器。 - 服务器将请求交给Struts控制...

    Struts框架 架构 应用 演示 ppt

    5. Struts控制器组件(Controller) Struts的控制器是ActionServlet,它拦截HTTP请求,解析请求参数,调用相应的Action,然后根据Action的返回结果转发到对应的视图。 6. Struts模型组件(Model) 模型由ActionForm...

    Struts in Action

    ##### 4.2 Struts控制器组件 Struts的核心是一个强大的控制器组件,它负责接收用户的请求,调用相应的模型组件处理数据,并将结果转发给视图组件进行渲染。这一机制确保了应用程序各部分之间职责明确,易于扩展和...

    《Struts in Action中文版》真正完整版

    1. **Struts控制器组件:** - 控制器是Struts框架的核心组件之一,负责接收用户的请求,并根据请求参数调用相应的业务逻辑处理类。 - **ActionServlet:** - 是Struts控制器的主要实现,它监听HTTP请求并将请求...

Global site tag (gtag.js) - Google Analytics