springmvc 發送PUT 和 DELETE 請求

一: 發送 DELETE 或者 PUT 請求:html

一、在表單中加入一個隱藏的參數: _method  , 值是 DELETE (或者PUT)java

    <form action="springmvc/testRest/a1we2!3#d" method="post">
        <input type="hidden"  name="_method" value="DELETE"></input>
        <input type="submit" value="test Rest delete"></input>
    </form>

二、 發送的POST 請求, 配置一個 HiddenHttpMethodFilter 過濾器:web

    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

該過濾器會把 獲取 String paramValue = request.getParameter("_method");      spring

paramValue  值是 DELETE , 而後把該POST 的 HTTP請求的 改爲 DELETE 請求。數據庫

 

三、在Controller 中匹配,獲取上面的 DETELE 請求api

        @RequestMapping(value="/testRest/{ss}", method=RequestMethod.DELETE)
        public String testRestDelete(@PathVariable("ss") String sid) {
            System.out.println("test DELETE: " + sid);
            return SUCCESS;
        }

輸出: test DELETE: a1we2!3cookie

點了 test Rest delete 這個按鈕後,請求的url 是  http://localhost:8080/springmvc-1/springmvc/testRest/a1we2!3#d  , 在springmvc 中經過 PathVariable 註解獲取 REST風格的URL 中的參數,獲取的時候  ss 值是 a1we2!3 , 保存到 sid 中。 (把 # 後面的內容去掉了)session

 

二:在 前臺頁面中寫的連接:mvc

<a href="springmvc/tsetParameters?username=zhou&age=11">tsetParameters</a></br>

  

RequestMapping 註解中可使用 params 匹配請求中的參數, 用headers 匹配http請求中頭域 

controller 方法中:
        @RequestMapping(value="tsetParameters", params={"username", "age!=10"},headers={"Accept-Language=zh-CN,zh;q=0.9" , "User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"})
        public String testParameters() {
            System.out.println("testParameters");
            return SUCCESS;
        }

當 前臺發送的請求 是:  http://localhost:8080/springmvc-1/springmvc/tsetParameters?username=zhou&age=11 而且http 請求中帶有:app

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

Accept-Language: zh-CN,zh;q=0.9

這兩個頭域的時候, 纔會執行  testParameters 方法。

即執行 testParameters 方法須要同時知足如下的條件:

一、請求url  tsetParameters  中必須含有 username 參數,必須含有 age 參數 而且 值不能是 10.

二、請求header 中 必須有 Accept-Language 和 User-Agent 。 而且值是 RequestMapping 中寫的。

不然就會報404 錯誤。

 

四: @RequestMapping 能夠映射參數:

value 值即請求參數的參數名

required 該參數是不是必須,默認是true 。

defaultValue 請求參數的默認值

好比請求url: http://localhost:8080/springmvc-1/springmvc/testRequestParam?username=zhou

controller 方法:

        @RequestMapping(value="/testRequestParam")
        public String testRequestParam(@RequestParam(value="username") String name, @RequestParam(value="age",required=false, defaultValue="0") int age){
            System.out.println("name:" + name + "======" + "age:" + age);
            return SUCCESS;
        }

輸出: name:zhou======age:0

 

RequestHeader 註解能夠獲取 http 請求的頭域:
		@RequestMapping("/testHeader")
		public String testRequestHeader(@RequestHeader("User-Agent") String ua) {
			System.out.println(ua);
			return SUCCESS;
		}

  

CookieValue 能夠獲取cookie 值
		@RequestMapping("/testCookie")
		public String testCookieVal(@CookieValue("JSESSIONID") String cook) {
			System.out.println(cook);
			return SUCCESS;
		}

  

Servlet 原生API 做爲目標方法的參數支持如下類型:

HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、Local InputStream、 OutputStream、 Reader、Writer 。

		@RequestMapping("/testServletAPI")
		public void testServletAPI(HttpServletRequest  req, HttpServletResponse rep,Writer writer) throws IOException {
			System.out.println("HttpServletRequest:" + req + "--------" + rep);
			writer.write("this is servlet api");
		}

  前臺頁面上顯示: this is servlet api

 

五:

springmvc 能夠返回目標方法中的map對象:

Controller 方法:

		@RequestMapping("/testMap")
		public String testMap(Map<String, Object> map) {
			map.put("names", Arrays.asList("tim","jack","mike"));
			return SUCCESS;
		}

  在返回的頁面 success.jsp 中 能夠接收 names 對象:

<body>

  ${requestScope.names}
  ${names}

</body>

頁面顯示:

[tim, jack, mike] [tim, jack, mike]

 

Controller 層也能夠返回 ModelAndView 對象:

        @RequestMapping("/testModelView")
        public ModelAndView testModel() {
            String viewName = SUCCESS;
            ModelAndView modelview = new ModelAndView(viewName);
            modelview.addObject("time",new Date());
            return modelview;
        }

success.jsp 經過  ${names}  或者 ${requestScope.names}  接收,在頁面上顯示時間。

 

六:

@sessionAttributes 能夠經過屬性名指定放到會話中的屬性(value屬性值), 也能夠經過模型屬性的對象類型指定哪些模型屬性須要放到會話中(types屬性值)。

Controller 方法:

        @RequestMapping("/testSessionAttr")
        public String testSessionAttr(Map<String, Object> map) {
            User user = new User("tom","123","tomc@guigu.com", 20);
            map.put("userone", user);
            map.put("school", "qinghua");
            User user2 = new User("mike","365","mm@guigu.com", 30);
            map.put("usertwo2", user2.getAge());
       
return SUCCESS; }

須要在Controller 類上加上註解: @SessionAttributes(value={"userone"}, types={String.class})

user: ${userone} </br>                                                            在前臺界面上取的值是: User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null] 
request user: ${requestScope.userone} </br>                                                                User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null] 
sessionScope user: ${sessionScope.userone}</br>                                                      User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]

school: ${school}</br>                                                                                                    qinghua
requestScope school: ${requestScope.school}</br>                                                      qinghua
sessoin school: ${sessionScope.school}</br>                                                                qinghua

usertwo: ${usertwo2}</br>                                                                                             30
requestScope usertwo: ${requestScope.usertwo2}</br>                                               30   
sessionScope usertwo: ${sessionScope.usertwo2}</br>                                               空

只有把 String 類型的值放到 session 中時, sessionScope 中才會取到。

 

七:

在前臺頁面向Controller傳遞bean 的屬性時,若是bean 對象沒有空的構造函數,而且前臺頁面傳的屬性和bean 的構造函數參數不匹配時,就會報錯,沒有空的構造函數:

嚴重: Servlet.service() for servlet [springmvc] in context with path [/springmvc-1] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zhou.entity.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zhou.entity.User.<init>()] with root cause
java.lang.NoSuchMethodException: com.zhou.entity.User.<init>()
at java.lang.Class.getConstructor0(Class.java:2849)
at java.lang.Class.getDeclaredConstructor(Class.java:2053)

須要加上一個空的構造函數。

一、在方法定義上使用 @ModelAttribute 註解:SpringMVC 在調用Controller 目標處理方法前,會先逐個調用在方法級上標註了 @ModelAttribute 的方法。

二、在方法的入參前使用 @ModelAttribute 註解 ,能夠從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數綁定到對象中,再傳入入參,將方法入參對象添加到模型中

前臺頁面傳入 username、email、 age:

    <form action="springmvc/testModeAttr">
        <input type="hidden" name="id" value="1">
        username: <input type="text" name="username" value="Tom"><br/>
        email: <input type="text" name="email" value="tomca@126.com"><br/>
        age: <input type="text" name="age" value="26"><br/>
        <input type="submit"  value="提交"><br/>
    </form>

Controller 中的方法:

        
        @RequestMapping("/testModeAttr")
        public String testModeAttr(User user,Map<String, Object> map) {
            System.out.println("modify:" + user);
            map.put("user", user);
            return SUCCESS;
        }
        
        @ModelAttribute
        public void getUser(@RequestParam(value="id", required=false) Integer id,Map<String, Object> map) {
            if(id!= null){
                User user = new User(1,"Tome", "12345","tom@guigu.com", 12);
                System.out.println("從數據庫中獲取的對象:" + user);
                map.put("user", user);
            }
        }

一、先執行 @ModelAttribute 註解的 getUser 方法, 輸出: 從數據庫中獲取的對象:User [id=1, username=Tome, password=12345, email=tom@guigu.com, age=12]

把 user 存入 key是 user 的對象中。

二、 SpringMVC 把 從Map 中取出的 User 對象,並把表單的請求參數 賦給該 User 對象的對應屬性。 (這一步是SpringMVC 完成的)  (在@ModelAttribute 修飾的方法中,放入到Map 時的鍵須要和目標方法入參類型的第一個字母小寫的字符一致,)

      若是在 @ModelAttribute 修飾的方法中,map存入的對象 和 目標方法的參數類名的第一個字母小寫的字符不一致,能夠在目標方法中用 @ModelAttribute 修改該參數。 好比:

      

        @RequestMapping("/testModeAttr")
        public String testModeAttr(@ModelAttribute("usera") User user,Map<String, Object> map) {
            System.out.println("modify:" + user);
            map.put("user", user);
            return SUCCESS;
        }
        
        @ModelAttribute
        public void getUser(@RequestParam(value="id", required=false) Integer id,Map<String, Object> map) {
            if(id!= null){
                User user = new User(1,"Tome", "12345","tom@guigu.com", 12);
                System.out.println("從數據庫中獲取的對象:" + user);
                map.put("usera", user);
            }
        }

 則在 目標方法 testModeAttr 中的參數 user 也就是 map 中存入的 key 是 usera 的對象。

三、 再執行 目標方法 testModeAttr , 把上面的user 對象傳入 該目標方法。

相關文章
相關標籤/搜索