J2EE--HttpServletRequest

  1. 什么是Request棋凳?
  2. 為什么要使用Request?
  3. 怎么使用Request?
  4. 其它功能
  5. 中文亂碼問題解決

1. 什么是Request髓废?

HttpServletRequest對(duì)象代表客戶端的請(qǐng)求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時(shí)草描,HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中览绿,通過這個(gè)對(duì)象提供的方法,可以獲得客戶端請(qǐng)求的所有信息穗慕。

2. 為什么要使用Request饿敲?

  • 使用Request對(duì)象來分析出對(duì)應(yīng)的Servlet去執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯
  • 使用Request對(duì)象來獲取、轉(zhuǎn)發(fā)逛绵、數(shù)據(jù)共享等功能

3. 怎么使用Request怀各?

根據(jù)HTTP協(xié)議我們可以得知,一次數(shù)據(jù)請(qǐng)求包含:

  • 請(qǐng)求行:請(qǐng)求方式 請(qǐng)求url 請(qǐng)求協(xié)議/版本
  • 請(qǐng)求頭:客戶端瀏覽器告訴服務(wù)器一些信息
  • 請(qǐng)求空行:空行术浪,就是用于分割POST請(qǐng)求的請(qǐng)求頭瓢对,和請(qǐng)求體的。
  • 請(qǐng)求體:封裝POST請(qǐng)求消息的請(qǐng)求參數(shù)的

3.1 獲取請(qǐng)求行數(shù)據(jù)

方法 說明
String getMethod() 獲取請(qǐng)求方式
String getContextPath() 獲取虛擬目錄
String getServletPath() 獲取Servlet路徑
String getQueryString() 獲取get方式請(qǐng)求參數(shù)
String getRequestURI() 獲取請(qǐng)求URI
String getRemoteAddr() 獲取客戶機(jī)的IP地址

示例代碼

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取虛擬目錄
        System.out.printf(req.getContextPath()+"\n");
        //獲取URI
        System.out.printf(req.getRequestURI()+"\n");
    }

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

效果演示

image.png
image.png

補(bǔ)充

  • URL:統(tǒng)一資源定位符 : http://localhost/day14/demo1 中華人民共和國
  • URI:統(tǒng)一資源標(biāo)識(shí)符 : /day14/demo1 共和國

3.2 獲取請(qǐng)求頭數(shù)據(jù)

方法 說明
String getHeader(String name) 通過請(qǐng)求頭的名稱獲取請(qǐng)求頭的值
Enumeration<String> getHeaderNames() 獲取所有的請(qǐng)求頭名稱

3.3 獲取請(qǐng)求體數(shù)據(jù)

請(qǐng)求體:只有POST請(qǐng)求方式胰苏,才有請(qǐng)求體硕蛹,在請(qǐng)求體中封裝了POST請(qǐng)求的請(qǐng)求參數(shù)
步驟:

  1. 獲取流對(duì)象
    BufferedReader getReader():獲取字符輸入流,只能操作字符數(shù)據(jù)
    ServletInputStream getInputStream():獲取字節(jié)輸入流硕并,可以操作所有類型數(shù)據(jù)
    在文件上傳知識(shí)點(diǎn)后講解
  2. 再從流對(duì)象中拿數(shù)據(jù)

4. 其它功能

4.1 獲取請(qǐng)求參數(shù)

獲取請(qǐng)求參數(shù)通用方式:不論get還是post請(qǐng)求方式都可以使用下列方法來獲取請(qǐng)求參數(shù)

方法 說明
String getParameter(String name) 根據(jù)參數(shù)名稱獲取參數(shù)值 username=zs&password=123
String[] getParameterValues(String name) 根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game
Enumeration<String> getParameterNames() 獲取所有請(qǐng)求的參數(shù)名稱
Map<String,String[]> getParameterMap() 獲取所有參數(shù)的map集合

示例代碼

html頁面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用戶登錄</h1>

<form action="demo" method="POST">
    用戶名:<input type="text" name="username"/>
    <br/>
    密 碼:<input type="password" name="password"/>
    <br/>
    <input type="checkbox" name="usertype" value="administrator"/>管理員
    <input type="checkbox" name="usertype" value="user"/>普通用戶
    <br/>
    <input type="submit" value="提交">

</form>

</body>
</html>
Servlet頁面
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //防止中文亂碼
        req.setCharacterEncoding("utf-8");
        //獲取username的參數(shù)(輸入值)
        System.out.printf(req.getParameter("username")+ "\n");
        //獲取password的參數(shù)(輸入值)
        System.out.printf(req.getParameter("password")+ "\n");
       //根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組
        String [] result= req.getParameterValues("usertype");
        for (String s : result) {
            System.out.println(s);
        }
    }

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

演示結(jié)果

image.png

4.2 請(qǐng)求轉(zhuǎn)發(fā)

一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式

4.2.1 步驟:

  1. 通過request對(duì)象獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path)
  2. 使用RequestDispatcher對(duì)象來進(jìn)行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response)

4.2.2. 特點(diǎn):

  1. 瀏覽器地址欄路徑不發(fā)生變化
  2. 只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部資源中法焰。
  3. 轉(zhuǎn)發(fā)是一次請(qǐng)求

示例代碼

LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

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

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

        String user_name = req.getParameter("username");

        if (user_name.equals("aaa")){
            req.getRequestDispatcher("/failServlet").forward(req,resp);
        }
    }
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

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

        //設(shè)置編碼
        resp.setContentType("text/html;charset=utf-8");
        //輸出
        resp.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤");
    }
}

效果展示

image.png
image.png

4.3 共享數(shù)據(jù)

  • 域?qū)ο螅阂粋€(gè)有作用范圍的對(duì)象倔毙,可以在范圍內(nèi)共享數(shù)據(jù)
  • request域:代表一次請(qǐng)求的范圍埃仪,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù)
方法 說明
void setAttribute(String name,Object obj) 存儲(chǔ)數(shù)據(jù)
Object getAttitude(String name) 通過鍵獲取值
void removeAttribute(String name) 通過鍵移除鍵值對(duì)

示例代碼

LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

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

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

        String user_name = req.getParameter("username");

        if (user_name.equals("aaa")){
            //存放數(shù)據(jù)
            req.setAttribute("shareData",user_name);
            //轉(zhuǎn)發(fā)
            req.getRequestDispatcher("/failServlet").forward(req,resp);
        }
    }
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

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


        //設(shè)置編碼
        resp.setContentType("text/html;charset=utf-8");

        //獲取存放數(shù)據(jù)
        String data =(String) req.getAttribute("shareData");
        //輸出
        resp.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤");
        resp.getWriter().write("用戶"+data+"不允許登錄陕赃!");
    }
}

效果顯示

image.png
image.png

4.4 獲取ServletContext

ServletContext getServletContext()

5. 中文亂碼問題

中文亂碼問題:

  • get方式:tomcat 8 已經(jīng)將get方式亂碼問題解決了
  • post方式:會(huì)亂碼解決:在獲取參數(shù)前卵蛉,設(shè)置request的編碼request.setCharacterEncoding("utf-8");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凯正,隨后出現(xiàn)的幾起案子毙玻,更是在濱河造成了極大的恐慌,老刑警劉巖廊散,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桑滩,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)运准,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門幌氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胁澳,你說我怎么就攤上這事该互。” “怎么了韭畸?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵宇智,是天一觀的道長。 經(jīng)常有香客問我胰丁,道長随橘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任锦庸,我火速辦了婚禮机蔗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甘萧。我一直安慰自己萝嘁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布扬卷。 她就那樣靜靜地躺著牙言,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邀泉。 梳的紋絲不亂的頭發(fā)上嬉挡,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音汇恤,去河邊找鬼庞钢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛因谎,可吹牛的內(nèi)容都是我干的基括。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼财岔,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼风皿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匠璧,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤桐款,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后夷恍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魔眨,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遏暴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侄刽。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朋凉,靈堂內(nèi)的尸體忽然破棺而出州丹,到底是詐尸還是另有隱情,我是刑警寧澤杂彭,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布墓毒,位于F島的核電站,受9級(jí)特大地震影響亲怠,放射性物質(zhì)發(fā)生泄漏蚁鳖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一赁炎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钾腺,春花似錦徙垫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至间螟,卻和暖如春吴旋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厢破。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工荣瑟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摩泪。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓笆焰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親见坑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚷掠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348