標籤:
- 編碼問題的原則
- 英文字母不會出現亂碼問題,所有的編碼錶都包含Unicode編碼錶
- 字元流=位元組流+編碼錶 使用tomcat伺服器時,預設使用tomcat預設編碼錶
- tomcat6.x tomcat7.x 預設全是ISO-8859-1 tomcat8.x預設使用UTF-8
- 在jsp編程中,getByte();預設使用ANSI 本地編碼錶GBK
- getByte()中有帶有編碼錶的構造,可以指定字元通過什麼編碼返回byte數組
- HTTPServletResponse
- getOutputStream和getWriter()不能同時使用????
這兩個流不需要我們手動釋放,Servlet會自動釋放????
response.getOutputStream().write("中文亂碼".getBytes());
response.getWriter().print("中文亂碼");
- 常用標題
- 重新整理 response.setHeader("Refresh", "1");一秒鐘重新整理一次
- 設定指定時間重新導向 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檔案 ");
- 緩衝時間 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");
- 位元組流亂碼的解決辦法
- 修改瀏覽解析編碼
- 告訴瀏覽器,使用的是UTF-8,同時位元組流輸出的byte數組也為UTF-8(如下三種)
- 直接寫出字元標籤 response.getOutputStream().write();è不推薦使用
response.getOutputStream().write("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">".getBytes());
response.getOutputStream().write("中文亂碼".getBytes("UTF-8"));
頭標籤在使用時,有的瀏覽器會直接識別為字串顯示出來
- 通過設定頭標籤 response.setHeader();
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.getOutputStream().write("中文亂碼".getBytes("UTF-8"));
- 直接設定標籤內的值 response.setContentType(); è推薦使用
response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write("中文亂碼".getBytes("UTF-8"));
- 字元流亂碼的解決辦法
a、直接寫出標籤在字元流中不能使用,剩下的都可以使用,推薦如下!
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("中文亂碼d");
- HTTPServletRequest
- 請求的方法
- 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地址
- 擷取表單資料(最常用的方法)
- 根據表單的name擷取表單的value request.getParameter(""); 擷取單個value
- 根據表單的name擷取表單的value數組 request.getParameterValues("") 一般用於checkbox和radio
- 擷取表單中的所有的name request.getParameterNames();
- 擷取重複的表單name 只能擷取到檢索到的第一個value
- checkbox和radio如果不選擇,用戶端不發送資料到伺服器
- 擷取資料的內省機制(反射原理)
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();
????????????}
????????????
????}
- 一種簡單的對象封裝方法(使用Apache的開源類庫)
BeanUtils.populate(user, request.getParameterMap());
import org.apache.commons.beanutils.BeanUtils;
可以自動得到Key和value並封裝到給定的對象之中,原理是內省
- 中文亂碼問題
post方式:request.setCharacterEncoding("UTF-8"); 擷取資料前
get方式: username=new String(username.getBytes("ISO-8859-1"),"UTF-8");使用打回原形的方式
原因:get是直接在地址欄傳遞的,請求前已經編碼過,預設認為中文是不安全的,預設ISO-8859-1
所以需要打回原形實現碼
使用getInpuStream()時必須使用post,用於檔案的上傳!
- 跳轉和包含
//跳轉request.getRequestDispatcher("/register.html").forward(request, response);
//包含request.getRequestDispatcher("/register.html").include(request, response);
HttpServletResponse與HttpServletRequest