SpringMVC框架的介绍与使用
SpringMVC介绍
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,跟Spring,Mybatis框架并称为ssm。Spring MVC是由Spring官方提供的基于MVC设计理念的web框架也是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互。
为什么叫MVC呢,这是因为,M是模型(Model):模型数据,主要处理业务逻辑;视图(View):呈现模型,主要用与用户进行交互;控制器(Controller):负责接收并处理请求,响应客户端。
SpringMVC特点
上面介绍了SpringMVC的概念,接下来介绍它的特点:
- SpringMVC遵守了MVC分层思想,上面提到有Model,View,Controller三层结构。
- 采用了松耦合、插件式结构;相比较于我们封装的BaseServlet以及其他的一些MVC框架来说更灵活、更具扩展性
- SpringMVC是基于Spring的扩展、提供了一套完善的MVC注解,如RequestMapping,RequestBody,ResponseBody等,后面会讲到。
- SpringMVC在数据绑定、视图解析都提供了多种处理方式,可灵活配置
- SpringMVC对RESTful URL设计方法提供了良好的支持,支持Restful风格。
因此,综上而言,SpringMVC的本质工作就是:
1.接收并解析请求
2.处理请求
3.数据渲染、响应请求
SpringMVC框架部署
首先创建一个Web工程,在Web工程中添加以下依赖:
<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>
接下来创建的SpringMVC配置文件,在resources目录下创建名为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.mvc"/>
<!-- 声明MVC使用注解驱动 -->
<mvc:annotation-driven/>
</beans>
然后在web.xml中配置SpringMVC的前端控制器:
SpringMVC提供了一个名为DispatcherServlet的类(SpringMVC前端控制器),用于拦截用户请求交由SpringMVC处理。
<?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>
SpringMVC框架使用
首先创建一个控制器的类,在SpringMVC中,我们把接收用户请求、处理用户请求的类称之为Controlelr(控制器)
我们创建一个控制器:
-
创建一个名为
com.mvc.controllers
的包(包需要在Spring注解扫描的范围内) -
创建一个类(无需做任何的继承和实现)
-
在类上添加
@Controller
注解声明此类为SpringMVC的控制器 -
在类上添加
@RequestMapping("访问路径")
声明此控制器类的请求url(可以省略)
@Controller
@RequestMapping("/book")
public class BookController {
}
在控制器类中定义处理请求的方法
- 在一个控制器类中可以定于多个方法处理不同的请求
- 在每个方法上添加
@RequestMapping("访问路径")
用于声明当前方法请求的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");
}
}
接下来部署静态资源:
静态资源是指项目中的HTML、css、js、图片、字体等
/* 和 / 的区别
- /* 拦截所有的HTTP请求,包括.jsp的请求,都做为控制器类的请求路径来处理
- / 拦截所有的HTTP请求,但不包括.jsp的请求,不会放行静态资源的请求(html/css/js/图片)
静态资源放行配置
- 在springMVC的配置文件,添加如下静态资源放行的配置
<!--配置静态资源放行-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/imgs/**" location="/imgs/"/>
<mvc:resources mapping="/pages/**" location="/pages/"/>
前端提交数据到控制器
输入框需要提供name属性,SpringMVC控制器是通过name属性取值的
<body>
<h3>添加图书</h3>
<form action="book/add" method="post">
<p>图书名称:<input type="text"/></p>
<p>图书作者:<input type="text"/></p>
<p>图书价格:<input type="text"/></p>
<p><input type="submit" value="提交"/></p>
</form>
</body>
URL提交
<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>
控制器接收前端提交的数据
@RequestParam 接收请求行传值
- 表单提交
- URL提交
- $.ajax()请求的url传值
- .get()中的{}传值
**@RequestParam
**注解用于接收请求行传递的数据
- 前端提交数据
<form action="book/add" method="post">
<p>图书名称:<input type="text" name="name"/></p>
<p>图书作者:<input type="text" name="author"/></p>
<p>图书价格:<input type="text" name="price"/></p>
<p><input type="submit" value="提交"/></p>
</form>
控制器接收数据
/*接收请求行数据*/
@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);
}
注意
如果控制器方法中接收数据的参数名与请求行传值的key一致,则@RequestParam注解可省略
@RequestMapping("/add")
public void addBook(String name,String author, double price){
System.out.println("---book add");
System.out.println(name);
System.out.println(author);
System.out.println(price);
}
前端:
<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");
}
ajax封装请求体数据
$.ajax({
...,
contentType:"application/json",
data:obj,,
...
})
**@RequestBody
**注解用于接收请求行头传递的数据
前端:
<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>
@RquestBody 将前端请求体提交的JSON格式数据转换成Java对象,依赖jackson包
导入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);
}
控制器响应前端请求
控制器响应同步请求
同步请求:form、超链接
处理同步请求的方法的返回类型定义为String或者ModelAndView,以实现页面的跳转
-
返回类型为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"; }
-
返回类型为 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; }
控制器响应异步请求
异步请求:ajax请求
使用response中的输出流进行响应
- 控制器方法的返回类型为
void
- 控制器方法添加
HttpServletResponse response
参数 - 在方法中通过response获取输出流,使用流响应ajax请求
@RequestMapping("/update")
public void update(@RequestBody Book book, HttpServletResponse response) throws IOException {
System.out.println("---book update");
System.out.println(book);
//使用ObjectMapper将对象转换成JSON格式字符串
String s = new ObjectMapper().writeValueAsString(book);
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.println(s);
out.flush();
out.close();
}
直接在控制器方法返回响应的对象
- 控制器方法的返回类型设置为响应给ajax请求的对象类型
- 在控制器方法前添加
@ResponseBody
注解,将返回的对象转换成JSON响应给ajax请求 - 如果一个控制器类中的所有方法都是响应ajax请求,则可以直接在控制器类前添加
@ResponseBody
注解
@RequestMapping("/update")
@ResponseBody
public List<Book> update() {
System.out.println("---book update");
List<Book> books = new ArrayList<Book>();
books.add(new Book(1,"Java","老张",2.22));
books.add(new Book(2,"C++","老李",3.22));
return books;
}
控制器响应同步请求的数据传递
对于同步请求的转发响应,我们可以传递参数到转发的页面
-
返回类型为String:
//1.在控制器方法中定义一个Model类型的参数 //2.在return页面之前,向model中添加键值对,添加的键值对就会被传递到转发的页面 @RequestMapping("/add") public String addBook(String name, String author, double price,Model model){ model.addAttribute("key1","value1"); model.addAttribute("book",new Book(1,"Java","老张",2.22)); return "/tips.jsp"; } //除了使用Model对象传值外,还可以直接使用HttpServletRequest对象 @RequestMapping("/add") public String addBook(String name, String author, double price,HttpServletRequest request){ request.setAttribute("key1","value1"); request.setAttribute("book",new Book(1,"Java","老张",2.22)); return "/tips.jsp"; }
-
返回类型为ModelAndView:
@RequestMapping("/add2") public ModelAndView addBook2(String name, String author, double price){ ModelAndView modelAndView = new ModelAndView("/tips.jsp"); modelAndView.addObject("key1","value1"); modelAndView.addObject("book",new Book(1,"Java","老张",2.22)); return modelAndView; }
文章到这里就结束了,以后还会记录一些其他的知识,喜欢的大佬可以多多支持哦😉😉。
如果有什么疑问的地方请指出,诸佬们一起讨论🍻🍻
![在这里插入图片描述](https://img-
- 点赞
- 收藏
- 关注作者
评论(0)