request和response
request功能
1.接受用戶的參數
2.轉發
3.作爲域對象
接受用戶的請求參數:
/**
* 接受用戶的請求參數
*/
@WebServlet("/one")
public class OneServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 設置請求編碼格式
request.setCharacterEncoding("utf-8");
// 獲取姓名
String name = request.getParameter("name");
System.out.println("姓名:"+name);
// 獲取愛好
String[] hobbys = request.getParameterValues("hobby");
for (String str : hobbys) {
System.out.println(str);
}
// 獲取性別
String sex = request.getParameter("sex");
System.out.println("性別:"+sex);
// 獲取所有的參數名稱
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String str = names.nextElement();
System.out.println("name:"+str);
}
System.out.println("----------------");
// 獲取map類型的數據
Map<String, String[]> map = request.getParameterMap();
// 遍歷map
for (java.util.Map.Entry<String, String[]> entry : map.entrySet()) {
System.out.println(entry.getKey()+":");
String[] value = entry.getValue();
for (String val : value) {
System.out.println(val+" ");
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
亂碼問題
/**
* 處理請求的亂碼問題
*/
@WebServlet("/two")
public class TwoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// tomcat8版本之後默認編碼格式不是iso-8859-1,是utf-8,不需要對get請求設置編碼格式,老版本需要設置編碼格式
String name = request.getParameter("username");
System.out.println(name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 方式一
// 目前的編碼格式:iso-8859-1
/*String name = request.getParameter("username");
// 得到iso-8859-1對應的字節數組
byte[] bytes = name.getBytes("iso-8859-1");
// 根據utf-8進行編碼得到新的字符串
String name1 = new String(bytes , "utf-8");
System.out.println("old:"+name);
System.out.println("new:"+name1);*/
// 方式二(可以使用過濾器設置編碼格式)
// 注意:一定要在參數獲取之前設置請求的編碼格式
request.setCharacterEncoding("utf-8");
String name = request.getParameter("username");
System.out.println(name);
}
}
獲取請求行信息
package com.hpe.request;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;
/**
* 獲取請求行信息
*/
@WebServlet("/three")
public class ThreeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 1.得到請求類型GET
out.println("請求類型:"+request.getMethod()+"</br>");
// 2.得到/servlet03/three
out.println("請求地址:"+request.getRequestURI()+"</br>");
// 3.得到http://localhost:8080/servlet03/three
out.println("請求地址:"+request.getRequestURL()+"</br>");
// 4.得到/servlet03
out.println("請求地址:"+request.getContextPath()+"</br>");
// 5.得到/three
out.println("請求地址:"+request.getServletPath()+"</br>");
// 6.得到請求的ip地址(客戶端的IP地址)0:0:0:0:0:0:0:1
out.println("請求IP:"+request.getRemoteAddr()+"</br>");
// 7.以String的形式返回指定請求頭的值;如果不存在,則返回null
// 得到localhost:8080
out.println("請求主機:"+request.getHeader("Host")+"</br>");
// 得到http://localhost:8080/servlet03/index.html
out.println("請求來源:"+request.getHeader("Referer")+"</br>");
// 8.得到null
out.println("信息類型:"+request.getContentType()+"</br>");
// 如何獲取當前web應用程序的地址
// 9.得到協議名稱
String http = request.getScheme();
// 10.得到主句
String host = request.getServerName();
// 11.得到端口號
int port= request.getServerPort();
// 12.得到上下文路徑
String path = request.getContextPath();
// 拼接打印
String basePath = http + "://" + host + ":" + port + path +"/";
out.print(basePath+"</br>");
// 如何解決相對路徑問題:使用絕對路徑
// <base href="http://localhost:8080/servlet03/">下面的所有超鏈接地址都是基於base
}
}
應用案例:
@WebServlet("/four")
public class FourServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 獲取請求來源
String referer = request.getHeader("Referer");
if(referer == null){
out.write("返回首頁,<a href='index.html'>首頁</a>");
}else{
out.write("<img src='"+request.getContextPath()+"/imgs/1.jpg'/>");
}
}
}
請求轉發
概念
一個web資源收到客戶端請求後,通過服務器去調用另外一個web資源進行處理。
特點
1.只發送一次請求,發送請求後請求對象會保存
2.是server內部轉發,地址欄不變
3.共享request中的數據:request對象始終是同一個
4.路徑:/代表當前web應用程序路徑
5.只能轉發到當前的web應用資源
request實現共享數據
1.Request對象同時也是一個域對象(Map容器),在實現轉發時把request對象帶給其他web資源。
2.要求:必須滿足是同一個請求
3.實現:request.setAttribute(name,value)
4.獲取:request。getAttribute(name)
代碼實例
轉發的Servlet:
package com.hpe.forward;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;
@WebServlet("/forward")
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("請求轉發...");
// 請求轉發到TestServlet
// 請求轉發步驟
// 1.使用request中的getRequestDispatcher(轉發的地址),得到的是RequestDispatcher實例
// 2.執行轉發(調用requestDispatcher中的forward方法進行請求轉發)
//RequestDispatcher requestDispatcher = request.getRequestDispatcher("test");
//requestDispatcher.forward(request, response);
// /解決相對路徑位置
// 共享數據 ServletContext,HTTPSession,HttpServletRequest
request.setAttribute("name", "jack");
// 獲取屬性
System.out.println("name:"+request.getAttribute("name"));
request.getRequestDispatcher("/test").forward(request, response);
//也可以請求轉發到一個頁面
//request.getRequestDispatcher("/index.html").forward(request, response);
// 轉發結束
System.out.println("轉發結束");
}
}
轉發到的Servlet:
package com.hpe.forward;
import java.io.IOException;
/**
* 測試請求轉發和重定向
*/
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet...");
String name = (String)request.getAttribute("name");
System.out.println("name:"+name);
}
}
response
概念
HttpServletResponse是ServletResponsede 子接口,用於封裝Http響應信息。
功能
1.設置響應內容
字符流輸出
字節流輸出
例子:
package com.hpe.response;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* response
*/
@WebServlet("/five")
public class FiveServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通過設置響應頭控制瀏覽器以utf-8的編碼顯示數據
//response.setHeader("Content-type", "text/html;charset=utf-8");// application/json
response.setContentType("text/html;charset=utf-8");
// 設置響應內容(字節流和字符流輸出是互斥的,使用了一個另一個則不能使用)
// 字符流輸出
//PrintWriter out = response.getWriter();
//out.print("BATJ:百度、阿里、騰訊、京東");
// 字節流輸出
ServletOutputStream out2 = response.getOutputStream();
out2.write("SEO:搜索引擎優化".getBytes("utf-8"));
}
}
2.設置響應頭
3.重定向
重定向
概念
請求發送回瀏覽器,由瀏覽器再重新向服務器自動發送一個請求
實現方式
調用response對象的sendRedirect(url)
特點
1.發送了兩次請求,前一次的請求不會保留,會有兩個request和response對象
2.地址欄會發生變化
3.不會共享request中的數據
4.路徑:重定向路徑以/開頭,/代表當前web站點的路徑
5.可以重定向到任何url的資源
6.狀態碼爲302
請求轉發和重定向的區別
1.請求轉發只發送一次請求,重定向發送了兩次請求
2.請求轉發地址欄是初次訪問的地址,重定向地址欄開始是初次訪問地址,後來是最後響應的地址
3.請求轉發的request對象始終是同一個,重定向中的request對象是兩個
4.請求轉發只能轉發給當前的web應用,重定向可以定向到任何資源
5.請求轉發中的/代表當前web應用的路徑http://localhost:8080/servlet03,而重定向中的/代表web站點的路徑http://localhost:8080
6.請求轉發是一種server行爲(服務器內部轉發),重定向是一種client行爲(交給客戶端重新自動發起請求)
例子:
package com.hpe.redirect;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("請求重定向...");
// 設置請求域的對象
request.setAttribute("name", "tom");
System.out.println(request.getAttribute("name"));
// 請求重定向
// 1.使用test是相對路徑,相對於當前的servlet。http://localhost:8080/servlet03/a/test
// 2.使用/test是絕對路徑,相對於當前tomcat站點。http://localhost:8080/test
// 3.拼接路徑如下
String contextPath = request.getContextPath();
// 可以在重定向的時候傳遞數據
int id = 1;
response.sendRedirect(contextPath+"/test?id="+id);
//response.sendRedirect("http://www.baidu.com");
}
}