Java-Web 编码和路径
一、響應編碼
????????當使用response.getWriter()來向客戶端發送字符數據時,如果在之前沒有設置編碼,那么默認使用iso-8859-1,因為iso-8859-1不支持中文,一定亂碼。
????????在使用response.getWriter()之前可以使用response.setCharaceterEncoding()來設置字符流的編碼為gbk或utf-8,當然我們通常會選擇utf-8。這樣使用response.getWriter()發送的字符就是使用utf-8編碼的。但還是會出現亂碼!因為瀏覽器并不知道服務器發送過來的是什么編碼的數據!這時瀏覽器會使用gbk來解碼,所以亂碼!
????????在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")來設置響應頭,通知瀏覽器服務器這邊使用的是utf-8編碼,而且在調用setHeader()后,還會自動執行setCharacterEncding()方法。這樣瀏覽器會使用utf-8解碼,所以就不會亂碼了!
????????在靜態頁面中,使用<meta>來設置content-type響應頭,例如:
????? ? 還有一種簡寫方式 ?setContentType("text/html;charset=utf-8);? ?推薦使用這種方法
????????????<meta http-equiv="content-type" content="text/html; charset=UTF-8">
二、請求編碼
????????* 客戶端發送給服務器的請求參數是什么編碼:
客戶端首先要打開一個頁面,然后在頁面中提交表單或點擊超鏈接!在請求這個頁面時,服務器響應的編碼是什么,那么客戶端發送請求時的編碼就是什么。
?* 服務器端默認使用什么編碼來解碼參數:
服務器端默認使用ISO-8859-1來解碼!所以這一定會出現亂碼的!因為iso不支持中文!
?* 請求編碼處理分為兩種:GET和POST:GET請求參數不在請求體中,而POST請求參數在請求體中,所以它們的處理方式是不同的!
?????* GET請求編碼處理:
????> String username = new String(request.getParameter("iso-8859-1"), "utf-8");
????> 在server.xml中配置URIEncoding=utf-8?????* POST請求編碼處理:
????> String username = new String(request.getParameter("iso-8859-1"), "utf-8");
????> 在獲取參數之前調用request.setCharacterEncoding("utf-8");
三、URL編碼
????????表單的類型:Content-Type: application/x-www-form-urlencoded,就是把中文轉換成%后面跟隨兩位的16進制。
為什么要用它:在客戶端和服務器之間傳遞中文時需要把它轉換成網絡適合的方式。
* 它不是字符編碼!
* 它是用來在客戶端與服務器之間傳遞參數用的一種方式!
* URL編碼需要先指定一種字符編碼,把字符串解碼后,得到byte[],然后把小于0的字節+256,再轉換成16進制。前面再添加一個%。
* POST請求默認就使用URL編碼!tomcat會自動使用URL解碼!
* URL編碼:String username = URLEncoder.encode(username, "utf-8");
* URL解碼:String username = URLDecoder.decode(username, "utf-8");
最后我們需要把鏈接中的中文參數,使用url來編碼!
四、路徑
? ? 1.客戶端路徑
????????超鏈接、表單、重定向都是客戶端路徑,客戶端路徑可以分為三種方式:????????????????絕對路徑;
????????????????以“/”開頭的相對路徑;
????????????????不以“/”開頭的相對路徑;
例如:http://localhost:8080/hello1/pages/a.html中的超鏈接和表單如下:
????????? 鏈接1和表單1:沒什么可說的,絕對路徑;
??????鏈接2和表單2:以“/”開頭,相對主機,與當前a.html的主機相同,即最終訪問的頁面為http://localhost:8080/hello2/index.html;
????????鏈接3和表單3:不以“/”開頭,相對當前頁面的路徑,即a.html所有路徑,即最終訪問的路徑為:http://localhost:8080/hello1/pages/index.html;
重定向1:
public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.sendRedirect("/hello/index.html");} }????????假設訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet
?因為路徑以“/”開頭,所以相對當前主機,即 http://localhost:8080/hello/index.html。重定向2:
public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.sendRedirect("index.html");} }????????假設訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet
????????因為路徑不以“/”開頭,所以相對當前路徑,即http://localhost:8080/hello/servlet/index.html
? ? 2.服務器端路徑
????????服務器端路徑必須是相對路徑,不能是絕對路徑。但相對路徑有兩種形式:
????????????以“/”開頭;
????????????不以“/”開頭;
????????其中請求轉發、請求包含都是服務器端路徑,服務器端路徑與客戶端路徑的區別是:
????????????客戶端路徑以“/”開頭:相對當前主機;
????????????服務器端路徑以“/”開頭:相對當前應用;
請求轉發1:
public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getRequestDispatcher("/BServlet").forward(request, response);} }????????假設訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet
????????因為路徑以“/”開頭,所以相對當前應用,即http://localhost:8080/hello/BServlet。
請求轉發2:
public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getRequestDispatcher("BServlet").forward(request, response);} }????????假設訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet
????????因為路徑不以“/”開頭,所以相對當前應用,即http://localhost:8080/hello/servlet/BServlet。
? ? 3.<url-pattern>路徑
????????<url-pattern>必須使用“/”開頭,并且相對的是當前應用。
? ? 4.ServletContext獲取資源
????????必須是相對路徑,可以“/”開頭,也可以不使用“/”開頭,但無論是否使用“/”開頭都是相對當前應用路徑。
????????例如在AServlet中獲取資源,AServlet的路徑路徑為:http://localhost:8080/hello/servlet/AServlet:
public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String path1 = this.getServletContext().getRealPath("a.txt");String path2 = this.getServletContext().getRealPath("/a.txt");System.out.println(path1);System.out.println(path2);} }????????path1和path2是相同的結果:http://localhost:8080/hello/a.txt
????5.Class獲取資源
????????Class獲取資源也必須是相對路徑,可以“/”開頭,也可以不使用“/”開頭。
package cn.yfy;import java.io.InputStream;public class Demo {public void fun1() {InputStream in = Demo.class.getResourceAsStream("/a.txt");}public void fun2() {InputStream in = Demo.class.getResourceAsStream("a.txt");} }????????fun1()方法獲取資源時以“/”開頭,那么相對的是當前類路徑,即/hello/WEB-INF/classes/a.txt文件;
????????fun2()方法獲取資源時沒有以“/”開頭,那么相對當前Demo.class所在路徑,因為Demo類在cn.yfy包下,所以資源路徑為:/hello/WEB-INF/classes/cn/yfy/a.txt。
? ? 6.ClassLoader獲取資源
????????ClassLoader獲取資源也必須是相對路徑,可以“/”開頭,也可以不使用“/”開頭。但無論是否以“/”開頭,資源都是相對當前類路徑。
public class Demo {public void fun1() {InputStream in = Demo.class.getClassLoader().getResourceAsStream("/a.txt");}public void fun2() {InputStream in = Demo.class.getClassLoader().getResourceAsStream("a.txt");} }????????fun1()和fun2()方法的資源都是相對類路徑,即classes目錄,即/hello/WEB-INF/classes/a.txt
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java-Web 编码和路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java-Web Response
- 下一篇: java美元兑换,(Java实现) 美元