首頁 > 軟體

SpringMVC 引數繫結之檢視傳參到控制器的實現程式碼

2023-03-07 06:02:55

⛳️ 基本型別做形式引數(零散引數的資料接收)

1、基本資料型別

要求前臺頁面的表單輸入框的name屬性值與對應控制器方法中的形式引數名稱與型別一致,控制器方法就能接收到來自前臺表單傳過來的引數,即請求引數與方法形參要完全相同,這些引數由系統在呼叫時直接賦值,程式設計師可在方法內直接使用。

專案案例: 輸入學生姓名、年齡和分數,提交成功則跳轉到提交成功的介面並展示資料。

關鍵步驟:

【1】在 Controller 層新建一個 TestController1 類,並新增一個方法,程式碼如下:

package cn.hh.test02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("testc1")
public class TestController1 {

    @RequestMapping("login")
    public ModelAndView login(String sName,int sAge, double sScore ){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("test1/show");
        mv.addObject("currentShow",sName+"年齡:"+sAge+",分數:"+sScore);
        return mv;
    }
}

【2】在 webapp 目錄下,新建一個目錄 test1,在 test1 中新建 test1.jsp 檔案,程式碼如下:

<%--
  Created by IntelliJ IDEA.
  User: hhzb100
  Date: 2023/2/28
  Time: 10:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="../testc1/login">
    姓名:<input type="text" name="sName">
    年齡:<input type="text" name="sAge">
    分數:<input type="text" name="sScore">
    <input type="submit" value="提交資料">
</form>
</body>
</html>

【3】再在上面的目錄裡新建 show.jsp 檔案,程式碼如下:

<%--
  Created by IntelliJ IDEA.
  User: hhzb100
  Date: 2023/2/26
  Time: 11:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>提交成功!${currentShow}</h1>
</body>
</html>

【4】在瀏覽器中輸入 http://localhost:8080/testspringmvc02/test1/test1.jsp,如下圖:

新增資料並提交,展示效果如下:

1.1 表單 name 屬性值與方法引數名稱不一致解決方案

當表單的 name 屬性值與方法引數的名稱不同時,會出現如下圖所示的500錯誤:

表單的 name 屬性值內容修改如下:

<form action="../testc1/login">
    姓名:<input type="text" name="stuName">
    年齡:<input type="text" name="stuAge">
    分數:<input type="text" name="stuScore">
    <input type="submit" value="提交資料">
</form>

而 TestController1 處理器中的方法引數分別為:sName、sAge、sScore;

則在接受方法的形參前面加個 @RequestParam(“表單 name 屬性值”), TestController1 類程式碼修改如下:

    //1、表單 name 屬性值與方法引數名稱不一致解決方案
    @RequestMapping("login")
    public ModelAndView login(@RequestParam("stuName") String sName, @RequestParam("stuAge")int sAge, @RequestParam("stuScore")double sScore ){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("test1/show");
        mv.addObject("currentShow",sName+"年齡:"+sAge+",分數:"+sScore);
        return mv;
    }

1.2 表單 name 屬性值為空時解決方案

當表單某個 name 屬性值為空時,執行效果如下:

解決辦法: 設定基本引數型別的預設值 @RequestParam(defaultValue = “xx”);修改 TestController1 類程式碼如下:

package cn.hh.test02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("testc1")
public class TestController1 {

    @RequestMapping("login")
    public ModelAndView login(@RequestParam(defaultValue = "張三") String sName, @RequestParam(defaultValue = "20") int sAge,
                              @RequestParam(defaultValue = "88.8") double sScore ){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("test1/show");
        mv.addObject("currentShow",sName+"年齡:"+sAge+",分數:"+sScore);
        return mv;
    }
}

修改後的執行效果如下:

2、包裝資料型別(推薦使用)

使用基本型別的包裝類,實現引數接收,避免使用基本型別接收引數時,將null值賦予基本型別變數丟擲異常的問題。之前基本資料型別會報500錯誤,包裝資料型別不會報錯。

    @RequestMapping("login")
    public ModelAndView login(String sName, Integer sAge, Double sScore ){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("test1/show");
        mv.addObject("currentShow",sName+"年齡:"+sAge+",分數:"+sScore);
        return mv;
    }

當不賦值時的執行效果如下,不會報500錯誤。

3、@RequestParam() 屬性

@RequestParam()有三個屬性:

  • value:指定請求引數的名稱。
  • required:指定該註解所修飾的引數是否是必須的,boolean 型別。若為 true,則表示請求中所攜帶的引數中必須包含當前引數。若為false,則表示有沒有均可。
  • defaultValue:指定當前引數的預設值。若請求 URI 中沒有給出當前引數,則當前方法引數將取該預設值。即使required為true,且URI中沒有給出當前引數,該處理器方法引數會自動取該預設值,而不會報錯。

⛳️ 陣列型別做形式引數

接收陣列引數的關鍵點有兩個:

  • 前臺表單有多個表單域的name屬性相同;
  • 控制器方法用這個name值命名的陣列作為引數。

專案案例: 頁面有多個興趣愛好供選擇,選擇好後,控制檯能顯示出來。

關鍵步驟:

【1】在 cn.hh.test02.controller 目錄下新增 TestController2 類,程式碼如下:

package cn.hh.test02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("testc2")
public class TestController2 {


    @RequestMapping("interest")
    public String interest(String[] myInterest){
        System.out.println("我的興趣愛好有:");
        for (String s : myInterest) {
            System.out.println("interest = " + s);
        }
        return "test1/interest";
    }
}

【2】在 src/main/webapp/test1 目錄下新建 interest.jsp,程式碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
我的興趣愛好<br/>
<form action="../testc2/interest">
    攝影:<input type="checkbox" name="myInterest" value="攝影"/><br/>
    跳舞:<input type="checkbox" name="myInterest" value="跳舞"/><br/>
    旅遊:<input type="checkbox" name="myInterest" value="旅遊"/><br/>
    閱讀:<input type="checkbox" name="myInterest" value="閱讀"/><br/>
    <input type="submit" value="確定"/>
</form>
<br/>觀測控制檯的輸出
</body>
</html>

【3】執行測試:

確定興趣愛好,觀察控制檯,控制檯列印如下:

⛳️ 實體 Bean 做形式引數

方法 Delete5(User user) 可只用一個實體類作形式引數,前提是這個實體類的各個屬性要與前臺表單穿過來的各個 name 屬性值相同。

關鍵步驟:

【1】建立實體類 User 類,程式碼如下:

package cn.kgc.springmvc02.entity;

import lombok.Data;

@Data
public class User {
    private String uName;
    private Integer uAge;
}

【2】在 cn/kgc/springmvc02/controller 目錄下,新建 ParamController 類,程式碼如下:

package cn.kgc.springmvc02.controller;

import cn.kgc.springmvc02.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("param")
public class ParamController {
    @RequestMapping("delete")
    public String Delete5(User user) {
        System.out.println("user = " + user);
        return "show";
    }
}

【3】在 src/main/webapp 目錄下建立 show.jsp,程式碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>刪除成功!</h1>
</body>
</html>

【4】頁面展示效果

【5】控制檯列印效果

⛳️ RESTful 風格程式設計

什麼是REST風格:把請求引數變為請求路徑的一種程式設計風格。 通過路徑變數的使用,可以實現REST風格的程式設計。

傳統的程式設計風格中,某項事物列表Web頁面,要想一個個編輯,需要每一項中有類似這種超連結:
/restfuls?id=1
其中每一項的id不同。而採用RESTful風格後,超連結將變成:
/ restfuls/1 或者 1/restfuls 意義一樣。

restful風格請求方式說明
/usersget查詢全部列表資料
/users/1get根據 id 查詢一條資料
/users/1delete根據 id 刪除一條資料
/userspost新增資料,引數以json格式進行傳遞
/usersput修改資料

@PathVariable 對映 URL 繫結的預留位置:

通過 @PathVariable 可以將 URL 中預留位置引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 預留位置可以通過

@PathVariable(“xxx”) 繫結到操作方法的入參中。

一般與 @RequestMapping(“xxx”) 一起使用

專案程式碼:

package cn.kgc.springmvc02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("restfuls")
public class RestfulController {

    //1、列表查詢
    @GetMapping
    public String getList(){
        System.out.println("列表資料展示");
        return "show";
    }

    //2、查詢一個
    @GetMapping("{id}")
    public String getDataById(@PathVariable Integer id){
        System.out.println("查詢id = " + id);
        return "show";
    }

    //3、根據 id 刪除一條資料
    @DeleteMapping("{id}")
    public String deleteById(@PathVariable Integer id){
        System.out.println("刪除id = " + id);
        return "show";
    }

    //4、新增資料
    @PostMapping
    public String addData(){

        return "show";
    }

    //5、修改資料
    @PutMapping("{id}")
    public String updateData(@PathVariable Integer id){
        System.out.println("修改id = " + id);
        return "show";
    }
}

執行測試:

【1】列表查詢(請求地址:/restfuls;請求方式:GET)

控制檯列印:

【2】查詢一個(請求地址:/restfuls/1;請求方式:GET)

控制檯列印:

【3】根據 id 刪除一條資料(請求地址:/restfuls/1;請求方式:DELETE)

控制檯列印:

【4】新增資料(請求地址:/restfuls;請求方式:POST)

控制檯列印:

【5】修改資料(請求地址:/restfuls/1;請求方式:PUT)

控制檯列印:

⛳️ 常見報錯

1、中文亂碼問題

對於上面案例所請求的引數,若含有中文,可能會出現中文亂碼問題,SpringMVC 對於請求引數中的中文亂碼問題,提供了專門的字元集過濾器,只需要在web.xml組態檔中註冊字串過濾器即可解決中文亂碼問題。上面專案若要解決亂碼問題,只需在 web.xml 中新增如下設定即即可:

<!--註冊字元集過濾器-->
<filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
<!--指定字元集-->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
<!--強制使用指定字元集-->
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2、使用 ModelAndView,頁面卻獲取不到值

有時候我們使用 ModelAndView 新增模型資料的時候,頁面用${ } 獲取不到相應的值,也面效果如下:

造成這個問題的原因是專案中的 web.xml 檔案內容有問題,先看看未修改前的頭部內容:

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

修改後的web.xml內容:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>Archetype Created Web Application</display-name>

修改之後,便可以解決這個問題!

到此這篇關於SpringMVC 引數繫結(檢視傳參到控制器)的文章就介紹到這了,更多相關SpringMVC 引數繫結內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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