基本概念:html
在調用service以前,服務器(tomcat)會將用戶的請求封裝到request對象裏面,同時也會建立一個response對象,經過service方法傳遞到咱們的Servlet中。咱們作必定的處理,將處理的結果,封裝到response中,再將response對象返回給服務器,服務器響應到客戶端。java
response:web
1.設置響應體
瀏覽器
(1) 向客戶端響應文本緩存
PrintWriter response.getWriter();tomcat
writer.write("文本") --- 向response的緩衝區中去寫服務器
注:向客戶端回寫中文數據時 亂碼 post
亂碼的緣由:response緩衝區的編碼方式是iso8859-1(西歐編碼方式)性能
解決方式:response.setContentType("text/html;charset=UTF-8");編碼
上面的代碼完成兩個設置:(1) 設置response緩衝區的編碼---response.setCharacterEncoding("UTF-8");
(2) 設置瀏覽器的解碼方式----response.setHeader("Content-Type", "text/html;charset=UTF-8")
(2) 向客戶端響應字節
ServletOutputStream out = response.getOutputStream();
2.response的一些細節:
(1) response.getOutputStream()得到的流不用手動關閉 --- web容器幫咱們關閉
(2) 重定向:302+Location
response有一個重定向的方法:sendRedirect(url)
(3) response有兩個獲取流的方法 getWriter和getOutputStream 不能一塊兒使用
(4) response緩存區有大小 默認是8k 經過setBufferSize設置大小 只能向大設置
(5) resposse緩衝區的內容被真正的刷出 不能再進行轉發和重定向
什麼狀況下 緩衝區的內容被刷出?
response.flushBuffer();
緩衝區的內容寫滿了
轉發或重定向也會刷出緩衝區的內容
(6) 當進行轉發或重定向時 以前寫到response緩衝區的內容會被清空 可是寫入的頭仍然有效
servlet01.java
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 設置響應頭 response.setHeader("vw", "v6"); // 追加響應頭 response.addHeader("mu", "77"); // 字符流響應正文,瀏覽器顯示信息 /* * PrintWriter writer = response.getWriter(); writer.print("thanks"); */ // 字節流響應正文(字節流和字符流不能同時使用) ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("hello".getBytes()); } }
request:
get提交方式有哪些?
直接輸入網址 、超連接<a href=""> 、<from method="get"> 、重定向 、定時跳轉 、 js的location.href
post提交方式哪些?
<form method="post">
URI與URL?
URI:全球資源標識符 能夠是絕對的,也能夠是相對的。相對的都是uri /day10_205/request1 C:\\
URL: 全球資源定位符 URL是一種具體的URI http://
一、獲取請求行的數據
得到請求方式:getMethod();
得到訪問資源:getRequestURI/getRequestURL
獲取訪問的資源後面參數的字符串:getRequestQuery()
獲取客戶機的ip:getRemoteAddr()
獲取web應用的名稱:getContextPath()
二、獲取請求頭的信息
getHeader(頭的名稱)根據指定頭名稱獲取值
getHeaderNames()獲取全部的請求頭的名字
getHeaders()獲取指定的頭的全部值
getIntHeader()
getDateHeader()
Referer:該資源的訪問來源 ----- 防盜鏈
三、獲取請求體的數據
(1) request.getParameter(name的屬性值);
(2)request.getParameterNames(); 能夠獲得全部的要提交標籤的name的屬性值。
(3)request.getParameterValues("hobby"); 多個屬性值 。例如checkbox 。
注:
request亂碼問題
緣由:
咱們提交信息 =====》瀏覽器會按照utf-8的形式給咱們傳遞的信息 進行編碼======》
服務器按照iso-8859-1的的形式給咱們解碼。
解決:
亂碼中文 ==== 》按照iso-8859-1編碼===》 按照utf-8的格式進行解碼===》咱們提交信息
post請求的亂碼解決方案
request.setCharacterEncoding("utf-8");
get,post請求通用解決方式
String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");
4. request對象是一個域對象
可見範圍:一次請求鏈中
setAttribute(String name,Object value)
getAttrbute(String name)
removeAttrbute(String name)
5. 請求轉發
request.getRequestDispatcher().forward(request,response);
轉發和重定向的區別?
(1) 轉發地址不變 客戶端一次請求 重定向地址變化 兩次請求
(2) 轉發是web應用內部的行爲 重定向是客戶端從新訪問的
(3) 轉發的性能高一些
6.請求包含:
request.getRequestDispatcher().include(request,response);
RequestServlet01.java
import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RequestServlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解決request請求亂碼問題(post提交數據) request.setCharacterEncoding("utf-8"); /*亂碼緣由: * 咱們提交信息 =====》瀏覽器會按照utf-8的形式給咱們傳遞的信息 進行編碼======》 服務器按照iso-8859-1的的形式給咱們解碼。 * get請求方式解決亂碼方法 String str1 = new String (name.getBytes("iso-8859-1"),"utf-8"); */ //獲得用戶的請求方式 String method = request.getMethod(); //獲得協議 String protocol = request.getProtocol(); //獲得資源路徑 String requestURI = request.getRequestURI(); System.out.println(method+"--"+protocol+"--"+requestURI); System.out.println("------------------------------------------------------"); /* * POST--HTTP/1.1--/Response_Request_test/RequestServlet01 */ //協議的請求資源路徑 StringBuffer requestURL = request.getRequestURL(); //獲得用戶的地址 String remoteAddr = request.getRemoteAddr(); //獲得資源名或者項目名 String contextPath = request.getContextPath(); System.out.println(requestURL+"--"+remoteAddr+"--"+contextPath); /* * http://localhost:8080/Response_Request_test/RequestServlet01 * --0:0:0:0:0:0:0:1 * --/Response_Request_test */ System.out.println("--------------------------------------"); //根據請求頭中相應的name得到相應的請求值 String header = request.getHeader("Host"); System.out.println(header); /* * localhost:8080 */ //獲得全部請求頭的name值 Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String nextElement = (String)headerNames.nextElement(); System.out.println(nextElement); } /* accept referer accept-language user-agent content-type accept-encoding host content-length connection cache-control */ //根據用戶表單的name得到相應的值 String username = request.getParameter("username"); System.out.println("username:"+username); /*username:123*/ //獲得咱們提交表單的標籤name的屬性值 Enumeration<String> names = request.getParameterNames(); while(names.hasMoreElements()){ String key = names.nextElement(); System.out.println(key); } /* username userpass */ //將用戶的請求的信息放到map裏面 Map<String,String[]> map = request.getParameterMap(); String usrname = map.get("username")[0]; System.out.println(usrname); /* 123*/ //獲得一個屬性值對應多個的值(checkbox) String[] values = request.getParameterValues("hobby"); for(String value:values){ System.out.println(value); } /* soccer basketball table tennis */ } }