springMVC解析

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler(处理器) Mapping)进行处理器管理和视图解析器(View Resolver)
进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含模型与视图(ModelAndView) Handler(处理器)equest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、
主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。

springMVC处理请求的流程:
第一步:用户发送请求到前端控制器(DispatcherServlet)。
第二步:前端控制器要根据不同的url请求对应的处理器(Handler), 此时处理器映射器(HandlerMapping)承担了这个任务,它会根据对应请求的url查找对应的处理器(Handler),它可以根据 xml 配置、注解进行查找。
第三步:处理器映射器(HandlerMapping)向前端控制器返回Handler(处理器)
第四步:前端控制器调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器(Handler)执行完成后给适配器返回模型与视图(ModelAndView)
第六步:处理器适配器(HandlerAdapter)向前端控制器(DispatcherServlet)返回模型与视图(ModelAndView)
    模型与视图(ModelAndView) 是SpringMVC 框架的一个底层对象,包括 Model 和 View
第七步:前端控制器(DispatcherServlet)请求视图解析器(view resolver)去进行视图解析
    根据逻辑视图名来解析真正的视图。
第八步:视图解析器(view resolver)向前端控制器返回 view
第九步:前端控制器进行视图渲染
    就是将模型数据(在 模型与视图(ModelAndView) 对象中)填充到 request 域
第十步:前端控制器向用户响应结果

以下是springMVC中出现的组件的作用解释:
1、前端控制器DispatcherServlet
 作用:接收请求,响应结果,前端控制器是SpringMVC的核心,它会分别调用处理器映射器、处理器适配器、视图解析器,属于一个领导的角色。
2、处理器映射器HandlerMapping
 作用:根据请求的url查找对应的Handler。
3、处理器适配器HandlerAdapter
 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
4、处理器Handler
 注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器ViewResolver
 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View
 注意:View是一个接口,实现类支持不同的View类型(jsp等)

配置部分:
1.前端控制器的配置
前端控制器是在web.xml文件中配置的

2.配置处理器适配器
处理器适配器是用来执行处理器的,在SpringMVC.xml中配置。
第一种配置:编写 Handler 时必须要实现 Controller
配置处理器适配器,所有适配器都得实现 HandlerAdapter接口

第二种配置:编写 Handler 时必须要实现 HttpRequestHandler
配置处理器适配器第二种方法,所有适配器都得实现 HandlerAdapter接口 ,这样配置所有Handler都得实现 HttpRequestHandler接口

3.编写Handler
在 springmvc.xml 文件中配置。通俗来讲,就是请求的 URL 到我们这里所编写的 Handler 类的某个方法进行一些业务逻辑处理。
 我们在上面讲解了两个处理器适配器来约束 Handler,那么我们就通过上面两种配置分别编写两个 Handler
第一种:实现Controller 接口

第二种:实现 HttpRequestHandler 接口

4.配置处理器映射器
在 springmvc.xml 文件中配置。通俗来讲就是请求的 URL 怎么能被 SpringMVC 识别,从而去执行我们上一步所编写好的 Handler
第一种方法:

这样配置的话,那么请求的 URL,必须为 http://localhost:8080/项目名/hello.do

第二种方法:

这种配置请求的 URL可以为 http://localhost:8080/项目名/hello1.do,或者http://localhost:8080/项目名/hello2.do

5.配置视图解析器
第一种配置:

 如果这样配,那么在 Handler 中返回的必须是路径+jsp页面名称+".jsp" 

  第二种配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 返回视图页面的前缀 -->
    <property name="prefix" value="/WEB-INF/view"></property>
    <!-- 返回页面的后缀 -->
    <property name="suffix" value=".jsp"></property>
</bean> 

  如果这样配,那么在 Handler 中只需要返回在 view 文件夹下的jsp 页面名就可以了。

基于注解配置SpringMVC
相比于以上的配置方法,其实此时还有更好的更简便的配置方法,就是基于注解配置SpringMVC。
1.在web.xml中配置前端处理器,相比于非注解配置没什么不同

2.在spring MVC文件中配置处理器映射器、处理器适配器、视图解析器。

此时不难发现,处理器映射器、处理器适配器引入的包相比于非注解引入的包有不同,并且配置处理器时指定的不再是一个固定的文件,而是指定一个包,会扫描包下面所有的处理器。

3.编写处理器Handler
package com.ys.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

//使用@Controller注解表示这个类是一个Handler
@Controller
public class HelloController {

//@RequestMapping注解括号里面的表示访问的URL
@RequestMapping("hello")
public ModelAndView hello(){
	ModelAndView modelView = new ModelAndView();
	//类似于 request.setAttribute()
	modelView.addObject("name","张三");
	//配置返回的视图名,由于我们在springmvc.xml中配置了前缀和后缀,这里直接写视图名就好
	modelView.setViewName("index");
	return modelView;
}

}

此时直接访问http://localhost:8080/SpringMVC_03/hello,就会访问到处于/WEB-INF/view下的index.jsp。

posted @ 2019-05-21 10:52  小小短腿儿  阅读(134)  评论(0编辑  收藏  举报