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中配置中央控制器
<!--中央处理器,最最最最最最最重要的部分-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--初始化就素要去读取spring的配置文件,用来初始化-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--拦截所有以av结尾的请求-->
<url-pattern>*.av</url-pattern>
</servlet-mapping>

5.2 配置全局过滤器

  • 用于过滤要进入中央控制器的请求
<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>
<!--加强参数-->
<!--强制设置请求request和响应response的数据信息为encoding-->
<!--无论客户端是否有指定编码,到了这边全是encoding的编码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
  • 注意 : web.xml中的配置信息是有顺序要求的, 详见2.3.dtd

5.3 配置DispatcherServlet的必须组件

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

  • 处理映射器(HandlerMapping)

    • BeanNameUrlHandlerMapping

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

作用的话留待补充

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

  • 开发Controller层,这一层主要功能是请求分发和适配
public class HelloAction implements Controller {

    @Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//可以同时返回视图+数据
ModelAndView mv = new ModelAndView();
mv.setViewName("/index.jsp");
return mv;
}
}

7. moudle层,让mybatis做

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

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

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

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

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

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

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

    举例:
    @ReauestMapping(value=/login”)
public String login(User user){
}

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

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

    举例:
public String login(HttpServletRequest request){
String usernma=Request.getParameter("username");
}
解释:使用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. BEC listen and translation exercise 39

    What about jigsaw puzzle design for visually handicapped?给视觉障碍人士设计拼图怎么样? Length is 50cm, and then th ...

  2. django学习笔记(二)模板

    1.当模板中的变量名遇到点时,以下面的顺序查找(短路逻辑): (1)字典类型查找: >>> from django.template import Template, Context ...

  3. P2056 采花

    题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成 ...

  4. bzoj 2632 [ neerc 2011 ] Gcd guessing game —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2632 官方题解:http://neerc.ifmo.ru/archive/2011/neer ...

  5. bzoj 4407 于神之怒加强版 —— 反演+筛积性函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推导如这里:https://www.cnblogs.com/clrs97/p/5191 ...

  6. JavaScript运行机制与setTimeout

    前段时间,老板交给了我一个任务:通过setTimeout来延后网站某些复杂资源的请求.正好借此机会,将JavaScript运行机制和setTimeout重新认真思考一遍,并将我对它们的理解整理如下. ...

  7. docker数据卷(volume)

    1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...

  8. Python:代码单元、代码点介绍

    转于:https://www.cnblogs.com/runwulingsheng/p/5106078.html 博主:你是那天边突然划过的一道闪电 代码点:指编码表(比如Unicode)中某个字符的 ...

  9. 【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图

    目录(?)[-] Debug视图 DDMS视图 查看应用运行状态 进入debug状态 HPROF Thread信息 Method信息 Stop 截图 UI层次架构信息 其它的 Tab中提供的功能 我们 ...

  10. Linker Tools Error LNK2001

    https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx https://www.cnblogs.com/runningRain/p/5674833 ...