最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC框架的介紹與使用詳解

 更新時(shí)間:2022年08月15日 14:22:15   作者:小威要向諸佬學(xué)習(xí)呀  
SpringMVC?是一種基于?Java?的實(shí)現(xiàn)?MVC?設(shè)計(jì)模型的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)?Web?框架,跟Spring,Mybatis框架并稱為ssm,這篇文章主要介紹了SpringMVC框架的介紹與使用,需要的朋友可以參考下

SpringMVC介紹

SpringMVC 是一種基于 Java 的實(shí)現(xiàn) MVC 設(shè)計(jì)模型的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí) 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é)接收并處理請(qǐng)求,響應(yīng)客戶端。

SpringMVC特點(diǎn)

上面介紹了SpringMVC的概念,接下來(lái)介紹它的特點(diǎn):

  • SpringMVC遵守了MVC分層思想,上面提到有Model,View,Controller三層結(jié)構(gòu)。
  • 采用了松耦合、插件式結(jié)構(gòu);相比較于我們封裝的BaseServlet以及其他的一些MVC框架來(lái)說(shuō)更靈活、更具擴(kuò)展性
  • SpringMVC是基于Spring的擴(kuò)展、提供了一套完善的MVC注解,如RequestMapping,RequestBody,ResponseBody等,后面會(huì)講到。
  • SpringMVC在數(shù)據(jù)綁定、視圖解析都提供了多種處理方式,可靈活配置
  • SpringMVC對(duì)RESTful URL設(shè)計(jì)方法提供了良好的支持,支持Restful風(fēng)格。

因此,綜上而言,SpringMVC的本質(zhì)工作就是:
1.接收并解析請(qǐng)求
2.處理請(qǐng)求
3.數(shù)據(jù)渲染、響應(yīng)請(qǐng)求

SpringMVC框架部署

首先創(chuàng)建一個(gè)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>

接下來(lái)創(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ū)動(dòng)  -->
    <mvc:annotation-driven/>

</beans>

然后在web.xml中配置SpringMVC的前端控制器:
SpringMVC提供了一個(gè)名為DispatcherServlet的類(SpringMVC前端控制器),用于攔截用戶請(qǐng)求交由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)建一個(gè)控制器的類,在SpringMVC中,我們把接收用戶請(qǐng)求、處理用戶請(qǐng)求的類稱之為Controlelr(控制器)
我們創(chuàng)建一個(gè)控制器:

  • 創(chuàng)建一個(gè)名為com.mvc.controllers的包(包需要在Spring注解掃描的范圍內(nèi))
  • 創(chuàng)建一個(gè)類(無(wú)需做任何的繼承和實(shí)現(xiàn))
  • 在類上添加@Controller注解聲明此類為SpringMVC的控制器
  • 在類上添加@RequestMapping("訪問(wèn)路徑")聲明此控制器類的請(qǐng)求url(可以省略)
@Controller
@RequestMapping("/book")
public class BookController {
}

在控制器類中定義處理請(qǐng)求的方法

  • 在一個(gè)控制器類中可以定于多個(gè)方法處理不同的請(qǐng)求
  • 在每個(gè)方法上添加@RequestMapping("訪問(wèn)路徑")用于聲明當(dāng)前方法請(qǐ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");
    }
}

接下來(lái)部署靜態(tài)資源:
靜態(tài)資源是指項(xiàng)目中的HTML、css、js、圖片、字體等

/* 和 / 的區(qū)別

/* 攔截所有的HTTP請(qǐng)求,包括.jsp的請(qǐng)求,都做為控制器類的請(qǐng)求路徑來(lái)處理
/ 攔截所有的HTTP請(qǐng)求,但不包括.jsp的請(qǐng)求,不會(huì)放行靜態(tài)資源的請(qǐng)求(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控制器是通過(guò)name屬性取值的

<body>
    <h3>添加圖書</h3>
    <form action="book/add" method="post">
        <p>圖書名稱:<input type="text"/></p>
        <p>圖書作者:<input type="text"/></p>
        <p>圖書價(jià)格:<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提交:請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體都可以用來(lái)傳值

<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 接收請(qǐng)求行傳值

  • 表單提交
  • URL提交
  • $.ajax()請(qǐng)求的url傳值
  • . p o s t ( ) / .post()/.post()/.get()中的{}傳值

**@RequestParam**注解用于接收請(qǐng)求行傳遞的數(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>圖書價(jià)格:<input type="text" name="price"/></p>
    <p><input type="submit" value="提交"/></p>
</form>

控制器接收數(shù)據(jù)

/*接收請(qǐng)求行數(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ù)名與請(qǐng)求行傳值的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封裝請(qǐng)求體數(shù)據(jù)

$.ajax({
    ...,
    contentType:"application/json",
    data:obj,,
    ...
})

**@RequestBody**注解用于接收請(qǐng)求行頭傳遞的數(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); //將對(duì)象轉(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 將前端請(qǐng)求體提交的JSON格式數(shù)據(jù)轉(zhuǎn)換成Java對(duì)象,依賴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)前端請(qǐng)求

控制器響應(yīng)同步請(qǐng)求

同步請(qǐng)求:form、超鏈接

處理同步請(qǐng)求的方法的返回類型定義為String或者M(jìn)odelAndView,以實(shí)現(xiàn)頁(yè)面的跳轉(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)異步請(qǐng)求

異步請(qǐng)求:ajax請(qǐng)求

使用response中的輸出流進(jìn)行響應(yīng)

  • 控制器方法的返回類型為void
  • 控制器方法添加 HttpServletResponse response參數(shù)
  • 在方法中通過(guò)response獲取輸出流,使用流響應(yīng)ajax請(qǐng)求
@RequestMapping("/update")
public void update(@RequestBody Book book, HttpServletResponse response) throws IOException {
    System.out.println("---book update");
    System.out.println(book);

    //使用ObjectMapper將對(duì)象轉(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)的對(duì)象

  • 控制器方法的返回類型設(shè)置為響應(yīng)給ajax請(qǐng)求的對(duì)象類型
  • 在控制器方法前添加@ResponseBody注解,將返回的對(duì)象轉(zhuǎn)換成JSON響應(yīng)給ajax請(qǐng)求
  • 如果一個(gè)控制器類中的所有方法都是響應(yīng)ajax請(qǐng)求,則可以直接在控制器類前添加@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)同步請(qǐng)求的數(shù)據(jù)傳遞

對(duì)于同步請(qǐng)求的轉(zhuǎn)發(fā)響應(yīng),我們可以傳遞參數(shù)到轉(zhuǎn)發(fā)的頁(yè)面

返回類型為String:

//1.在控制器方法中定義一個(gè)Model類型的參數(shù)
//2.在return頁(yè)面之前,向model中添加鍵值對(duì),添加的鍵值對(duì)就會(huì)被傳遞到轉(zhuǎn)發(fā)的頁(yè)面
@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對(duì)象傳值外,還可以直接使用HttpServletRequest對(duì)象
@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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 根據(jù)URL下載圖片至客戶端、服務(wù)器的簡(jiǎn)單實(shí)例

    根據(jù)URL下載圖片至客戶端、服務(wù)器的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇根據(jù)URL下載圖片至客戶端、服務(wù)器的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • MyBatis注解開發(fā)-@Insert和@InsertProvider的使用

    MyBatis注解開發(fā)-@Insert和@InsertProvider的使用

    這篇文章主要介紹了MyBatis注解開發(fā)-@Insert和@InsertProvider的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-07-07
  • Java編程通過(guò)匹配合并數(shù)據(jù)實(shí)例解析(數(shù)據(jù)預(yù)處理)

    Java編程通過(guò)匹配合并數(shù)據(jù)實(shí)例解析(數(shù)據(jù)預(yù)處理)

    這篇文章主要介紹了Java編程通過(guò)匹配合并數(shù)據(jù)實(shí)例解析(數(shù)據(jù)預(yù)處理),分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • JAVA代碼塊你了解嗎

    JAVA代碼塊你了解嗎

    這篇文章主要介紹了舉例說(shuō)明Java中的代碼塊,包括靜態(tài)屬性和非靜態(tài)屬性以及構(gòu)造函數(shù)等相關(guān)的執(zhí)行先后,需要的朋友可以參考下
    2021-09-09
  • Java集合List和Map互轉(zhuǎn)的方法總結(jié)

    Java集合List和Map互轉(zhuǎn)的方法總結(jié)

    有時(shí)候我們需要將給定的List轉(zhuǎn)換為Map,或者M(jìn)ap轉(zhuǎn)換為L(zhǎng)ist,本文主要介紹了Java集合List和Map互轉(zhuǎn)的方法總結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 使用@SpringBootTest注解進(jìn)行單元測(cè)試

    使用@SpringBootTest注解進(jìn)行單元測(cè)試

    這篇文章主要介紹了使用@SpringBootTest注解進(jìn)行單元測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 一文讀懂Jvm類加載機(jī)制

    一文讀懂Jvm類加載機(jī)制

    這篇文章主要介紹了一文讀懂Jvm類加載機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • mybatis中的setting配置詳解

    mybatis中的setting配置詳解

    這篇文章主要給大家介紹了關(guān)于mybatis中setting配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • Java實(shí)現(xiàn)后臺(tái)發(fā)送及接收json數(shù)據(jù)的方法示例

    Java實(shí)現(xiàn)后臺(tái)發(fā)送及接收json數(shù)據(jù)的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)后臺(tái)發(fā)送及接收json數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了java針對(duì)json格式數(shù)據(jù)的傳輸與操作相關(guān)技巧,需要的朋友可以參考下
    2018-12-12
  • 基于JAVA每月運(yùn)勢(shì)api調(diào)用代碼實(shí)例

    基于JAVA每月運(yùn)勢(shì)api調(diào)用代碼實(shí)例

    這篇文章主要為大家詳細(xì)介紹了JAVA每月運(yùn)勢(shì)api調(diào)用代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論

顺义区| 嘉善县| 兴海县| 娱乐| 陆良县| 罗田县| 武强县| 永仁县| 安阳县| 呼图壁县| 贵州省| 芮城县| 方城县| 正镶白旗| 东源县| 台中市| 太原市| 滦南县| 株洲市| 青神县| 桓仁| 阿鲁科尔沁旗| 武乡县| 静安区| 磐安县| 常宁市| 长治县| 偏关县| 班玛县| 湖南省| 广灵县| 仪陇县| 蓬安县| 无锡市| 启东市| 桦甸市| 安阳县| 高邑县| 称多县| 抚州市| 梅河口市|