背景
在 Java 中,HTTP 模塊的 request 對象和 response 對象分別表示客戶端向服務器發(fā)送請求和服務器向客戶端發(fā)送響應時使用的對象。
繼承關系
ServletRequest -- 接口
| 繼承
HttpServletRequest -- 接口
| 實現(xiàn)
org.apache.catalina.connector.RequestFacade 類(tomcat)
獲取數(shù)據(jù)request
request 對象包含有關客戶端請求的信息,例如請求方法、請求 URL、請求頭、請求體等,其中常用的屬性和方法包括:
獲取請求行數(shù)據(jù)
-
獲取請求方式 :GET
- String getMethod()
-
(*)獲取虛擬目錄:/day14
- String getContextPath()
-
獲取Servlet路徑: /demo1
- String getServletPath()
-
獲取get方式請求參數(shù):name=zhangsan
- String getQueryString()
-
(*)獲取請求URI:/day14/demo1
-
String getRequestURI(): /day14/demo1
-
StringBuffer getRequestURL():http://localhost/day14/demo1
-
URL:統(tǒng)一資源定位符 : http://localhost/day14/demo1
-
URI:統(tǒng)一資源標識符 : /day14/demo1
-
-
獲取協(xié)議及版本:HTTP/1.1
- String getProtocol()
-
獲取客戶機的IP地址:
- String getRemoteAddr()
以下是一個簡單的 Java Servlet 示例,演示如何使用 request 對象處理 HTTP 請求和響應:
package cn.xxx.web.request;
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 java.io.IOException;
/**
* 演示Request對象獲取請求行數(shù)據(jù)
*/
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
1. 獲取請求方式 :GET
* String getMethod()
2. (*)獲取虛擬目錄:/day14
* String getContextPath()
3. 獲取Servlet路徑: /requestDemo1
* String getServletPath()
4. 獲取get方式請求參數(shù):name=zhangsan
* String getQueryString()
5. (*)獲取請求URI:/day14/demo1
* String getRequestURI(): /day14/requestDemo1
* StringBuffer getRequestURL() :http://localhost/day14/requestDemo1
6. 獲取協(xié)議及版本:HTTP/1.1
* String getProtocol()
7. 獲取客戶機的IP地址:
* String getRemoteAddr()
*/
//1. 獲取請求方式 :GET
String method = request.getMethod();
System.out.println(method);
//2.(*)獲取虛擬目錄:/day14
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3. 獲取Servlet路徑: /demo1
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4. 獲取get方式請求參數(shù):name=zhangsan
String queryString = request.getQueryString();
System.out.println(queryString);
//5.(*)獲取請求URI:/day14/demo1
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//6. 獲取協(xié)議及版本:HTTP/1.1
String protocol = request.getProtocol();
System.out.println(protocol);
//7. 獲取客戶機的IP地址:
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
}
獲取請求頭數(shù)據(jù)
- (*)
String getHeader(String name)
:通過請求頭的名稱獲取請求頭的值 -
Enumeration<String> getHeaderNames()
:獲取所有的請求頭名稱
package cn.xxx.web.request;
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 java.io.IOException;
import java.util.Enumeration;
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示獲取請求頭數(shù)據(jù)
//1.獲取所有請求頭名稱
Enumeration<String> headerNames = request.getHeaderNames();
//2.遍歷
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根據(jù)名稱獲取請求頭的值
String value = request.getHeader(name);
System.out.println(name+"---"+value);
}
}
}
package cn.xxx.web.request;
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 java.io.IOException;
import java.util.Enumeration;
@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示獲取請求頭數(shù)據(jù):user-agent
String agent = request.getHeader("user-agent");
//判斷agent的瀏覽器版本
if(agent.contains("Chrome")){
//谷歌
System.out.println("谷歌來了...");
}else if(agent.contains("Firefox")){
//火狐
System.out.println("火狐來了...");
}
}
}
獲取請求體數(shù)據(jù)
只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求參數(shù)。
-
獲取流對象
* BufferedReader getReader():獲取字符輸入流,只能操作字符數(shù)據(jù)- ServletInputStream getInputStream():獲取字節(jié)輸入流,可以操作所有類型數(shù)據(jù)(在文件上傳知識點后講解)
-
再從流對象中拿數(shù)據(jù)
package cn.xxx.web.request;
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 java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取請求消息體--請求參數(shù)
//1.獲取字符流
BufferedReader br = request.getReader();
//2.讀取數(shù)據(jù)
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
示例:防盜鏈
package cn.xxx.web.request;
import javax.servlet.ServletContext;
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 java.io.IOException;
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示獲取請求頭數(shù)據(jù):referer
String referer = request.getHeader("referer");
System.out.println(referer);//http://localhost/day14/login.html
//防盜鏈
if(referer != null ){
if(referer.contains("/day14")){
//正常訪問
// System.out.println("播放電影....");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("播放電影....");
}else{
//盜鏈
//System.out.println("想看電影嗎?來優(yōu)酷吧...");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("想看電影嗎?來優(yōu)酷吧...");
}
}
}
}
其他功能
獲取請求參數(shù)通用方式
不論get還是post請求方式都可以使用下列方法來獲取請求參數(shù)
- String getParameter(String name):根據(jù)參數(shù)名稱獲取參數(shù)值 username=zs&password=123
- String[] getParameterValues(String name):根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game
- Enumeration getParameterNames():獲取所有請求的參數(shù)名稱
- Map<String,String[]> getParameterMap():獲取所有參數(shù)的map集合
package cn.xxx.web.request;
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 java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post 獲取請求參數(shù)
//根據(jù)參數(shù)名稱獲取參數(shù)值
String username = request.getParameter("username");
/* System.out.println("post");
System.out.println(username);*/
//根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組
String[] hobbies = request.getParameterValues("hobby");
/*for (String hobby : hobbies) {
System.out.println(hobby);
}*/
//獲取所有請求的參數(shù)名稱
Enumeration<String> parameterNames = request.getParameterNames();
/*while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
System.out.println(name);
String value = request.getParameter(name);
System.out.println(value);
System.out.println("----------------");
}*/
// 獲取所有參數(shù)的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍歷
Set<String> keyset = parameterMap.keySet();
for (String name : keyset) {
//獲取鍵獲取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("-----------------");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get 獲取請求參數(shù)
/*
//根據(jù)參數(shù)名稱獲取參數(shù)值
String username = request.getParameter("username");
System.out.println("get");
System.out.println(username);*/
this.doPost(request,response);
}
}
中文亂碼問題:
* get方式:tomcat 8 已經(jīng)將get方式亂碼問題解決了
* post方式:會亂碼
解決:在獲取參數(shù)前,設置request的編碼request.setCharacterEncoding(“utf-8”);
package cn.xxx.web.request;
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 java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.設置流的編碼
request.setCharacterEncoding("utf-8");
//獲取請求參數(shù)username
String username = request.getParameter("username");
System.out.println(username);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
請求轉(zhuǎn)發(fā)
一種在服務器內(nèi)部的資源跳轉(zhuǎn)方式
-
步驟:
- 通過request對象獲取請求轉(zhuǎn)發(fā)器對象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher對象來進行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response)
-
特點:文章來源:http://www.zghlxwxcb.cn/news/detail-689044.html
- 瀏覽器地址欄路徑不發(fā)生變化
- 只能轉(zhuǎn)發(fā)到當前服務器內(nèi)部資源中。
- 轉(zhuǎn)發(fā)是一次請求
package cn.xxx.web.request;
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 java.io.IOException;
@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo8888被訪問了。。。");
//轉(zhuǎn)發(fā)到demo9資源
/*
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");
requestDispatcher.forward(request,response);
*/
//存儲數(shù)據(jù)到request域中
request.setAttribute("msg","hello");
request.getRequestDispatcher("/requestDemo9").forward(request,response);
//request.getRequestDispatcher("http://www.xxx.cn").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
共享數(shù)據(jù)
- 域?qū)ο螅阂粋€有作用范圍的對象,可以在范圍內(nèi)共享數(shù)據(jù)
- request域:代表一次請求的范圍,一般用于請求轉(zhuǎn)發(fā)的多個資源中共享數(shù)據(jù)
- 方法:
- void setAttribute(String name,Object obj):存儲數(shù)據(jù)
- Object getAttitude(String name):通過鍵獲取值
- void removeAttribute(String name):通過鍵移除鍵值對
package cn.xxx.web.request;
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 java.io.IOException;
@WebServlet("/requestDemo9")
public class RequestDemo9 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取數(shù)據(jù)
Object msg = request.getAttribute("msg");
System.out.println(msg);
System.out.println("demo9999被訪問了。。。");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
獲取ServletContext
ServletContext getServletContext()文章來源地址http://www.zghlxwxcb.cn/news/detail-689044.html
package cn.xxx.web.request;
import javax.servlet.ServletContext;
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 java.io.IOException;
@WebServlet("/requestDemo10")
public class RequestDemo10 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = request.getServletContext();
System.out.println(servletContext);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
到了這里,關于java:詳解http模塊request對象的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!