SpringMVC框架的介紹與使用詳解
SpringMVC介紹

SpringMVC 是一種基于 Java 的實(shí)現(xiàn) MVC 設(shè)計(jì)模型的請求驅(qū)動類型的輕量級 Web 框架,跟Spring,Mybatis框架并稱為ssm。Spring MVC是由Spring官方提供的基于MVC設(shè)計(jì)理念的web框架也是基于Servlet封裝的用于實(shí)現(xiàn)MVC控制的框架,實(shí)現(xiàn)前端和服務(wù)端的交互。
為什么叫MVC呢,這是因?yàn)椋?strong>M是模型(Model):模型數(shù)據(jù),主要處理業(yè)務(wù)邏輯;視圖(View):呈現(xiàn)模型,主要用與用戶進(jìn)行交互;控制器(Controller):負(fù)責(zé)接收并處理請求,響應(yīng)客戶端。
SpringMVC特點(diǎn)
上面介紹了SpringMVC的概念,接下來介紹它的特點(diǎn):
- SpringMVC遵守了MVC分層思想,上面提到有Model,View,Controller三層結(jié)構(gòu)。
- 采用了松耦合、插件式結(jié)構(gòu);相比較于我們封裝的BaseServlet以及其他的一些MVC框架來說更靈活、更具擴(kuò)展性
- SpringMVC是基于Spring的擴(kuò)展、提供了一套完善的MVC注解,如RequestMapping,RequestBody,ResponseBody等,后面會講到。
- SpringMVC在數(shù)據(jù)綁定、視圖解析都提供了多種處理方式,可靈活配置
- SpringMVC對RESTful URL設(shè)計(jì)方法提供了良好的支持,支持Restful風(fēng)格。
因此,綜上而言,SpringMVC的本質(zhì)工作就是:
1.接收并解析請求
2.處理請求
3.數(shù)據(jù)渲染、響應(yīng)請求

SpringMVC框架部署
首先創(chuàng)建一個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>
接下來創(chuàng)建的SpringMVC配置文件,在resources目錄下創(chuàng)建名為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使用注解驅(qū)動 -->
<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框架使用
首先創(chuàng)建一個控制器的類,在SpringMVC中,我們把接收用戶請求、處理用戶請求的類稱之為Controlelr(控制器)
我們創(chuàng)建一個控制器:
- 創(chuàng)建一個名為
com.mvc.controllers的包(包需要在Spring注解掃描的范圍內(nèi)) - 創(chuàng)建一個類(無需做任何的繼承和實(shí)現(xiàn))
- 在類上添加
@Controller注解聲明此類為SpringMVC的控制器 - 在類上添加
@RequestMapping("訪問路徑")聲明此控制器類的請求url(可以省略)
@Controller
@RequestMapping("/book")
public class BookController {
}在控制器類中定義處理請求的方法
- 在一個控制器類中可以定于多個方法處理不同的請求
- 在每個方法上添加
@RequestMapping("訪問路徑")用于聲明當(dāng)前方法請求的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");
}
}
接下來部署靜態(tài)資源:
靜態(tài)資源是指項(xiàng)目中的HTML、css、js、圖片、字體等
/* 和 / 的區(qū)別
/* 攔截所有的HTTP請求,包括.jsp的請求,都做為控制器類的請求路徑來處理
/ 攔截所有的HTTP請求,但不包括.jsp的請求,不會放行靜態(tài)資源的請求(html/css/js/圖片)
靜態(tài)資源放行配置
在springMVC的配置文件,添加如下靜態(tài)資源放行的配置
<!--配置靜態(tài)資源放行--> <mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/js/**" location="/js/"/> <mvc:resources mapping="/imgs/**" location="/imgs/"/> <mvc:resources mapping="/pages/**" location="/pages/"/>
前端提交數(shù)據(jù)到控制器
輸入框需要提供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" rel="external nofollow" >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>
控制器接收前端提交的數(shù)據(jù)
@RequestParam 接收請求行傳值
- 表單提交
- URL提交
- $.ajax()請求的url傳值
- . p o s t ( ) / .post()/.post()/.get()中的{}傳值
**@RequestParam**注解用于接收請求行傳遞的數(shù)據(jù)
前端提交數(shù)據(jù)
<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>
控制器接收數(shù)據(jù)
/*接收請求行數(shù)據(jù)*/
@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);
}注意如果控制器方法中接收數(shù)據(jù)的參數(shù)名與請求行傳值的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封裝請求體數(shù)據(jù)
$.ajax({
...,
contentType:"application/json",
data:obj,,
...
})
**@RequestBody**注解用于接收請求行頭傳遞的數(shù)據(jù)
前端:
<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); //將對象轉(zhuǎn)換成JSON格式
$.ajax({
url:"book/update",
type:"post",
contentType:"application/json",
data:s, //如果data的值為json格式字符串,contentType必須設(shè)置為"application/json"
success:function(res){
console.log(res);
}
});
});
</script>
@RquestBody 將前端請求體提交的JSON格式數(shù)據(jù)轉(zhuǎn)換成Java對象,依賴jackson包
導(dǎo)入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);
}
控制器響應(yīng)前端請求
控制器響應(yīng)同步請求
同步請求:form、超鏈接
處理同步請求的方法的返回類型定義為String或者M(jìn)odelAndView,以實(shí)現(xiàn)頁面的跳轉(zhuǎn)
返回類型為String
轉(zhuǎn)發(fā)
@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
轉(zhuǎn)發(fā)
@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;
}
控制器響應(yīng)異步請求
異步請求:ajax請求
使用response中的輸出流進(jìn)行響應(yīng)
- 控制器方法的返回類型為
void - 控制器方法添加
HttpServletResponse response參數(shù) - 在方法中通過response獲取輸出流,使用流響應(yīng)ajax請求
@RequestMapping("/update")
public void update(@RequestBody Book book, HttpServletResponse response) throws IOException {
System.out.println("---book update");
System.out.println(book);
//使用ObjectMapper將對象轉(zhuǎn)換成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();
}
直接在控制器方法返回響應(yīng)的對象
- 控制器方法的返回類型設(shè)置為響應(yīng)給ajax請求的對象類型
- 在控制器方法前添加
@ResponseBody注解,將返回的對象轉(zhuǎn)換成JSON響應(yīng)給ajax請求 - 如果一個控制器類中的所有方法都是響應(yīng)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;
}
控制器響應(yīng)同步請求的數(shù)據(jù)傳遞
對于同步請求的轉(zhuǎn)發(fā)響應(yīng),我們可以傳遞參數(shù)到轉(zhuǎn)發(fā)的頁面
返回類型為String:
//1.在控制器方法中定義一個Model類型的參數(shù)
//2.在return頁面之前,向model中添加鍵值對,添加的鍵值對就會被傳遞到轉(zhuǎn)發(fā)的頁面
@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;
}
到此這篇關(guān)于SpringMVC框架的介紹與使用的文章就介紹到這了,更多相關(guān)SpringMVC介紹與使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis 如何判斷l(xiāng)ist集合是否包含指定數(shù)據(jù)
這篇文章主要介紹了mybatis 判斷l(xiāng)ist集合是否包含指定數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
springboot如何獲取接口下所有實(shí)現(xiàn)類
這篇文章主要介紹了springboot如何獲取接口下所有實(shí)現(xiàn)類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋)
這篇文章主要介紹了Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
spring boot實(shí)現(xiàn)驗(yàn)證碼功能
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了spring boot實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友可以參考下2018-04-04
在springboot中實(shí)現(xiàn)個別bean懶加載的操作
這篇文章主要介紹了在springboot中實(shí)現(xiàn)個別bean懶加載的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Java如果通過jdbc操作連接oracle數(shù)據(jù)庫
這篇文章主要介紹了Java如果通過jdbc操作連接oracle數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09

