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

Spring MVC 響應(yīng)處理頁面、數(shù)據(jù)與狀態(tài)配置的方法

 更新時間:2025年11月07日 11:46:47   作者:?喜歡做夢  
本文給大家介紹Spring MVC 響應(yīng)處理頁面、數(shù)據(jù)與狀態(tài)配置的相關(guān)知識,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

響應(yīng)

定義

響應(yīng)(Response)是接收方(服務(wù)器、服務(wù)或設(shè)備)針對發(fā)送方(客戶端)發(fā)起的“請求”所返回的反饋信息。

返回靜態(tài)頁面

html代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>我是index頁面</h1>
</body>
</html>

代碼:

@RestController
@RequestMapping("response")
public class ResponseController {
    @RequestMapping("/1")
    public String method1(){
        return "/index.html";
    }
}

結(jié)果:咦?這結(jié)果怎么不是我們想要的頁面?為什么會這樣?那要怎么修改?

這個代碼的問題在于@RestController會將返回值直接作為響應(yīng)體。這里我們需要用到@Controller。

為什么呢?

@Controller:@Controller是承接http請求,完成視圖解析,方法返回的字符串會被視圖解析器處理,找到對應(yīng)的頁面文件,響應(yīng)給前端。

@RestController:是@ResponseBody+@Controller的組合注解,核心是直接返回數(shù)據(jù),而不是視圖,不會做視圖解析流程。

那這樣就可以了嗎

正確代碼如下:

@Controller
@RequestMapping("response")
public class ResponseController {
    @RequestMapping("/1")
    public String method1(){
        return "/index.html";
    }
}

返回數(shù)據(jù):@ResponseBody

@ResponseBody:他主要用于將方法的返回值直接寫入http響應(yīng)體中,而不是將其解析為視圖名稱去進(jìn)行視圖跳轉(zhuǎn)。簡單來說,就是把你要返回的東西直接原樣發(fā)給前端,不會當(dāng)成路徑頁面瞎找。

    @RequestMapping("/2")
    @ResponseBody
    public String method2(){
        return "返回數(shù)據(jù)";
    }

如果沒有加@ResponseBody,結(jié)果如下,有人可能會疑問,那為什么我返回靜態(tài)頁面第一個錯誤的代碼,也可以返回數(shù)據(jù)。因?yàn)榈谝粋€錯誤代碼里面使用的是@RestController注解,核心是直接返回數(shù)據(jù)。

那@ResponseBody和@RestController又有什么區(qū)別?

?? @ResponseBody和@RestController的區(qū)別

對比@RestController@ResponseBody
作用范圍只能用在類上只能用在方法上
功能本質(zhì)相當(dāng)于@ResponseBody+@Controller的組合,標(biāo)記一個類,表明該類是一個控制器單獨(dú)的注解,僅控制方法返回作為響應(yīng)
使用場景整個類都需要返回數(shù)據(jù),一次注解,全類方法生效類用@Controller時,個別方法需要返回數(shù)據(jù),逐個方法標(biāo)記
視圖解析不會走視圖解析,直接返回數(shù)據(jù)不會走視圖解析,直接返回數(shù)據(jù)

@RestController就像老師在班群里面通知消息,而@ResponseBody相當(dāng)于老師個別針對幾個同學(xué)私信通知消息。

返回HTML片段代碼

 @RequestMapping("/4")
    @ResponseBody
    public String method4(){
        return "<h1>我是一級標(biāo)題<h1>";
    }

看一下結(jié)果

不是說好的,@ResponseBody是原樣返回字符串嗎,為什么這次不是!??!

這里解釋一下:是因?yàn)闉g覽器會自動解析html,造成一種“不是原樣”返回的錯覺。

瀏覽器收到響應(yīng)后,發(fā)現(xiàn)響應(yīng)頭里的Content-type是text/html(Spring自動推斷的),就會按照html的規(guī)則進(jìn)行渲染。

如果想讓瀏覽器不解析,直接顯示原樣,應(yīng)該怎么寫?

這里需要設(shè)置Content-type

可以強(qiáng)制讓響應(yīng)方法變?yōu)榧兾谋荆o方法加produces=“text/plain”

代碼:

 @RequestMapping(value = "/5",produces = "text/plain")
    @ResponseBody
    public String method5(){
        return "<h1>我是一級標(biāo)題<h1>";
    }

結(jié)果:

返回JSON

UserInfo

public class UserInfo {
    private String name;
    private int age;
    public UserInfo(){
    }
    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

返回json對象代碼:

 @RequestMapping("/6")
    @ResponseBody
    public UserInfo method6(){
        UserInfo userInfo=new UserInfo("lisi",13);
        return userInfo;
    }

結(jié)果:

狀態(tài)碼

狀態(tài)碼的定義

狀態(tài)碼是http協(xié)議中,服務(wù)器響應(yīng)請求時返回的三位數(shù)數(shù)字,用來快速告知客服端“請求處理結(jié)果”,就是請求結(jié)果的快捷反饋

分類:

  • 1xx:服務(wù)器已收到請求,需繼續(xù)處理(如100Continue讓客戶端繼續(xù)發(fā)數(shù)據(jù))
  • 2xx:請求成功(200 OK表示請求完成,201 Created表示資源創(chuàng)建成功)
  • 3xx:需客戶端進(jìn)一步操作(301永久重定向,302臨時重定向)
  • 4xx:客戶端請求有誤(400請求語法錯誤、401需登入、403沒權(quán)限、404資源找不到)
  • 5xx:服務(wù)器處理出錯(500服務(wù)器內(nèi)部故障、503服務(wù)器忙/維護(hù)中)

設(shè)置狀態(tài)碼

代碼:

 @RequestMapping("/7")
    @ResponseBody
    public String method7(HttpServletResponse response){
        response.setStatus(401);
        return "設(shè)置狀態(tài)碼成功";
    }

結(jié)果:

設(shè)置header

代碼:

@RequestMapping("/8")
    @ResponseBody
    public String method8(HttpServletResponse response){
        response.setHeader("headerkey","headervalue");
        return "設(shè)置header成功";
    }

結(jié)果

綜合性練習(xí)

練習(xí)1:

加法計算器

前端代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
     <form action="calc/sum" method="post">
        <h1>計算器</h1>
        數(shù)字1:<input name="num1" type="text">
        數(shù)字2:<input name="num2" type="text">
        <input type="submit" value=" 點(diǎn)擊相加 ">
    </form>
</body>
</html>

前后端交互接口

服務(wù)器代碼:

@RestController
@RequestMapping("/calc")
public class CalcController {
    @RequestMapping("/sum")
    public String method8(Integer num1,Integer num2){
        //如果有其中一個沒有參數(shù),直接返回
        if(num1 == null || num2 ==null){
            return "參數(shù)不合法";
        }
        Integer sum=num1+num2;
        return "<h1>計算機(jī)結(jié)果:" + sum + "<h1>";
    }
}

練習(xí)2:

用戶登入

我們需要一個前端的輸入信息登入界面,然后向后端發(fā)送請求進(jìn)行校驗(yàn),查詢當(dāng)前賬號是否正確。隨后在有一個登入狀態(tài),展示當(dāng)前登入的用戶名。

1.前端登入頁

功能:提供輸入框頁面,以及通過點(diǎn)擊按鈕像后端發(fā)送請求,進(jìn)行前后端的交互

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登錄頁面</title>
</head>
<body>
<!--頁面-->
  <h1>用戶登錄</h1>
  用戶名:<input name="userName" type="text" id="userName">
  密碼:<input name="password" type="password" id="password">
  <input type="button" value="登錄" onclick="login()">
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.7.1.min.js"></script>
         <script>
<!--前后端進(jìn)行交互-->
            function login(){
           //獲取前端數(shù)據(jù)發(fā)送給后端,到時候后端進(jìn)行校驗(yàn)
             //1.請求方式
             //2.后端地址
             //3.前端數(shù)據(jù)
                //使用jQuery的ajax方法發(fā)送請求
                $.ajax({
                    //請求類型
                    type: "post",
                    //請求后端接口地址
                    url: "/user/login",
                    //要發(fā)送到后端的數(shù)據(jù)
                    data: {
                        //獲取輸入框的值
                        userName: $("#userName").val(),
                        password: $("#password").val()
                    },
           //返回后端校驗(yàn)后的結(jié)果
             //成功跳轉(zhuǎn)頁面
             //失敗,進(jìn)行錯誤提示
                    //http請求成功的回調(diào)函數(shù)
                    //success:是ajax專門為成功響應(yīng)設(shè)計的回調(diào),會自動接收后端返回的正常結(jié)果
                    success: function(result){
                        //判斷后端返回的結(jié)果
                        if(result){
                            //如果登入成功,跳轉(zhuǎn)頁面
                            location.href="index2.html" rel="external nofollow" ;
                        }else{
                            //否則,返回錯誤提示
                        alert("密碼錯誤");
                    }
                }
            })
        }
  </script>
</body>
</html>

2.后端控制器

功能:提供兩個接口,進(jìn)行接口的校驗(yàn),查詢當(dāng)前的登入狀態(tài)。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
       @RequestMapping("/login")
       //校驗(yàn),記錄登入狀態(tài)
    public Boolean login(String userName, String password, HttpSession session){
           //參數(shù)校驗(yàn):校驗(yàn)用戶名和密碼是否為空或者不是空字符串
           //寫法一:
//           if(userName == null || userName == "" || password == null || password == "" ){
//                 return false;
//           }
           //寫法二:
           //StringUtils.hasLength():校驗(yàn)用戶名和密碼是否為空或者不是空字符串
           if(!StringUtils.hasLength(userName)  || !StringUtils.hasLength(password)){
               return false;
           }
           //校驗(yàn)用戶名和密碼是否正確
           //這里是硬編碼,固定用戶名為admin和密碼為123456,實(shí)際數(shù)據(jù)要從數(shù)據(jù)庫中查詢驗(yàn)證
           if("admin".equals(userName) &&  "123456".equals(password)){
               //如果校驗(yàn)成功,將用戶名存儲到會話中
               session.setAttribute("userName",userName);
               return true;
           }
           return false;
       }
       //查詢當(dāng)前登入狀態(tài)
       @RequestMapping("/getLoginUser")
    public String getLoginUser(HttpSession session){
           //獲取會話中存儲的值
           //如果用戶未登入,返回null
           //如果用戶已登入,返回用戶名
           String userName=(String) session.getAttribute("userName");
           return userName;
       }
}

前端首頁

功能:查詢登入狀態(tài),展示用戶的登入名

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>用戶登錄首頁</title>
</head>
<body>
    登錄人: <span id="loginUser"></span>
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.7.1.min.js"></script>
    <script>
        $.ajax({
            url: "/user/getLoginUser",
            type: "get",
            //請求成功后的回調(diào)函數(shù)
            success: function(userName){
                //將結(jié)果填充到頁面
                $("#loginUser").text(userName);
            }
        });
    </script>
</body>
</html>

到此這篇關(guān)于Spring MVC 響應(yīng)處理頁面、數(shù)據(jù)與狀態(tài)配置的方法的文章就介紹到這了,更多相關(guān)Spring MVC 數(shù)據(jù)和頁面響應(yīng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

伊川县| 广南县| 旌德县| 吉林省| 定州市| 洪泽县| 乐平市| 东兴市| 平安县| 涟源市| 渝北区| 本溪| 喜德县| 舟曲县| 义乌市| 醴陵市| 石嘴山市| 海城市| 通渭县| 岳普湖县| 安远县| 逊克县| 若羌县| 临城县| 信丰县| 綦江县| 邵武市| 西乌珠穆沁旗| 嘉义县| 枣庄市| 呼图壁县| 茶陵县| 舒兰市| 扎赉特旗| 贺州市| 新乡县| 陇南市| 云龙县| 新昌县| 贵州省| 本溪|