赞
踩
SSM简单整合
SpringMVC工作原理:
1、用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回给DispatcherServlet
3、DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter适配器。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
4、 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5、Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象
6、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet
7、ViewResolver 结合Model和View,来渲染视图(即将模型数据填充至视图中)
8、将渲染结果返回给客户端
SpringMVC和Strust2的区别:
Struts2是类级别上的拦截,一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文。而且Struts过滤后是去Struts配置文件中找Action,每个类的请求你都要配置对应的拦截器。而SpringMVC过滤后是去controller中找对应于@RequestMapping注解的url绑定的方法。
也因为拦截器原因,导致Struts2的action比较乱,因为它要定义属性来获取请求中参数的数据,而属性在一个类的方法间是共享的(方法间不能独享request、response数据),属于多例模式。所以会有点乱。而SpringMVC中请求参数与controller中方法的形参自动配对(在名字相同,或请求参数与形参的属性名相同,或通过@RequestParam注解指定条件下会自动将请求参数的值赋给形参)方法间可以独享request、response数据,属于单利模式。(单例模式,在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段)。
springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean、FrameworkServlet和 DispatcherServlet。
HttpServletBean直接继承自java的HttpServlet,其作用是将Servlet中配置的参数设置到相应的属性;FrameworkServlet初始化了WebApplicationContext,DispatcherServlet初始化了自身的9个组件。
SpringMVC九大组件介绍:
1. HandlerMapping:它的作用是根据request找到对应的处理器Handler和Interceptors,它的接口里面只有一个getHandler()方法。
2. HandlerAdapter:它的作用可以理解为一个适配器,就是使用处理器干活的工具,因为SpringMVC中的Handler可以是任意的形式(方法或者类),只要能处理请求就ok,但是Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法,所以它会让固定的Servlet处理方法调用灵活的Handler来进行处理。里面有3个方法,Support(Object handler)判断是否可以使用某个Handler;handle()方法是用来具体使用Handler干活;getLastModified()是获取资源的Last-Modified,也就是资源最后一次修改的时间。
3. HandlerExceptionResolver:此组件的作用是根据处理过程中出现的异常设置ModelAndView,之后再交给render进行渲染,只有一个方法resolveException()
4. ViewResolver:ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。这里就有两个关键问题:使用哪个模板(默认为InternalResourseViewResolver只针对jsp视图 )?用什么技术(规则)填入参数?这其实是ViewResolver主要要做的工作,ViewResolver需要找到渲染所用的模板和所用的技术(也就是视图的类型)进行渲染,具体的渲染过程则交由不同的视图自己完成。只有一个方法resolverViewName()
5. RequestToViewNameTranslator:ViewName是根据ViewName查找View,但有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。RequestToViewNameTranslator在Spring MVC容器里只可以配置一个,所以所有request到ViewName的转换规则都要在一个Translator里面全部实现。
6. LocaleResolver:解析视图需要两个参数:一是视图名,另一个是Locale。视图名是处理器返回的,Locale是从哪里来的?这就是LocaleResolver要做的事情。LocaleResolver用于从request解析出Locale,Locale就是zh-cn之类,表示一个区域,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。
7. ThemeResolver:用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、如图片、css样式等。SpringMVC的主题也支持国际化,同一个主题不同区域也可以显示不同的风格。SpringMVC中跟主题相关的类有 ThemeResolver、ThemeSource和Theme。主题是通过一系列资源来具体体现的,要得到一个主题的资源,首先要得到主题的名称,这是ThemeResolver的工作。然后通过主题名称找到对应的主题(可以理解为一个配置)文件,这是ThemeSource的工作。最后从主题中获取资源就可以了。
8. MultipartResolver:用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File,如果上传多个文件,还可以调用getFileMap得到FileName->File结构的Map。此组件中一共有三个方法,作用分别是判断是不是上传请求,将request包装成MultipartHttpServletRequest、处理完后清理上传过程中产生的临时资源。
9. FlashMapManager:用来管理FlashMap的,FlashMap主要用在redirect中传递参数。
SpringMVC本质上是一个Servlet,Servlet的运行需要一个Servlet容器,如常用的Tomcat。Servlet容器帮我们统一做了像底层Socket连接那种通用但又很麻烦的工作,我们只要按照Servlet接口去做就可以了,而SpringMVC又在此基础上提供了一套通用的解决方案,这样我们连Servlet都不用写了,可以完全把重心放在核心业务逻辑上。
Tomcat可以分为两大部分,连接器和容器,连接器 专门用于处理网络连接相关的事情,如Socket连接,request封装,连接线程池维护等工作,容器 用来存放我们编写的网站程序。
Tomcat中一共有4层容器:Engine,Host,Context,Wrapper。一个Wrapper对应一个Servlet,一个Context对应一个应用(也就是域名后跟的路径下的应用),一个Host对应一个站点(的根路径),如不同的域名,一个Engine是引擎,一个容器只有一个。
Servlet接口一共有5个方法,其中init和destroy用于初始化和销毁Servlet,整个生命周期只被调用一次;service方法实际处理请求;getServletConfig方法返回ServletConfig,可以获取到配置Servlet时使用的init-param配置的参数,还可以获取ServletContext;getServletInfo方法可以获取一些Servlet相关的信息,如作者,版权等,需要自己实现,默认返回为空。
Java提供了两个Servlet的实现类:
1.GenericServlet: 主要做了三件事。第一,实现了ServletConfig接口,让我们可以直接调用ServletConfig中的方法;第二,提供了无参的init方法;第三,提供了log方法。
**2.HttpServlet:**主要做了两件事。第一,将ServletRequest和ServletResponse转换为了HttpServletRequest和HttpServletResponse;第二,根据Http请求类型将请求路由到7个不同的处理方法。
SpringMVC本质上是一个Servlet,这个Servlet继承自HttpServlet,其中有三个层次的Servlet:
1.HttpServletBean: 用于将Servlet中配置的参数设置到相应的属性中
2.FrameworkServlet: 初始化了SpringMVC中所使用的WebApplicationContext,并将不同类型的请求合并到了processRequest方法统一处理,processRequest方法主要做了三件事:①调用了doService模板方法具体处理请求。②将当前请求的LocaleContext和ServletRequestAttributes在处理请求前设置到了LocaleContextHolder和RequestContextHolder,并在请求处理完成后恢复。③请求处理完后发布了ServletRequestHandledEvent消息。
3.DispatcherServlet: 首先根据contextConfigLocation设置的SpringMVC.XML文件位置读取文件并初始化相应的组件,doService方法给request设置了一些属性(包括webApplicationContext,localeResolver,themeResolver,FlashMap和FlashMapManager)并将请求交给了doDispatch方法具体处理,doDispatch主要做了四件事(文章开头的工作流程)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。