springmvc Controller接收前端參數的幾種方式總結

  • 2019 年 10 月 13 日
  • 筆記

 

(1) 普通方式-請求參數名和Controller方法的參數一致

 

 1 @Controller   2 @RequestMapping("/param")   3 public class TestParamController {   4     private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);   5     /**   6      * 請求參數名和Controller方法的參數一致   7      * produces 設置返回參數的編碼格式可以設置返回數據的類型以及編碼,可以是json或者xml   8      * {   9      *     @RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})  10      *      或  11      *     @RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})  12      *      或  13      *     @RequestMapping(value="/xxx",produces = "{text/html;charset=utf-8}")  14      * }  15      * @param name 用戶名  16      * @param pwd 密碼  17      * @return  18      *  19      */  20     @RequestMapping(value = "/add", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})  21     @ResponseBody  22     public String addUser(String name, String pwd){  23         logger.debug("name:" + name + ",pwd:" + pwd);  24         return "name:" + name + ",pwd:" + pwd;  25     }  26  27 }

如下圖所示:

通過訪問:http://localhost:8080/sty/param/add.action?name=張三&pwd=123456

          

 

 (2) 對象方式-請求參數名和Controller方法中的對象的參數一致

 

@Controller  @RequestMapping("/param")  public class TestParamController {      private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);      /**       * 請求參數名和Controller方法的參數一致       * produces 設置返回參數的編碼格式可以設置返回數據的類型以及編碼,可以是json或者xml       * }       * @param user 用戶資訊       * @return       *       */      @RequestMapping(value = "/addByObject", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUserByObject(User user){          logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());          return "name:" + user.getName() + ",pwd:" + user.getPwd();      }  }

如下圖所示:

通過訪問:http://localhost:8080/sty/param/addByObject.action?name=張三&pwd=123456

 

 

(3) 自定義方法參數名-當請求參數名與方法參數名不一致時

 

  注意可以在參數中增加@RequestParam註解。如果在方法中的參數增加了該註解,說明請求的url必須帶該帶有該參數,否則不能執行該方法。如果在方法中的參數沒有增加該註解,說明請求的url無需帶有該參數,也能繼續執行該方法。

  @RequestParam(defaultValue=”0″)可設置默認值(僅當傳入參數為空時)。

  @RequestParam(value=”id”)可接受傳入參數為id的值,覆蓋該註解注釋的欄位。

  @RequestParam(name=”name”,defaultValue = “李四”) String u_name   如果傳入欄位”name”為空,默認u_name的值為”李四”。若傳入”name”不為空,默認u_name值為傳入值。

以下只該出方法:

/**   * 自定義方法參數名-當請求參數名與方法參數名不一致時   * @param u_name 用戶名   * @param u_pwd 密碼   * @return   */  @RequestMapping(value = "/addByDifName", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})  @ResponseBody  public String addUserByDifName(@RequestParam("name") String u_name, @RequestParam("pwd")String u_pwd){      logger.debug("name:" + u_name + ",pwd:" + u_pwd);      return "name:" + u_name + ",pwd:" + u_pwd;  }

如下圖所示:

通過訪問:http://localhost:8080/sty/param/addUserByDifName.action?name=張三&pwd=123456

 

 

(4) HttpServletRequest方式

 

  以下只給出該方法:

/**     * 通過HttpServletRequest接收     * @param request     * @return     */    @RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})    @ResponseBody    public String addUserByHttpServletRequest(HttpServletRequest request){        String name = request.getParameter("name");        String pwd = request.getParameter("pwd");        logger.debug("name:" + name + ",pwd:" + pwd);        return "name:" + name + ",pwd:" + pwd;    }

如下圖所示:

通過訪問:http://localhost:8080/sty/param/addByHttpServletRequest.action?name=張三&pwd=123456

 

 

(5) @PathVariable獲取路徑中的參數接收

 

         參考:https://www.iteye.com/blog/zhlj11-1885005

   註:url含有中文名稱時,因為編碼問題,無法進行映射,需要修改tomcat下的conf文件夾下的server.xml中的URIEncoding=”UTF-8”,對URL編碼設置就可以解決中文問題。

對於經常遇到路徑在有符號”.”問題,因為springmvc默認是把點後面的資訊作為文件後綴,需要修改默認值:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">                <property name="interceptors" ref="localeChangeInterceptor"/>                <property name="useDefaultSuffixPattern" value="false" />         </bean> 

  另外,這時候如果只設置這個,請求可以傳遞到對於的controller,但傳過去的數據會有問題,只會傳最後一個點前面的數據,除非你在最後加上“/”,比如/news/測試.點/  這樣就會把“測試.點”當作整體,不然只會得到“測試”。這時候我們可以這樣設置@RequestMapping(“/news/{title:.*}”) 

以下只給出該方法(本次不進行中文及特殊符號測試):

/**     * 通過@PathVariable獲取路徑中的參數     * @param name 用戶名     * @param pwd 密碼     * @return     */    @RequestMapping(value = "/add/{name}/{pwd}", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})    @ResponseBody    public String addUserByPathVariable(@PathVariable String name, @PathVariable String pwd){        logger.debug("name:" + name + ",pwd:" + pwd);        return "name:" + name + ",pwd:" + pwd;    }

 

如下圖所示:

通過訪問:http://localhost:8080/sty/param/add/zhangsan/123456.action

 

 

(6) @RequestBody-JSON方式接收

 

  以上方式(1)/(2)/)(3)/(4)/(5)都是非JSON方式,也就是說如果使用JSON方式提交,會報錯(在第二種對象方式中,將get請求方式修改為POST,並將上送數據修改為JSON串方式):

       此時未引入jackson-databind.jar依賴。並在springmvc.xml文件未進行開啟json格式的支援,也就是說未加入以下程式碼:

<!-- 同時開啟json格式的支援-->  <mvc:annotation-driven></mvc:annotation-driven>

  提交請求列印未有報錯,但是返回的數據為null,如圖所示:

   

         若開啟json格式的支援,測試也如上圖所示,也並能正常返回。

         原因:因為為在欄位名稱之前未使用@RequestBody註解。

eg1(測試普通對象)

         程式碼如下所示,

/**     * RequestBody-JSON 對象方式     * @param user     * @return     */    @RequestMapping(value = "/addByObjectJSON", produces = {"application/json;charset=UTF-8"})    @ResponseBody    public String addUserByObjectJSON(@RequestBody User user){        logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());        return "name:" + user.getName() + ",pwd:" + user.getPwd();    }

測試結果如圖所示(訪問 http://localhost:8080/sty/param/addByObjectJSON.action ):

 

eg2(測試List對象)

程式碼如下所示,

/**   * RequestBody-JSON List對象方式   * @param users   * @return   */  @RequestMapping(value = "/addByListJSON", produces = {"application/json;charset=UTF-8"})  @ResponseBody  public String addUsersByListJSON(@RequestBody List<User> users){      StringBuilder sb = new StringBuilder("{");      if(null != users){          for(User user : users){              sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");          }      }      sb.append("}");      logger.debug(sb.toString());      return sb.toString();  }

   測試結果

  測試結果如圖所示(訪問 http://localhost:8080/sty/param/addByListJSON.action  ):

   

eg3(測試Map對象)

程式碼如下圖所示:

/**     * RequestBody-JSON Map對象方式     * @param users     * @return     */    @RequestMapping(value = "/addByMapJSON", produces = {"application/json;charset=UTF-8"})    @ResponseBody    public String addUsersByMapJSON(@RequestBody Map<String, User> users){        StringBuilder sb = new StringBuilder("{");        if(null != users){            Iterator it = users.keySet().iterator();            while(it.hasNext()){                User user = users.get(it.next());                sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");            }        }        sb.append("}");        logger.debug(sb.toString());        return sb.toString();    }

   測試結果

測試結果如圖所示(訪問 http://localhost:8080/sty/param/addByMapJSON.action ):

另外附部分源碼:

  User.java

package com.mjs.study.action.dto;    /**   * @Description   * @ClassName User   * @Author Administrator   * @Data 2019/10/13 2:43   * @Version 1.0   */  public class User {      private String name;      private String pwd;      private String sex;        public String getName() {          return name;      }        public void setName(String name) {          this.name = name;      }        public String getPwd() {          return pwd;      }        public void setPwd(String pwd) {          this.pwd = pwd;      }        public String getSex() {          return sex;      }        public void setSex(String sex) {          this.sex = sex;      }  }

View Code

 TestParamController.java 

package com.mjs.study.action;    import com.github.pagehelper.PageInfo;  import com.mjs.study.action.dto.User;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.stereotype.Controller;  import org.springframework.web.bind.annotation.*;    import javax.servlet.http.HttpServletRequest;  import java.util.Iterator;  import java.util.List;  import java.util.Map;    /**   * @Description 測試springmvc傳入參數   * @ClassName TestParamController   * @Author Administrator   * @Data 2019/10/13 1:33   * @Version 1.0   */  @Controller  @RequestMapping("/param")  public class TestParamController {      private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);      /**       * 請求參數名和Controller方法的參數一致       * produces 設置返回參數的編碼格式 可以設置返回數據的類型以及編碼,可以是json或者xml       * {       *     @RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})       *      或       *     @RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})       *      或       *     @RequestMapping(value="/xxx",produces = "{text/html;charset=utf-8}")       * }       * @param name 用戶名       * @param pwd 密碼       * @return       *       */      @RequestMapping(value = "/add", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUser(String name, String pwd){          logger.debug("name:" + name + ",pwd:" + pwd);          return "name:" + name + ",pwd:" + pwd;      }        /**       * 自定義方法參數名-當請求參數名與方法參數名不一致時       * @param u_name 用戶名       * @param u_pwd 密碼       * @return       */      @RequestMapping(value = "/addByDifName", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUserByDifName(@RequestParam(name="name",defaultValue = "李四") String u_name, @RequestParam("pwd")String u_pwd){          logger.debug("name:" + u_name + ",pwd:" + u_pwd);          return "name:" + u_name + ",pwd:" + u_pwd;      }        /**       * 請求參數名和Controller方法的參數一致       * produces 設置返回參數的編碼格式 可以設置返回數據的類型以及編碼,可以是json或者xml       * @param user 用戶資訊       * @return       *       */      @RequestMapping(value = "/addByObject", produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUserByObject(User user){          logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());          return "name:" + user.getName() + ",pwd:" + user.getPwd();      }        /**       * RequestBody-JSON 對象方式       * @param user       * @return       */      @RequestMapping(value = "/addByObjectJSON", produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUserByObjectJSON(@RequestBody User user){          logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());          return "name:" + user.getName() + ",pwd:" + user.getPwd();      }        /**       * RequestBody-JSON List對象方式       * @param users       * @return       */      @RequestMapping(value = "/addByListJSON", produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUsersByListJSON(@RequestBody List<User> users){          StringBuilder sb = new StringBuilder("{");          if(null != users){              for(User user : users){                  sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");              }          }          sb.append("}");          logger.debug(sb.toString());          return sb.toString();      }      /**       * RequestBody-JSON Map對象方式       * @param users       * @return       */      @RequestMapping(value = "/addByMapJSON", produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUsersByMapJSON(@RequestBody Map<String, User> users){          StringBuilder sb = new StringBuilder("{");          if(null != users){              Iterator it = users.keySet().iterator();              while(it.hasNext()){                  User user = users.get(it.next());                  sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");              }          }          sb.append("}");          logger.debug(sb.toString());          return sb.toString();      }      /**       * 通過HttpServletRequest接收       * @param request       * @return       */      @RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUserByHttpServletRequest(HttpServletRequest request){          String name = request.getParameter("name");          String pwd = request.getParameter("pwd");          logger.debug("name:" + name + ",pwd:" + pwd);          return "name:" + name + ",pwd:" + pwd;      }        /**       * 通過@PathVariable獲取路徑中的參數       * @param name 用戶名       * @param pwd 密碼       * @return       */      @RequestMapping(value = "/add/{name}/{pwd}", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})      @ResponseBody      public String addUserByPathVariable(@PathVariable String name, @PathVariable String pwd){          logger.debug("name:" + name + ",pwd:" + pwd);          return "name:" + name + ",pwd:" + pwd;      }  }

View Code

  該部分和個人github部分內容同步。