SpringMVC 02: SpringMVC響應get和post請求 + 5種獲取前端資料的方式

2022-09-01 06:19:59

響應get和post請求

  • SpringMVC中使用@RequestMapping註解完成對get請求和post請求的響應

  • 專案結構和組態檔與SpringMVC部落格集中的"SpringMVC 01"保持一致

  • 在webapp/admin目錄下新建2個jsp檔案,這兩個jsp檔案分別作為相應請求的響應頁面

  • mainGet.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>mainGet.jsp</title>
</head>
<body>
<h2>main......page.....get......</h2>
</body>
</html>
  • mainPost.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>mainPost.jsp</title>
</head>
<body>
<h2>main......page.....post......</h2>
</body>
</html>
  • 新增控制器:ReqAction,在@RequestMapping註解後可以跟兩個引數
  • value引數負責對應請求路徑,只有正確請求路徑下的目標action方法,才可能被呼叫
  • method引數負責指定該action方法負責響應的請求型別
  • 僅是請求路徑對應上並不可以呼叫action方法,必須請求路徑和請求方式都對上,相應的action方法才會被呼叫
package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class ReqAction {
    @RequestMapping(value = "/req", method = RequestMethod.GET)
    public String reqGet(){
        System.out.println("獲取到get請求,伺服器被存取......");
        return "mainGet";
    }

    @RequestMapping(value = "/req", method = RequestMethod.POST)
    public String reqPost(){
        System.out.println("獲取到post請求,伺服器被存取......");
        return "mainPost";
    }
}
  • webapp/index.jsp如下,以form表單的形式,分別傳送get和post請求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index.jsp</title>
</head>
<body>
<h2>分別用get和post方式存取伺服器</h2>
<form action="${pageContext.request.contextPath}/req.action" method="get/post">
    <input type="submit" value="get/post方式提交">
</form>
</body>
</html>
  • 部署並啟動tomcat測試,第一次用表單傳送get請求,第二次用表單傳送post請求

  • 表單傳送get請求時,網站首頁(left),請求到的頁面(mild),控制檯輸出(right)如下

  • 表單傳送post請求時,網站首頁(left),請求到的頁面(mild),控制檯輸出(right)如下

5種獲取前端資料的方式

  • 1.直接注入獲取
  • 2.實體類封裝獲取
  • 3.動態預留位置獲取
  • 4.@RequestParam註解方式獲取
  • 5.手工獲取資料
  • 在webapp/admin目錄下新建dataSubmit.jsp,作為5種請求方式的響應結果頁面
  • dataSubmit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>dataSubmit.jsp</title>
</head>
<body>
<h2>dataSubmit.........page</h2>
</body>
</html>
  • webapp/index.jsp如下,是網站的首頁,包含5種請求方式的前端顯示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index.jsp</title>
</head>
<body>
    
<h2>SpringMVC中獲取前端提交資料的5種方式</h2>
<hr>
    
<h2>方式1:單個資料的獲取方式</h2>
<form action="${pageContext.request.contextPath}/dataSubmit/submit01.action" method="get">
    姓名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
    
<h2>方式2:封裝成實體類進行獲取</h2>
<form action="${pageContext.request.contextPath}/dataSubmit/submit02.action" method="get">
    姓名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
    
<h2>方式3:動態預留位置獲取提交的資料(只可以用在超連結或位址列)</h2>
<!-- 攜帶的資料放在.action之前,用斜槓分隔開-->
<a href="${pageContext.request.contextPath}/dataSubmit/submit03/xun/22.action">動態預留位置獲取提交資料</a>
    
<h2>方式4:引數名稱不一致時接收資料</h2>
<form action="${pageContext.request.contextPath}/dataSubmit/submit04.action" method="get">
    姓名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
    
<h2>方式5:手工獲取前端提交的資料</h2>
<form action="${pageContext.request.contextPath}/dataSubmit/submit05.action" method="get">
    姓名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>
  • 新增SpringMVC控制器:DataSubmit,含有對前端5種請求方式的5種響應處理
package com.example.controller;

import com.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/dataSubmit")
public class DataSubmit {

    //直接注入獲取
    @RequestMapping("/submit01")
    public String dataSubmit01(String name, int age){//前端提交的資料,通過SpringMVC框架依次分別注入到目標方法的引數中,且自動完成了型別轉換
        System.out.println("姓名: " + name + " 年齡: " + age);
        return "dataSubmit";
    }

    //封裝成實體類來獲取
    @RequestMapping("/submit02")
    public String dataSubmit02(User user){//SpringMVC自動建立實體類物件,並將前端提交的資料,注入到User實體類中的對應屬性中
        System.out.println(user);
        return "dataSubmit";
    }

    //動態預留位置獲取資料
    @RequestMapping("/submit03/{name}/{age}")//目標路徑後用大括號接住前端隨著地址攜帶來的資料,括號用斜槓分割開,括號內名稱和@PathVariable後面的註解名一致,將攜帶的資料注入給目標方法中的對應變數
    public String dataSubmit03(
            @PathVariable("name")
            String name,
            @PathVariable("age")
            int age){
        System.out.println("姓名: " + name + " 年齡: " + age);
        return "dataSubmit";
    }

    //引數名稱不一致時獲取資料
    @RequestMapping("/submit04")
    public String dataSubmit04(
            @RequestParam("name")//若前端資料名和後端變數名不一致,則可以將@RequestParam註解名和前端傳來的資料名稱保持一致,這樣將前端資料傳給註解標識的變數
            String uname,
            @RequestParam("age")
            int uage){
        System.out.println("姓名: " + uname + " 年齡: " + uage);
        return "dataSubmit";
    }

    //手工獲取前端提交的資料
    @RequestMapping("/submit05")
    public String dataSubmit05(HttpServletRequest request){//就是傳統servlet開發時獲取前端資料的方式,只不過這裡HttpServletRequest範例物件由SpringMVC框架自動建立
        String name = request.getParameter("name");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println("姓名: " + name + " 年齡: " + age);
        return "dataSubmit";
    }
}
  • 部署tomcat,並啟動測試
  • 前端頁面,一次輸入資料,提交測試即可

  • 測試結果不再贅述