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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java-Web 编码和路径

發(fā)布時間:2025/3/20 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java-Web 编码和路径 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、響應(yīng)編碼

????????當(dāng)使用response.getWriter()來向客戶端發(fā)送字符數(shù)據(jù)時,如果在之前沒有設(shè)置編碼,那么默認(rèn)使用iso-8859-1,因?yàn)閕so-8859-1不支持中文,一定亂碼。
????????在使用response.getWriter()之前可以使用response.setCharaceterEncoding()來設(shè)置字符流的編碼為gbk或utf-8,當(dāng)然我們通常會選擇utf-8。這樣使用response.getWriter()發(fā)送的字符就是使用utf-8編碼的。但還是會出現(xiàn)亂碼!因?yàn)闉g覽器并不知道服務(wù)器發(fā)送過來的是什么編碼的數(shù)據(jù)!這時瀏覽器會使用gbk來解碼,所以亂碼!
????????在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")來設(shè)置響應(yīng)頭,通知瀏覽器服務(wù)器這邊使用的是utf-8編碼,而且在調(diào)用setHeader()后,還會自動執(zhí)行setCharacterEncding()方法。這樣瀏覽器會使用utf-8解碼,所以就不會亂碼了!
????????在靜態(tài)頁面中,使用<meta>來設(shè)置content-type響應(yīng)頭,例如:

????? ? 還有一種簡寫方式 ?setContentType("text/html;charset=utf-8);? ?推薦使用這種方法

????????????<meta http-equiv="content-type" content="text/html; charset=UTF-8">


二、請求編碼

????????* 客戶端發(fā)送給服務(wù)器的請求參數(shù)是什么編碼:

    客戶端首先要打開一個頁面,然后在頁面中提交表單或點(diǎn)擊超鏈接!在請求這個頁面時,服務(wù)器響應(yīng)的編碼是什么,那么客戶端發(fā)送請求時的編碼就是什么。
   ?* 服務(wù)器端默認(rèn)使用什么編碼來解碼參數(shù):
    服務(wù)器端默認(rèn)使用ISO-8859-1來解碼!所以這一定會出現(xiàn)亂碼的!因?yàn)閕so不支持中文!
   ?* 請求編碼處理分為兩種:GET和POST:GET請求參數(shù)不在請求體中,而POST請求參數(shù)在請求體中,所以它們的處理方式是不同的!
   ?????* 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");

    ????> 在獲取參數(shù)之前調(diào)用request.setCharacterEncoding("utf-8");


三、URL編碼

????????表單的類型:Content-Type: application/x-www-form-urlencoded,就是把中文轉(zhuǎn)換成%后面跟隨兩位的16進(jìn)制。

  為什么要用它:在客戶端和服務(wù)器之間傳遞中文時需要把它轉(zhuǎn)換成網(wǎng)絡(luò)適合的方式。
  * 它不是字符編碼!
  * 它是用來在客戶端與服務(wù)器之間傳遞參數(shù)用的一種方式!
  * URL編碼需要先指定一種字符編碼,把字符串解碼后,得到byte[],然后把小于0的字節(jié)+256,再轉(zhuǎn)換成16進(jìn)制。前面再添加一個%。
  * POST請求默認(rèn)就使用URL編碼!tomcat會自動使用URL解碼!
  * URL編碼:String username = URLEncoder.encode(username, "utf-8");
  * URL解碼:String username = URLDecoder.decode(username, "utf-8");
  最后我們需要把鏈接中的中文參數(shù),使用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:以“/”開頭,相對主機(jī),與當(dāng)前a.html的主機(jī)相同,即最終訪問的頁面為http://localhost:8080/hello2/index.html;

????????鏈接3和表單3:不以“/”開頭,相對當(dāng)前頁面的路徑,即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");} }

????????假設(shè)訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet

   ?因?yàn)槁窂揭浴?”開頭,所以相對當(dāng)前主機(jī),即 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");} }

????????假設(shè)訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet

????????因?yàn)槁窂讲灰浴?”開頭,所以相對當(dāng)前路徑,即http://localhost:8080/hello/servlet/index.html

? ? 2.服務(wù)器端路徑

????????服務(wù)器端路徑必須是相對路徑,不能是絕對路徑。但相對路徑有兩種形式:

????????????以“/”開頭;

????????????不以“/”開頭;

????????其中請求轉(zhuǎn)發(fā)、請求包含都是服務(wù)器端路徑,服務(wù)器端路徑與客戶端路徑的區(qū)別是:

????????????客戶端路徑以“/”開頭:相對當(dāng)前主機(jī);

????????????服務(wù)器端路徑以“/”開頭:相對當(dāng)前應(yīng)用;

請求轉(zhuǎn)發(fā)1:

public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getRequestDispatcher("/BServlet").forward(request, response);} }

????????假設(shè)訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet

????????因?yàn)槁窂揭浴?”開頭,所以相對當(dāng)前應(yīng)用,即http://localhost:8080/hello/BServlet。

請求轉(zhuǎn)發(fā)2:

public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getRequestDispatcher("BServlet").forward(request, response);} }

????????假設(shè)訪問AServlet的路徑為:http://localhost:8080/hello/servlet/AServlet

????????因?yàn)槁窂讲灰浴?”開頭,所以相對當(dāng)前應(yīng)用,即http://localhost:8080/hello/servlet/BServlet。

? ? 3.<url-pattern>路徑

????????<url-pattern>必須使用“/”開頭,并且相對的是當(dāng)前應(yīng)用。

? ? 4.ServletContext獲取資源

????????必須是相對路徑,可以“/”開頭,也可以不使用“/”開頭,但無論是否使用“/”開頭都是相對當(dāng)前應(yīng)用路徑。

????????例如在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是相同的結(jié)果: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()方法獲取資源時以“/”開頭,那么相對的是當(dāng)前類路徑,即/hello/WEB-INF/classes/a.txt文件;

????????fun2()方法獲取資源時沒有以“/”開頭,那么相對當(dāng)前Demo.class所在路徑,因?yàn)镈emo類在cn.yfy包下,所以資源路徑為:/hello/WEB-INF/classes/cn/yfy/a.txt。

? ? 6.ClassLoader獲取資源

????????ClassLoader獲取資源也必須是相對路徑,可以“/”開頭,也可以不使用“/”開頭。但無論是否以“/”開頭,資源都是相對當(dāng)前類路徑。

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

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Java-Web 编码和路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。