HttpServletRequest
HttpServletRequest對象代表用戶端的請求,當用戶端通過HTTP協議訪問伺服器時,HTTP要求標頭中的所有資訊都封裝在這個對象中,開發人員通過這個對象的方法,可以獲得客戶這些資訊
request常用方法
l獲得客戶機資訊
•getRequestURL方法返回用戶端發出請求時的完整URL。
•getRequestURI方法返回請求行中的資源名部分。
•getQueryString 方法返回請求行中的參數部分。
•getRemoteAddr方法返回傳出請求的客戶機的IP地址
•getRemoteHost方法返回傳出請求的客戶機的完整主機名稱
•getRemotePort方法返回客戶機所使用的網路連接埠號碼
•getLocalAddr方法返回WEB伺服器的IP地址。
•getLocalName方法返回WEB伺服器的主機名稱
•getMethod得到客戶機請求方式
URL和URI的關係:URI是URL的父類,URI描述資源,URL描述互連網的資源
String url = request.getRequestURL().toString();
System.out.println(url);
System.out.println(request.getRequestURI());
System.out.println(request.getQueryString());
System.out.println(request.getRemoteAddr());
System.out.println(request.getRemoteHost());
System.out.println(request.getRemotePort());
System.out.println(request.getMethod());
Request常用方法
l獲得客戶機要求標頭
•getHead(name)方法
•getHeaders(String name)方法
•getHeaderNames方法
l獲得客戶機請求參數(用戶端提交的資料)
•getParameter(name)方法
•getParameterValues(String name)方法
•getParameterNames方法
•getParameterMap方法 //
•getInputStream
擷取客戶機帶過來的資料
String username = request.getParameter("username");
System.out.println(username);
System.out.println("----------------------");
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String name =(String) e.nextElement();
String value = request.getParameter(name);
System.out.println(name + "=" + value);
}
System.out.println("----------------------");
String values[] =request.getParameterValues("username");
for(int i=0;values!=null &&i<values.length;i++){
System.out.println(values[i]);
}
System.out.println("----------------------");
//http://localhost:8080/day05/servlet/RequestDemo3?username=aaa&username=bbb&password=123
Map<String,String[]>map = request.getParameterMap();
Set<Map.Entry<String,String[]>> set = map.entrySet();
for(Map.Entry<String,String[]> entry : set){
username =entry.getKey();
values =entry.getValue();
for(int i=0;values!=null &&i<values.length;i++){
System.out.println(username +"=" + values[i]);
}
}
request常見應用1
l防盜鏈
String referer =request.getHeader("referer");
if(referer==null ||!referer.startsWith("http://localhost")){
response.sendRedirect("/day05/index.html");
return;
}
String data = "鳳姐日記";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html;charset=UTF-8");
response.getWriter().write(data);
l各種表單輸入項資料的擷取
•text、password、radio、checkbox、
•file、select、textarea、 hidden、
•image、button給js編程用
package cn.itcast.request;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//擷取不同類型表單的資料(擷取客戶機表單提交的資料)
public class RequestDemo5 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getParameter("username"));
System.out.println(request.getParameter("password"));
System.out.println(request.getParameter("gender"));
System.out.println(Arrays.asList(request.getParameterValues("like")==null?newString[]{}:request.getParameterValues("like")));
System.out.println(request.getParameter("city"));
System.out.println(request.getParameter("resume"));
System.out.println(request.getParameter("xx"));
String username =request.getParameter("username"); //"" null
if(username==null ||username.trim().equals("")){
System.out.println("您沒有提交資料");
}
request.getParameter("gender"); //null
request.getParameterValues("like");//null
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
form表單:
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>form.html</title>
<meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
<meta http-equiv="description"content="this is my page">
<meta http-equiv="content-type"content="text/html; charset=UTF-8">
<!--<link rel="stylesheet"type="text/css"
href="./styles.css">-->
</head>
<body>
<form action="/day05/servlet/RequestDemo5"method="post">
使用者名稱:<input type="text"name="username"><br/>
密碼:<input type="password"name="password"><br/>
性別:<input type="radio"name="gender" value="male">男
<input type="radio"name="gender" value="female">女
<br/>
愛好:<input type="checkbox"name="like" value="basketball">藍球
<input type="checkbox"name="like" value="football">足球
<input type="checkbox"name="like" value="java">java
<input type="checkbox"name="like" value=".net">.net
<br/>
所在地:<select name="city">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="cs">長沙</option>
</select><br/>
簡曆:<textarea rows="5"cols="60" name="resume"></textarea><br/>
大頭照:<input type="file" name="image"><br/>
<input type="hidden"name="xx" value="yyy">
<input type="submit" value="提交">
</form>
<form action="/day05/servlet/RequestDemo6"method="get">
使用者名稱:<input type="text"name="username"><br/>
<input type="submit" value="提交">
</form>
<form action="/day05/servlet/RequestDemo7"method="post">
使用者名稱:<input type="text"name="username"><br/>
<input type="submit" value="提交">
</form>
<!-- 超連結後面帶中文資料一定要經過url編碼 -->
<a href="/day05/servlet/RequestDemo8?name=方立勳">點點</a>
</body>
</html>
如果都沒有添 或選擇,輸入項預設為空白串“”,選擇項為NUll
所以最好用這種方式進行比較判斷:if(username==null ||username.trim().equals("")){
l請求參數的中文亂碼問題
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//request的亂碼問題:get\post
public classRequestDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throwsServletException, IOException {
//以下代碼可以解決post提交的亂碼
request.setCharacterEncoding("UTF-8"); //只對post方式有效
//String username1 =request.getParameter("username");
//System.out.println(username1);
//以下代碼可能解決get提交的亂碼
String username2 =request.getParameter("username");
//username2 = newString(username2.getBytes("iso8859-1"),"UTF-8");
System.out.println(username2);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//思考題 :下面程式有亂碼嗎????
public classRequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throwsServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username"); //方立
response.setCharacterEncoding("gb2312");
response.setContentType("text/html;charset=gb2312");
response.getWriter().write(username);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
lURL地址的編碼
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//超連結提交中文資料 在伺服器端擷取的代碼
/*
* <!-- 超連結後面帶中文資料一定要經過url編碼 -->
<a href="/day05/servlet/RequestDemo8?name=方立勳">點點</a>
*
*/
public class RequestDemo8 extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Stringname = request.getParameter("name");
name= new String(name.getBytes("iso8859-1"),"UTF-8");
System.out.println(name);
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request常見應用2
lrequest對象實現請求轉寄:請求轉寄指一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理。
l請求轉寄的應用情境:MVC設計模式
lrequest對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉寄。
lrequest對象同時也是一個域對象,開發人員通過request對象在實現轉寄時,把資料通過request對象帶給其它web資源處理。
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
* 請求轉寄的特點:
* 1.請求轉寄對瀏覽器而言只發了一次請求,並且瀏覽器的地址欄不會發生變化
* 2.請求轉寄下,伺服器只會建立一個request response
*
* 請求轉寄應用情境mvc設計模式
* 在mvc設計模式下,都是servlet處理請求,處理請求產生資料後,servlet會把資料存放區request域,然後轉寄給jsp顯示
*
String data = "aaaa";
request.setAttribute("data", data);
request.setAttribute("data", data);
RequestDispatcher rd =request.getRequestDispatcher("/view.jsp");
rd.forward(request, response);
請求轉寄的細節
lforward方法用於將請求轉寄到RequestDispatcher對象封裝的資源。
l如果在調用forward方法之前,在Servlet程式中寫入的部分內容已經被真正地傳送到了用戶端,forward方法將拋出IllegalStateException異常。
l如果在調用forward方法之前向Servlet引擎的緩衝區(response)中寫入了內容,只要寫入到緩衝區中的內容還沒有被真正輸出到用戶端,forward方法就可以被正常執行,原來寫入到輸出緩衝區中的內容將被清空,但是,已寫入到HttpServletResponse對象中的回應標頭欄位資訊保持有效
String data = "aaa";
response.getWriter().write(data); //瀏覽器不會看到這個資料的輸出
request.getRequestDispatcher("/index.jsp").forward(request, response);
String data2 = "bbb";
response.getWriter().write(data2); //瀏覽器不會看到這個資料的輸出
請求重新導向和請求轉寄的區別
l一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理,稱之為請求轉寄。
l一個web資源收到用戶端請求後,通知瀏覽器去訪問另外一個web資源,稱之為請求重新導向。
lRequestDispatcher.forward方法只能將請求轉寄給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect方法還可以重新導向到同一個網站上的其他應用程式中的資源,甚至是使用絕對URL重新導向到其他網站的資源。
l如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB網站的根目錄;如果建立RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程式的根目錄。
l調用HttpServletResponse.sendRedirect方法重新導向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重新導向的目標URL;調用RequestDispatcher.forward方法的請求轉寄過程結束後,瀏覽器地址欄保持初始的URL地址不變。
lHttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在伺服器端內部將請求轉寄給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在伺服器程式內部發生了轉寄行為。
lRequestDispatcher.forward方法的調用者與被調用者之間共用相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。
RequestDispatcher
linclude方法:
•RequestDispatcher.include方法用於將RequestDispatcher對象封裝的資源內容作為當前響應內容的一部分包含進來,從而實現可程式化的伺服器端包含功能。
•被包含的Servlet程式不能改變響應訊息的狀態代碼和回應標頭,如果它裡面存在這樣的語句,這些語句的執行結果將被忽略
//動態包含
request.getRequestDispatcher("/servlet/HeadServlet").include(request, response);
String data = "aaa<br/>";
response.getWriter().write(data);
request.getRequestDispatcher("/servlet/FootServlet").include(request, response);
工程中“\”的用法:
伺服器端“\”代表Web應用,用戶端代表整個網站
this.getServletContext().getRealPath("/download/日本 妞.jpg");
this.getServletContext().getResourceAsStream("/download/日本 妞.jpg");
request.getRequestDispatcher("/login.html");
response.sendRedirect("/day05/index.jsp");
/*
<a href="/day05/message.jsp">點點</a>
<form action="/day05/servlet/FootServlet">
</form>
<img src="/day05/download/日本紐.jpg">
*/
}