HttpServletResponse與HttpServletRequest

來源:互聯網
上載者:User

標籤:

  1. 編碼問題的原則
    1. 英文字母不會出現亂碼問題,所有的編碼錶都包含Unicode編碼錶
    2. 字元流=位元組流+編碼錶 使用tomcat伺服器時,預設使用tomcat預設編碼錶
    3. tomcat6.x tomcat7.x 預設全是ISO-8859-1 tomcat8.x預設使用UTF-8
    4. 在jsp編程中,getByte();預設使用ANSI 本地編碼錶GBK
    5. getByte()中有帶有編碼錶的構造,可以指定字元通過什麼編碼返回byte數組
  2. HTTPServletResponse
    1. getOutputStream和getWriter()不能同時使用????

      這兩個流不需要我們手動釋放,Servlet會自動釋放????

      response.getOutputStream().write("中文亂碼".getBytes());

      response.getWriter().print("中文亂碼");

    2. 常用標題
      1. 重新整理 response.setHeader("Refresh", "1");一秒鐘重新整理一次
      2. 設定指定時間重新導向 response.setHeader("Refresh", "3;URL=/index.jsp");URL可以省略

        轉寄: / 代表當前應用

  • 只有一次請求,共用請求
  • 需要共用request時使用轉寄
  • 地址欄不會變化
  • 伺服器的內部行為
  • 只能轉寄內部地址

//通過得到內容物件 實現頁面跳轉 /代表當前項目中 不能使用相對路徑

getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

//得到請求對象,實現頁面跳轉

request.getRequestDispatcher("/Test.html").forward(request, response);

重新導向: / 代表tomcat 根目錄

  • 會發出新的請求
  • 地址欄會發生變化
  • 可以轉寄內部地址,也可以訪問外部資源
  • 不寫/代表 相對路徑

    //使用相對路徑時 指向的就是當前class路徑

    response.sendRedirect("myServlet_OutputStream");

    response.setHeader("Refresh", "3;URL=當前類空間中的class檔案 ");

  1. 緩衝時間 response.setDateHeader("Expires",System.currenTimeMillis()+1*1000*60*60); /1 小時

    地址欄直接Enter鍵 是使用緩衝 需要更新 需要重新整理 才會更新頁面

    靜態web資源是可以緩衝的

    動態web資源是不建議使用緩衝的

    控制沒有緩衝

//控制沒有緩衝

response.setHeader("expires","0");

response.setHeader("cache-control","no-cache");

response.setHeader("pragma","no-cache");

  1. 位元組流亂碼的解決辦法
    1. 修改瀏覽解析編碼
    2. 告訴瀏覽器,使用的是UTF-8,同時位元組流輸出的byte數組也為UTF-8(如下三種)
    3. 直接寫出字元標籤 response.getOutputStream().write();è不推薦使用

      response.getOutputStream().write("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">".getBytes());

      response.getOutputStream().write("中文亂碼".getBytes("UTF-8"));

      頭標籤在使用時,有的瀏覽器會直接識別為字串顯示出來

    4. 通過設定頭標籤 response.setHeader();

      response.setHeader("Content-type", "text/html;charset=UTF-8");

      response.getOutputStream().write("中文亂碼".getBytes("UTF-8"));

    5. 直接設定標籤內的值 response.setContentType(); è推薦使用

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

      response.getOutputStream().write("中文亂碼".getBytes("UTF-8"));

  2. 字元流亂碼的解決辦法

    a、直接寫出標籤在字元流中不能使用,剩下的都可以使用,推薦如下!

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

    response.getWriter().print("中文亂碼d");

  1. HTTPServletRequest
    1. 請求的方法
  • java.lang.String getContextPath() 應用程式名稱
  • ????java.lang.String getMethod() 擷取請求方式,擷取的是大寫
  • ????java.lang.String getQueryStrin() 擷取請求的資料
  • ????java.lang.StringBufferget RequestURL() 當前項目的訪問路徑,推薦使用ServletContext的getRealPath替代
  • ????java.lang.String getRequestURI() 擷取不包括主機名稱連接埠號碼的訪問路徑
  • ????getRealPath() 擷取絕對路徑
  • ????getProtocol() 擷取協議和版本
  • ????getRemoteAddr() 擷取來訪者的IP地址
  1. 擷取表單資料(最常用的方法)
    1. 根據表單的name擷取表單的value request.getParameter(""); 擷取單個value
    2. 根據表單的name擷取表單的value數組 request.getParameterValues("") 一般用於checkbox和radio
    3. 擷取表單中的所有的name request.getParameterNames();
    4. 擷取重複的表單name 只能擷取到檢索到的第一個value
    5. checkbox和radio如果不選擇,用戶端不發送資料到伺服器
  2. 擷取資料的內省機制(反射原理)

User user = new User();

????????//表單提交了多少資料過來?

????????Enumeration<String> e = request.getParameterNames();

????????while(e.hasMoreElements()) {

????????????//擷取每一個表單的name

????????????String fieldName = e.nextElement();

????????????String fieldValue = request.getParameter(fieldName);

????????????

????????????try {

????????????????//內省

????????????????PropertyDescriptor pd = new PropertyDescriptor(fieldName,User.class);

????????????????Method m = pd.getWriteMethod();//得到指定欄位的set方法

????????????????m.invoke(user, fieldValue);

????????????} catch (Exception e1) {

????????????????// TODO Auto-generated catch block

????????????????e1.printStackTrace();

????????????}

????????????

????}

  1. 一種簡單的對象封裝方法(使用Apache的開源類庫)

    BeanUtils.populate(user, request.getParameterMap());

    import org.apache.commons.beanutils.BeanUtils;

    可以自動得到Key和value並封裝到給定的對象之中,原理是內省

  2. 中文亂碼問題

    post方式:request.setCharacterEncoding("UTF-8"); 擷取資料前

    get方式: username=new String(username.getBytes("ISO-8859-1"),"UTF-8");使用打回原形的方式

    原因:get是直接在地址欄傳遞的,請求前已經編碼過,預設認為中文是不安全的,預設ISO-8859-1

    所以需要打回原形實現碼

    使用getInpuStream()時必須使用post,用於檔案的上傳!

  3. 跳轉和包含

    //跳轉request.getRequestDispatcher("/register.html").forward(request, response);

    //包含request.getRequestDispatcher("/register.html").include(request, response);

HttpServletResponse與HttpServletRequest

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.