SpringMVC中可以接收的參數--超詳細

本文詳細歸納了SpringMVC中控制器可以接收的參數,下面會逐個列出,並給出代碼示例

1. Web開發相關對象

  •      request對象
  •      response對象
  •      session對象
  •      WebRequest對象 - request對象和session對象的合體,同時提供了request和session相關的方法
  @RequestMapping("/test01.action")
    public void test01(HttpServletRequest request, HttpServletResponse response, HttpSession session, WebRequest wreq){
        //--request
        request.getParameter("username");
        request.getHeader("Host");
        //--response
        response.setContentType("text/html;charset=utf-8");
        //--session
        session.setAttribute("k1","v1");
        //--WebRequest
        wreq.getParameter("username");
        wreq.getHeader("Host");
        wreq.getSessionId();
    }

2. web流對象

 

  •  InputStream - request.getInputStream()
  •  OutputStream - response.getOutputStream()
  •  Reader - request.getReader()
  •  Writer - response.getWriter()

 注意!
     不能同時獲取InputStream和Reader
     不能同時獲取OutputStream和Writer

    @RequestMapping("/test02.action")
    public void test02(OutputStream out) throws IOException {
        out.write("abcdef".getBytes());
    }

測試結果如下

3.模型對象

  • Model
  • Map
  • ModelMap

此三類對象都是模型對象,用來封裝模型數據,唯一的不同在其api有所區別

 

@RequestMapping("/test03.action")
    public String test03(Model model, Map map, ModelMap modelMap){
        model.addAttribute("k1","v1");
        model.addAttribute("k2","v2");

        map.put("k3","v3");
        map.get("k3");

        modelMap.addAttribute("k4","v4");
        modelMap.put("k5","v5");
        modelMap.get("k5");

        return "my01test03";
    }

4.請求參數

41.傳統方式獲取

@RequestMapping("/test01.action")
    public void test01(HttpServletRequest request){
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(username);
        System.out.println(age);
    }

可以通過瀏覽器地址欄傳參獲取,測試結果如下

如:http://localhost/SpringMVCDay02_01_accpetParam_Web_exploded/my02/test01.action?username=zs&age=18

4.2直接獲取方式一

SpringMVC中可以直接獲取,但是要注意:請求參數名和方法參數名一致

測試方法同上,這裏不再給出

    @RequestMapping("/test02.action")
    public void test02(String username,int age){
        System.out.println(username);
        System.out.println(age);
    }

 4.3直接獲取方式二

上面4.2方式要求參數名和方法參數名必須一致,如果請求參數名和方法參數名不一致時可以通過@RequestParam註解指定參數即可獲取

    @RequestMapping("/test03.action")
    public void test03(@RequestParam("username") String uname,@RequestParam("age") int uage){
        System.out.println(uname);
        System.out.println(uage);
    }

4.4多個同名請求參數

4.4.1方式一:用字符串接收,則,獲取到多個值用逗號拼接的結果

    @RequestMapping("/test04.action")
    public void test04(String username,int age,String like){

        System.out.println(like);
     
    }

測試通過地址欄拼接多個同名請求參數

http://localhost/SpringMVCDay02_01_accpetParam_Web_exploded/my02/test04.action?username=zs&age=18&like=zq&like=pq&like=qq

測試結果如下

4.4.2方式二:用字符串數組接受,則,獲取到多個值組成的數組

    @RequestMapping("/test04.action")
    public void test04(String username,int age,String [] like){
        System.out.println(Arrays.asList(like));
    }

 測試結果爲

4.5封裝請求參數到bean

可以直接在控制器方法上接收一個bean,springmvc自動將請求參數封裝到bean的同名屬性中

4.5.1情況一:

User實體類如下: 

public class User {
    private String username;
    private int age;
    private String addr;

    public User() {
    }

    public User(String username, int age, String addr) {
        this.username = username;
        this.age = age;
        this.addr = addr;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", addr='" + addr + '\'' +
                '}';
    }
}

 控制器中直接獲取User對象

    @RequestMapping("/test05.action")
    public void test05(User user){
        System.out.println(user);
    }

通過地址欄傳參測試

http://localhost/SpringMVCDay02_01_accpetParam_Web_exploded/my02/test05.action?username=zs&age=19&addr=bj

測試結果如下:

 4.5.2情況二

複雜類型封裝請求參數到bean,如下User2中除了基本的數據類型,還有引用數據類型Dog

public class User2 {
    private String username;
    private int age;
    private String addr;
    private Dog dog;

    public User2() {
    }

    public User2(String username, int age, String addr, Dog dog) {
        this.username = username;
        this.age = age;
        this.addr = addr;
        this.dog = dog;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "User2{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", addr='" + addr + '\'' +
                ", dog=" + dog +
                '}';
    }
}

控制器中的代碼:

    @RequestMapping("/test06.action")
    public void test06(User2 user2){
        System.out.println(user2);
    }

通過地址欄傳參測試

http://localhost/SpringMVCDay02_01_accpetParam_Web_exploded/my02/test06.action?username=zs&age=19&addr=bj&dog.name=wc&dog.age=3

測試結果如下: 

 

5.域屬性

四大域屬性中:

  • page(pageContext)域SpringMVC中Controller沒什麼關聯,因爲它只是在jsp頁面起作用
  • ServletContext 在SpringMvc中沒有便捷方式

5.1Request域屬性 - 傳統方式

//先執行下面,設置好值,然後在通過傳統的方式獲取
    @RequestMapping("/test01.action")
    public void test01(HttpServletRequest request){
        String v1 = (String) request.getAttribute("k1");
        String v2 = (String) request.getAttribute("k2");
        System.out.println(v1);
        System.out.println(v2);
    }

///////////////////////////////////////////////
    @RequestMapping("/test00.action")
    public void test00(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
//        request.setAttribute("k1","v1");
//        request.setAttribute("k2","v2");
//        request.getRequestDispatcher("/my03/test01.action").forward(request,response);

//        request.setAttribute("k1","v1");
//        request.setAttribute("k2","v2");
//        request.getRequestDispatcher("/my03/test02.action").forward(request,response);

//        session.setAttribute("sk1","sv1");
//        session.setAttribute("sk2","sv2");
//        request.getRequestDispatcher("/my03/test03.action").forward(request,response);

        session.setAttribute("sk1","sv1");
        session.setAttribute("sk2","sv2");
        request.getRequestDispatcher("/my03/test04.action").forward(request,response);
    }

5.2通過SpringMVC方式獲取Request域屬性

    @RequestMapping("/test02.action")
    public void test02(@RequestAttribute("k1") String k1,@RequestAttribute("k2") String k2){
        System.out.println(k1);
        System.out.println(k2);
    }

 5.3Session域屬性 - 傳統方式獲取

    @RequestMapping("/test03.action")
    public void test03(HttpSession session){
        String sk1 = (String) session.getAttribute("sk1");
        String sk2 = (String) session.getAttribute("sk2");
        System.out.println(sk1);
        System.out.println(sk2);
    }

 5.4Session域屬性 - SpringMVC方式獲取

    @RequestMapping("/test04.action")
    public void test04(@SessionAttribute("sk1") String sk1,@SessionAttribute("sk2") String sk2){
        System.out.println(sk1);
        System.out.println(sk2);
    }

6.SpringMVC獲取模型中的數據

獲取的方式有兩種,獲取前可以通過@ModelAttribute將值存入到model

import org.springframework.stereotype.Component;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

@Component
@RequestMapping("/my04")
public class MyController04 {
    @ModelAttribute("mk1")
    public String mx(){
        System.out.println("mx...");
        return "abc";
    }

    /**
     * 控制器方法可以接受的參數6 - 模型數據
     *  http://localhost/SpringMVCDay02_01_accpetParam/my04/test02.action
     */
    @RequestMapping("/test02.action")
    public void test02(@ModelAttribute("mk1") String mk1){
        System.out.println(mk1);
    }

    /**
     * 控制器方法可以接受的參數6 - 模型數據
     *  http://localhost/SpringMVCDay02_01_accpetParam/my04/test01.action
     */
    @RequestMapping("/test01.action")
    public void test01(Model model){
        System.out.println(model.asMap());
    }
}

測試結果如下

7.其他可接收的請求參數

7.1Cookie值 - 傳統方式

 @RequestMapping("/test01.action")
    public void test01(HttpServletRequest request){
        Cookie[] cs = request.getCookies();
        Cookie findC = null;
        if(cs!=null){
            for(Cookie c : cs){
                if("JSESSIONID".equals(c.getName())){
                    findC = c;
                    break;
                }
            }
        }
        if(findC!=null){
            String v = findC.getValue();
            System.out.println(v);
        }
    }

 7.2Cookie值 - SpringMVC方式

    @RequestMapping("/test02.action")
    public void test02(@CookieValue("JSESSIONID") String JSESSIONID){
        System.out.println(JSESSIONID);
    }

7.3Header值 - 傳統方式

    @RequestMapping("/test03.action")
    public void test03(HttpServletRequest request){
        String value = request.getHeader("User-Agent");
        System.out.println(value);
    }

7.4Header值 - SpringMVC方式

    @RequestMapping("/test04.action")
    public void test04(@RequestHeader("User-Agent") String userAgent){
        System.out.println(userAgent);
    }

7.5路徑參數獲取

RESTFul風格的請求

 /**
     * 控制器方法可以接受的參數9 - 路徑參數獲取
     *  http://localhost/SpringMVCDay02_01_accpetParam/my05/test05/zs/19.action
     *  http://localhost/SpringMVCDay02_01_accpetParam/my05/test05/ls/23.action
     *  http://localhost/SpringMVCDay02_01_accpetParam/my05/test05/ww/31.action
     */
    @RequestMapping("/test05/{uname}/{uage}.action")
    public void test05(@PathVariable("uname") String uname,@PathVariable("uage") int uage){
        System.out.println(uname);
        System.out.println(uage);
    }

 測試結果如下:

7.6獲取請求體

    /**
     * 控制器方法可以接受的參數10 - 獲取請求體
     *  用字符串接收可以將請求體以一個字符串來接收
     *  如果請求體中是一個json數據,則可以用一個bean來接收,SpringMVC會自動將json中的數據設置到bean的對應屬性上
     *  http://localhost/SpringMVCDay02_01_accpetParam/my05test06.jsp
     */
    @RequestMapping("/test06.action")
    public void test06(@RequestBody User user){
        System.out.println(user);
    }

 前端頁面,數據通過ajax 發送

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>my05test06.jsp</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.2.6.js"></script>
    <script type="text/javascript">
        function sendData(){
            $.ajax({
                url: "${pageContext.request.contextPath}/my05/test06.action",
                type: "post",
                data: JSON.stringify({'username':'zs','age':19,'addr':'bj'}),
                contentType: "application/json",
                success: function(flag){
                    if (flag) {
                        console.log("添加成功");
                    } else {
                        console.log("添加失敗");
                    }
                }
            });
        }


    </script>
</head>
<body>
    <input type="button" onclick="sendData()" value="發送"/>
</body>
</html>

測試結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章