javaweb入門筆記(4)-request和response

javaweb入門筆記(4)-request和response

標籤: javawebhtml


[TOC]java


API:git

response

輸出數據

程序以什麼碼錶輸出,就必定要控制瀏覽器以什麼碼錶打開。可有以下兩種寫法:github

  • response.setHeader("Content-type","text/html;charset=UTF-8")
  • response.setContentType("text/html;charset=UTF-8")(默認調用setHeadersetCharacterEncoding)

把分號;錯寫成逗號,,瀏覽器會提示下載web

用html技術的<meta>標籤能夠模擬一個http響應頭, <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>apache

response可用setCharacterEncoding方法設置碼錶。字符流輸出:PrintWritet->response->瀏覽器,response->瀏覽器默認使用iso-8859編碼設計模式

文件下載

使用ServerContextgetRealPath方法,再InputStreamOutputStreamapi

若是下載文件是中文名爲中文,則文件名須要通過url編碼URLEncoder.encode瀏覽器

隨機圖片

使用BufferedImage在內存生成圖片,再使用ImageIO輸出。緩存

畫圖使用Graphics,旋轉使用Graphics2D

漢字的區間:\u4e00-\u9fa5

刷新和緩存

  • 刷新:通常不在servlet里加refresh頭,而是在jsp加入<meta>頭模擬。
  • 緩存:加入expires頭,當前時間+要緩存的時長

請求重定向

重定向:設置狀態碼和location頭便可,或者直接使用responsesendRedirect方法。向服務器兩次請求。瀏覽器會改變地址欄,通常適用於登陸、購物等場景。

轉發:則是調用ServletContex對象的getRequestDispatcher方法,再調用forward方法。向服務器一次請求,瀏覽器地址欄不變。

一些細節:

  • getOutputStreamgetWriter方法跟別用於輸出二進制數據、輸出文本數據的ServletOutputStreamPrintwriter對象,這兩個方法相互排斥,只能調用其中一個,不然拋IllegalStateException異常。
  • response的輸出流會本身關閉。Servletservice方法結束後,Servlet引擎會檢查並調用close方法關閉該輸出流對象。

request

  • URI:標識某個資源
  • URL:標識互聯網上某個資源

一些方法

  • getRequestURI用於權限攔截,訪問統計
  • getRemoteAddr用於獲得客戶機IP地址
  • getMethod獲得客戶機請求方式

requst對象獲取數據的四種方式

  • getParameter
  • getParameterNames
  • getParameterValues
  • getParameterMap(可結合JavaBean使用)

(getInputStream用於文件上傳)

中文亂碼

url後面若是有中文數據,須要編碼後再提交

表單提交的數據使用的碼錶和該頁面的碼錶一致,而getParameter方法默認使用ISO-8859碼錶。

解決:

  • 對於post提交的數據,在獲取數據前要使用request對象的setCharacterEncoding設置碼錶。
  • 對於get提交的數據,只能手工解決。先對數據調用getBytes("ISO-8859-1")獲取二進制字節,再用特定碼錶構建字符串。
  • 超鏈提交的中文,解決辦法同get提交的數據。

也能夠經過改服務器配置來解決亂碼問題,但通常不建議使用。

  • URIEncoding:改tomcat的配置文件conf/server.xml的鏈接器<Connector>中的URIEncoding屬性
  • useBodyEncodingForURI:將conf/server.xml的鏈接器<Connector>中的useBodyEncodingForURI置爲true

請求轉發

應用場景:MVC設計模式

  • model : javabean;
  • view : jsp;
  • controller : servlet

使用request域對象把數據帶給轉發資源。調用request對象的getRequestDispatcher方法,再調用forward方法。一次請求,瀏覽器地址欄不變。

forward一些細節

  • 不能在關閉輸出流後再調用轉發,也不能調用兩次,不然會拋出異常。
  • 跳轉以前會清空response中的數據。即數據只是寫入到緩衝區而沒真正輸出到客戶端,則可調用forward方法,原來寫入到緩衝區的內容被清空,但響應頭字段信息保持。

include方法能夠用於包含一些公共頁面(通常不在servlet中包含)

地址的寫法

以斜槓/開頭。若是是給服務器用,則/表明當前web應用;若是給瀏覽器用,則/表明網站。

例子:目錄結構以下

mail---------------------------Web應用所在目錄
           |----form1.html
           |----WEB-INF目錄
                    |---------classes目錄
                    |---------lib目錄
                    |---------web.xml
  1. request.getRequestDispatcher("/form1.html")
  2. response.sendRedirect("mail/form1.html")
  3. this.getServletContext().getRealPath("/form1.html")
  4. this.getServletContext().getResourceAsStream("/form1.html")
  5. <a href="/mail/form1.html">
  6. <form action="/mail/form1.html">

其中,1,3,4是給服務器用;2,5,6是瀏覽器用

防盜鏈

讀取referer請求頭,不合要求則重定向。


做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索