SpringMVC_入门案例[web3.0开发]
文章目录
web3.0开发是通过配置类而不通过xml配置文件
1. 创建一个Maven工程
创建的是一个web工程
2. 修改项目结构
我们可以看到项目创建好的时候项目中是没有源码目录的, 所以我们要添加源码目录:
3. 删除WEB-INFO下的配置文件
因为我们此时是web3.0开发, 是使用配置类来完成配置, 不需要使用xml配置文件了
4. 在pom.xml文件中添加依赖和插件
我们添加了:
- servlet依赖
- springmvc依赖
- tomcat插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>springmvc_01_quickstart</name>
<groupId>com.ffyc</groupId>
<artifactId>springmvc_01_quickstart</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 这里一定要注意:依赖范围一定要设置为provided
provided表示的是编译和测试时作用, 在运行环境中就会失效(运行时tomcat中已经是由Servlet.jar包了)-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
<!-- 导入一个tomcat插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.创建一个SpringMvcConfig配置类, 在该类上开启组件扫描
package com.ffyc.springmvc.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.ffyc.springmvc")
public class SpringMvcConfig {
}
6.创建一个ServletContainersInitConfig配置类
该类就是配置在Servlet容器启动的时候要做的事情
package com.ffyc.springmvc.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
/**
* 让web容器启动的时候加载springmvc容器和spring容器, 还有就是做映射, 配置哪些请求要通过springmvc处理, 也就是配置DispatcherServlet请求映射
* spring容器和springmvc容器之间是父子容器关系, spring容器是父容器
*/
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
/**
* 加载springmvc容器
* @return
*/
protected WebApplicationContext createServletApplicationContext() {
//创建springmvc容器
AnnotationConfigWebApplicationContext annotationConfigApplicationContext = new AnnotationConfigWebApplicationContext();
annotationConfigApplicationContext.register(SpringMvcConfig.class); //注册的方式加载配置类
//将springmvc容器返回
return annotationConfigApplicationContext;
}
/**
* 哪些请求需要springmvc处理
* @return
*/
protected String[] getServletMappings() {
//表示所有的请求都要到disPatcherServlet(前端控制器中), 进行一个请求分发
return new String[]{"/"};
}
/**
* 加载spring容器
* @return
*/
protected WebApplicationContext createRootApplicationContext() {
//这里我们暂时是可以不使用spring容器的, 所以我们这里直接返回一个null
return null;
}
}
可以看到我们加载了springmvc容器, 然后配置了DispatcherServlet的请求映射
7.创建一个控制器来测试:
web3.0下我们一般都是前端异步请求 + 后端直接响应Json数据, 不会直接返回页面
package com.ffyc.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//注册组件到容器中
@Controller
//使用@ResponseBody注解, 告诉Servlet直接以响应体的形式响应数据, 而不是以model and View的形式响应
@ResponseBody
public class UserController {
@RequestMapping("/save")
public String save() {
System.out.println("save..");
return "{'name'='zs'}";
}
}
注意: 如果没有加@ResponseBody注解, 那么就是响应页面, 就会有以下两种问题:
-
如果Controller返回值为void : 前端会报一个500, 因为要响应一个页面, 但是响应没有返回值
-
如果Controller返回的不是页面, 前端就会报404, 因此此时返回的并不是一个页面
加上@ResponseBody注解之后就没有了这些问题, 加上了@ResponseBody注解之后就会将返回值转换为Json格式之后写到response对象的body位置, 然后最终由Web容器(tomcat返回)
@ResponseBody注解工作原理(简述):
作用范围 : 使用在控制层(Controller层)
作用 : 将方法的返回值, 以特定的格式写入到response的body区域, 进而将数据返回给客户端
- 如果方法上面没有写@ResponseBody,底层会将方法的返回值封装为ModelAndView对象。
- 如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。
原理 : 控制层方法的返回值是如何转化为json格式的字符串的?其实是通过HttpMessageConverter中的方法实现的,它本是一个接口,在其实现类完成转换。如果是bean对象,会调用对象的getXXX()方法获取属性值并且以键值对的形式进行封装,进而转化为json串。如果是map集合,采用get(key)方式获取value值,然后进行封装。
8.添加tomcat
9.在前端进行测试
因为我们配置的tomcat端口是80, 所以我们在前端直接可以通过localhost/sava请求访问, 原本访问应该是localhost:80/save, 但是http协议之下默认访问的端口号就是80, 所以可以不用添加端口号