Servlet學(xué)習(xí)筆記(二):request

Servlet整個運(yùn)行過程圖:


servlet運(yùn)行

Web應(yīng)用的標(biāo)準(zhǔn)目錄結(jié)構(gòu):
Web應(yīng)用的標(biāo)準(zhǔn)目錄結(jié)構(gòu)

(一)Request
1.Request 獲取客戶端和請求頭的常用API

request_API

示例:

package cn.itcast.android.request;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo01 extends HttpServlet {
    /**
    requset的常用API
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url = request.getRequestURL().toString();
        String uri = request.getRequestURI();
        String Query = request.getQueryString();
        //客戶機(jī)的IP地址
        String remote = request.getRemoteAddr();
        //Web服務(wù)器的IP地址
        String local = request.getLocalAddr();
        //客戶的請求方式
        String method = request.getMethod();
        //servlet的映射路徑
        String path = request.getServletPath();
        //web應(yīng)用根目錄
        String contextPath = request.getContextPath();
        //向?yàn)g覽器輸出,即response代表每個瀏覽器,從response對象中獲取到的輸出流自然指向每個瀏覽器
        PrintWriter pw = response.getWriter();
        pw.write(url + "<br/>");
        pw.write(uri + "<br/>");
        pw.write(Query + "<br/>");
        pw.write(remote + "<br/>");
        pw.write(local + "<br/>");
        pw.write(method+ "<br/>");
        pw.write(path + "<br/>");
        pw.write(contextPath + "<br/>");
    }
}

結(jié)果:


示例.PNG

2.Request獲取請求參數(shù)

  • 若以GET方式進(jìn)行請求,請求參數(shù)位于請求行中;以POST方式進(jìn)行請求,請求參數(shù)位于請求體中。如果表單中沒有寫method,則默認(rèn)GET方式。
  • 對于POST請求,表單不填任何內(nèi)容信息,那么request.getParameter()返回一個" "空白字符串
  • 當(dāng)請求頁面,出現(xiàn)HTTP Status 405 錯誤頁面時,表明客戶端以GET方式提交,但是服務(wù)器并沒有相應(yīng)的doGet()方式來處理,不能一 一對應(yīng),就會報錯。
  • 如果doPost和doGet,他們的業(yè)務(wù)邏輯是一樣的,則他們兩者之間可以進(jìn)行互相調(diào)用。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //調(diào)用doPost方法
        this.doPost(request, response);
    }

3.GET和POST出現(xiàn)亂碼的原因和解決方案

  • 先上一張圖,讓我們明白整個數(shù)據(jù)值他是怎樣進(jìn)行編碼傳遞的


    亂碼來源.png

    模擬過程
  • 解決方案:

主要是服務(wù)器的解碼方式為“ISO8859-1”,造成了亂碼
1.修改服務(wù)器的解碼方式(在conf文件中的server.xml)

修改服務(wù)器的配置文件

但是添加了被框住的語句,可能會造成一些麻煩。因?yàn)橐话銇碚f,服務(wù)器和程序員的工作是有明確分工的,不建議進(jìn)行交涉,不推薦此方法。
2.將獲取到的被“ISO8859-1”解碼過后的字符串,用getBytes("ISO8859-1")進(jìn)行還原成字節(jié)數(shù)組,再次對其進(jìn)行按照“UTF-8”的形式進(jìn)行解碼,獲得想要的
缺陷:不適合多個參數(shù)

  • 關(guān)于解碼問題

1.對于提交方式為POST的:
request.setCharacterEncoding("UTF-8");//放在getParameter前才會有效
本方法只針對于POST請求,因?yàn)镻OST的請求參數(shù)放在請求體中,而GET方式的數(shù)據(jù)放在請求行中

2.對于GET方式:只能采用傳統(tǒng)方式
byte[] buf = xx.getBytes("ISO8859-1");
xx = new String(buf,"UTF-8");

4.封裝User---JavaBean對象

  • 簡單介紹JavaBean
    程序中往往有重復(fù)使用的段落,JavaBean就是為了能夠重復(fù)使用而設(shè)計的程序段落,而且這些段落并不只服務(wù)于某一個程序,而且每個JavaBean都具有特定功能,當(dāng)需要這個功能的時候就可以調(diào)用相應(yīng)的JavaBean。從這個意義上來講,JavaBean大大簡化了程序的設(shè)計過程,也方便了其他程序的重復(fù)使用。
  • 滿足這三個條件:
    1.執(zhí)行java.io.Serializable 接口
    2.提供無參數(shù)的構(gòu)造器
    3.提供getter 和 setter方法訪問它的屬性.
給個示例

例如:有如下的表單,采用POST進(jìn)行提交數(shù)據(jù),現(xiàn)在要對數(shù)據(jù)進(jìn)行封裝到JavaBean對象中去


package cn.itcast.android.request;

public class User {

    /**
     * 用戶,用于封裝所有的表單參數(shù),即javabean
     */
    private String username;
    private String password;
    private String[] likes;
    private Integer salary;
    //無參構(gòu)造器
    public User(){}
    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;
    }
}

像這樣就可以封裝成一個User對象,然后,BeanUtils(user,name,values);將獲取到的參數(shù),封裝起來。注意:name要與表單的name相對應(yīng)。

5.request 域?qū)ο?/p>

  • Request 有兩層含義:
    (1)它是一個請求對象
    (2)域?qū)ο?,理解為一個容器可以存放Object類型的數(shù)據(jù)
  • 域?qū)ο笞饔?/li>
域?qū)ο笞饔?/div>

Request域?qū)ο蟪S玫腁PI:
(1)setAttribute(String, Object);------進(jìn)行存放
(2)getAttribute(String);-----------------返回一個Object類型
(3)removeAttribute(String);-----------無void

6.轉(zhuǎn)發(fā)

request.getRequestDispatcher("/ xxxxxxxxx ").forward(request,response);
/表示當(dāng)前應(yīng)用的根目錄,forward實(shí)現(xiàn)真正地轉(zhuǎn)發(fā)

  • 位于WEB-INF這個私有目錄下的資源,該如何訪問呢?
    只能借助于轉(zhuǎn)發(fā)
  • 轉(zhuǎn)發(fā)細(xì)節(jié):
    (1)forward方法用于將請求轉(zhuǎn)發(fā)到RequestDispatcher對象封裝的路徑去
    (2)如果向response對象中輸出內(nèi)容,但是該內(nèi)容沒有真正的輸出到瀏覽器,即停留在response的緩沖區(qū)中。此時,若又要轉(zhuǎn)發(fā),這時,原緩沖區(qū)的內(nèi)容就會被清空,不會被輸出到瀏覽器上面,最終,結(jié)果是轉(zhuǎn)發(fā)到目標(biāo)資源,但是如果已經(jīng)寫入到HttpServletRequest對象中的響應(yīng)頭字段信息保持有效。
    (3)當(dāng)真正地將內(nèi)容輸出到了瀏覽器中了,request對象的生命結(jié)束,而此時要進(jìn)行轉(zhuǎn)發(fā)response不會恢復(fù),所以報錯。意思是,不要在轉(zhuǎn)發(fā)之前,提前把數(shù)據(jù)傳給瀏覽器,這樣是無用功。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評論 19 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,413評論 6 13
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • 在這個風(fēng)和日麗的午后,一架由上海浦東轉(zhuǎn)機(jī)再飛往甌江之濱白甌市白甌機(jī)場的波音737客機(jī)平穩(wěn)地緩緩落地。 一位...
    楠溪陳釀閱讀 427評論 0 3
  • 01 黑暗的房間里,只有手機(jī)屏幕的悠悠白光,照著季子軍的臉有些詭異,他面無表情的看著屏幕,心中酸澀不已。 隱約間,...
    靜逐閱讀 404評論 0 5

友情鏈接更多精彩內(nèi)容