請求響應及重定向

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");
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章