<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 本文是servlet的入門篇,主要簡單介紹下http協議 ### 1.什么是http _ 1.http協議:_ 1. 復雜解釋: ??http(超文本傳輸協議)是一個基于請求與響應模式的、無狀態的、應用層的協議,常基于TCP的連接方式,HTTP1.1版本中給出一種持續連接的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。 2. 簡單說: ??對瀏覽器客戶端 和 服務器端 之間數據傳輸的格式規范. 3. 協議版本: ??http1.0:當前瀏覽器客戶端與服務器端建立連接之后,只能發送一次請求,一次請求之后連接關閉。 ??http1.1:當前瀏覽器客戶端與服務器端建立連接之后,可以在一次連接中發送多次請求。(基本都使用1.1) ????請求一次資源就會出現一次請求,比如三張圖片,就有三次請求,如果圖片是一樣 的就只有一次請求; **2.查看http協議的工具:** 1. chrome(谷歌)瀏覽器查看: ??右鍵點擊查看元素(inspect element),點擊network即可; ![1](https://box.kancloud.cn/2016-04-13_570e00111c5e6.png "") 2. 火狐: ??使用火狐的firebug插件(右鍵->firebug->網絡) 3. 使用系統自帶的telnet工具(遠程訪問工具) a)telnet localhost 8080 訪問tomcat服務器 b)ctrl+] 回車.可以看到回顯 c)輸入請求內容,回車,即可查看到服務器響應信息。 ~~~ GET / HTTP/1.1 Host: www.baidu.com ~~~ ### 2.http協議內容: 1. 請求: ~~~ GET /HttpSer HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 ~~~ 1. 響應: ~~~ HTTP/1.1 302 Found Server: Apache-Coyote/1.1 Location: http://localhost:8080/HttpSer/ Transfer-Encoding: chunked Date: Fri, 09 Oct 2015 08:55:42 GMT ~~~ 下面將對這兩個協議進行介紹: ### 3.http請求介紹: ~~~ GET /HttpSer HTTP/1.1-請求行 Host: localhost:8080--請求頭;有多個key-value組成 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 --可選,實體內容; ~~~ ### 請求行介紹 GET /HttpSer HTTP/1.1 -請求行 **1.請求資源的URL和URI比較:** ????URL: 統一資源定位符。[http://localhost:8080/HttpSer/index.html](http://localhost:8080/HttpSer/index.html)。只能定位互聯網資源。是URI 的子集. ????URI: 統一資源標記符。/HttpSer/index.html。用于標記任何資源。可以是本地文件系統,局域網的資源(//192.168.14.10/HttpSer/index.html),可以是互聯網。 **2.請求方式:** ????常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE ????常用的請求方式: GET(有將實體信息放在瀏覽器地址欄) 和 POST(隱藏實體內容) **3. servlet獲得請求行信息:_** ~~~ /*** 1.1請求行的獲得*/ System.out.println("請求方式:"+request.getMethod());//獲得提交方式 System.out.println("請求URI:"+request.getRequestURI());//獲得uri System.out.println("請求url:"+request.getRequestURL());//獲得url System.out.println("獲得協議:"+request.getProtocol());//獲得所用協議 ##輸出: 請求方式:GET 請求URI:/HttpSer/TestRequst 請求url:http://localhost:8080/HttpSer/TestRequst 獲得協議:HTTP/1.1 ~~~ **4. 測試提交方式:** 新建立web工程,建立TestMethod.html文件: ![4](https://box.kancloud.cn/2016-04-13_570e00114d4e7.png "") 建立Servlet類TestMethod.java修改get和post方法: ~~~ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("get 方式提交"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("post 方式提交"); } ~~~ 運行tomcat可以看淡提交方式的不同:瀏覽器地址欄顯示的不同,servlet調用的方法也不同; get提交 ![2](https://box.kancloud.cn/2016-04-13_570e00116ac98.png "") post提交 ![3](https://box.kancloud.cn/2016-04-13_570e001180467.png "") **經過對比請求可以發現** get方式在請求行多了?name=wang&pass=123 post多了實體內容:Content-Type: application/x-www-form-urlencoded 請求內容同如下: ~~~ #get方式: GET /HttpSer/TestMethod?name=wang&pass=123 HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36 Referer: http://localhost:8080/HttpSer/testMethod.html Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 #post方式: POST /HttpSer/TestMethod HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 18 Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Origin: http://localhost:8080 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36 Content-Type: application/x-www-form-urlencoded Referer: http://localhost:8080/HttpSer/testMethod.html Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8 ~~~ ### 請求頭介紹: **1. 請求頭介紹:** 請求頭主要包含一些有用信息: 1.Host: localhost:8080主機地址和端口 2.Connection: keep-alive 連接方式 3.User-Agent:瀏覽器的一些信息 4.Referer:來訪頁面 5.Content:實體內容;post才有 **2. servlet獲得請求頭主要的方法:** request.getHeader(“Host”));通過建獲得相應請求的內容; Enumeration headerNames = request.getHeaderNames();獲得請求頭所有的鍵值 **3. 演示如下:** 修改doget方法 ~~~ /*** 設置參數查詢的編碼 *該方法只能對請求實體內容的數據編碼起作用。POST提交的數據在實體內容中,所以該方法對POST方法有效! *GET方法的參數放在URI后面,所以對GET方式無效!!! */ request.setCharacterEncoding("utf-8"); /** * 1.1請求行的獲得 */ System.out.println("請求方式:"+request.getMethod()); System.out.println("請求URI:"+request.getRequestURI()); System.out.println("請求url:"+request.getRequestURL()); System.out.println("獲得協議:"+request.getProtocol()); /** * 1.2請求頭的獲得 */ //通過鍵獲得請求頭的內容 System.out.println("獲得host:"+request.getHeader("Host")); System.out.println("獲得瀏覽器的User-Agent:"+request.getHeader("User-Agent")); //通過迭代器迭代,獲得鍵 在取鍵值 Enumeration<String> headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String key=headerNames.nextElement(); System.out.println(key+":"+request.getHeader(key)); } /** * 得到請求實體內容 * 比如:實體為name=peace&pass=1234 */ ServletInputStream in = request.getInputStream(); byte[] buf=new byte[1024]; int len=0; while((len=in.read(buf))!=-1){ String str=new String(buf,0,len); System.out.println(str); } #輸出如下: 請求方式:GET 請求URI:/HttpSer/TestRequst 請求url:http://localhost:8080/HttpSer/TestRequst 獲得協議:HTTP/1.1 獲得host:localhost:8080 獲得瀏覽器的User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36 host:localhost:8080 connection:keep-alive accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 upgrade-insecure-requests:1 user-agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36 referer:http://localhost:8080/HttpSer/testMethod.html accept-encoding:gzip, deflate, sdch accept-language:en-US,en;q=0.8 cookie:CNZZDATA1255712369=1133597550-1443969628-%7C1443969628//此去后面文章會介紹; ~~~ ### 輸入參數的介紹: **1. 輸入參數:** 輸入參數: 對于get來說就是跟在url后面的內容 /TestParam?name=”peace”&password=”sisi” ;name=”peace”&password=”sisi”這就是輸入參數 對于post來說就是實體內容,不可見 **2. Servlet中獲得輸入參數的方法:** String name=request.getParameter(“name”);獲得對應輸入參數名字的內容 Enumeration params = request.getParameterNames();獲得所有輸入參數的名字,返回一個迭代器 String[] hobits = request.getParameterValues(names);如果對應名字的內容是一個數組,使用這個方法獲得,比如復選框 **3. 演示如下:** 1.建立testParam.html ![5](https://box.kancloud.cn/2016-04-13_570e0011971bd.png "") 2.修改doget方法: ~~~ /** * 設置參數查詢的編碼 * 該方法只能對請求實體內容的數據編碼起作用。POST提交的數據在實體內容中,所以該方法對POST方法有效! * GET方法的參數放在URI后面,所以對GET方式無效!!! */ request.setCharacterEncoding("utf-8"); //獲得所有的方式 System.out.println("提交方式:"+request.getMethod()); //獲得輸入參數 String name=request.getParameter("name"); String pass=request.getParameter("password"); System.out.println("name:"+name+",pass:"+pass); /*此去為如果get方式提交出現亂碼,使用; * if("GET".equals(request.getMethod())){ password = new String(password.getBytes("iso-8859-1"),"utf-8"); }*/ System.out.println(">>>>>>>>>>>>>>>>>"); //獲得所有輸入參數的名字 Enumeration<String> params = request.getParameterNames(); while(params.hasMoreElements()) { String names=params.nextElement(); //如果是復選框,使用getParameterValues(names);方法 if("hobit".equals(names)){ System.out.println(names+":"); String[] hobits = request.getParameterValues(names); for(String s:hobits) System.out.print(s+","); System.out.println(); } else{ System.out.println(names+":"+request.getParameter(names)); } } ##輸出結果如下: 提交方式:POST name:peace,pass:124 >>>>>>>>>>>>>>>>> name:peace password:124 gender:男 籍貫:湖南 hobit: 籃球,足球, info:一條小鯊魚peace id:001 ~~~ ### 4.http響應介紹: ~~~ HTTP/1.1 302 Found ---響應行 Server: Apache-Coyote/1.1 ---響應頭, 有多個key-value組成 Location: http://localhost:8080/HttpSer/ Transfer-Encoding: chunked Date: Fri, 09 Oct 2015 08:55:42 GMT ~~~ ### 響應行介紹: HTTP/1.1 302 Found **1基本介紹** 1.HTTP/1.1:采用的協議 2.302:狀態碼 常見的狀態: 200 : 表示請求處理完成并完美返回 302: 表示請求需要進一步細化。 404: 表示客戶訪問的資源找不到。 500: 表示服務器的資源發送錯誤。(服務器內部錯誤) 3.Found:狀態描述,常見ok和found **2. servlet中的方法** tomcat服務器把請求信息封裝到HttpServletRequest對象,且把響應信息封裝到HttpServletResponse response.setStatus(404);//設置狀態碼 response.sendError(404);// 設置錯誤頁面 **3. 演示如下** ~~~ response.setStatus(404);//錯誤代碼,沒有反應 response.sendError(404);// 發送404的狀態碼+404的錯誤頁面 #輸出結果: HTTP/1.1 404 Not Found Server: Apache-Coyote/1.1 Content-Type: text/html;charset=ISO-8859-1 Content-Language: en Content-Length: 949 Date: Sat, 10 Oct 2015 13:09:53 GMT ~~~ ![6](https://box.kancloud.cn/2016-04-13_570e0011baa56.png "") ### 響應頭介紹: **1. 基本介紹** 格式:Server: Apache-Coyote/1.1;Server響應頭名,后面的是響應值; 頭里面主要包括:Server,服務器類型;Location:跳轉網頁地址 Conten*:實體內容 **2. servlet中的方法** response.setHeader(“server”, “JBoss”);修改對應頭名的內容; **3. 演示如下** ~~~ //修改服務器類型 response.setHeader("server", "JBoss"); /** * 修改實體內容 */ //瀏覽器能直接看到的內容就是實體內容 response.getWriter().println("hello peace");//字符內容,常用 //response.getOutputStream().write("hello world".getBytes());//字節內容。不能兩個同時使用 #輸出如下: HTTP/1.1 200 OK server: JBoss Content-Length: 12 Date: Sat, 10 Oct 2015 13:11:04 GMTHTTP/1.1 200 OK server: JBoss Content-Length: 12 Date: Sat, 10 Oct 2015 13:11:04 GMT ~~~ ![7](https://box.kancloud.cn/2016-04-13_570e0011d36e0.png "") ### 幾個常要的方面介紹 1. 測試重定向:與轉發不同 ~~~ /** * 測試重定向:與轉發不同 * 使用請求重定向:發送一個302狀態嗎+location的響應 * */ response.setStatus(302);//設置狀態碼 response.setHeader("location", "/HttpSer/adv.html");//設置重定向頁面 //簡單寫法 // response.sendRedirect("/HttpSer/adv.html"); #輸出: HTTP/1.1 302 Found Server: Apache-Coyote/1.1 location: /HttpSer/adv.html Content-Length: 12 Date: Sat, 10 Oct 2015 13:15:26 GMT ~~~ 1. 定時刷新: ~~~ /** * 定時刷新 * 原理:瀏覽器解析refresh頭,得到頭之后重新請求當前資源 * */ //response.setHeader("refresh", "1");//每隔1秒刷新一次 //隔5秒后轉到另外的資源 //response.setHeader("refresh", "5;url=/HttpSer/adv.html"); #輸出: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 refresh: 1 Content-Length: 12 Date: Sat, 10 Oct 2015 13:18:39 GMT HTTP/1.1 200 OK Server: Apache-Coyote/1.1 refresh: 5;url=/HttpSer/adv.html Content-Length: 12 Date: Sat, 10 Oct 2015 13:21:29 GMT ~~~ 1. 設置編碼: ~~~ response.setCharacterEncoding("utf-8"); /** * 1. 服務器發送給瀏覽器的數據類型和內容編碼 */ //response.setHeader("content-type", "text/html");//設置內容為html //response.setContentType("text/html;charset=utf-8");//和上面代碼等價。推薦使用此方法 //response.setContentType("text/xml");//設置內容為xml //response.setContentType("image/png");//設置內容為圖片 ~~~ 1. 設置為下載方式打開文件: ~~~ /** * 設置以下載方式打開文件 */ //response.setHeader("Content-Disposition", "attachment; filename="+file.getName()); ~~~ 1. 發送硬盤圖片給瀏覽器: ~~~ File file = new File("/media/peace/本地磁盤/andriod/1.png");//WebContent /** * 發送圖片 */ FileInputStream in = new FileInputStream(file); byte[] buf = new byte[1024]; int len = 0; //把圖片內容寫出到瀏覽器 while( (len=in.read(buf))!=-1 ){ response.getOutputStream().write(buf, 0, len); } ~~~ 來自一條小鯊魚(rlovep.com) [代碼下載](https://github.com/wpeace1212/BlogSource/tree/master/HttpSer/src/com/rlovep/Http)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看