springMVC总结

1.springmvc概述

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

2.springmvc优点

1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;
3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;
4、和Spring 其他框架无缝集成,是其它Web框架所不具备的;
5、可适配,通过HandlerAdapter可以支持任意的类作为处理器;
6、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;
7、功能强大的数据验证、格式化、绑定机制;
8、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;
9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
10、强大的JSP标签库,使JSP编写更容易。

还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。

3.springmvc运行原理

核心架构的具体流程步骤如下:

image.png

1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
执行处理器(Controller,也叫后端控制器)。
5、Controller执行完成返回ModelAndView
6、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
7、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
8、ViewReslover解析后返回具体View给DispatcherServlet
9、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
10、DispatcherServlet响应用户

框架组件

  • DispatcherServlet:前端控制器
    用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

  • HandlerMapping:处理器映射器
    HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  • Handler:处理器
    Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
    由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

  • HandlAdapter:处理器适配器
    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

  • View Resolver:视图解析器
    View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

  • View:视图
    springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
    一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。需要用户手动开启的组件有处理器映射器和视图解析器.

4.springMVC与struts2区别

  • 共同点:

    • 它们都是表现层框架,都是基于MVC模型编写的
    • 它们底层都依赖原始的servletAPI
    • 它们处理请求的机制都是一个核心控制器
  • 区别:

    • springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
    • springmvc是基于方法设计的(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类设计的,传递参数是通过类的属性,每次执行都会创建一个处理类的实例。所以,其效率没有springMVC高
    • Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据,
      springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

5.注解驱动的作用:

  • 自动创建处理器映射器
  • 自动创建处理器适配器
  • 支持所有注解
  • 支持json格式数据
  • 参数绑定
  • springmvc接收参数方式:直接把接收参数变量放在方法中自动接收参数

6.解决参数乱码

  • 在pom.xml文件中添加
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
  • 在web.xml中配置spring自带的编码过滤器
<!--    配置编码过滤器-->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

7.SpringMVC默认支持的参数类型

  • HttpServletRequest:通过request对象获取请求信息
  • HttpServletResponse:通过response处理响应信息
  • HttpSession:通过session对象得到session中存放的对象
  • Model/ModelMap:ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据.

8.支持的数据类型

参数类型推荐使用包装数据类型,因为基础数据类型不可以为null

  • 整型:Integer、int
  • 字符串:String
  • 单精度:Float、float
  • 双精度:Double、double
  • 布尔型:Boolean、boolean

9.springMVC注解

RESTful支持:

  • Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释。
    资源定位:互联网所有的事物都是资源,要求url中只有动词,没有名词。没有参数
    Url格式:http://blog.dn.net/beat_the_world/article/details/45621673

常用注解:

  • @Controller:用于标识是处理器类.表示把我的控制器对象交给spring来创建。
    Controller起作用:只需要扫描即可。

  • @RequestMapping :请求映射注解,springMVC 4.3之后支持restful风格的写法

    • @GetMapping
    • @PostMapping
    • @PutMapping
    • @DeleteMapping
    • @PatchMappin
  • 小贴士:所有从浏览器直接发送的请求,都是get请求,href发送的请求都是get请求

  • URL路径映射
    @RequestMapping:请求到处理器功能方法的映射规则,URL路径映射:@RequestMapping(value=”/user”)或@RequestMapping(“/user”)

  • URL路径传参映射
    @RequestMapping(value=”/user/{userId}”):{userId}占位符,请求的URL可以是“/user/001”或“/user/abc”,通过在方法中使用@PathVariable(userId)获取{userId}中的userId值,此种方式是restful风格

  • RequestParam

    • value:参数名字,即入参的请求参数名字,如value=“studentid”表示请求的参数区中的名字为studentid的参数的值将传入;
    • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;
    • defaultValue:默认值,表示如果请求中没有同名参数时的默认值
      @RequestParam(defaultValue=”1”,value=”myid”)
      defaultValue=1:设置默认值
      defaultValue=2:给参数定义别名,别名和页面传递参数匹配即可

7.Redirect 重定向和Forward 转发区别

转发:

  • 地址栏不发生变化,显示的是上一个页面的地址
  • 请求次数:只有1次请求
  • 请求域中数据不会丢失
  • 服务器内部资源跳转,属于服务器行为

重定向:

  • 地址栏:显示新的地址
  • 请求次数: 至少2次
  • 请求域中的数据会丢失,因为是2+次请求
  • 浏览器行为

springMVC重定向写法:

  • return "redirect:/success.html"
    注意springMVC重定向的页面不走视图解析器,所以redirect:后写法要和response.sendRedirect(),中写法一致,即 项目名/文件路径

springMVC 转发写法:

  • return "forward:/WEB-INF/views/success.jsp"
    注意springMVC转发的页面也不走视图解析器,所以forward:后写法要于“request.getRequestDispatcher().forward(request,response)一致,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。

8. json数据交互

  • @RequestBody 注解 用于读取http请求的内容(字符串),通过springMVC提供的 HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。注意get请求不适应,因为get请求没有请求体

  • @RequestBody 注解实现接收http请求的json数据,将json数据转换为java对象

  • @RequestBody/@ResponseBody要依赖Jackson

  • 支持注解,注解映射器和注解适配器可以使用<mvc:annotation-driven />代替。

  • @ResponseBody 注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

9. 自定义异常处理器

/**
* 自定义全局异常处理器
*/
public class ExceptionResolver implements HandlerExceptionResolver {

       @Override
       public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj,
               Exception ex) {
           CustomException ce = null;
           //判断此异常是否是自定义异常
           if (ex instanceof CustomException) {
               //自定义异常
               ce = (CustomException) ex;
           } else {
               //如果抛出的不是系统自定义异常则重新构造一个系统错误异常
               ce = new CustomException("网络异常!");
           }
           //创建modelAndView对象,封装数据,视图页面
           ModelAndView modelAndView = new ModelAndView();
           //设置数据
           modelAndView.addObject("error", ce.getMessage());
           //设置返回页面
           modelAndView.setViewName("error/error");
           return modelAndView;
       }
   }

异常处理器配置在springmvc.xml中配置:

<!-- 配置全局异常处理器 -->
<bean id="exceptionResolver" class="com.aric.exception.ExceptionResolver"/>

10. 拦截器

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

自定义拦截器

/**
* 登陆拦截器
*/
public class LoginInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }

    /**
     * controller执行后但未返回视图前调用此方法
     * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
    }
    /**
     * controller执行前调用此方法
     * 返回true表示继续放行,返回false拦截
     * 这里可以加入登录校验、权限拦截等
     */
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception {
        //1.登陆请求,放行
        if (req.getRequestURI().contains("login")) {
            return true;
        }
        //2.如果用户登陆,放行
        if (req.getSession().getAttribute("user") != null) {
            return true;
        }
        //3.否则,拦截
        //跳转登陆页面登陆
        req.getRequestDispatcher("/WEB-INF/jsps/login.jsp").forward(req, resp);
        return false;
    }
}

拦截器配置在springMVC.xml中配置

<!--配置局部拦截器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="handlerInterceptor1"/>
            <ref bean="handlerInterceptor2"/>
        </list>
    </property>
</bean>
    <bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
    <bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
    
<!-- 配置全局拦截器 -->   
<mvc:interceptors>
    <!-- 登陆拦截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.aric.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

拦截器与过滤器的区别
过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大;
拦截器Inerceptor依赖于框架容器,基于反射机制,只过滤请求.

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

推荐阅读更多精彩内容

  • 过去的2017年在很多人眼里很平常,但在我的眼里却是我到目前为止最充实的一年,就在2017年12月31日这天,《时...
    奇行怪撰阅读 254评论 2 1
  • 虽然你的承诺一次次失言, 虽然你的誓言一次次成空白, 但我仍然相信这次是真的。 我也承认,在你面前, 我的智商像孩...
    d602bc1a09乡野村妇阅读 311评论 2 2
  • 成长不是学会和这个世界妥协了, 而是懂得了其中的彷徨和无言, 理解了其中的纠结和挣扎, 尊重了其中的无谓和无畏, ...
    子转阅读 80评论 0 0
  • http://www.iyuji.cn/iyuji/s/Zk9DWkNMTnVyTFEyZmlKMGVBVUJBQ...
    24队幸福指数88阅读 142评论 0 0
  • 今天第一节课是语文,语文老师教的,我们动物儿歌的课文和生字。还学了读一读记一记,蜻蜓展翅,蝴蝶飞舞,蚯蚓松土...
    褚益赫小乐阅读 298评论 0 0