当前位置:   article > 正文

Java小白修炼手册--第五阶段-- SpringMVC框架(day01)_spring框架一个非常重要的功能模块。 b.实现了mvc结构,便于简单.快速开发mvc

spring框架一个非常重要的功能模块。 b.实现了mvc结构,便于简单.快速开发mvc

目录

SpringMVC

Spring Web MVC简介

MVC模式简介

什么是Spring Web MVC

Spring Web MVC的核心组件

Spring Web MVC的核心处理流程

基于XML配置的MVC应用

搭建Spring Web MVC环境

项目演示

初始化类

Controller组件(使用控制器接收并处理请求,业务控制器 )

显示html模版页面

ViewResolver组件 (视图解析器)

DispatcherServlet (前端控制器)

ModelAndView组件

HandlerMapping组件(映射处理器)


SpringMVC

Spring Web MVC简介

MVC = Model(数据模型) + View(视图) + Controller(控制器)

SpringMVC框架主要解决了接收请求与处理响应的问题,也可以认为是解决了V-C交互的问题,与M其实没有关系。

在传统的Java EE的开发模式下,可能存在Servlet组件数量太多的问题,会导致项目的管理难度太大,且运行时,会有大量的Servlet对象长期占用内存的问题!

另外,传统的Java EE开发模式下,数据的处理过程中代码量相对较大,而SpringMVC非常大极度的简化了开发量!

MVC模式简介

  • M-Model模型

模型( Model )的职责是负责业务逻辑。包含两层:业务数据和业务处理逻辑。比如实体类、DAO、Service都 属于模型层。

  • V-View视图

视图( View )的职责是负责显示界面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的JSP

  • C-Controller控制器

控制器是模型层M和视图层V之间的桥梁,用于控制流程,比如:在Servlet项目中的单一控制器ActionServlet。
 


什么是Spring Web MVC

Spring web MVCSpring框架一个非常重要的功能模块。实现了MVC结构,便于简单、快速开发MVC结构的Web程序。Spring web MVC提供的API封装了Web开发中常用的功能简化了Web过程.
 


Spring Web MVC的核心组件

Spring Web MVC提供了M、VC相关的主要实现组件,具体如下

  • DispatcherServlet ( 控制器,请求入口) -->前端控制器,负责接收所配置的所有请求(假设配置为*.do,则它将接收所有以.do为后缀的请求),并负责分发这些请求;
  • HandlerMapping ( 控制器,请求派发) -->记录了请求路径与处理请求的Controller或其方法的对应关系,
  • Controller (控制器,请求处理流程)-->控制器,负责处理具体的请求,每个项目中可能有若干个
  • ModelAndView (模型,封装业务处理结果和视图)-->控制器处理完请求后得到的结果,该结果可以包含数据与视图名称;
  • ViewResolver (视图,视图显示处理器)-->视图解析器,可以根据视图名称来确定具体的视图组件。


Spring Web MVC的核心处理流程

  • 浏览器向Spring发出请求请求交给前端控制器DispatcherServlet处理
  • 控制器通过HandlerMapping找到相应的Controller组件处理请求
  • 执行Controller组件约定方法处理请求,在约定方法调用模型组件完成业务处理。约定方法可以返回一个ModelAndView对象, 封装了处理结果数据和视图名称信息
  • 控制器接收ModelAndView之后,调用ViewResolver组件,定位View(JSP)并传递数据信息,生成响应界面结果
     

基于XML配置的MVC应用


搭建Spring Web MVC环境
 

项目演示

创建Maven ProjectGroup Idcn.teduArtifact Idspringmvc01Packaing必须选择war

当项目创建出来后,对项目名称点右键,在项目属性的Targeted Runtimes中勾选Tomcat。

刚刚创建好的项目的pom.xml会报错,因为缺少web.xml文件,并且<failOnMissingWebXml>节点默认为true,结合指定Java版本的代码,在pom.xml中添加:

  1. <properties>
  2. <failOnMissingWebXml>false</failOnMissingWebXml>
  3. <java.version>1.8</java.version>
  4. <maven.compiler.source>1.8</maven.compiler.source>
  5. <maven.compiler.target>1.8</maven.compiler.target>
  6. </properties>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-webmvc</artifactId>
  11. <version>5.1.5.RELEASE</version>
  12. </dependency>
  13. </dependencies>

初始化类

创建cn.tedu.spring包,在这个包中创建SpringMvcConfig配置类,并在这个类上配置组件扫描:

  1. package cn.tedu.spring;
  2. import org.springframework.context.annotation.ComponentScan;
  3. /**
  4. * SpringMvc的配置类
  5. */
  6. @ComponentScan("cn.tedu.spring")
  7. public class SpringMvcConfig {
  8. }

在这个包中创建SpringMvcInitializer类,作为整个项目的初始化类,该类需要继承自AbstractAnnotationConfigDispatcherServletInitializer类,并重写该类中的抽象方法,在重写的getServletConfigClasses()方法中,返回以上SpringMvcConfig类,在重写的getServletMappings()方法中,返回的字符串数组中配置"*.do"即可:

  1. package cn.tedu.spring;
  2. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  3. /**
  4. * 项目的初始化类
  5. */
  6. public class SpringMvcInitializer extends
  7. AbstractAnnotationConfigDispatcherServletInitializer {
  8. @Override
  9. protected Class<?>[] getRootConfigClasses() {
  10. return null;
  11. }
  12. @Override
  13. protected Class<?>[] getServletConfigClasses() {
  14. // 当项目初始化时,会加载当前方法的返回值
  15. // 类似于创建了AnnotationConfigApplicationContext的对象,并且把当前方法的返回值作为构造方法参数
  16. return new Class[] { SpringMvcConfig.class };
  17. }
  18. @Override
  19. protected String[] getServletMappings() {
  20. // 所有以 .do 为后缀的请求都由SpringMVC框架处理
  21. // 之所以使用 .do 是因为它不是一个正常的扩展名
  22. // 可以与访问普通的文件区分开来
  23. // 也可以换成其它后缀,例如 .action
  24. return new String[] { "*.do" };
  25. }
  26. }

以上2个类都可以不必放在cn.tedu.spring包中,但是,应该为这2个类确定一个合理的包名。

Controller组件(使用控制器接收并处理请求,业务控制器 )

业务控制器,负责调用模型组件,处理请求。

Controller组件负责执行具体的业务处理,可调用DAO等组件,编写时需要实现Controller接口及约定方法
在组件扫描的cn.tedu.spring包中创建HelloController类,并在类的声明之前添加@Controller注解:

  1. package cn.tedu.spring;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. /**
  6. * 控制器类,SpringMVC框架中的控制器的名称是自定义的,并且,不需要继承自某个类,也不需要实现某个接口
  7. */
  8. @Controller
  9. public class HelloController {
  10. // @RequestMapping用于配置请求路径
  11. // 后续,当项目运行时,按照这个路径来访问
  12. // 就会导致接下来的方法被执行
  13. // 接下来的方法就相当于Servlet中的service()方法
  14. @RequestMapping("hello.do")
  15. // @ResponseBody表示响应正文
  16. // 会导致接下来的方法的返回值会直接响应到客户端去
  17. @ResponseBody
  18. public String hello() {
  19. // 注意:不要返回中文或中文的标点符号,默认不支持
  20. return "Hello, SpringMVC!!!";
  21. }
  22. }

显示html模版页面

先在src/main/resources下创建templates文件夹,然后,在该文件夹创建register.html页面,页面的内容可以自行设计。

然后,在控制器中,将处理请求的方法之前的@ResponseBody注解去掉,并将方法的返回值改为register(HTML文件的名称),例如:

  1. // 【显示注册页面】
  2. @RequestMapping("reg.do")
  3. public String reg() {
  4.    return "register";
  5. }

最后,在pom.xml中添加thymeleafthymeleaf-spring4/thymeleaf-spring5的依赖:

  1. <dependency>
  2. <groupId>org.thymeleaf</groupId>
  3. <artifactId>thymeleaf</artifactId>
  4. <version>3.0.11.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.thymeleaf</groupId>
  8. <artifactId>thymeleaf-spring5</artifactId>
  9. <version>3.0.11.RELEASE</version>
  10. </dependency>

ViewResolver组件 (视图解析器)

解析Controller返回的结果,定位视图jsp组件(默认是转发方式),将模型数据传递到视图jsp

所有Controller组件都返回一个ModelAndView实例,封装了视图名。Spring中的视图以名字为标识 ,视图解析器ViewResolver通过名字来解析视图。
Spring提供了多种视图解析器,具体如下
 

ViewResolver类型功能描述
InternalResourceViewResolver将视图名直接解析成对应的URL,不需要显式的映射定义。如果你的视图名和视图资源的名字是一致的,就可使用该解析器,而无需进行映射
UrlBasedViewResolverUrBasedViewResolver的子类,它支持InternalResourceView (对Servlet和JSP的包装),以及其子类IstdView和TilesView响应类型
XmViewResolver支持用xmI文件定义具体的响应视图文件
VelocityViewResolver/FreeMarkerViewResolverUrlBasedViewResolver的子类,它能支持Velocity和FreeMarker等视图技术

 

 

 

 

 

 

 

并在SpringMvcConfig中添加关于ViewResolver的配置:

  1. package cn.tedu.spring;
  2. import org.springframework.context.annotation.ComponentScan;
  3. /**
  4. * SpringMvc的配置类
  5. */
  6. @ComponentScan("cn.tedu.spring")
  7. public class SpringMvcConfig {
  8. private String characterEncoding = "utf-8";
  9. @Bean
  10. public ViewResolver viewResolver() {
  11. ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
  12. templateResolver.setCharacterEncoding(characterEncoding);
  13. templateResolver.setCacheable(false);
  14. templateResolver.setTemplateMode("HTML");
  15. templateResolver.setPrefix("/templates/"); // 前缀
  16. templateResolver.setSuffix(".html"); // 后缀
  17. SpringTemplateEngine templateEngine = new SpringTemplateEngine();
  18. templateEngine.setTemplateResolver(templateResolver);
  19. ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
  20. viewResolver.setCharacterEncoding(characterEncoding);
  21. viewResolver.setTemplateEngine(templateEngine);
  22. return viewResolver;
  23. }
  24. }

在以上配置中,需要关注的就是配置“前缀”和“后缀”的2条配置!SpringMVC框架在使用以上视图解析器时,会将“前缀”、“控制器方法返回的视图名称”、“后缀”拼接起来,得到具体用于显示的视图组件,以上代码中,拼接起来的值就是/templates/register.html,能够指向所设计的网页文件!当然,也可以采取其它的组件方式,例如“前缀”和“后缀”都配置为空字符串,而方法的返回值直接返回"/templates/register.html"也是可以的!

另外,以上代码中使用到了ClassLoaderTemplateResolver模版解析器,该模版解析器在工作时,默认会在项目的src/main/resources下查找视图组件,所以,视图文件(HTML)文件必须放在这个位置!还可以使用ServletContextTemplateResolver模版解析器,其查找视图组件的位置是在webapp下。

 


DispatcherServlet控制器

主控制器,所有的SpringMVC请求首先进入主控制器接收所有web请求,配置servlet,进行初始化,实例化Spring容器对象,然后调用HandlerMapping

DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IOC容器无缝集成,从而可以获得Spring的所有好处。 

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

4、通过ViewResolver解析逻辑视图名到具体视图实现;

5、本地化解析;

6、渲染具体的视图等;

7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

DispatcherServlet初始化的上下文加载的Bean是只对SpringMVC有效的Bean,

  1. <servlet>
  2. <servlet-name>springmvc</servlet-name>
  3. <servlet-class>
  4. org.springframework.web.servlet.DispatcherServlet
  5. </servlet- class>
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:spring-mvc.xml</param-value>
  9. </init-param>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>springmvc</servlet-name>
  14. <url-pattern>* .form</url-pattern>
  15. </servlet-mapping>

DispatcherServlet中使用的特殊的Bean:

DispatcherServlet默认使用WebApplicationContext作为上下文,该上下文中特殊的Bean有:

1、Controller:

处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理;

2、HandlerMapping:

请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain对象

(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;

如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;

3、HandlerAdapter:

HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,

从而很容易支持很多类型的处理器;

如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,

并且按处理器的handleRequest方法进行功能处理;

4、ViewResolver:

ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;

如InternalResourceViewResolver将逻辑视图名映射为jsp视图;

5、LocalResover:

本地化解析,因为Spring支持国际化,因此LocalResover解析客户端的Locale信息从而方便进行国际化;

6、ThemeResovler:

主题解析,通过它来实现一个页面多套风格,即常见的类似于软件皮肤效果;

7、MultipartResolver:

文件上传解析,用于支持文件上传;

8、HandlerExceptionResolver:

处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面(而不是给用户看到具体的错误信息);

9、RequestToViewNameTranslator:

当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名;


ModelAndView组件

Controller组件约定的handleRequest方法执行后返回个ModelAndView对象,该对象可封装模型数据和视图名响应信息。
ModelAndView构造器如下

  • ModelAndView(String viewName)
  • ModelAndView(String viewName, Map model)
  • viewName是jsp页面的名字
  • model的数据存储到request的attribute中

HandlerMapping组件(映射处理器)

  • 映射处理器,SimpleUrlhandlerMapping,使用者传递RequestMapping ,.do请求对应Controller
  • 负责维护请求URL和Controller之间的映射关系,可以根据请求找到相对应的Controller处理
  • 通过HandlerMapping组件, DispatcherServlet控制器可以将客户HTTP请求映射到Controller组件上。
  • SimpleUrlHandlerMapping
  • 维护一个HTTP请求和Controller映射关系列表(map) ,根据列表对应关系调用Controller
     

RequestMappingHanderMapping
RequestMappingHandlerAdapter

在Controller类和方法上使用@RequestMapping注解指定对应的客户HTTP请求(后续注解配置部分将详细介绍)
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/99975
推荐阅读
相关标签
  

闽ICP备14008679号