Spring MVC框架入门学习步骤

  • 1、了解Spring MVC基本慨念, 是什么?,能干什么?
  • 2、Spring MVC核心组件、底层实现原理
  • 3、Spring MVC实际开发, 基于XML方式、基于注解的方式

什么是MVC设计模式?

可以将一个Web应用程序分成三层:Controller层、View层 和 Model层。

  • Controller:负责接收客户端请求, 然后对请求做出相应的业务处理, 最终将处理结果返回给客户端

  • Model:负责处理具体的业务逻辑, 产生不同的模型数据。一般是指dao 和 service

  • View:视图层负责将模型数据展示给用户, 是程序与用户进行交互的窗口

  • 1、用户提交请求后, 被controller控制层接收。

  • 2、控制层根据不同的请求, 去调用model模型层相应的业务方法。

  • 3、不同的业务方法会对数据库进行增删改查的持久化操作, 并产生相应的模型数据。

  • 4、模型数据传递给view视图层, view视图层拿到数据之后进行渲染, 最终把结果响应给客户端。


什么是Spring MVC?

  • Spring MVC是Spring框架的一个后续产品, 是Spring的一个子模块, 二者可以很好的结合使用, 无需整合处理。

  • Spring MVC是目前最好的一款实现了MVC设计模式的框架。它对整个MVC设计模式进行的封装, 然后提供更加简洁方便的方法, 大大提高程序员的开发效率。


Spring MVC的核心组件(底层实现)?

  • 1、DispatcherServlet:前置控制器, 是整个流程控制的核心, 用来控制其他组件的执行, 进行一个统一的调度,降低各个组件的耦合性, 相当于总指挥。

  • 2、Handler:处理器(控制器), 用来完成具体的业务逻辑, 它就是我们Spring MVC中的编写的Controller类。

  • 3、HandlerMapping:请求映射, DispatcherServlet接收到不同的请求后, 将不同的请求分发到不同的Handler中, 那么它是如何分发实现的呢?需要借助HandlerMapping, 将请求映射到具体的Handler中, 映射成功后会返回一个HandlerExecutionChain对象给DispatcherServlet。

  • 4、HandlerInterceptor:处理器拦截器, 它是一个接口, 如果需要做一些拦截处理, 可以实现这个接口来完成这样的功能, 它会在访问Controller前后执行。它其实与AOP有点类似, 只是它拦截的是url, 而AOP拦截的是类的元数据(包、方法), 相比较而言AOP更细致一点。

  • 5、HandlerExecutionChain:处理器执行链, 它包括一个Handler处理器(控制器)对象 和 至少一个HandlerInterceptor拦截器。Handler是我们编写的Controller类, 至于为什么是至少一个HandlerInterceptor呢, Spring MVC一般会默认提供一个拦截器, 如果需要额外添加拦截器的话, 需要实现这个接口。

  • 6、HandlerAdapter:处理器适配器, Handler在执行业务方法之前,需要执行一系列的操作。包括对表单数据的验证、表单数据数据类型的转换 以及将表单数据封装到Java Bean当中。这一系列的操作都是由HandlerAdapter来完成的。DispatcherServlet通过HandlerAdapter来执行不同的Handler

  • 7、ModelAndView:是装载了模型数据和视图信息的一个类, 这里的视图指的是逻辑视图, 它作为Handler的处理结果返回给DispatcherServlet, DispatcherServlet拿到ModelAndView之后, 是需要进行解析的, 那怎么解析呢?需要借助ViewResolver视图解析器。

  • 8、ViewResolver:视图解析器, 视图解析器会将逻辑视图解析成物理视图, 并完成模型数据的填充, 最终将结果渲染响应给客户端。


Spring MVC的实现流程?

  • 1、客户端发送的请求被DispatcherServlet接收。

  • 2、DispatcherServlet接收到请求后, 根据HandlerMapping的映射将这个请求映射到具体的Handler, 映射成功后会返回一个HandlerExecutionChain对象(包括一个Handler对象 和 至少一个HandlerInterceptor)给DispatcherServlet。注意这里只是拿到Handler对象, 并没有执行Handler中的处理方法。

  • 3、DispatcherServlet拿到Handler之后, 通过HandlerAdapter来执行具体的Handler的处理方法, 并且在Handler的处理方法执行之前, 可能会做一系列的处理, 包括表单数据的验证、表单数据类型转换等. . . 。

  • 4、在Handler的处理方法执行完之后,会返回一个ModelAndView(模型数据和逻辑视图)这样一个对象给DispatcherServlet。

  • 5、DispatcherServlet拿到返回的ModelAndView后, 将其交给ViewResolver, 通过ViewResolver视图解析器进行解析, 将逻辑视图转换成web工程的一个物理视图(jsp), 然后返回一个视图对象给DispatcherServlet。

  • 6、然后在jsp视图中将Handler传递过来的模型数据进行封装, 并加以渲染, 最终响应给客户端。


在前面学习到Spring MVC的组件时, 是不是有点小恐惧, Spring MVC有这么多个组件, 那么它使用起来会不会非常复杂,开发步骤会不会很多. . .

其实, Spring MVC的大部分组件是由它自身提供的, 我们只需要通过配置进行关联即可, 实际需要我们手动编写的只有两个部分:Handler 和 View。 Handler是MVC中的C, 即Controller; View是我们的视图, 可以理解为jsp

Spring MVC基于XML的开发方式?

基于XML的开发步骤:

  • 1、Spring MVC基础配置, 在web.xml中配置

  • 2、编写Handler, 即Controller类

  • 3、编写View, 也就是jsp

  • 4、通过XML配置Handller(Controller),HandlerMapping组件的映射

  • 5、通过XML配置ViewResolver视图解析器

( 红色字体是需要我们编写的部分, 其它的部分通过配置完成 )

1、在web.xml中配置Spring MVC基础配置。

  • 配置前置控制器DispatcherServlet, < servlet>结点下由三个必须的子节点:<servlet-name><servlet-class><init-param> , < servlet-name>是servlet的名字, 一般与servlet类名有关, < servlet-class>是servlet类的全类名, < init-param>初始化参数, 用于指定spring mvc配置文件地址。

  • 配置servlet与url之间的映射< servlet-mapping>, < servlet-mapping>有两个子节点:<servlet-name><url-pattern>。该< servlet-name>的名字必须与servlet的名字一致, < url-pattern>指定对应servlet的url路径。

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app><!--配置前端控制器,接收不同的url请求分发给不同的Handler,起到一个总指挥的作用--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--配置初始化参数,指定spring mvc配置文件路径--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc1.xml</param-value></init-param></servlet><!--配置url请求映射--><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><!--拦截所有请求--><url-pattern>/</url-pattern></servlet-mapping></web-app>

2、定义Handler, 即Controller类

  • 定义一个XmlHandler 实现Controller接口,并重写handlerRequest方法, 然后在方法中处理具体的业务逻辑
package com.cd.handler.xml;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 定义一个Handler实现Controller接口,并重写handlerRequest方法*/
public class XmlHandler implements Controller {/*** 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析*/public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {//装载模型数据和逻辑视图ModelAndView modelAndView = new ModelAndView();//填充模型数据modelAndView.addObject("name","李宁");//设置逻辑视图modelAndView.setViewName("show");//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象return modelAndView;}
}

3、编写View, 也就是jsp

  • 由于我们前面设置的视图名称是show, 模型数据会返回到show视图中, 所以这里需要我们定义show.jsp。由于Spring MVC会自动将ModelAndView中的模型数据放到jsp内置对象(request作用域)当中, 然后我们就可以通过EL表达式从内置对象中回去到模型数据, 并对其进行渲染。

  • 并且, 使用EL表达式需要我们添加 <%@page isELIgnored="false" %> 语句, 表示不忽略EL表达式

<%@page pageEncoding="UTF-8" %> <%--页面使用UTF-8编码--%>
<%@page isELIgnored="false" %>  <%--不忽略EL表达式--%>
<html>
<head><meta charset="UTF-8"><title>SpringMVC实现方式</title>
</head>
<body>My name is ${name}
</body>
</html>

4、在springmvc.xml中, 通过XML配置Handller(Controller),HandlerMapping组件的映射

  • 就是将url请求通过SimpleUrlHandlerMapping映射到具体的Handler中
<!--配置HandlerMapping,将请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><!--配置映射url--><property name="mappings"><props><!--配置test请求对应的Handler,就是将test请求映射到id为xmlHandler的Handler对象中,使url请求和Handler进行关联--><prop key="/test">xmlHandler</prop></props></property>
</bean><!--配置 Handler的 Bean,即Controller-->
<bean id="xmlHandler" class="com.cd.handler.xml.XmlHandler"/>

5、在springmvc.xml中, 通过XML配置ViewResolver视图解析器

  • 配置视图解析器, 将ModelAndView中的设置的逻辑视图解析成web工程中对应的jsp视图 。ViewResolver中定义的视图前缀和视图后缀, 就是分别用来加在逻辑视图前后的 。 比如ModelAndView中设置的逻辑视图是show, 那么经过下面的ViewResolver视图解析器解析后, 就变成了/show.jsp, 即根目录底下的show.jsp视图文件
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--视图前缀--><property name="prefix" value="/"/>    <!--/表示根目录--><!--视图后缀--><property name="suffix" value=".jsp"/>
</bean>

完整的springmvc.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置HandlerMapping,将请求映射到Handler--><bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/test">xmlHandler</prop></props></property></bean><!--配置Handler,即Controller--><bean id="xmlHandler" class="com.cd.handler.xml.XmlHandler"/><!--视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--视图前缀--><property name="prefix" value="/"/><!--/表示根目录--><!--视图后缀--><property name="suffix" value=".jsp"/></bean>
</beans>

Spring MVC基于注解的开发方式?

基于注解的开发步骤:

  • 1、Spring MVC基础配置, 在web.xml中配置

  • 2、编写Handler, 即Controller类

  • 3、编写View, 也就是jsp

  • 4、在Controller中, 通过注解实现Handller(Controller)、HandlerMapping组件的映射

  • 5、通过XML配置ViewResolver视图解析器

( 红色字体是需要我们编写的部分, 其它的部分通过配置完成 )

1、在web.xml中配置Spring MVC基础配置

  • 包括前置控制器DispatcherServlet 和 将 配置将 url 请求映射到DispatcherServlet。
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app><!--配置前端控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--配置初始化参数,指定spring mvc配置文件路径--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc2.xml</param-value></init-param></servlet><!--配置url请求映射--><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><!--拦截所有请求--><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

2、定义Handler, 即Controller类

  • 基于注解方式无需实现Controller接口, 使用@Controller注解声明该类是一个Controller类即可。所以, 我们可以在类中自定义方法, 然后在方法中处理具体的业务逻辑。
package com.cd.handler.annotation;
import org.springframework.web.servlet.ModelAndView;@Controller
public class AnnotationHandler {/*** 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析*/public ModelAndView testModelAndView(){//装载模型数据和逻辑视图ModelAndView modelAndView = new ModelAndView();//填充模型数据modelAndView.addObject("name","李宁");//设置逻辑视图modelAndView.setViewName("show");//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象return modelAndView;}
}

3、编写View, 也就是jsp

  • 由于我们前面设置的视图名称是show, 模型数据会返回到show视图中, 所以这里需要我们定义show.jsp。由于Spring MVC会自动将ModelAndView中的模型数据放到jsp内置对象(request作用域)当中, 然后我们就可以通过EL表达式从内置对象中回去到模型数据, 并对其进行渲染。

  • 并且, 使用EL表达式需要我们添加 <%@page isELIgnored="false" %> 语句, 表示不忽略EL表达式

<%@page pageEncoding="UTF-8" %> <%--页面使用UTF-8编码--%>
<%@page isELIgnored="false" %>  <%--不忽略EL表达式--%>
<html>
<head><meta charset="UTF-8"><title>SpringMVC实现方式</title>
</head>
<body>My name is ${name}
</body>
</html>

4、在Controller中, 通过注解实现Handller(Controller)、HandlerMapping组件的映射

  • 通过@RequestMapping注解直接将url请求和Controller中的方法进行关联, @RequestMapping的作用是将一个具体的url请求 和 Controller中的一个具体的方法进行映射关联
package com.cd.handler.annotation;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class AnnotationHandler {/*** 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析*/@RequestMapping("/testModelAndView")public ModelAndView testModelAndView(){//装载模型数据和逻辑视图ModelAndView modelAndView = new ModelAndView();//填充模型数据modelAndView.addObject("name","李宁");//设置逻辑视图modelAndView.setViewName("show");//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象return modelAndView;}
}

5、在springmvc.xml中, 通过XML配置ViewResolver视图解析器

  • 配置自动扫描, 使@Controller注解生效

  • 配置视图解析器, 将ModelAndView中的设置的逻辑视图解析成web工程中对应的jsp视图 。ViewResolver中定义的视图前缀和视图后缀, 就是分别用来加在逻辑视图前后的 。 比如ModelAndView中设置的逻辑视图是show, 那么经过下面的ViewResolver视图解析器解析后, 就变成了/show.jsp, 即根目录底下的show.jsp视图文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd "><!--自动扫描--><context:component-scan base-package="com.cd.handler.annotation"/><!--视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--视图前缀--><property name="prefix" value="/"/><!--视图后缀--><property name="suffix" value=".jsp"/></bean>
</beans>

Spring MVC基于注解开发中Controller的业务方法开发方式?

Spring MVC基于注解开发中, 处理业务方法的方式, 除了ModelAndView之外,还有另外两种方式:Model 和 Map

取前面基于注解开发案例代码, 其它内容不变, 修改AnnotationHandler处理器控制器类代码, 在类中添加两个业务方法, 用来演示Model 和 Map开发方式

package com.cd.handler.annotation;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import java.util.Map;@Controller
public class AnnotationHandler {/*** 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析*/@RequestMapping("/testModelAndView")public ModelAndView testModelAndView(){//装载模型数据和逻辑视图ModelAndView modelAndView = new ModelAndView();//填充模型数据modelAndView.addObject("name","李宁");//设置逻辑视图modelAndView.setViewName("show");//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象return modelAndView;}/*** 2、业务方法: Model传值,String进行视图解析*/@RequestMapping("/testModel")public String testModel(Model model){//填充模型数据model.addAttribute("name","李宁");//设置逻辑视图return "show";}/*** 3、业务方法: Map传值,String进行视图解析*/@RequestMapping("/testMap")public String testMap(Map<String,String> map){//填充模型数据map.put("name","李宁");//设置逻辑视图return "show";}
}

Model方式, 其实就是将 ModelAndView 拆分成 Model 和 String , Model用来传递模型数据, String用来设置逻辑视图, 然后return返回。Map方式与Model方式大致相同, 只不过是将Model替换成Map而已, 它们的填充模型数据时调用的方法不一样。

对比Spring MVC中3种Controller的业务方法的开发方式, 发现Model 和 Map方式 明显要比ModelAndView方式要简单很多。 所以实际开发中, 建议使用这两种方式。


1、Spring MVC实现了MVC设计模式, 它对MVC设计模式进行了封装。Spring MVC 是Spring的一个后续产品, 二者可以很好的结合使用, 无需过多的整合处理。

2、Spring MVC底层有很多组件, 它们大部分都是Spring MVC提供的, 我们只需要通过配置进行关联即可, 真正需要我们手动编写的只有Handler 和 View 两个组件。

3、Spring MVC有基于XML 和 注解两种开发方式。

4、基于XML方式需要定义一个类来实现Controller接口, 表明这是一个Controller, 然后再spring mvc配置文件中配置SimpleUrlHandlerMapping 和 Handler(实现了Controller接口的类), 通过SimpleUrlHandlerMapping将url请求和Handler进行关联/映射。

5、基于注解方式, 直接再类中通过@Controller注解声明为Controller类后, 通过@RequestMapping直接将Url请求 和 Controller中具体的业务方法进行关联即可, 比基于XML方式要简单很多, 所以建议使用基于注解方式进行开发。

Spring MVC入门案例源码


30分钟轻松入门Spring MVC相关推荐

  1. 2018已经很冷,2019年Android工作或更难找—,30分钟轻松入门flutter

    大佬带你走进Android开发的世界,掌握了这些知识点,学习Android也可以很轻松. 核心分析内容 对于怎么学习Android,主要解决的是3个问题:学什么.怎么学 & 怎么用. 具体如下 ...

  2. 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world...

    2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...

  3. 全网最详细中英文ChatGPT接口文档(六)30分钟快速入门ChatGPT——使用策略和API数据使用策略

    30分钟快速入门使用ChatGPT--使用策略和API数据使用策略 Usage policies使用策略 Disallowed usage of our models 禁止使用我们的模型 API da ...

  4. 30分钟轻松搭建网站应用__LAMP安装命令

    前言 大家好,我是ChinaManor,直译过来就是中国码农的意思,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人. 30分钟轻松搭建网站应用 5.2安装LAMP环境① ...

  5. asp.net core轻松入门之MVC中Options读取配置文件

    接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...

  6. Redis:30分钟从入门到精通 - 2P

    2019独角兽企业重金招聘Python工程师标准>>> 作者好牛逼,我不懂的他全都懂. Redis: Zero to Master in 30 minutes - Part 2 Pa ...

  7. 深度学习之30分钟快速入门PyTorch(附学习资源推荐)

    目录 1.Pytorch简介 1.0 如何使用本教程 1.1 PyTorch由来 1.2 Torch简介 1.3 重新认识PyTorch 1.4 PyTorch和Tensorflow的对比 1.5 总 ...

  8. 30分钟正则表达式入门

    入门 \b代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格或标点符号或换行来分隔的,但是\b并不匹配这些单词分隔符中的任何一个,它只匹配一个位置. 如果同时使用其它的一些元字符, ...

  9. 五分钟快速入门 Spring Data JPA

    Spring Data JPA(类似于Java Web 中的 DAO) 操作声明持久层的接口(Repository) 三个核心接口: CrudRepository PagingAndSortingRe ...

最新文章

  1. 域中计算机设定重启,域中添加计算机设定的步骤
  2. 20155328 《信息安全系统设计基础》第六周 课堂提交补充
  3. 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks(附资源)
  4. 【iOS数据持久化】数据库(SQLite.swift)和FMDB
  5. 安卓四大组件之Activity
  6. 一行代码,揭开 CPU 执行原理!
  7. Javascript事件机制兼容性解决方案
  8. C#类的一些简单比较
  9. HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi
  10. RH413-测试文件的特殊权限
  11. macos系统安装homebrew包管理工具
  12. 5G 协议 标准 下载
  13. python playsound播放时关闭_python - 使用playsound模块停止音频 - 堆栈内存溢出
  14. Tips-不下载PS制作电子签名
  15. 关于“善念科技”的思考
  16. 数字经济赋能实体,Matrix Global Exchange为投资者带来优质项目
  17. hadoop到底是什么
  18. 4.1 图像的几种色彩模式 [原创Ps教程]
  19. 硅谷最干货大会之一AI Frontiers 详解全球投资热区和5大应用趋势
  20. 金属结构保温板的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. Node.js-Express框架
  2. linux常用命令--实用小技巧
  3. MacBook搭建go语言开发环境
  4. Codeforces Round #432 B
  5. java必会的英语单词
  6. ubuntu 下LAMP服务器环境搭建
  7. AFN的简单二次封装
  8. 未与信任 SQL Server 连接相关联
  9. 浅谈javascript函数劫持
  10. c#里有遍历目录及子目录以树的形式展现