springboot獲取請(qǐng)求參數(shù)的幾種方式可選參數(shù)使用

post 請(qǐng)求獲取body內(nèi)容

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
 
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
 
public class HttpServletRequestReader
{
 
    // 字符串讀取
    // 方法一
    public static String ReadAsChars(HttpServletRequest request)
    {
 
        BufferedReader br = null;
        StringBuilder sb = new StringBuilder("");
        try
        {
            br = request.getReader();
            String str;
            while ((str = br.readLine()) != null)
            {
                sb.append(str);
            }
            br.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != br)
            {
                try
                {
                    br.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }
 
    // 方法二
    public static void ReadAsChars2(HttpServletRequest request)
    {
        InputStream is = null;
        try
        {
            is = request.getInputStream();
            StringBuilder sb = new StringBuilder();
            byte[] b = new byte[4096];
            for (int n; (n = is.read(b)) != -1;)
            {
                sb.append(new String(b, 0, n));
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != is)
            {
                try
                {
                    is.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
 
    }
 
    // 二進(jìn)制讀取
    public static byte[] readAsBytes(HttpServletRequest request)
    {
 
        int len = request.getContentLength();
        byte[] buffer = new byte[len];
        ServletInputStream in = null;
 
        try
        {
            in = request.getInputStream();
            in.read(buffer, 0, len);
            in.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != in)
            {
                try
                {
                    in.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return buffer;
    }
 
}

注意:HttpServletRequest 請(qǐng)求中的 body 內(nèi)容僅能調(diào)用 request.getInputStream()矮湘, request.getReader()和request.getParameter("key") 方法讀取一次,重復(fù)讀取會(huì)報(bào) java.io.IOException: Stream closed 異常褐荷。

1.get請(qǐng)求獲取全部參數(shù)

    @RequestMapping("/getRequest")
    public String getReq(HttpServletRequest request) {
        Map<String,Object> map = new HashMap<String,Object>();
        Enumeration paramNames = request.getParameterNames();
        while (paramNames.hasMoreElements()) {
            String paramName = (String) paramNames.nextElement();

            String[] paramValues = request.getParameterValues(paramName);
            if (paramValues.length >0) {
                String paramValue = paramValues[0];
                if (paramValue.length() != 0) {
                    map.put(paramName, paramValue);
                }
            }
        }

        Set<Map.Entry<String, Object>> set = map.entrySet();
        logger.debug("==============================================================");
        for (Map.Entry entry : set) {
            logger.debug(entry.getKey() + ":" + entry.getValue());
        }
        logger.debug("=============================================================");
        return JSONObject.toJSONString(map);
    }

2脚曾、可選參數(shù)

spring mvc中@requesMapping的可配置參數(shù)和標(biāo)注的處理方法的可選參數(shù)

@RequestMapping的可選參數(shù)

value:表示需要匹配的url的格式镣煮。
method:表示所需處理請(qǐng)求的http 協(xié)議(如get,post,put,delete等)安券,可選值為RequestMethod這個(gè)enum的值。
params:格式為”paramname=paramvalue” 或 “paramname!=paramvalue”昧绣。不帶參數(shù)則表示paramvalue可以為任意值规肴。
如params = {"param1=1","param2!=2","param3"},表示對(duì)應(yīng)的url必須包括param1,param2,param3三個(gè)參數(shù),其中param1的值必須為1,param2的值不能為2奏纪,param3的值可以為任意值鉴嗤。
headers:用來(lái)限定對(duì)應(yīng)的reqeust請(qǐng)求的headers中必須包括的內(nèi)容,例如
headers={"Connection=keep-alive"}, 表示請(qǐng)求頭中的connection的值必須為keep-alive序调。

使用@requesMapping標(biāo)注的處理函數(shù)包括的可選參數(shù)醉锅,除了HttpServletRequest, HttpServletResponse, HttpSession這些web應(yīng)用中常見(jiàn)的參數(shù)及之前提到過(guò)的@PathVariable外,還可以包括以下可選的參數(shù)发绢,其中大部分參數(shù)的順序沒(méi)有特殊要求的硬耍。

java.util.Locale

當(dāng)前請(qǐng)求所屬的區(qū)域設(shè)置。

java.io.InputStream或java.io.Reader

用來(lái)讀取request content边酒,相當(dāng)于 request.getInputStream()或request.getReader();

java.io.OutputStream或java.io.Writer

用來(lái)生成reponse content经柴,相當(dāng)于response.getOutputStream()或response.getWriter()。

java.security.Principal

當(dāng)前認(rèn)證了的用戶

WebRequest或NativeWebRequest

Spring 對(duì)request,response,session等web元素封裝后的對(duì)象HttpServletRequest/response/HttpSession等原始的web對(duì)象

java.util.Map 或 org.springframework.ui.Model或org.springframework.ui.ModelMap

用來(lái)存放domain model的map結(jié)構(gòu)墩朦。

HttpEntity<?>

可用來(lái)讀取http請(qǐng)求的header和 body內(nèi)容坯认,注意因?yàn)閔ttpentity,@RequestBody,Reader這三種類型的參數(shù)都是通過(guò)inputstram來(lái)讀取httpbody的數(shù)據(jù)的氓涣,而inputstream流不能反復(fù)讀取牛哺,因此這三種類型的參數(shù)不能放在一起使用。而且在沒(méi)有設(shè)置content-type或沒(méi)有設(shè)置相應(yīng)的messageconverter的情況下劳吠,都會(huì)報(bào)錯(cuò)引润。

Command 或 form objects

通過(guò)spring 的databinding機(jī)制將request請(qǐng)求中的參數(shù)自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的java bean實(shí)例。

Errors或BindingResult

對(duì)command或form objects值的校驗(yàn)結(jié)果痒玩。此參數(shù)必須緊跟在需校驗(yàn)的command或form object參數(shù)后面淳附。因?yàn)閐atabinding可以允許將輸入?yún)?shù)和多個(gè)java bean 進(jìn)行綁定(也就是說(shuō)我們可以把輸入request param轉(zhuǎn)換成為多個(gè)java 對(duì)象)。

SessionStatus

Session的狀態(tài)蠢古。當(dāng)使用@SessionAttributes來(lái)標(biāo)注請(qǐng)求需要session中對(duì)應(yīng)的值時(shí),在處理結(jié)束時(shí)奴曙,使用SessionStatus. setComplete()來(lái)將session設(shè)置為時(shí)效。

@RequestParam

將request參數(shù)和handler method參數(shù)做綁定草讶。例如

@RequestParam(value="username",defaultValue="winzip",required=false) String name
#表示將request中的username參數(shù)和handler method中的name參數(shù)綁定洽糟,缺省值為”winzip”,request請(qǐng)求中可以不傳遞此參數(shù)

@RequestHeader

將handler method中的參數(shù)與request header中的值綁定,例如

@RequestHeader(required=false,value="User-Agent") String ua
#表示將header中的"User-Agent"與ua這個(gè)入?yún)⒔壎ā?

@RequestBody

將handler method中的參數(shù)與request context body中的值綁定
例如

@RequestBody String u

表示將request body中的內(nèi)容與u這個(gè)入?yún)⒔壎ā?/p>

@CookieValue

將handler method中的參數(shù)與cookie中的值綁定
例如

@CookieValue(value="JSESSIONID",required=false) String jssionid

@ModelAttribute

將handler method中的參數(shù)與對(duì)應(yīng)的類型綁定到涂,名稱缺省為類名(首字母小寫(xiě)),如果ModelAttribute指定了值則以該值作為model attribute name颁督。
例如

@ModelAttribute("ooxx") User u
#則在modelmap中創(chuàng)建了一個(gè)鍵值為ooxx的model attribute践啄。
@ModelAttribute User u 或 User u
#在modelmap中創(chuàng)建了一個(gè)鍵值為user的model attribute

實(shí)例

 /**
     * 接收普通請(qǐng)求參數(shù)
     * http://localhost:8080/hello/show18?name=998 顯示為998
     * http://localhost:8080/hello/show18?name 顯示為hello
     * @return
     */
    @RequestMapping("show18")
    public ModelAndView test18(@RequestParam(value="name",required=true,defaultValue="hello")String name){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello2");
        mv.addObject("msg", "接收普通請(qǐng)求參數(shù):" + name);
        return mv;
    }

1、直接把表單的參數(shù)寫(xiě)在Controller相應(yīng)的方法的形參中沉御,適用于get方式提交屿讽,不適用于post方式提交。

 /**
     * 1.直接把表單的參數(shù)寫(xiě)在Controller相應(yīng)的方法的形參中
      * @param username
     * @param password
     * @return
     */
    @RequestMapping("/addUser1")
    public String addUser1(String username,String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }

url形式:http://localhost/SSMDemo/demo/addUser1?username=lixiaoxi&password=111111 提交的參數(shù)需要和Controller方法中的入?yún)⒚Q一致。

2伐谈、通過(guò)HttpServletRequest接收烂完,post方式和get方式都可以。

/**
     * 2诵棵、通過(guò)HttpServletRequest接收
      * @param request
     * @return
     */
    @RequestMapping("/addUser2")
    public String addUser2(HttpServletRequest request) {
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }

3抠蚣、通過(guò)一個(gè)bean來(lái)接收,post方式和get方式都可以。
(1)建立一個(gè)和表單中參數(shù)對(duì)應(yīng)的bean

package demo.model;

public class UserModel {
    
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}

(2)用這個(gè)bean來(lái)封裝接收的參數(shù)

  /**
     * 3履澳、通過(guò)一個(gè)bean來(lái)接收
      * @param user
     * @return
     */
    @RequestMapping("/addUser3")
    public String addUser3(UserModel user) {
        System.out.println("username is:"+user.getUsername());
        System.out.println("password is:"+user.getPassword());
        return "demo/index";
    }

4嘶窄、通過(guò)@PathVariable獲取路徑中的參數(shù)

  /**
     * 4、通過(guò)@PathVariable獲取路徑中的參數(shù)
      * @param username
     * @param password
     * @return
     */
    @RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)
public String addUser4(@PathVariable String username,@PathVariable String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }

例如距贷,訪問(wèn)http://localhost/SSMDemo/demo/addUser4/lixiaoxi/111111 路徑時(shí)柄冲,則自動(dòng)將URL中模板變量{username}和{password}綁定到通過(guò)@PathVariable注解的同名參數(shù)上,即入?yún)⒑髐sername=lixiaoxi忠蝗、password=111111现横。
5、使用@ModelAttribute注解獲取POST請(qǐng)求的FORM表單數(shù)據(jù)
Jsp表單如下:

<form action ="<%=request.getContextPath()%>/demo/addUser5" method="post"> 
     用戶名:&nbsp;<input type="text" name="username"/><br/>
     密&nbsp;&nbsp;碼:&nbsp;<input type="password" name="password"/><br/>
     <input type="submit" value="提交"/> 
     <input type="reset" value="重置"/> 
</form> 

Java Controller如下:

 /**
     * 5阁最、使用@ModelAttribute注解獲取POST請(qǐng)求的FORM表單數(shù)據(jù)
      * @param user
     * @return
     */
    @RequestMapping(value="/addUser5",method=RequestMethod.POST)
    public String addUser5(@ModelAttribute("user") UserModel user) {
        System.out.println("username is:"+user.getUsername());
        System.out.println("password is:"+user.getPassword());
        return "demo/index";
    }

6戒祠、用注解@RequestParam綁定請(qǐng)求參數(shù)到方法入?yún)?/p>

當(dāng)請(qǐng)求參數(shù)username不存在時(shí)會(huì)有異常發(fā)生,可以通過(guò)設(shè)置屬性required=false解決,例如: @RequestParam(value="username", required=false)

    /**
     * 6、用注解@RequestParam綁定請(qǐng)求參數(shù)到方法入?yún)?      * @param username
     * @param password
     * @return
     */
    @RequestMapping(value="/addUser6",method=RequestMethod.GET)
    public String addUser6(@RequestParam("username") String username,@RequestParam("password") String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闽撤,一起剝皮案震驚了整個(gè)濱河市得哆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哟旗,老刑警劉巖贩据,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闸餐,居然都是意外死亡饱亮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)舍沙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)近上,“玉大人,你說(shuō)我怎么就攤上這事拂铡∫嘉蓿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵感帅,是天一觀的道長(zhǎng)斗锭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)失球,這世上最難降的妖魔是什么岖是? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上豺撑,老公的妹妹穿的比我還像新娘烈疚。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著西土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阶剑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天危号,我揣著相機(jī)與錄音牧愁,去河邊找鬼。 笑死外莲,一個(gè)胖子當(dāng)著我的面吹牛猪半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偷线,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼磨确,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了声邦?” 一聲冷哼從身側(cè)響起乏奥,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亥曹,沒(méi)想到半個(gè)月后邓了,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媳瞪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年骗炉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇受。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡句葵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兢仰,到底是詐尸還是另有隱情乍丈,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布把将,位于F島的核電站轻专,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秸弛。R本人自食惡果不足惜铭若,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望递览。 院中可真熱鬧叼屠,春花似錦、人聲如沸绞铃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)儿捧。三九已至荚坞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菲盾,已是汗流浹背颓影。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懒鉴,地道東北人诡挂。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像临谱,于是被迫代替她去往敵國(guó)和親璃俗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355