白话MVC(二)
在Struts的过滤器中,经过调用PrepareOperations.createActionContext(Request, Response)函数后,一个ActionContext对象被创建了,与Action有关的数据全部放在了ActionContext中,有些地方仍然使用HttpRequestServlet.getAttribute(String)这个函数取值,所以struts框架包装HttpRequestServlet,覆盖此函数,使它能从ActionContext中取值,譬如说:取ValueStack的值,它的key是"com.opensymphony.xwork2.util.ValueStack.ValueStack"。
request = prepare.wrapRequest(request);
在框架内部,直到Action.execute()函数被调用之前,Model层所需要用的数据全部从ActionContext中取得。深入这行代码
execute.executeAction(request, response, mapping);
进去看,发现其实是调用了Dispatcher.serviceAction(...)函数,在这个函数首先根据所给的参数创建ActionContext(是因为在前面以前创建过,是不是多余?),然后根据ActionMapping对象,从x-work容器内载入ActionProxy类,这个时候,ActionProxy有一个重要的对象ActionInvocation被创建。
Dispatcher.serviceAction(HttpServletRequest, HttpServletResponse, ServletContext,
ActionMapping)
这个方法里其实是调用了StrutsActionProxy.execute()方法,execute方法内调用了ActionContext.invoke()方法,再在invoke方法里先调用所有的拦截器,最后调用Action类的execute方法或者在配置文件里允许被调用的方法,这个过程描述出来很啰嗦。
但是有一点特别重要,在执行拦截器和Action时,都公用了ActionContext这个对象,对于拦截器来说,只用从ActionContext里取数据,执行功能代码后,再次调用ActionInnvocation.invoke()方法。这中约定对于链式的设计非常重要。
看下面的示意图(该死的word,那个ActionProxy方块不知道怎么搞的,怎么也拉不到对齐的位置)。
Action类被执行后,返回ExecuteResult对象,表示一个执行的对象结果,为什么有这个对象,而不是直接返回一个表示要跳转或转发的URL呢?让我们粗略看一下这个类继承图就知道了。
因为struts着力于优雅的处理错误信息,验证信息等,还要支持很多框架的视图技术,所以,也是一个很复杂的设计,这里暂时不讨论。
回到Model装配的问题上来,在经过拦截器层层拦截后,在Action类被执行前,Action类的Model Bean是一定要被装配好的,只是经过struts2的拦截器实在是很多,逐个逐个的看,真不知道要看到什么时候,这里投个巧,借助eclispse继承开发环境的条件断点则容易的定位到答案,Model Bean是在ParametersInterceptor这个类中被装配的。
Map<String, Object> contextMap = ac.getContextMap();
try {
ReflectionContextState.setCreatingNullObjects(contextMap, true); //允许创建空对象
ReflectionContextState.setDenyMethodExecution(contextMap, true); //不容许调用非属性相关的setter方法
ReflectionContextState.setReportingConversionErrors(contextMap, true); //报告错误到contextMap
ValueStack stack = ac.getValueStack();
setParameters(action, stack, parameters); //利用intercepter装配bean,且保证创建这个对象
} finally {
ReflectionContextState.setCreatingNullObjects(contextMap, false);
ReflectionContextState.setDenyMethodExecution(contextMap, false);
ReflectionContextState.setReportingConversionErrors(contextMap, false);
}
上面是这个拦截器的核心代码,在ParametersInterceptor的私有方法setParameters(action, stack, parameters)中,借助OGNL装配了Model Bean,正因为OGNL组件,参数值都在值栈里,并且用参数的名字作为key,即使装配复合的Model Bean,对于struts框架来说,也是非常简单的工作。
目前为止,Model Bean在struts2框架里是如何自动装配的,主要的线路点就介绍完了,也达到了让fastupload支持struts框架所必须掌握的知识,因为即将进行fastupload的新版本开发工作,这个系列暂停一段时间。
[本文系作者原创,如若转载,请注明出处,@仪山湖]
- 大小: 60.6 KB
- 大小: 27.6 KB
分享到:
相关推荐
2. **控制器执行**:控制器接收到请求后,根据请求的参数调用相应的业务逻辑,这可能涉及到与模型的交互。 3. **模型操作**:模型执行相关的业务逻辑,如查询数据库、处理数据等。 4. **视图渲染**:控制器根据模型...
Struts2作为一款强大的MVC(Model-View-Controller)框架,为Web应用提供了良好的架构支持。它简化了控制器层的编写,使得业务逻辑和视图呈现更加分离。在学生信息管理系统中,Struts2负责处理HTTP请求,调度控制...
### 更多Windows白话经典算法之七大排序第2版(高清) #### 一、概览 本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序...
ACM在线评测系统,可以支持C、C++和Java+Struts2 + Spring + Hibernate+课程设计+毕业设计 ACM在线评测系统,可以支持C、C++和Java+Struts2 + Spring + Hibernate+课程设计+毕业设计 ACM在线评测系统,可以支持C、...
07 白话容器基础(三):深入理解容器镜像.pdf
基于MVC实现的门禁管理系统+毕业设计+课程设计+源码 基于MVC实现的门禁管理系统+毕业设计+课程设计+源码 基于MVC实现的门禁管理系统+毕业设计+课程设计+源码 基于MVC实现的门禁管理系统+毕业设计+课程设计+源码 ...
C#+dot net+MVC+基于.net MVC的教师公寓管理系统设计与实现+本科毕业设计+课设+源码+web C#+dot net+MVC+基于.net MVC的教师公寓管理系统设计与实现+本科毕业设计+课设+源码+web C#+dot net+MVC+基于.net MVC的...
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。...
EF框架+T4模板+Lambda表达式+三层设计+MVC 毕业设计:在线汽车站车票售卖系统。系统有车站窗口端、旅客端、检票端。整体业务逻辑清晰,含有路线、班车、车票管理。根据班车自动生成余票信息。建议可以做为在线售票...
这个系统遵循MVC(Model-View-Controller)设计模式,这是一种常见的软件架构模式,旨在提高代码的可维护性和可扩展性。 1. **Java Servlet**:Servlet是Java编程语言中用来处理HTTP请求的服务器端组件。在本项目中...
《僧伽吒经》+白话全文注释版(第三卷下)[文].pdf
Struts是Apache软件基金会的一个开源项目,它是一个用于构建企业级Java Web应用的MVC(Model-View-Controller)框架。Struts通过解耦业务逻辑、视图和控制逻辑,提高了代码的可维护性和可扩展性。在本系统中,Struts...
《子平真诠白话解释》是一部对古代命理学经典著作《子平真诠》的现代解读作品,它将古典文言文译为现代白话文,旨在为现代读者提供更加通俗易懂的阅读体验。《子平真诠》由古代著名命理学者所著,对后世影响深远。...
《白话C++》教程是一本面向初学者和有一定编程基础的人士的C++学习资料。本书以通俗易懂的语言,生动有趣的例子,深入浅出地解析了C++这一强大的编程语言,使得学习者能够更轻松地掌握C++的基础与进阶知识。 C++是...
白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-...
白话机器学习的数学-立石贤吾-源代码.zip
在MVC模式中,"content"可能对应于模型(Model)部分,包含业务逻辑和数据处理,也可能包括视图(View)和控制器(Controller)的代码,具体取决于系统的组织结构。 总结起来,这个压缩包提供了一个基于PHP和MySQL...
《罗织经》白话全译.doc
《白话C++》是一本深受读者喜爱的编程著作,由中国的编程大师撰写,旨在以通俗易懂的方式解析复杂的C++编程语言。作者通过简洁幽默的语言,使得这本教程不仅适合初学者,也对有一定经验的程序员有很高的参考价值。在...