1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        超級贊!SpringMVC中的請求參數的完美處理技巧~

        共 6574字,需瀏覽 14分鐘

         ·

        2021-08-19 12:20

        點擊關注公眾號,Java干貨及時送達

        Java技術迷 | 出品

        本篇文章我們來學習一下SpringMVC中是如何處理請求中的參數的。

        回想一下原生Servlet是如何處理請求參數的?我們需要使用HttpServletRequest調用getParameter方法進行獲取,就像這樣:

        @WebServlet("/hello")
        public class HelloServlet extends HttpServlet {

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 獲取參數值
        String username = req.getParameter("username");
        }

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
        }
        }

        下面來看看SpringMVC是如何處理這一需求的。

        @RequestParam

        在SpringMVC中,我們可以直接在方法上聲明入參獲取請求參數,比如:

        @Controller
        public class HelloController {

        @RequestMapping("/hello")
        public String hello(String username) {
        System.out.println(username);
        return "success";
        }
        }

        那在傳遞參數的時候參數名就必須指定為username,這樣處理方法就能夠直接獲取到請求參數,當然了,這樣獲取有一個弊端,就是參數名被固定了,只能是username,我們可以在參數前添加@RequestParam注解來解決:

        @RequestMapping("/hello")
        public String hello(@RequestParam("user") String username) {
        System.out.println(username);
        return "success";
        }

        此時參數名就可以隨意定義,轉而由@RequestParam注解來指定需要接收的參數名。

        當請求中未攜帶user參數時,程序就會出錯:

        Resolved exception caused by handler execution: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'user' is not present

        這是因為@RequestParam默認要求參數必須攜帶,否則就會報錯,可以通過修改注解中的required屬性值來解決這一個問題:

        @RequestMapping("/hello")
        public String hello(@RequestParam(value = "user",required = false) String username) {
        System.out.println(username);
        return "success";
        }

        此時無論是否攜帶user參數,程序都不會出錯,當未攜帶user參數時,username值為null。

        還可以通過配置defaultValue屬性值來指定當參數未攜帶時的默認值:

        @RequestMapping("/hello")
        public String hello(@RequestParam(value = "user",required = false,defaultValue = "zhang") String username) {
        System.out.println(username);
        return "success";
        }

        此時當請求未攜帶user參數時,username值為 zhang  。

        @RequestHeader

        SpringMVC中也能非常方便地獲取請求頭中的信息,如:

        @RequestMapping("/hello")
        public String hello(@RequestHeader("User-Agent") String userAgent) {
        System.out.println(userAgent);
        return "success";
        }

        通過@RequestHeader注解即可輕松獲取請求頭信息,其value值為請求頭的key,和@RequestParam注解類似,當試圖去獲取一個不存在的請求頭時,程序便會報錯:

        @RequestMapping("/hello")
        public String hello(@RequestHeader("test") String userAgent) {
        System.out.println(userAgent);
        return "success";
        }

        報錯信息為:

        Missing request header 'test' for method parameter of type String

        所以也可以在注解中添加required屬性來解決:

        @RequestMapping("/hello")
        public String hello(@RequestHeader(value = "test",required = false) String userAgent) {
        System.out.println(userAgent);
        return "success";
        }

        defaultValue屬性也是一樣的用法。

        @RequestBody

        在前后端分離的項目開發(fā)中,后端接收到的往往并不是一個直接的字符參數,而是一串JSON數據,那么該如何處理JSON類型的請求參數呢?

        其實很簡單,先接收到JSON參數,再通過一些第三方庫將JSON解析成正常的屬性值即可,而在SpringMVC中,可以直接使用@RequestBody注解來解決:

        @RequestMapping("/hello")
        public String hello(@RequestBody String json) {
        System.out.println(json);
        return "success";
        }

        通過這種方式能夠獲取到前端提交的JSON參數:

        {"name:"張三","age":"20"}

        你還可以直接將請求參數中的JSON串轉換為Bean對象:

        @RequestMapping("/hello")
        public String hello(@RequestBody Person person) {
        System.out.println(person);
        return "success";
        }

        此時SpringMVC將按照參數名和Person對象中的屬性名進行一一對應,并將參數值封裝到Person中生成一個對象,這樣便極大地方便了開發(fā)流程。

        @CookieValue

        通過@CookieValue注解可以很方便地獲取到請求中的cookie信息:

        @RequestMapping("/hello")
        public String hello(@CookieValue("_ga") String ga) {
        System.out.println(ga);
        return "success";
        }

        同理,若是獲取不存在的cookie,也會出現錯誤,解決方案和前面是一樣的,就不再贅述了。

        傳入對象類型

        當請求參數較為復雜時,比如一個對象,如果借助@RequestParam注解,就必須這樣:

        @RequestMapping("/hello")
        public String hello(
        @RequestParam("name") String name,
        @RequestParam("age") Integer age,
        @RequestParam("sex") Character sex,
        @RequestParam("address") String address
        ) {
        System.out.println(name);
        System.out.println(age);
        System.out.println(sex);
        System.out.println(address);
        return "success";
        }

        并且隨著參數的增多,這種冗余的代碼還要繼續(xù)編寫,為此,SpringMVC有一個更加優(yōu)雅的解決方案,就是直接接收一個對象類型的參數,所以,要先將這些參數封裝成一個對象:

        @Data
        @ToString
        public class Person {
        private String name;
        private Integer age;
        private Character sex;
        private String address;
        }

        此時方法中只需接收一個Person類型的參數即可:

        @RequestMapping("/hello")
        public String hello(Person person) {
        System.out.println(person);
        return "success";
        }

        它同時還支持級聯封裝,如:

        @Data
        @ToString
        public class Person {
        private String name;
        private Integer age;
        private Character sex;
        private Address address;
        }

        @Data
        @ToString
        public class Address {
        private String province;
        private String city;
        }

        現在Person對象中的地址屬性仍然是一個對象,SpringMVC仍然能夠將數據準確無誤地封裝到Person參數中,但請求參數在傳遞時就需要通過 . 來進行傳送,比如:

        http://localhost:8080/hello?name=zhangsan&sex=f&age=20&address.province=jiangxi&address.city=nanchang

        需要注意的是請求參數中的參數名必須和對象中定義的屬性名一致。

        傳入原生API

        有時候一些需求也不得不使用到原生的API,比如設置cookie、session等,SpringMVC當然也考慮到了這一點,所以若是想使用原生的API,則直接寫到方法的入參中即可,如:

        @RequestMapping("/hello")
        public String hello(HttpServletResponse response) {
        Cookie cookie = new Cookie("test", "test");
        response.addCookie(cookie);
        return "success";
        }

        想操作Session,就將HttpSession作為參數傳入:

        @RequestMapping("/hello")
        public String hello(HttpSession session) {
        session.setAttribute("test","test");
        return "success";
        }

        SpringMVC支持以下九個ServletAPI的對象:

        1.HttpServletRequest2.HttpServletResponse3.HttpSession4.java.security.Principal5.Locale6.InputStream7.OutputStream8.Reader9.Writer

        這九個對象都能夠直接以參數的形式傳入方法中。

        解決亂碼問題

        如果在發(fā)送請求時攜帶的參數是中文的,就會產生亂碼,在原生的Servlet開發(fā)中,我們通常使用:

        request.setCharacterEncoding("UTF-8");

        但這是用來解決POST請求亂碼的,對于響應的亂碼,應使用:

        response.setContentType("text/html;charset=utf-8");

        然而在SpringMVC中,我們通常不會使用到HttpServletRequest和HttpServletResponse對象,那么亂碼問題該如何解決呢?

        可以定義一個Filter過濾器,來攔截所有請求,并在過濾器中集中處理亂碼的問題,SpringMVC已經考慮到了這一點,并為我們提供了一個專門解決亂碼問題的過濾器CharacterEncodingFilter,只需在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>
        </filter>
        <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>

        注意:若項目中配置了多個Filter,則CharacterEncodingFilter一定要配置在其它Filter之前。

        以上便是有關SpringMVC中處理請求參數的全部內容!

        本文作者:汪偉俊 為Java技術迷專欄作者 投稿,未經允許請勿轉載。

        1、 19 張圖讓你秒懂 Spring Cloud 全家桶!

        2、 10 款牛哄哄的 Chrome 插件,你用了幾個?

        3、 在 IntelliJ IDEA 中這樣使用 Git,賊方便了!

        4、計算機時間到底是怎么來的?程序員必看的時間知識!

        5、這些IDEA的優(yōu)化設置趕緊安排起來,效率提升杠杠的!

        6、和100位00后聊完,我明白了為什么還有6億中國人仍不放棄QQ

        7、真香!用 IDEA 神器看源碼,效率真高!

        點分享 

        點收藏 

        點點贊 

        點在看

        瀏覽 146
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美猛少妇色xxxx久久久久 | 色妞在线| 黄频视频在线观看免费 | 按摩做爰免费观看 | 亚洲丝袜精品 | 校花开腿让我爽一晚漫画 | 男人的天堂在线视频 | 成人毛片视频免费观看 | 99免费在线观看视频 | 国产精品无人区 |