日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java-Web 编码和路径

發布時間:2025/3/20 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的超鏈接和表單如下:

絕對路徑:<a href="http://localhost:8080/hello2/index.html">鏈接1</a> 客戶端路徑:<a href="/hello3/pages/index.html">鏈接2</a> 相對路徑:<a href="index.html">鏈接3</a> <hr/> 絕對路徑: <form action="http://localhost:8080/hello2/index.html"><input type="submit" value="表單1"/> </form> 客戶端路徑: <form action="/hello2/index.html"><input type="submit" value="表單2"/> </form> 相對路徑: <form action="index.html"><input type="submit" value="表單3"/> </form>

????????? 鏈接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 编码和路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。