一.Spring MVC初体验
从本节开始,我要学习在Spring生态体系中我们必须掌握的Web应用框架 Spring MVC。
1.Spring MVC 介绍
MVC在之前学习J2EE的时候已经了解过了。所谓MVC,是一种著名的架构模式(注意:不是设计模式)。
MVC的缩写是 Model-View-Controller首写字母的缩写。View视图是界面的部分,用于和用户进行交互,比如通过界面显示查询结果,提供表单接收用户的输入信息等。而后面的Model模型呢通常指的是我们的数据,放在java代码中,就是业务逻辑的部分。在MVC的设计理念中,如果视图中的比如某个表格中的数据来自于后端的model中,那并不是由视图主动地来通过java调用model中的某一个方法获取某一个数据,而是要通过控制器Controller,控制器Controller相当于是一个中介。控制器是整个MVC中最重要的部分,他的用途就是接收视图中所传过入的数据,然后再根据数据调用后端的业务逻辑得到结果,最后再通过控制器将后端的结果返回到视图中。也就是指视图和模型之间没有必然的连接关系。一切都是通过控制器来进行调用和返回的。其实,之前讲的Servlet就是用于开发控制器的技术,但是Servlet中提供的这些方法,使用起来有时候并不是这么方便。正是因为servlet在开发过程中有很多不方便的地方,所以spring这个机构就开发了Spring MVC,提供了简单的方式,帮我们快速的完成了web应用地开法。也就是说,作为spring mvc这个框架来说,他的主要用途就是帮我们简化web应用程序的开发。
2.Spring MVC简介
Spring MVC是Spring体系的轻量级Web MVC框架,他的主要作用就是用于替代传统的J2EE Servlet ,来让我们开发应用程序的时侯,更加的简单。
Spring MVC的核心Controller控制器,用于处理请求,产生响应。 在MVC中,界面是不允许直接访问后端的Model业务逻辑的,而是通过Controller作为一个中间者来进行传递调用,这样做的最大好处就是让我们的界面与后端java业务逻辑有效的解耦,提高了程序的可维护新。
Spring MVC基于Spring IoC容器运行,所有对象被IoC管理。
Spring MVC 文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html
3.Spring 5.X 的版本变化
下面来说一说版本的变化,随着时代的发展,现在Spring已经是5.X的版本了。
Spring 5.X最低要求JDK8与J2EE 7 (即Servlet 3.1 / Tomcat 8.5+)
Spring 5.X 支持JDK8/9,可以使用新特性
Spring 5.X最重要的新特性是支持响应式编程 所谓响应式编程是基于事件来的,打个比方,如果你做过界面就知道,当点击一个按钮的时候,就会触发一个单机的响应事件。那么,如果放在我们后台的编程中,也有类似的理念,当触发了某一个事件的时候,自动的去执行某一段代码。这就是响应式编程。响应式编程是另外一种编程的风格,专注于构建对事件做出响应的应用程序。
4.Spring MVC环境配置
IDEA环境下创建Maven WebApp
创建一个空的Maven项目,项目名字为first-springtime,然后进行如下配置:
先添加Web模块(点加号前要先选中模块):
下面在右侧对web进行配置:
1.首先要把web目录存储的地址改为main目录下,后面修改为src\main\webapp\WEB-INF\web.xml ,然后修改web项目的版本为4.0
注意:这里的版本一定要与JDK版本和tomcat版本相对应,不然运行会报错。
版本参考下图:
2.还要设置存储页面的目录放在src\main\webapp ,然后给应用设置一个应用上下文默认 / 即可。
创建Artifact
下面配置我就不多说了。
上面只是对web项目做配置,下面才是对Spring MVC的环境配置
Spring MVC的环境配置
1.maven中导入spring-webmvc 这个依赖。
打开pom.xml,添加如下的依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.13</version> </dependency>
添加这个依赖后,会发现spring的一些底层包也会一同被加入。
2.web.xml中配置DispatcherServlet
DispatcherServlet是Spring MVC中最核心的对象,DispatcherServlet用于拦截Http请求,并根据请求的URL调用与之对应的Controller方法,来完成Http请求。
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--加载applicationContext.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <!--在web应用启动时,自动创建Spring IoC容器,并初始化DispatcherServlet--> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--"/"代表要拦截所有的请求--> <url-pattern>/</url-pattern> </servlet-mapping> <!--将请求的字符集转换为UTF-8--> <filter> <filter-name>characterFilter</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> </filter> <filter-mapping> <filter-name>characterFilter</filter-name> <!--对所有的请求进行过滤--> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
在resources目录下创建applicationContext.xml文件,下面是applicationContext.xml的初始配置:
applicationContext.xml
<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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> </beans>
3.在applicationContext.xml中,配置applicationContext的mvc标记
配置context:component-scan这个标签的作用:
在Spring IoC初始化过程中,自动创建并管理指定包及其子包中拥有@Repository 、@Service 、@Controller 、 @Component 这些注解的对象。
<!--自动扫描组件,自动扫描符合条件的bean--> <context:component-scan base-package="com.haiexijun.springmvc"></context:component-scan> <!--启用Spring MVC的注解开发模式--> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=utf-8</value> <value>application/json;charset=utf-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!--将图片/JS/CSS等静态资源排除在外,可提高执行效率--> <mvc:default-servlet-handler/>
4.开发Controller控制器
到这里,Spring MVC就基本上配置得差不多了,下面来开发一个Controller来体验一下。
在java下com.haiexijun.springmvc下面创建一个controller包,然后创建一个java类TestController。在类名上面添加**@Controller注解**。里面定义了一个test方法,这个方法返回一个SUCCESS字符串。那如何让这个方法处理请求呢?我们只需要在这个方法上添加上两个注解就可以了。@GetMapping() 注解用于将当前的方法绑定某个get类型请求的URL,比如@GetMapping("/t")则为绑定localhost/t这个URL,地址栏中输入localhost/t就能访问到这个方法了。@ResponseBody 注解作用是直接向响应输出字符串数据,不跳转页面。
package com.haiexijun.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController { @GetMapping("/t") //用于将当前的方法绑定某个get类型请求的URL,比如localhost/t @ResponseBody //作用:直接向响应输出字符串数据,不跳转页面 public String test(){ return "SUCCESS"; } }
下面还要进行一项配置,把maven的依赖导出项目时加入到lib目录下:
全选中后,右键put进去。
运行启动。输入localhost:8888/t,成功打印SUCCESS