1. 需求分析
需求一:图片列表查询,从后台返回数据,将数据展示在页面上;
需求二:新增图片,将新增用户的数据传递到后台,并在控制台打印。
说明:此次案例的重点是在SpringMVC中如何使用RESTful实现前后台交互,所以本案例并没有和数据库进行交互,所有数据使用假
数据来完成开发。
步骤分析:
1.搭建项目导入jar包;
2.编写Controller类,提供两个方法,一个用来做列表查询,一个用来做新增;
3.在方法上使用RESTful进行路径设置;
4.完成请求、参数的接收和结果的响应;
5.使用PostMan进行测试;
6.将前端页面拷贝到项目中;
7.页面发送ajax请求;
8.完成页面数据的展示;
2. 环境准备
创建一个Web的Maven项目
pom.xml添加Spring依赖
<?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dcxuexi</groupId> <artifactId>springmvc_05_rest_case</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>springmvc_05_rest_case Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.15.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> <uriEncoding>UTF-8</uriEncoding> </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 { }
最终创建好的项目结构如下:
3. 后台接口开发
步骤1:编写Controller类并使用RESTful进行配置
@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'}";
}
}
步骤2:使用PostMan进行测试
测试新增
{
"userName": "王菲",
"userAge": 53,
"userSex": "女",
"address": "北京市东城区,中国流行乐女歌手、影视演员"
}
测试查询
4. 页面访问处理
步骤1:拷贝静态页面
将准备好的所有内容拷贝到项目的webapp
目录下
步骤2:访问pages目录下的user.html
打开浏览器输入http://localhost/page/user.html
(1)出现错误的原因?
SpringMVC拦截了静态资源,根据/page/user.html去controller找对应的方法,找不到所以会报404的错误。
(2)SpringMVC为什么会拦截静态资源呢?
(3)解决方案?
- SpringMVC需要将静态资源进行放行。
@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/");
}
}
- 该配置类是在config目录下,SpringMVC扫描的是controller包,所以该配置类还未生效,要想生效需要将SpringMvcConfig配置类进行修改
@Configuration
@ComponentScan({"com.dcxuexi.controller","com.dcxuexi.config"}) // 方法一
//@ComponentScan("com.dcxuexi") // 方法二
@EnableWebMvc
public class SpringMvcConfig {
}
步骤3:修改user.html页面
<!DOCTYPE html>
<html>
<head>
<!-- 页面meta -->
<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>