Spring MVC經常使用客戶端參數接收方式

Spring MVC經常使用客戶端參數接收方式

在MVC結構中,控制器組件主要的功能就是接收請求、處理請求、生成響應,接收客戶端傳來的請求參數的每每是控制器要作的第一件事。html

Book實體類Book.javajava

public class Book {
    private Integer bookId;
    private String author;
    //生成Get、Set方法,此處省略
}

1、直接用參數名匹配請求參數

客戶端界面(表單):web

<form action="/queryString" method="post">
    <input type="text" name="bookId">
    <input type="text" name="author">
    <input type="submit" value="提交">
</form>

controller層:ajax

@Controller
public class ParamPassDemo {
    @RequestMapping(value="/queryString")
    public String test1(Integer bookId, String author) {
        System.out.println("bookId="+bookId+", author="+author);
        //此處返回的地址爲(/WEB-INF/jsp/index.jsp)
        return "index";
    }
}

注意:這裏@RequestMapping中只有value屬性,value能夠省略不寫。spring

客戶端輸入:123,Roseapp

控制檯輸出:bookId=123, author=Rosejsp

2、經過@RequestParam註解來指定請求參數的name

客戶端界面(表單):post

<form action="/queryStringWithSpecName" method="post">
    <input type="text" name="bookId" value="321">
    <input type="text" name="author" value="Jack">
    <input type="submit" value="提交">
</form>
若是表單中的字段與方法中的參數名一致,能夠不須要@RequestParam,Spring會自動處理。

controller層:ui

@Controller
public class ParamPassDemo {
    @RequestMapping("/queryStringWithSpecName")
    public String test2(@RequestParam(value="bookId",required=false) Integer id, @RequestParam("author") String name) {
        System.out.println("bookId="+id+", author="+name);
        return "index";
    }
}

注意:這裏@RequestParam中有兩個屬性,value不能省略。url

@RequestParam將請求地址中的參數傳遞給目標方法,在處理方法入參處使用能夠把請求參數傳遞給請求方法。

當使用@RequestParam註解時,設置客戶端傳遞的請求參數name="bookId"和@RequestParam的value值value="bookId"相匹配後,參數名int id能夠和請求參數不匹配。

客戶端輸入:321, Jack

控制檯輸出:bookId=321, author=Jack


客戶端界面(ajax):

<button onclick="clickMe()">點我</button>
<script>
    function clickMe() {
            $.ajax({
            type : 'POST',
            url : "/queryStringWithSpecName",
            data : {
                "bookId" : 1,
                "author" : "Jack"
            },
        });
    }
</script>

controller層:(不變)

客戶端: data:{"author" : "Jack"}

控制檯輸出: bookId=null, author=Jack(若是bookId爲int類型,控制檯會拋出異常)

客戶端: data:{"bookId" : 1}

控制檯輸出: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'author' is not present

經過required設置可選參數,requiredfalse時表示能夠不帶參數,爲true時表示必須帶參數(默認值爲true)。

當可選參數不存在時,Spring默認將其賦值爲空(null),但因爲bookId已定義爲基本類型int,因此賦值會失敗。 解決方法:採用int包裝類Integer。

3、使用領域對象來接收參數

客戶端界面(表單):

<form action="/queryStringWithDomainObj" method="post">
    <input type="text" name="bookId">
    <input type="text" name="author">
    <input type="submit" value="提交">
</form>

controller層:

@Controller
public class ParamPassDemo {
    @RequestMapping("/queryStringWithDomainObj")
    public String test3(Book book) {
        System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor());
        return "index";
    }
 }

客戶端輸入:111, Bob

控制檯輸出:bookId=111, author=Bob

4、URL動態參數傳遞(路徑參數)

客戶端界面(超連接):

<a href="/book/1">testPathVariable</a>

controller層:

@Controller
public class ParamPassDemo {
    //@PathVariable能夠用來映射URL中的佔位符到目標方法的參數中
    @RequestMapping("/book/{bookId}")
    public String test4(@PathVariable("bookId") Integer bookId) {
        System.out.println("bookId:" + bookId);
        return "index";
    }
 }

控制檯輸出:bookId:1

@PathVariable 映射 URL 綁定的佔位符

經過 @PathVariable 能夠將 URL 中佔位符參數綁定到控制器處理方法的入參中:URL 中的 {xxx} 佔位符能夠經過@PathVariable(「xxx「) 綁定到操做方法的入參中。

5、使用HttpServletRequest獲取請求參數

客戶端界面(表單):

<form action="/queryBook" method="post">
    <input type="text" name="bookId">
    <input type="text" name="author">
    <input type="submit" value="提交">
</form>

controller層:

@Controller
public class ParamPassDemo {
    @RequestMapping("/queryBook")
    public String test5(HttpServletRequest request) {
        System.out.println("bookId:" + request.getParameter("bookId"));
        //此處index.jsp界面在WEB-INF下
        return "redirect:/index.jsp";
    }
 }

客戶端輸入:123

控制檯輸出:用戶id:123

6、跳轉到另外一個controller方法

客戶端界面(url地址欄):

http://localhost:8080/test6?bookId=321

controller層:

@Controller
public class ParamPassDemo {
    @RequestMapping("/test6")
    public String test6(String bookId){
        System.out.println("bookId="+bookId);
        //使用服務端跳轉的方式轉向到另外一個controller
        //return "forward:queryBook?bookId="+bookId;
        return "redirect:queryUser?bookId="+bookId;
    }
 }

控制檯輸出:bookId=321 bookId:321

相關文章
相關標籤/搜索