需求一:图片列表查询,从后台返回数据,将数据展示在页面上;

需求二:新增图片,将新增用户的数据传递到后台,并在控制台打印。

说明:此次案例的重点是在SpringMVC中如何使用RESTful实现前后台交互,所以本案例并没有和数据库进行交互,所有数据使用假数据来完成开发。
步骤分析:
1.搭建项目导入jar包;
2.编写Controller类,提供两个方法,一个用来做列表查询,一个用来做新增;
3.在方法上使用RESTful进行路径设置;
4.完成请求、参数的接收和结果的响应;
5.使用PostMan进行测试;
6.将前端页面拷贝到项目中;
7.页面发送ajax请求;
8.完成页面数据的展示;
创建一个Web的Maven项目
pom.xml添加Spring依赖
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.dcxuexigroupId>
<artifactId>springmvc_05_rest_caseartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<name>springmvc_05_rest_case Maven Webappname>
<url>http://www.example.comurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.7maven.compiler.source>
<maven.compiler.target>1.7maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.2.15.RELEASEversion>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.8version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>80port>
<path>/path>
<uriEncoding>UTF-8uriEncoding>
configuration>
plugin>
plugins>
build>
project>
创建对应的配置类
@Configuration
@ComponentScan("com.dcxuexi.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
public class ServlertConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
return new Filter[]{new CharacterEncodingFilter("UTF-8")};
}
}
编写模型类User
public class User {
private String userName;
private Integer userAge;
private String userSex;
private String address;
public User() {
}
public User(String userName, Integer userAge, String userSex, String address) {
this.userName = userName;
this.userAge = userAge;
this.userSex = userSex;
this.address = address;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userAge=" + userAge +
", userSex='" + userSex + '\'' +
", address='" + address + '\'' +
'}';
}
}
编写UserController
@Controller
public class UserController {
}
最终创建好的项目结构如下:

@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping
public List<User> findAll(){
List<User> userList = new ArrayList<>();
User user1 = new User("刘德华", 61, "男", "香港,中国香港影视男演员、歌手、制片人、作词人");
User user2 = new User("黎明", 56, "男", "香港,中国香港男歌手、演员、导演");
User user3 = new User("郭富城", 57, "男", "香港,华语影视男演员、歌手、舞者");
User user4 = new User("张学友", 61, "男", "香港,中国香港流行乐男歌手、演员、作曲人");
User user5 = new User("成龙", 69, "男", "香港,中国影视男演员、导演、制作人、编剧、歌手");
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
return userList;
}
@PostMapping
public String save(User user){
System.out.println("user save ==> "+ user);
return "{'module':'user save success'}";
}
}
测试新增
{
"userName": "王菲",
"userAge": 53,
"userSex": "女",
"address": "北京市东城区,中国流行乐女歌手、影视演员"
}

测试查询

将准备好的所有内容拷贝到项目的webapp目录下

打开浏览器输入http://localhost/page/user.html

(1)出现错误的原因?

SpringMVC拦截了静态资源,根据/page/user.html去controller找对应的方法,找不到所以会报404的错误。
(2)SpringMVC为什么会拦截静态资源呢?

(3)解决方案?
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//当访问/pages/????时候,从/pages目录下查找内容
registry.addResourceHandler("/page/**").addResourceLocations("/page/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
@Configuration
@ComponentScan({"com.dcxuexi.controller","com.dcxuexi.config"}) // 方法一
//@ComponentScan("com.dcxuexi") // 方法二
@EnableWebMvc
public class SpringMvcConfig {
}
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SpringMVC案例title>
<link rel="stylesheet" href="../plugins/elementui/index.css">
<link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../css/style.css">
head>
<body class="hold-transition">
<div id="app">
<div class="content-header">
<h1>用户管理h1>
div>
<div class="app-container">
<div class="box">
<div class="filter-container">
<el-input placeholder="用户名称" style="width: 200px;" class="filter-item">el-input>
<el-button class="dalfBut">查询el-button>
<el-button type="primary" class="butT" @click="openSave()">新建el-button>
div>
<el-table size="small" current-row-key="id" :data="dataList" stripe highlight-current-row>
<el-table-column type="index" align="center" label="序号">el-table-column>
<el-table-column prop="userName" label="用户名称" align="center">el-table-column>
<el-table-column prop="userAge" label="用户年龄" align="center">el-table-column>
<el-table-column prop="userSex" label="用户性别" align="center">el-table-column>
<el-table-column prop="address" label="描述" align="center">el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="primary" size="mini">编辑el-button>
<el-button size="mini" type="danger">删除el-button>
template>
el-table-column>
el-table>
<div class="pagination-container">
<el-pagination
class="pagiantion"
@current-change="handleCurrentChange"
:current-page="pagination.currentPage"
:page-size="pagination.pageSize"
layout="total, prev, pager, next, jumper"
:total="pagination.total">
el-pagination>
div>
<div class="add-form">
<el-dialog title="新增用户" :visible.sync="dialogFormVisible">
<el-form ref="dataAddForm" :model="formData" :rules="rules" label-position="right" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="用户名称" prop="userName">
<el-input v-model="formData.userName" />
el-form-item>
el-col>
<el-col :span="12">
<el-form-item label="用户年龄" prop="userAge">
<el-input v-model="formData.userAge" />
el-form-item>
el-col>
<el-col :span="12">
<el-form-item label="用户性别" prop="userSex">
<el-input v-model="formData.userSex" />
el-form-item>
el-col>
el-row>
<el-row>
<el-col :span="24">
<el-form-item label="描述">
<el-input v-model="formData.address" type="textarea">el-input>
el-form-item>
el-col>
el-row>
el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取消el-button>
<el-button type="primary" @click="saveBook()">确定el-button>
div>
el-dialog>
div>
div>
div>
div>
body>
<script src="../js/vue.js">script>
<script src="../plugins/elementui/index.js">script>
<script type="text/javascript" src="../js/jquery.min.js">script>
<script src="../js/axios-0.18.0.js">script>
<script>
var vue = new Vue({
el: '#app',
data:{
dataList: [],//当前页要展示的分页列表数据
formData: {},//表单数据
dialogFormVisible: false,//增加表单是否可见
dialogFormVisible4Edit:false,//编辑表单是否可见
pagination: {},//分页模型数据,暂时弃用
},
//钩子函数,VUE对象初始化完成后自动执行
created() {
this.getAll();
},
methods: {
// 重置表单
resetForm() {
//清空输入框
this.formData = {};
},
// 弹出添加窗口
openSave() {
this.dialogFormVisible = true;
this.resetForm();
},
//添加
saveBook () {
axios.post("/user",this.formData).then((res)=>{
});
},
//主页列表查询
getAll() {
axios.get("/user/").then((res)=>{
this.dataList = res.data;
console(this.dataList);
});
},
}
})
script>
html>