首頁 > 軟體

SpringMVC框架的介紹與使用詳解

2022-08-15 18:07:25

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" 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>

控制器接收前端提交的資料

@RequestParam 接收請求行傳值

  • 表單提交
  • URL提交
  • $.ajax()請求的url傳值
  • . p o s t ( ) / .post()/.post()/.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;
}

到此這篇關於SpringMVC框架的介紹與使用的文章就介紹到這了,更多相關SpringMVC介紹與使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com