SpringMVC知识梳理(一)

什么是SpringMVC

SpringMVC其实就是spring框架的一个模块,SpringMVC和spring之间可以无缝整合,SpringMVC也是一个非常优秀的基于MVC的web框架,什么是MVC这里就不多说了,下面来了解一下springmvc的执行流程。

SpringMVC执行流程

spring-mvc执行流程图

如上图所示,这是springmvc的执行流程图:

  1. 首先,用户向springmvc发送请求,springmvc的前端控制器拦截到用户的请求

  2. springmvc中的前端控制器请求springmvc的处理器映射器查找Handler(通过xml配置或者注解配置)

  3. 处理器映射器返回查找到的Handler给前端控制器

  4. 前端控制器拿到Handler,请求处理器适配器去执行Handler

  5. 处理器适配器去执行Handler

  6. Handler执行完毕返回ModelAndView

  7. 处理器适配器执行完Handler之后返回ModelAndView给前端控制器

  8. 前端控制器向ViewResolver(视图解析器)传递ModelAndView,视图解析器解析ModelAndView

  9. 视图解析器解析完ModelAndView就返回View

  10. 前端控制器进行视图渲染(进行数据填充)

  11. 前端控制器获取到渲染后的视图

  12. 前端控制器将视图对象返回给用户

入门程序HelloWorld

创建一个maven的web项目,导进去相应的jar包,然后开始配置:

第一步是在web.xml文件中配置前端控制器:


<!--配置前端控制器-->

<servlet>

<servlet-name>dispatcherServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring-mvc.xml</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>dispatcherServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

接着是在resource下创建spring-mvc.xml文件,这里需要注意的是,如果你在这个文件外面再加一个文件夹的话,在前端控制器里面也要修改,否则会找不到这个文件。

然后在spring-mvc.xml里面配置:

 <!--配置处理器映射器,BeanNameUrlHandlerMapping也是spring默认的处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--配置处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--配置自定义controller-->
    <bean id="helloController" name="/hello.do" class="com.ssm.core.controller.HelloController"/>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

接着是自定义controller:

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("hello", "Hello World");
        mv.addObject("message","这是第一个spring-mvc的controller");
        mv.setViewName("hello");
        return mv;
    }
}

最后是测试结果:

springmvc请求测试

出现如上就表示我们已经成功了。

程序解析

我们通过上面的例子去理解一下spring-mvc的执行流程:

  1. 用户发送请求(在浏览器中发送请求 http://localhost:8080/hello.do

  2. web.xml中配置的 DispatcherServlet前端控制器拦截用户的请求

  3. 前端控制器请求在 spring-mvc.xml中配置的 BeanNameUrlHandlerMapping 处理器映射器根据用户请求的url(即是 /hello.do)去寻找Handler,并返回给前端控制器

  4. 前端控制器拿到Handler之后去请求在spring-mvc.xml中配置的处理器适配器SimpleControllerHandlerAdapter去执行Handler

  5. 处理器适配器根据前端控制器传来的Handler去寻找相应的我们定义的Controller去调用方法

  6. 我们定义的Controller执行完方法之后给处理器适配器返回 ModelAndView

  7. 处理器适配器返回 ModelAndView 给前端控制器

  8. 前端控制器拿到ModelAndView之后传给在 spring-mvc.xml中配置的视图解析器 InternalResourceViewResolver去解析

  9. 视图解析器解析完成视图之后,返回真正的view给前端控制器

  10. 前端控制器拿到view之后进行渲染和返回给用户

如上,就是spring-mvc的执行流程

非注解的处理器映射器和处理器适配器

处理器映射器

springmvc有三个处理器映射器,分别是:SimpleUrlHandlerMapingControllerClassNameHandlerMapping它们分别对应不同的功能:

  • BeanNameUrlHandlerMapping:是默认配置的,功能是根据url请求去匹配bean的name属性的url获取Controller,使用在上面的例子中

  • SimpleUrlHandlerMaping:根据请求的url去匹配简单的key,在根据key对应的Controller的id去寻找Controller,例如:

    SimpleURLHandlerMapping

    我们请求上面中的hello.dotest.doss.do都可以访问到同一个HelloController。

  • ControllerClassNameHandlerMapping:根据类名.do (类名首字母小写)去寻找Controller, 已经废弃,就不做演示了

这些处理器映射器之间都可以共存,我们可以同时定义多个。

处理器适配器

springmvc提供有两个处理器适配器:

  • SimpleControllerHandlerAdapter:需要实现Controller接口,调用Controller里面的方法,返回ModelAndView ,使用如上面的例子
  • HttpRequestHandlerAdapter:编写的Controller需要实现HttpRequestHandler 接口,例子如下:
    HttpRequestHandler

两个处理器适配器可以共存

注解的处理器映射器和处理器适配器

注解式开发在实际开发中非常常用,一般都是使用注解式开发,所以需要重点了解和掌握

在spring3.1之前使用DefaultAnnotationHandlerMapping注解映射器,在spring3.1之后使用RequestMappingHandlerMapping

在spring3.1之前使用AnnotationMethodHandlerAdapter注解适配器,在spring3.1之后使用RequestMappingHandlerAdapter

想要使用注解,我们需要在配置文件中开启注解:


注解

或者直接开启注解驱动

驱动

然后我们直接Controller中加入注解@Controller就可以使用了,不需要在实现接口,如下图:

test

然后我们在浏览器中就可以直接访问:http://localhost:8080/test

springmvc常用注解
  • @Controller:注册bean到spring容器中,bean的id是类型首字母小写,也可以自己指定
  • @RequestMapping:用来定义访问的url。可以是方法级别的,也可以是类级别的。两者可以协同工作,缩小选择范围。用法:
@RequestMapping(value="",method={"",""},headers={},params={"",""})

上面参数可不全部都设,其中

value:设置访问地址
method:设置访问方式,常用的method=RequestMethod.POST,和method=RequestMethod.GET
headers:头域,可以设置浏览器支持的格式
params:访问参数设置
  • @Autowired:对成员变量、方法和构造函数进行标注,来完成自动装配工作。可以消除get,set方法。
  • @ResponseBody:直接放在方法上,表示返回类型将会直接作为Http响应字节流输出,可以用于Ajax。
  • @Valid:实体设置+类+类的引用,直接将页面中封装的实体对象信息封装@Valid后面定义的实体中。有了这个注解,就不用request.getParameter("")了,jsp页面上控件的name属性 跟实体字段一样,这样不用主动获取,就能自动的拿到页面控件的值了。
  • @RequestParam:获取全局变量的值,用法:
@RequestParam(required=,value="",defaultValue="")
required:参数是否必须,boolean类型,默认为true
value:传递的参数名称,String类型,可选项,有值则对应方法的参数
defaultValue:参数没有传递时为参数默认指定的值
  • @PathVariable:用于方法中的参数,表示方法参数绑定到地址URL的模板

springmvc封装参数

springmvc封装参数与struts2不同,springmvc基于方法进行封装参数,struts2基于属性进行参数封装,下面实现一个简单类型的参数封装例子:
首先在页面中定义:


页面

然后在Controller方法中定义接受方法:


controller

这里面有一个需要注意的是:页面中定义的参数的name和controller方法中的形参名称一样,如果不一样,需要用@RequestParam进行绑定,还有,最好使用包装类型。
  pojo参数的封装跟上面的差不多,对应属性的名称在pojo里面的名称最好一样,这样可以自动封装进去。
  针对特殊类型的参数,springmvc提供了converter(转换器)可以使用,还有在日期绑定等特殊格式的时候我们还可以自定义converter。

自定义converter步骤如下:

新建类实现converter接口:


converter

然后在方法里面实现转换的逻辑

然后在spring-mvc.xml文件里面配置:

converter

converter

如此,便可以实现自定义转换器,到这里就基本是springmvc的基础入门,后面会直接整合spring、mybatis一起来深入学习。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容