文章目录
1. 框架部署
1.1 基于Maven创建一个web工程
SpringMVC是一个web框架,应用在web工程中
- 创建一个空的Maven项目
- 在
pom.xml
中添加语句<packaging>war</packaging>
; - 在
main
文件夹下新建一个文件夹,命名为webapp
,刷新Maven依赖,webapp
文件夹就会出现一个小圆点; - 在
webapp
目录下建立一个文件夹WEB-INF
,WEB-INF
目录下创建一个文件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_3_1.xsd"
version="3.1">
</web-app>
- 添加
Tomcat
依赖。点击FIle
→ \rightarrow →Project Structure
→ \rightarrow →Modules
→ \rightarrow →Dependencies
→ \rightarrow →+
→ \rightarrow → 选择Tomcat并添加。 - 服务器部署。点击
Run/Debug Configurations
→ \rightarrow →+
→ \rightarrow →Tomacat
→ \rightarrow →Local
→ \rightarrow → 点击右下的Fix 选择下面一个选项部署项目。
1.2 添加SpringMVC依赖
其依赖主要有 spring-context
、spring-aspects
、spring-jdbc
、spring-test
、spring-web
、spring-webmvc
,添加的依赖如下:
<properties>
<spring.version>5.2.13.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
1.3 创建配置文件
在 resource
目录下建立 SpringMVC 配置文件,名为 spring-servlet.xml
并添加命名空间,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--IoC采用注解配置-->
<context:annotation-config/>
<context:component-scan base-package="com.mr"/>
<!-- 声明MVC使用注解驱动 -->
<mvc:annotation-driven/>
</beans>
1.4 配置前端控制器
SpringMVC提供了一个名为DispatcherServlet的类(SpringMVC前端控制器),用于拦截用户请求交由SpringMVC处理。
故 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_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
2. 框架的使用
在SpringMVC中,我们把接收用户请求、处理用户请求的类称之为Controlelr(控制器)
2.1 创建控制器类
- 创建一个名为
com.mr.controllers
的包(包需要在Spring注解扫描的范围内) - 创建一个类(无需做任何的继承和实现)
- 在类上添加
@Controller
注解声明此类为SpringMVC的控制器 - 在类上添加
@RequestMapping("url")
声明此控制器类的请求url(可以省略)
@Controller
@RequestMapping("/book")
public class BookController {
}
- 在一个控制器类中可以定于多个方法处理不同的请求
- 在每个方法上添加
@RequestMapping("url")
用于声明当前方法请求的url
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/add")
public void addBook(){
System.out.println("---book add");
}
@RequestMapping("/list")
public void listBooks(){
System.out.println("---book list");
}
}
- 当访问网址
http://localhost:8080/springmvc/book/add
时,控制台会打印出相关的信息。
2.2 静态资源配置
静态资源:就是项目中的HTML、css、js、图片、字体等
在 web.xml
文件中,配置SpringMVC时 /
和 /*
是有区别的。
- /* 拦截所有的HTTP请求,包括.jsp的请求,都做为控制器类的请求路径来处理
- / 拦截所有的HTTP请求,但不包括.jsp的请求,不会放行静态资源的请求(html/css/js/图片)
若想要 SpringMVC 放行静态资源,必须进行如下配置:
<!--配置静态资源放行-->
<!--下面一句话的意思是,如果有css打头的请求,一律到location所在的位置中去寻找-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/imgs/**" location="/imgs/"/>
<mvc:resources mapping="/pages/**" location="/pages/"/>
3. 前端提交数据到控制器
3.1 表单提交
先将 web.xml
中的 /*
改为/
,在 webapp
下建立一个JSP文件,名为 book-add.jsp
,其内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>表单提交</h3>
<%--action指定提交到哪里--%>
<form action="book/add" method="get" enctype="multipart/form-data">
<p>图书名称:<input type="text" name="name"/></p>
<p>图书作者:<input type="text" name="author"/></p>
<p>图书价格:<input type="text" name="price"/></p>
<p>出版日期:<input type="text" name="date"/></p>
<p><input type="submit" value="提交"/></p>
</form>
</body>
</html>
若使用表单提交,则输入框需要提供name属性,SpringMVC控制器是通过name属性取值的。
3.2 超链接提交
<a href="book/add?bookName=Java">URL提交</a>
Ajax 提交
<input type="button" value="ajax提交" id="btn1"/>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function(){
var obj = {};
obj.bookName = "Java";
obj.bookAuthor="张三";
obj.bookPrice = 3.33;
$.ajax({
url:"book/add",
type:"post",
headers:{
},
contentType:"application/json",
data:obj,
success:function(res){
console.log(res);
}
});
});
</script>
4. 控制器接收前端提交的数据
一般使用 @RequestParam
注解用于接收请求行传递的数据
4.1 接收表单数据
前端如 3.1 节所示,控制器的代码如下:
@RequestMapping("/add")
public void addBook(@RequestParam("name") String a,
@RequestParam("author") String b,
@RequestParam("price") double c){
System.out.println("---book add");
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
注意:如果控制器方法中接收数据的参数名与表单中的 name
值一致,则 @RequestParam
注解可省略。
4.2 接收请求头数据
- 前端
<input type="button" value="ajax提交" id="btn1"/>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function(){
$.ajax({
url:"book/list",
type:"post",
headers:{
token:"wahahaawahaha"
},
success:function(res){
console.log(res);
}
});
});
</script>
- 控制器
@RequestMapping("/list")
public void listBooks(@RequestHeader("token") String token){
System.out.println("---book list");
}
4.3 接收请求体数据
- 前端
<input type="button" value="ajax提交" id="btn1"/>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function(){
var obj = {};
obj.bookName = "Python";
obj.bookAuthor="杰哥";
obj.bookPrice = 2.22;
var s = JSON.stringify(obj); //将对象转换成JSON格式
$.ajax({
url:"book/update",
type:"post",
contentType:"application/json",
data:s, //如果data的值为json格式字符串,contentType必须设置为"application/json"
success:function(res){
console.log(res);
}
});
});
</script>
- 导入
jackson
依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
- 控制器
@RequestMapping("/update")
public void update(@RequestBody Book book){
System.out.println("---book update");
System.out.println(book);
}
5. 控制器响应前端请求
处理同步请求的方法的返回类型定义为String或者ModelAndView,以实现页面的跳转。
5.1 返回值为String
- 转发
@RequestMapping("/add")
public String addBook(String name, String author, double price){
System.out.println("---book add");
return "/tips.jsp";
}
- 重定向
@RequestMapping("/add")
public String addBook(String name, String author, double price){
System.out.println("---book add");
return "redirect:/tips.jsp";
}
5.2 返回类型为 ModelAndView
- 转发
@RequestMapping("/add")
public ModelAndView addBook(String name, String author, double price){
System.out.println("---book add");
ModelAndView modelAndView = new ModelAndView("/tips.jsp");
return modelAndView;
}
- 重定向
@RequestMapping("/add")
public ModelAndView addBook(String name, String author, double price){
System.out.println("---book add");
ModelAndView modelAndView = new ModelAndView("redirect:/tips.jsp");
return modelAndView;
}