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的控制器组件以及动态ActionForm的概念。 **Struts1控制器组件** 1. **ActionServlet组件**: ...
- **Struts控制器组件**:Struts框架中的控制器组件主要负责处理HTTP请求,并根据不同的请求类型调用相应的Action处理类。 - **开发流程**:在使用Struts开发Web应用时,通常会遵循以下步骤: - 定义应用需求 - ...
- **可编程组件**:Struts控制器组件是一组可编程的组件,可以帮助开发者定义应用如何与用户交互。 - **组件实例**:例如,通过Struts可以轻松定义超链接、表单以及自定义的动作,从而简化了与用户交互的过程。 #...
虽然不是视图组件的一部分,但Struts2的拦截器(Interceptor)在视图展现过程中也起着关键作用。拦截器可以处理用户请求,在Action执行前后进行一些预处理或后处理,比如权限验证、日志记录等。这使得视图组件能专注...
Struts控制器,特别是Action,是Struts框架中的核心组件,负责协调用户请求、业务逻辑与视图之间的关系。理解并熟练运用Action,能有效提高Java Web应用的开发效率和质量。通过配置Action,结合模型和视图,可以构建...
本课件主要讲解了Struts框架中的控制器组件及其相关概念。 **第二章 Struts 控制器** 1. **Struts 控制器组件** - **ActionServlet**: 是Struts框架的核心,它是Servlet的子类,处理HTTP请求。ActionServlet负责...
Struts控制器组件主要包括以下几部分: - **超链接和表单**:开发人员可以通过定义超链接和表单来实现用户与Web应用程序的交互。这些超链接和表单通常指向特定的动作。 - **定制动作**:每个动作都是一个实现了`...
2. **Struts控制器组件** 在这一部分,读者将了解到Struts的核心组件——ActionServlet和ActionForm,它们在处理用户请求和更新模型数据方面的作用。ActionServlet作为Web应用的入口点,负责接收请求并转发到相应的...
- **Struts控制器组件**:Struts的核心是其控制器组件,它负责处理HTTP请求并将数据传递给模型对象或视图组件。 - **Struts开发Web应用流程**: - 用户通过浏览器发送请求到服务器。 - 服务器将请求交给Struts控制...
5. Struts控制器组件(Controller) Struts的控制器是ActionServlet,它拦截HTTP请求,解析请求参数,调用相应的Action,然后根据Action的返回结果转发到对应的视图。 6. Struts模型组件(Model) 模型由ActionForm...
##### 4.2 Struts控制器组件 Struts的核心是一个强大的控制器组件,它负责接收用户的请求,调用相应的模型组件处理数据,并将结果转发给视图组件进行渲染。这一机制确保了应用程序各部分之间职责明确,易于扩展和...
1. **Struts控制器组件:** - 控制器是Struts框架的核心组件之一,负责接收用户的请求,并根据请求参数调用相应的业务逻辑处理类。 - **ActionServlet:** - 是Struts控制器的主要实现,它监听HTTP请求并将请求...