SpringMVC
什么是MVC
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
M:Model,模型层,指工程中的JavaBean,作用是处理数据
JavaBean分为两类:
一类称为实体类Bean,专门用于存储业务数据的,如Student,User一类称为业务处理Bean,指Service或Dao对象,专门用于处理业务逻辑和数据访问
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕后将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器
什么是SpringMVC
SpringMVC是Spring的一个后续产品,是Spring的一个子项目
SpringMVC是Spring为表述层开发提供的一整套完备的解决方案,在表述层框架历经Struct,WebWork,Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为Java EE项目表述层开发的首选方案
SpringMVC的特点
Spring家族原生产品,与IOC容器等基础设施无缝对接
基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
代码清晰简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置响应组件即可
性能卓著,尤其适合现代大型、超大型互联网项目要求
HelloWorld
创建Maven工程,引入依赖
<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
配置web.xml
注册SpringMVC的前端控制器DispatcherServlet
-
默认配置方式
此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为<servlet-name>-servlet.xml,例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml
<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
扩展配置方式
可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间
<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- contextConfigLocation Spring配置文件位置 --> <!-- contextClass IoC容器类 --> <param-name>contextConfigLocation</param-name> <param-value>classpath: WEB-INF/applicationContext.xml</param-value> </init-param> <!-- 将前端控制器DispatcherServlet的初始化时间提前到服务器启动时 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
创建请求控制器
由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理请求的类,即请求控制器
请求控制器中的每一个处理请求的方法称为控制器方法
因为SpringMVC的控制器由一个POJO(普通的Java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IOC管理,此时SpringMVC才能意识到控制器的存在
@Controller
public class HelloController {}
创建SpringMVC的配置文件
视图解析器
可以将视图解析为页面
@Bean
public InternalResourceViewResolver viewResolver()
{
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
//前缀
viewResolver.setPrefix("/WEB-INF/view");
//后缀
viewResolver.setSuffix(".jsp");
return viewResolver;
}
解析规则:
前缀 + 控制器方法返回的字符串 + 后缀
mvc注解驱动
xml版
<mvc:default-servlet-handler/>
<!-- 开启mvc注解驱动-->
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 处理响应中文内容乱码-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"/>
<property name="supportedMediaTypes">
<list>
<value>text/html</value>
<value>application/json</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
java版
@Bean
public StringHttpMessageConverter messageConverter()
{
StringHttpMessageConverter messageConverter = new StringHttpMessageConverter();
messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
messageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));
return messageConverter;
}
SpringMVC的注解
@Controller
标注一个类为控制器类,处理请求
@RequestMapping()
标注在处理请求的方法上,请求映射
当方法的参数名与请求参数的参数名相同时,将请求参数的参数值设置给该方法参数
若方法返回一个字符串,则该字符串会被视图解析器解析为一个视图(页面)
参数:
value = "请求路径"
method = RequestMethod.?
处理请求方式为的?请求
@ResponseBody
返回纯数据
@RequestMapping("/data")
@ResponseBody
public Object data()
{
Map<String,String> map = new HashMap<>();
map.put("aaa","aaa");
map.put("bbb","ccc");
map.put("ccc","bbb");
return map;
}
若想使用此注解需要配置一个信息转换器MappingJackson2HttpMessageConverter,其依赖jackson包
@Bean
public MappingJackson2HttpMessageConverter jsonMessageConverter()
{
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
messageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));
return messageConverter;
}