javaWeb學習之Servlet
1.javaWeb初識
Web概述:web(World Wide Web)即全球廣域網,也稱為全球資訊網,它是一種基於超文字和HTTP的、全球性的、動態互動的、跨平臺的分散式圖形資訊系統。是建立在Internet上的一種網路服務,為瀏覽者在Internet上查詢和瀏覽資訊提供了圖形化的、易於訪問的直觀介面,其中的文件及超級連結將Internet上的資訊節點組織成一個互為關聯的網狀結構。
JavaWEB概述:使用java語言進行WEB開發
軟體架構
1.CS結構的軟體
- CS:Client/Server客戶端和服務端,這種軟體往往需要安裝,比如QQ,迅雷等
- 優缺點:
- 優點
- 可以減輕伺服器端壓力,將部分程式碼寫到客戶端
- 介面很美觀
- 優點
- 缺點:
- 一旦伺服器更新,客戶端也需要更新
- 分散式開發比較弱
2.BS結構的軟體
- BS:Brower/Server瀏覽器和伺服器,這種軟體不需要安裝,只需要通過瀏覽器就可以訪問
- 優缺點:
- 優點:
- 伺服器一旦更新,不需要更新客戶端,因為客戶端就是瀏覽器
- 比較強的分散式能力
- 缺點(現在的缺點也已經得到解決了,所以BS架構將是大勢所趨啊):
- 伺服器端壓力比較大
- 介面效果不如CS結構軟體
- 優點:
WEB伺服器
伺服器包括:
- 硬體:其實就是一臺電腦(這臺電腦配置要求很高)
- 軟體:需要在這臺電腦上安裝web伺服器的軟體
常見的WEB伺服器(軟體)
- Tomcat:Apache組織提供的一個開源的免費的web伺服器,滿足了javaEE的Serlet和JSP的規範
- WebSphere:IBM公司開發的一個收費的大型web伺服器,滿足了javaEE開發的所有規範
- WebLogic:BEA公司開發的一個收費的大型web伺服器,滿足了javaEE開發的所有規範
- IIS:應用在.NET平臺上
- Apache:應用在PHP平臺上
WEB開發中的資源
1.靜態web資源
- HTML
- CSS
- JS
2.動態web資源
- Servlet、JSP
- PHP
- ASP
2.Tomcat
tomcat概述:Apache組織提供的一個開源的免費的web伺服器,滿足了javaEE的Serlet和JSP的規範
Tomcat的安裝
1.下載Tomcat
2.解壓
解壓後的目錄如下:
3.啟動tomcat
進入tomcat的bin目錄下,找到startup.bat,然後雙擊startup.bat即可啟動tomcat(注意這裡雙擊startup.bat會開啟一個dos視窗,不要關閉它,關閉則會關閉tomcat伺服器)
4.測試tomcat是否啟動成功
在瀏覽器的位址列上輸入:http://localhost:8080/
如果有以上畫面,則代表啟動成功。
Tomcat安裝的注意事項
1.Tomcat執行需要依賴java環境,也就是說你的電腦上必須安裝了JDK才能啟動Tomcat成功,因為在Tomcat啟動的時候需要使用JRE的環境,必須配置JAVA_HOME環境變數,如果沒有配置JAVA_HOME環境變數,那麼伺服器在啟動的時候就會一閃然後關閉
2.Tomcat埠號衝突問題:如果電腦上的其他程式佔用了Tomcat的預設埠8080或者你啟動了兩次Tomcat,則也會導致Tomcat啟動不了(8080埠被佔用的概率很小,但是80埠被佔用的概率就很大,因為80埠是http的預設埠),如果遇到了埠衝突問題,怎麼辦呢?
解決方法:
- 將佔用埠的程式結束掉
- 輸入命令檢視各個程式佔用的埠號:netstat -ano
- 找到誰佔用了之後,在工作管理員中結束這個程式即可(工作管理員的詳細資訊裡操作結束)
- 改變自身埠號
- 進入到tomcat目錄下的conf目錄下的server.xml檔案裡進行修改
- 這個server.xml檔案裡的 <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />就配置了我們的預設埠號資訊
Tomcat的目錄結構介紹
- bin:存放一些二進位制檔案(命令檔案),如開啟和關閉tomcat
- conf:存放一些配置檔案
- lib:存放tomcat所需要的jar包
- logs:tomcat伺服器日誌檔案
- temp:tomcat執行產生臨時檔案
- webapps:需要釋出的專案需要放在webapps下
- work:jsp翻譯成servlet產生的程式碼
動態web資源的目錄結構
website
|------靜態頁面(HTML、CSS、JS、圖片)
|------JSP頁面
|------WEB-INF
|-----web.xml (必須的)
|-----classes (可選的)
|-----lib (可選的)
Tomcat專案釋出的方式
1.方式一:直接將專案複製到tomcat/webapps下
2.方式二:在Tomcat/conf/server.xml配置tomcat的虛擬路徑(官方不推薦)
- 在server.xml檔案的Host標籤裡插入:<Context path="/虛擬的路徑" docBase="/真實專案的路徑"></Context>進行配置
3.方式三:在tomcat/conf/Catalina/localhost/下配置tomcat的虛擬路徑(推薦使用)
- 在tomcat/conf/Catalina/localhost目錄下建立一個xml檔案,在這個xml檔案中進行以下配置:<Context docBase="/真實專案的路徑"></Context>,而我們的這個xml的名字就是我們訪問真實專案的虛擬路徑
3.HTTP協議
概述:規定了瀏覽器和伺服器端的資料互動的格式
HTTP的特性
-
基於請求和響應模式
- 必須要先有請求,後有響應
- 請求和響應必須成對出現 -
簡單快捷
- 因為傳送請求的時候只需要傳送請求方式和請求路徑即可
HTTP之請求部分
1.請求行
- 請求方式:請求方式有很多種,常用的是get和post
- 請求路徑
- 協議版本
2.請求頭
- 請求頭的一般格式都是一個key對應一個value的,也有一個key對應多個value的情況
- 記住一些請求頭
- Referer:代表網頁的來源(防盜鏈)
- User-Agent:獲得客戶端的瀏覽器型別
3.請求體
- 只有post請求方式才有請求體,而且請求體是post方式的請求引數
HTTP之響應部分
1.響應行
- 協議版本
- 狀態碼
- 200:代表響應成功
- 302:需要進行重定向操作
- 304:需要查詢本地快取
- 404:請求資源不存在
- 500:伺服器內部錯誤
2.響應頭
- 通常是一個key對應一個value的,也有一個key對應多個value的情況
- 記住一些響應頭
- Location:重定向的路徑
- Refresh:定時重新整理
- Content-Disposition:檔案下載的時候使用
3.響應體
- 就是顯示到瀏覽器頁面上的程式碼
4.Servlet
概述:Servlet其實就是一個執行在web伺服器上的小的程式,用於處理從web客戶端傳送的請求,並且對請求做出響應
Servlet的使用
1.編寫一個java類實現Servlet的介面
程式碼實現:
//web_text(web project專案)下的src目錄下的HelloWorld.java
package cn.luyi.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloWorld implements Servlet{
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("HelloWorld");
}
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
2.配置Servlet
配置web.xml:
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>web_text</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Servlet -->
<servlet>
<!-- 配置Servlet的名稱 -->
<servlet-name>HelloWorld</servlet-name>
<!-- 配置實現Servlet類的全路徑 -->
<servlet-class>cn.luyi.servlet.HelloWorld</servlet-class>
</servlet>
<!-- 配置Servlet的對映 -->
<servlet-mapping>
<!-- 配置Servlet的名稱 -->
<servlet-name>HelloWorld</servlet-name>
<!-- 配置訪問路徑 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
3.測試:通過http://localhost:8080/web_text/hello路徑訪問,頁面上顯示HelloWorld則成功啦
Servlet的實現關係
前面我們通過實現Servlet介面來實現往頁面輸出東西,但是我們只用到了一個方法service,卻要重寫所有的Servlet介面的方法,我們開發中是不會這麼做的,所以,我們接下來就要學習通過繼承Servlet的實現類來達到我們的目的
Servlet的兩個實現類:GenericServlet類和HttpSrvlet類
- GenericServlet類:通用的Servlet,是一個與協議無關的Servlet
- HttpServlet類:Http專用的Servlet
通常我們編寫一個Servlet都會讓他繼承HttpServlet並重寫service方法,在service方法內部根據請求方式不同執行不同的doXxx的方法,如get請求方式則執行doGet方法,所以我們往往繼承了HttpServlet之後不需要重寫service方法,只需要重寫doGet和doPost等方法即可
以上我們說的建立一個Servlet的方式,其實Eclise已經給我們提供了建立一個這樣的Servlet的快捷方式(右鍵src目錄下的包名,然後新建一個Servlet即可,它會自動配置web.xml檔案)
Servlet的生命週期
Servlet生命週期:Servlet物件從建立到銷燬的過程
Servlet中有init, service,destory方法,這幾個方法稱為是Servlet生命週期相關的方法
Servlet是在第一次被訪問的時候會被例項化,只要servlet一被例項化,那麼Servlet中的service方法就會執行,當servlet伺服器移除或者伺服器關閉的時候Servlet物件被銷燬,裡面的destory方法就會執行,然後垃圾回收就會將其回收
程式碼演示Servlet的生命週期:
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo2 implements Servlet{
public void init(ServletConfig config) throws ServletException {
System.out.println("init方法");
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service方法");
}
public void destroy() {
System.out.println("destory方法");
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
//瀏覽器一訪問,就會執行init方法和service方法,停掉伺服器,就會執行destory方法
Servlet的啟動時配置
Serclet物件是第一次被訪問的時候被建立的,init方法就會執行,假設在init方法中做了一些比較耗時的操作(比如載入一些配置檔案並解析花費了3秒鐘),第一個使用者第一次訪問這個Servlet的時候,就需要等待3秒鐘,那麼,我們如何使得第一個使用者在第一次訪問的時候不需要花費這麼長時間呢?
這就需要我們對Servlet進行啟動時載入配置了,現在,我們通過一個配置將Servlet的例項化的過程放在伺服器啟動的時候(讓伺服器啟動的時候建立Servlet的物件),如果現在這樣做,那麼之前花費的時間就會在伺服器啟動的時候一起花費掉了,對於使用者來講就不需要額外花費這個時間了,那麼如何進行啟動時配置呢?
我們的這個配置是在web.xml中進行配置的,哪個servlet就在哪個servlet標籤中進行啟動時配置,這個配置標籤為load-on-startup,這個標籤中放一個整數,整數越小,代表啟動時載入的優先順序越高,一般配置在2以上,因為我們的Tomcat有一個預設Servlet的優先順序為1,我們不能比他高
web.xml進行Servlet啟動時載入配置:
<!-- 配置Servlet -->
<servlet>
<!-- 配置Servlet的名稱 -->
<servlet-name>HelloWorld</servlet-name>
<!-- 配置實現Servlet類的全路徑 -->
<servlet-class>cn.luyi.servlet.HelloWorld</servlet-class>
<!-- 配置該Servlet啟動時載入,優先順序為2-->
<load-on-startup>2</load-on-startup>
</servlet>
<!-- 配置Servlet的對映 -->
<servlet-mapping>
<!-- 配置Servlet的名稱 -->
<servlet-name>HelloWorld</servlet-name>
<!-- 配置訪問路徑 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet的訪問路徑
web.xml中url-pattern標籤的配置的三種方式:
- 完全路徑匹配:以/開始,比如/ServletDemo1
- 目錄匹配:以/開始,以/*結束,比如/aaa/*
- 副檔名匹配:不能以/開始,以*開始,比如*.jsp
以上的這三種方式的訪問優先順序為:完全路徑匹配>目錄匹配>副檔名匹配
ServletConfig物件
概述:ServletConfig物件用來獲得Servlet的相關配置的物件
獲得ServletConfig物件:
- getServletConfig()
獲得Servlet的初始化引數方法:
- String getInitParamter(String name):獲得指定初始化引數值
- Enumeration getInitParameteNames():獲得所有初始化引數的名稱
獲得Servlet的名稱
- getServletName()
程式碼示例:
//web.xml關於Servlet的配置:
<servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>cn.luyi.servlet.ServletDemo4</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>luyi</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/ServletDemo4</url-pattern>
</servlet-mapping>
//ServletDemo4.java
package cn.luyi.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲得ServletConfig物件
ServletConfig config = this.getServletConfig();
//獲得初始化引數
String username = config.getInitParameter("username");
String password = config.getInitParameter("password");
System.out.println(username + "---" + password);
//獲得所有初始化引數的名稱
Enumeration names = config.getInitParameterNames();
while(names.hasMoreElements()){
String name = (String) names.nextElement();
String value = config.getInitParameter(name);
System.out.println(name + "---" + value);
}
//獲得Servlet的名稱
String servletName = config.getServletName();
System.out.println(servletName);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ServletContext物件
概述ServletContext:Servlet的上下文物件,ServletContext物件對Servlet之前和之後的內容都知道,這個物件一個web專案只有一個,在伺服器啟動的時候為每個web專案建立一個單獨的ServletContext物件
ServletContext物件的兩個作用:
1.用來獲取web專案資訊
- 獲取ServletContext物件:getServletContext()
- 獲取檔案的MIME型別:getMimeType(檔名)
- 獲取路徑工程名:getRealPath()
- 獲取全域性初始化引數:
- String getInitParamter(String name):獲得指定初始化引數值
- Enumeration getInitParameteNames():獲得所有初始化引數的名稱
程式碼示例:
//web.xml
<context-param>
<param-name>username</param-name>
<param-value>luyi</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>cn.luyi.servlet.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>/ServletDemo5</url-pattern>
</servlet-mapping>
//ServletDemo5.java
package cn.luyi.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo5 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲得檔案的MIME型別
ServletContext servletContext = this.getServletContext();
String mimeType = servletContext.getMimeType("aa.txt");
System.out.println(mimeType);
//獲得當前工程名的絕對路徑
String path = servletContext.getRealPath("/");
System.out.println(path);
//獲得全域性初始化引數
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password");
System.out.println(username + "---" + password);
Enumeration names = servletContext.getInitParameterNames();
while(names.hasMoreElements()){
String name = (String) names.nextElement();
String value = servletContext.getInitParameter(name);
System.out.println(name + "---" + value);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.讀取Web專案下的檔案
之前使用IO流就可以讀取檔案(java專案中),現在是web專案,web專案需要釋出到Tomcat下才能獲得訪問的,獲取web專案下的檔案如果使用傳統的IO就會出現問題(原因:路徑中使用的是相對路徑,相對的是JRE環境)
- InputStream getResourceAsStream("/檔名"):讀取檔名並作為輸入流
ServletContext作為域物件:ServletContext是在伺服器啟動的時候為每個web專案單獨建立一個ServletContext物件,當web專案從伺服器中移除,或者是關閉伺服器的時候,ServletContext物件會被銷燬,向ServletContext中儲存的資料一直存在(當伺服器關閉的時候,ServletContext物件被銷燬,然後裡面資料才會失效),作用範圍為整個web應用
使用ServletContext作為域物件的方法:
- setAttribute(String name, Object object):存入資料
- getAttribute(String name):取出資料
- removetAttribute(String name):移除資料
5.Response物件
概述:開發的軟體是B/S結構的軟體,可以通過瀏覽器訪問伺服器的軟體,從瀏覽器輸入一個地址訪問伺服器,這個過程就是請求。伺服器接收到請求,需要進行處理,處理之後需要將處理結果顯示回瀏覽器,這個過程就是響應了
Response物件的API
1.關於響應行的方法:
- setStatus(int sc):設定狀態碼
2.關於響應頭的方法:
- setDateHeader(String name, long date):設定響應頭的時間部分
- setHeader(String name, String value):設定響應頭的一個個鍵值對資訊(值為String型別),如果我們要設定的這個鍵已經存在,則重寫設定為給定的這個值
- setIntHeader(String name, int value):設定響應頭的一個個鍵值對資訊(值為int型別),如果我們要設定的這個鍵已經存在,則重寫設定為給定的這個值
- addDateHeader(String name, long date):設定響應頭的時間部分
- addHeader(String name, String value):設定響應頭的一個個鍵值對資訊(值為String型別),如果我們要設定的這個鍵已經存在,則追加這個值
- addIntHeader(String name, int value):設定響應頭的一個個鍵值對資訊(值為int型別),如果我們要設定的這個鍵已經存在,則追加這個值
3.關於響應體的方法:
- getOutputStream():獲取位元組流
- getWriter():獲取字元流
4.Response的其他API
- sendRedirect(String location):重定向方法
- setContentType(String type):設定瀏覽器開啟頁面時採用的字符集
- addCookie(Cookie cookie):伺服器向瀏覽器回寫Cookie的方法
Response物件的API的使用程式碼示例:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*//設定狀態碼為302
response.setStatus(302);
//實現頁面跳轉
response.sendRedirect("/web_text/hello");*/
//定時重新整理
//設定字符集以使得相容中文
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("5秒後跳轉");
//設定五秒後跳轉到/hello頁面
response.setHeader("Refresh", "5;url=/web_text/hello");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Response物件響應的中文亂碼處理
1.使用位元組流的話,可能出現亂碼,只要保證位元組陣列和瀏覽器預設開啟時採用的字符集一樣就不會出現亂碼了
2.使用字元流的話,一定會出現亂碼,原因是字元流是有緩衝區的,response獲得字元流,response設計預設的緩衝區編碼是IOS-8859-1,這個字符集不支援中文,解決這種情況導致的亂碼就需要設定response獲得字元流緩衝區的編碼和設定瀏覽器預設開啟時採用的字符集一致即可
設定的程式碼:
//設定瀏覽器預設開啟時採用的字符集
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//設定response獲得字元流的緩衝區的編碼
response.setCharacterEncoding("UTF-8");
//以上兩條程式碼可簡寫為:
response.setContentType("text/html;charset=UTF-8");
6.Request物件
概述:開發的軟體都是B/S結構軟體,從瀏覽器向伺服器提交一些資料時,將這些內容進行封裝,封裝成了一個請求物件
Request物件的API:
1.獲得客戶機資訊
- getMethod():獲得請求方式
- getQueryString():獲取請求路徑後得提交引數的字串
- String getRequestURI():獲取請求路徑的URI
- StringBuffer getRequestURL():獲取請求路徑的URL
- String getRemoteAddr():返回客戶端的ip地址
2.獲得請求頭的方法:
- String getHeader(String name):獲得一個key對應一個value的請求頭
- Enumeration getHeaders(String name):獲得一個key對應多個value的請求頭
3.獲得請求引數的方法
- String getParameter():獲取提交的引數(一個name對應一個value)
- String[] getParameterValues():獲取提交的值(一個name對應多個value)
- Map getParameterMap():獲取提交的引數,將提交的名稱和對應的值存入到一個Map集合中去
4.Request作為域物件的方法
- void setAttribute(String name,Object o):向request域中存資料
- Object getAttribute(String name):向request域中取資料
- void removeAttribute(String name):從request域中移除資料
Request物件的API程式碼示例:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取請求方式
System.out.println("請求方式" + request.getMethod());
//獲得客戶機的IP地址
System.out.println("客戶機ip地址" + request.getRemoteAddr());
//獲取請求引數的字串(所有的引數和值)
System.out.println("請求引數" + request.getQueryString());
//獲得請求頭資訊
System.out.println("瀏覽器型別為:" + request.getHeader("User-Agent"));
//獲得請求引數的值
System.out.println("name引數的值為:" + request.getParameter("name"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
request物件接收請求引數為中文亂碼處理
1.post請求:post方式提交的資料是在請求體中,request物件接收到資料之後,放入request的緩衝區,緩衝區就有編碼(預設ISO-8859-1)
解決方案:將request的緩衝區的編碼修改為UTF-8即可
修改程式碼:request.setCharacterEncoding("UTF-8")
2.get請求:get方式提交的資料在請求行的url後面,在位址列上其實就已經進行了一次URL的編碼了
解決方案:將存入request緩衝區的值以ISO-8859-1的方式獲取到,以UTF-8的方式進行解碼
修改程式碼:
//將存入request緩衝區的值以ISO-8859-1的方式獲取到
String encode = URLEncoder.encode(引數, "ISO-8859-1");
//以UTF-8的方式進行解碼
String decode = URLDecoder.decode(encode, "UTF-8");
//以上程式碼可以簡寫為:
String value = new String(引數.getBytes("ISO-8859-1"), "UTF-8");