MVC 思想简介

博客园好像不支持发布markdown的时序图, 如果你会markdown并且不太熟悉Springmvc执行流程, 照着图在Markdown上面敲一遍执行流程,这是我经历过的最快的记忆和熟悉方式!

1.分为三层 Model(模型层) Controller(控制层) View(视图层)

最基本的MVC思想结构

2. Mvc架构特点

1.1 三层架构,分工明确,相比于传统的五层架构来说,Mvc将数据层和业务逻辑层都囊括在了模型层中

1.2 SpringMvc的优势

Spring 框架提供了一整套MVC设计模式的所需组件--Spring Mvc

Spring Mvc 提供了一个DispatcherServlet ,用作前端控制器用来控制请求,同事提供灵活的配置处理**程序映射**,**视图解析**,**语言环境**,**主题解析**,**文件上传**.

Spring Mvc 还包含多种视图技术,例如**Java Server Pages(JSP)**,**Velocity**,**iText**,和**POI**等;

3. SpringMvc的优点

  • 拥有强大的灵活性,非侵入性,和可配置性;
  • 提供了一个前端控制器DispatcherServlet ,开发者不用再开发控制器;
  • 分工明确,包括 控制器,验证器,命令对象,模型对象,处理程序映射视图解析器,等,每一个功能实现由一个专门的对象负责,低耦合;
  • 自动解析,它可以自动绑定用户输入,并且转换输入类型,如:自动解析前端字符串,并自动将其解析为映射对象所需要的类型;
  • 数据传输模式是Map类型,前端JSON获取;
  • 支持国际化,支持更具用户区域显示多国语言,并且国际化的配置非常简单;
  • 支持多种视图技术;

4. SpringMVC框架流程图

但是在开发中,我们需要做的没有这么多,只需要开发MVC部分,其他组件由SpringMVC提供

  • SpringMVC框架提供: 中央控制器,处理适配器,处理映射器,视图解析器
  • 其他组件: 浏览器,数据库,模型层,视图层,控制器由我们开发

5. 开发流程

5.1. 配置中央控制器(DispatcherServlet)

  • 这一层直接和浏览器接触,需要对浏览器发出的请求进行处理
  • 它最主要,整个spring框架依赖它来启动,所以需要将它设置成在服务器启动时加载
    • web.xml中配置中央控制器
  1. <!--中央处理器,最最最最最最最重要的部分-->
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!--初始化就素要去读取spring的配置文件,用来初始化-->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:spring/spring-*.xml</param-value>
  9. </init-param>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>springmvc</servlet-name>
  13. <!--拦截所有以av结尾的请求-->
  14. <url-pattern>*.av</url-pattern>
  15. </servlet-mapping>

5.2 配置全局过滤器

  • 用于过滤要进入中央控制器的请求
  1. <filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <!--初始化时指定编码-->
  5. <init-param>
  6. <param-name>encoding</param-name>
  7. <param-value>utf-8</param-value>
  8. </init-param>
  9. <!--加强参数-->
  10. <!--强制设置请求request和响应response的数据信息为encoding-->
  11. <!--无论客户端是否有指定编码,到了这边全是encoding的编码-->
  12. <init-param>
  13. <param-name>forceEncoding</param-name>
  14. <param-value>true</param-value>
  15. </init-param>
  16. </filter>
  • 注意 : web.xml中的配置信息是有顺序要求的, 详见2.3.dtd

5.3 配置DispatcherServlet的必须组件

三大接口是必须的,通常根据不同需求选择他们中的不同实现

  • 处理映射器(HandlerMapping)

    • BeanNameUrlHandlerMapping

      • 如果使用这个映射器,那么就需要实现Controller接口来完成请求分发
  • 处理适配器(HandlerAdapter)
    • SimpleControllerHandlerAdapter
  • 视图解析器(ViewResolver)
    • InternalResourceViewResolver
  1. <!--配置处理器映射器-->
  2. <!--这大哥-->
  3. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  4. <!--配置处理器适配器-->
  5. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
  6. <!--配置视图解析器-->
  7. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
  • 方式二 处理映射器和处理适配器要配套使用
  1. <bean id="hello2Action" class="com.lyuweigh.action.Hello2Action"/>
  2. <!--处理映射器-->
  3. <!--SimpleUrlHandlerMapping 通过Controller的id来找-->
  4. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  5. <property name="mappings">
  6. <props>
  7. <!--请求的url对应Controller的Bean对象-->
  8. <prop key="/demo">hello2Action</prop>
  9. </props>
  10. </property>
  11. </bean>
  12. <!--处理适配器-->
  13. <!--Controller需要实现HttpRequestHandler-->
  14. <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
  15. <!--视图解析器,不需要配套使用-->
  16. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

作用的话留待补充

6. 开发具体的功能控制器Action(Controller)

  • 开发Controller层,这一层主要功能是请求分发和适配
  1. public class HelloAction implements Controller {
  2. @Override
  3. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  4. //可以同时返回视图+数据
  5. ModelAndView mv = new ModelAndView();
  6. mv.setViewName("/index.jsp");
  7. return mv;
  8. }
  9. }

7. moudle层,让mybatis做

6. 使用注解和XML混合配置SpringMVC

  • web.xml 的配置是死的,不用改变
6.1 基于注解的处理映射器和处理适配器

老样子,视图解析器不变 还是InternalResourceViewResolver

  1. <!--注解的配置方案-->
  2. <!--注解映射器-->
  3. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  4. <!--注解适配器-->
  5. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
  • 并且,这注解的配置方按,有简单的方式可以替换手动配置的映射器,适配器
6.2 Controller的配置方式
  1. @Controller
  2. @RequestMapping("hello.do")
  3. public class Hello3Action {
  4. //方法可自定义
  5. @RequestMapping("/demo")
  6. public ModelAndView helloWorld(HttpServletRequest request, HttpServletResponse response) {
  7. ModelAndView mv = new ModelAndView();
  8. mv.addObject("demo", "lyuweigh3");
  9. mv.setViewName("/index.jsp");
  10. return mv;
  11. }
  12. }
  • @RequestMapping()

    • 可以配置在方法上表示该方法的请求路径
    • 也可以配置在类名上表名该模块的请求路径

可以每个方法都加上一个URL和方法对应

7. Controller/Action自定义方法设置

  • 注解配置的方法有两种返回方式

    • String
    • ModelAndView
  • 返回的ModelAndView中,返回字符串前面加上
    • redirect: ->表示重定向
    • forward: ->表示转发
  • 返回字符串的方式就和直接了,处理直接弄成JSON格式
7.1 传值
  1. 功能方法之间的传值(c-c)

    • request
    • session
    • cache(分布式缓存)
  2. 从具体功能方法到页面(c-v)

    • MoudleAndView 的 addObject()
    • String
  3. 从页面到功能方法(v-c)

    • request.getParmeter()

一共是五种传参方式:

  • 一:直接将请求参数名作为Controller中方法的形参

    举例:public String login (String username,String password) :

    解释:括号中的参数必须与页面Form 表单中的name 名字相同

  • 二:使用@RequestParam 绑定请求参数参数值

    举例:public String login(RequestParam ("username") String name) :

    解释:双引号中的username 必须与页面vlaue名字相同,String name 中的name可以随便写

  • 三:用注解@RequestMapping接收参数的方法

    • 如果后面参数里面的字符串前没有"/",那么会默认加上字符串
  1. @RequestMapping(value="/login/{username}/{password}")
  2. public String login(@PathVariable("username") String name@PathVariable("password") String name)

解释:上面的 @RequestMapping(value="/login/{username}/{password}") 是以注解的方式写在方法上的。注解上的usernname和 password 必须好页面上value 相同

  • 四:使用Pojo对象(就是封装的类,类中封装的字段作为参数)绑定请求参数值,原理是利用Set的页面反射机制找到User对象中的属性

    举例:
  1. @ReauestMappingvalue=/login”)
  2. public String login(User user){
  3. }

解释:就是把封装的一个类当成一个参数放在方法中,封装类中的属性就是就是参数。

  • 五:使用原生的Servlet API 作为Controller 方法的参数

    举例:
  1. public String login(HttpServletRequest request){
  2. String usernma=Request.getParameter("username");
  3. }
  1. 解释:使用request 请求页面参数的方式获取从页面传过来的参数

SpringMVC 思想介绍的更多相关文章

  1. SpringMVC Controller介绍

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  2. SpringMVC Controller介绍(转)

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  3. c++学习笔记---01---C++语言与OO思想介绍

    C++语言与OO思想介绍 C++的特点与OO思想 C语言有一个优点,即它的速度可以很快.写出来的程序可以很精练.简单.小巧,不用为了解决某个问题环绕太平洋一大圈. 但如果将C和C++相比较,C++就经 ...

  4. Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

    本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...

  5. [转]SpringMVC Controller介绍及常用注解

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  6. SpringMVC Controller 介绍

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  7. Ext学习-基础概念,核心思想介绍

    1.目标   本阶段的目标是通过学习一些基础知识来对EXTJS有个整体的了解,知道EXTJS的基础语法,核心设计思想等等 2.内容   1.基础部分学习   2.EXTJS类系统介绍   3.EXTJ ...

  8. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  9. 深入理解springMVC思想

     转载:http://elf8848.iteye.com/blog/875830 深入理解Spring MVC 思想   目录  一.前言二.spring mvc 核心类与接口三.spring mvc ...

随机推荐

  1. 通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用

    通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用 (2012-04-02 09:17:28) 转载▼   对于glLoadIdentity(), ...

  2. 【二叉树的递归】02二叉树的最大深度【Maximum Depth of Binary Tree】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,找出他的最小的深度 ...

  3. RTP 打包H264与AAC

    static int h264_parse(Track *tr, uint8_t *data, size_t len) { h264_priv *priv = tr->private_data; ...

  4. oubango中视频JitterBuffer的优化

       

  5. 转 Django根据现有数据库,自动生成models模型文件

    Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...

  6. HDOJ1166(线段树点修改)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. 人物-IT-柳传志:柳传志

    ylbtech-人物-IT-柳传志:柳传志 柳传志,英文名:Chuanzhi Liu,男,汉族,中共党员,1944年4月出生于江苏镇江,联想控股股份有限公司董事长,联想集团创始人. 企业家.投资家.全 ...

  8. Python知识点: os.popen

    用例:f = os.popen("%s %s %s" % ("pkg-config", " ".join(args), mod)) pope ...

  9. springMVC绑定json参数之二(2.2.3)

    二.springmvc 接收不同格式的json字符串 4).格式四:json传递复杂对象(对象中有属性,还有List) 复杂对象: package testVO; import java.util.L ...

  10. linux日常管理-rsync_ssh方式

    现在我们有两台机器,两台机器都需要安装rsync    yum -y install rsync       一台的主机名是wangshaojun IP是192.168.1.117 ,另一台的主机名是 ...