javaweb入门笔记(4)-request和response
2019獨角獸企業重金招聘Python工程師標準>>>
javaweb入門筆記(4)-request和response
標簽: javaweb
[TOC]
API:
- Interface HttpServletResponse
- Interface HttpServletRequest
response
輸出數據
程序以什么碼表輸出,就一定要控制瀏覽器以什么碼表打開。可有如下兩種寫法:
- response.setHeader("Content-type","text/html;charset=UTF-8")
- response.setContentType("text/html;charset=UTF-8")(默認調用setHeader和setCharacterEncoding)
把分號;錯寫成逗號,,瀏覽器會提示下載
用html技術的<meta>標簽可以模擬一個http響應頭,<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
response可用setCharacterEncoding方法設置碼表。字符流輸出:PrintWritet->response->瀏覽器,response->瀏覽器默認使用iso-8859編碼
文件下載
使用ServerContext的getRealPath方法,再InputStream和OutputStream
如果下載文件是中文名為中文,則文件名需要經過url編碼URLEncoder.encode
隨機圖片
使用BufferedImage在內存生成圖片,再使用ImageIO輸出。
畫圖使用Graphics,旋轉使用Graphics2D
漢字的區間:\u4e00-\u9fa5
刷新和緩存
- 刷新:一般不在servlet里加refresh頭,而是在jsp加入<meta>頭模擬。
- 緩存:加入expires頭,當前時間+要緩存的時長
請求重定向
重定向:設置狀態碼和location頭即可,或者直接使用response的sendRedirect方法。向服務器兩次請求。瀏覽器會改變地址欄,一般適用于登錄、購物等場景。
轉發:則是調用ServletContex對象的getRequestDispatcher方法,再調用forward方法。向服務器一次請求,瀏覽器地址欄不變。
一些細節:
- getOutputStream和getWriter方法跟別用于輸出二進制數據、輸出文本數據的ServletOutputStream、Printwriter對象,這兩個方法相互排斥,只能調用其中一個,否則拋IllegalStateException異常。
- response的輸出流會自己關閉。Servlet的service方法結束后,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,3,4是給服務器用;2,5,6是瀏覽器用
防盜鏈
讀取referer請求頭,不合要求則重定向。
作者@brianway更多文章:個人網站 | CSDN | oschina
轉載于:https://my.oschina.net/brianway/blog/614215
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的javaweb入门笔记(4)-request和response的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz 定时器任务调度
- 下一篇: 关于位置搜索的文章