• UID10
  • 登录2016-10-31
  • 粉丝38
  • 关注4
  • 发帖386
  • 主页
  • 金币2543枚
社区居民
忠实会员
原创写手
bill 发布于2015-08-10 10:21
0/3417

SpringMVC开发要点

楼层直达
SpringMVC是一种很强大的MVC框架,从名字上可以看出它与Spring框架的连接非常好。本文整合网上一些参考资料,介绍其技术特点和关键技术要点。

一、SpringMVC特点
1、让我们能非常简单的设计出干净的Web层(也就是控制层Controller)。
2、进行更简单的Web层的开发。
3、天生与Spring框架集成;
4、提供强大的约定大于配置的契约式编程支持(这一块随后会进行详细介绍)。
5、能简单的进行Web层的单元测试;
6、支持灵活的URL到页面控制器的映射;
7、非常容易与其他视图技术集成,如Velocity、FreeMarker等。因为模型数据不放在特定的API中,而是放在一个Model里(控制器的返回值ModelAndView,返回值为Map数据结构,所以可以为其他V使用)
8、非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API
9、提供一套强在的JSP标签库,简化JSP的开发(使用不太多可以使用JSTL来代替);
10、支持灵活的本地化、主题等解析。
11、更加简单的异常处理;
12、对静态资源的支持。
13、支持Restful风格。

二、SpringMVC的架构
SpringMVC是一个基于DispatcherServlet(前端控制器)的MVC框架,每一个请求最先访问的都是 DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理 以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。
下图是SpringMVC的调用过程:

图片:arch.png



、配置文件
  1. web.xml配置文件。使用Spring MVC,配置前端控制器DispatcherServlet是第一步。
    web.xml配置Servlet示例:
    <!-- Spring MVC Servlet -->
     <servlet>
      <servlet-name>Spring-Servlet</servlet-name>
      <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>
        classpath:spring-servlet.xml
       </param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
     </servlet>
       
     <servlet-mapping>
      <servlet-name>Spring-Servlet</servlet-name>
      <url-pattern>*.do</url-pattern>
     </servlet-mapping>
注:
  • <load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动
  • DispatcherServlet的初始化过程中,可以同时加载多个spring配置文件,来生成文件中定义的bean。
  • <url-pattern>*.do</url-pattern> 会拦截*.do结尾的请求
2. springmvc servlet 配置文件
有使用多种写法:
  • 不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml
  • <param-value>/WEB-INF/classes/springMVC.xml</param-value>
  • <param-value>classpath*:springMVC-mvc.xml</param-value>
  • 多个值用逗号分隔
示例配置文件:
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:context="http://www.springframework.org/schema/context" 
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
       http://www.springframework.org/schema/context &lt;a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;/a&gt;"&gt;
    
    
    &lt;!-- 启用spring mvc 注解 --&gt;
    &lt;context:annotation-config /&gt;
    
    
    &lt;!-- 设置使用注解的类所在的jar包 --&gt;
    &lt;context:component-scan base-package="controller"&gt;&lt;/context:component-scan&gt;
    
    
    &lt;!-- 完成请求和注解POJO的映射 --&gt;
    &lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /&gt;
    
    
    &lt;!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --&gt;
    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" /&gt;
&lt;/beans&gt;
DispatcherServlet会利用一些特殊的bean来处理Request请求和生成相应的视图返回。关于视图的返回,Controller只负责传回来一个值,然后到底返回的是什么视图,是由视图解析器控制的,在jsp中常用的视图解析器是InternalResourceViewResovler,它会要求一个前缀和一个后缀。在上述视图解析器中,如果Controller返回的是blog/index,那么通过视图解析器解析之后的视图就是/jsp/blog/index.jsp。

核心类和接口
1. DispatcherServlet -- 前置/端控制器,它继承自HttpServlet。

图片:dispatch.jpg


2. HandlerMapping接口 -- 处理请求的映射
拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。 “某某规则”:是根据你使用了哪个HandlerMapping接口的实现类的不同而不同。
HandlerMapping接口的实现类:
  •     SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller
  •     DefaultAnnotationHandlerMapping  通过注解,把一个URL映射到Controller类上

图片:handlemapping.jpg




3. HandlerAdapter接口 -- 处理请求的映射.
AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上

图片:handleadapter.jpg


4. Controller接口 -- 控制器
由于我们使用了@Controller注解,添加了@Controller注解注解的类就可以担任控制器(Action)的职责,
所以我们并没有用到这个接口。

图片:controller.jpg



5. HandlerInterceptor 接口--拦截器
我们自己实现这个接口,来完成拦截器的工作。
 
6. ViewResolver接口的实现类
  • UrlBasedViewResolver类通过配置文件,把一个视图名交给到一个View来处理
  • InternalResourceViewResolver类,比上面的类,加入了JSTL的支持

图片:viewresolver.jpg


7. View接口
JstlView类

图片:jstview.jpg



8. LocalResolver接口

图片:localresolver.jpg


9. HandlerExceptionResolver接口 --异常处理
SimpleMappingExceptionResolver实现类

图片:handerexceptionresolver.jpg


10. ModelAndView类
无图。
 

注解

SpringMVC的注解配置,的确比XML配置方便简洁多了,现将SpringMvc的具体注解配置说明一下。
1、添加SpringMVC注解功能

有两种方式:
a、手工注入开启注解的具体类

<!-- 注解扫描包 -->  
  1. <context:component-scan base-package="com.springmvc.controller.annotation"></context:component-scan>  
  2. <!-- 开启注解 -->  
  3. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>  
  4. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>  
b、使用springmvc标签
  1. <mvc:annotation-driven/>  
  2. <!-- 注解扫描包 -->  
  3. <context:component-scan base-package="com.springmvc.controller.annotation"></context:component-scan>  
2、使用注解后的Controller类
  1. package com.springmvc.controller.annotation;  
  2.  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.web.servlet.ModelAndView;  
  9.  
  10. @Controller  
  11. @RequestMapping("/user")  
  12. public class UserController {  
  13.    @RequestMapping("/add.do")  
  14.    public ModelAndView addUser(){  
  15.        return new ModelAndView("user","method","add");  
  16.    }  
  17.    @RequestMapping("/delete.do")  
  18.    public ModelAndView deleteUser(){  
  19.        return new ModelAndView("user","method","delete");  
  20.    }  
  21.    @RequestMapping("/update.do")  
  22.    public ModelAndView updateUser(){  
  23.        return new ModelAndView("user","method","update");  
  24.    }  
  25.    @RequestMapping("/toUser.do")  
  26.    //只进行跳转  
  27.    public String toUser(HttpServletRequest request, HttpServletResponse response){  
  28.        System.out.println("跳转...");  
  29.        request.setAttribute("method", "跳转");  
  30.        return "user";  
  31.    }  
  32. }  



0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 72422/370   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 41351/0   Python爬虫:常用浏览器的useragent

  • 41313/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 37809/259   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 36409/145   省时省力的Android组件群来了,非常棒的原型参考

  • 28406/2   超全!整理常用的iOS第三方资源

  • 27850/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 27705/142   2016抢红包软件及源码

  • 22053/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 21822/157   Android版类似UC浏览器:非常赞,产品级的源码

  • 21672/25   Android工程师面试题大全

  • 21505/27   2016程序员跳槽全攻略

  • 21341/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20225/20   码魂:程序员的牛B漫画

  • 18426/10   2016年最全的Android面试考题+答案 精编版

  • 18175/3   吐槽那些程序员的搞笑牛逼注释

  • 17792/42   一个绚丽的loading动效分析与实现!

  • 17662/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 17645/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 17096/1   iOS 动画总结

  • 16570/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 16281/23   个人收集的Android 各类功能源代码

  • 16075/81   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 15936/10   女程序员的梦,众网友的神回复

  • 15810/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 15675/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 15624/11   年会上现场review代码是怎么样的体验!

  • 15493/21   Android福利第三波【Android电子书】

  • 15410/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 15402/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 15231/23   珍藏多年的素材,灵感搜寻网站

  • 15016/79   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 14828/0   iOS中文版资源库,非常全

  • 14475/18   65条最常用正则表达式,你要的都在这里了

  • 14197/15   基于Android支付宝支付设计和开发方案

  • 13659/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13458/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 13003/7   一张图搞定iOS学习路线,非常全面

  • 12988/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 12922/7   用程序员的姿势抢过年的火车票

  • 12878/0   GitHub iOS 库和框架Top100 

  • 12625/10   成为Java顶尖程序员 ,看这11本书就够了

  • 12496/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12437/18   一张图搞定Android学习路线,非常全面

  • 12270/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 12115/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12049/29   【持续更新中】Android福利贴(一):资料源码

  • 11497/4   46 个非常有用的 PHP 代码片段

  • 11251/3   即时通信第三方库

  • 10872/8   流媒体视频直播方案

  • 10761/18   八个最优秀的Android Studio插件

  • 10722/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 10600/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10448/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10390/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 9771/6   开箱即用!Android四款系统架构工具

  • 9579/10   十大技巧快速提升Android应用开发性能

  • 9519/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9447/3   一张图看清Linux 内核运行原理

  • 9338/1   Android性能优化视频,文档以及工具

  • 返回顶部