Servlet中Request用法和API


1.Request概述
--用戶通過瀏覽器訪問服務器時,Tomcat將HTTP請求中所有的信息都封裝在Request對象中
--作用:開發人員可以通過request對象方法,來獲取瀏覽器發送的所有信息.

 

 

 2.Request體系結構

ServletRequest
    |
HttpServletRequest
    |
org.apache.catalina.connector.RequestFacade(由tomcat廠商提供)

3.Request獲取Http請求信息

String getMethod()  獲取請求方式 GET
String getContextPath() 獲取項目網絡地址(虛擬路徑)
String getRequestURI() 統一資源標識符(范圍廣)
StringBuffer getRequestURL() 獲取URL(統一資源定位符)
String getProtocol() 獲取協議和版本號 HTTP/1.1
String getRemoteAddr() 獲取客戶端ip地址
getLocalAddr() 獲取用戶ip地址
解決post提交方式的亂碼:request.setCharacterEncoding("UTF-8");
解決get提交的方式的亂碼:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
String getHeader(String name) 根據請求頭的名稱獲取對應的值,注意:不區分大小寫
Enumeration<String> getHeaderNames() 獲取所有請求頭的名稱--注意:Iterator前身迭代器
req.setCharacterEncoding("utf-8");
System.out.println("請求方式=" + req.getMethod());
System.out.println("項目名=" + req.getContextPath());
System.out.println("當前訪問相對目錄=" + req.getRequestURI());
System.out.println("當前訪問絕對路徑=" + req.getRequestURL());
System.out.println("http版本號=" + req.getProtocol());
System.out.println("獲取用戶ip地址=" + req.getLocalAddr());
System.out.println("獲取ip地址=" + req.getRemoteAddr());
//
System.out.println("兩個絕對路徑=");
System.out.println(this.getServletContext().getRealPath("/"));
System.out.println(req.getSession().getServletContext().getRealPath("/"));
String path = req.getContextPath();
String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/";
System.out.println("拼接獲取服務器加模塊名=" + basePath);
//獲取請求頭
String header = req.getHeader("Host");
System.out.println(header);
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
   String sname = headerNames.nextElement();
   String header1 = req.getHeader(sname);
   System.out.print(sname + "::" + header1);
}

結果 (省略一堆header值)

請求方式=GET
項目名=/web08_servlet_anno
當前訪問相對目錄=/web08_servlet_anno/indexServlet
當前訪問絕對路徑=http://localhost:8080/web08_servlet_anno/indexServlet
http版本號=HTTP/1.1
獲取用戶ip地址=0:0:0:0:0:0:0:1
獲取ip地址=0:0:0:0:0:0:0:1
兩個絕對路徑=
G:\ouClass\artifacts\web08_servlet_anno_war_exploded\
G:\ouClass\artifacts\web08_servlet_anno_war_exploded\
拼接獲取服務器加模塊名=http://localhost:8080/web08_servlet_anno/
localhost:8080
//header....

注意:在jsp中獲取靜態路徑使用的是 

req.getContextPath()

對應jsp

${pageContext.request.contextPath}或<%=request.getContextPath()%>

詳情查看  https://www.cnblogs.com/xiaozhang666/p/13355474.html

 

4.獲取請求參數

--不論get還是post請求方式,都可以使用下列方法來獲取請求參數
--在web階段,get和post方法處理的業務邏輯是一樣的...

--根據參數名獲取參數值
String getParameter(String name) --根據參數名獲取參數值數組 例如 hobby=somke&hobby=drink String[] getParameterValues(String name) --獲取所有的參數名和參數值,封裝map集合(key參數名,value參數值) Map<String,String[]> getParameterMap()
--前端傳值為數組時
String[] likeList = request.getParameterValues("likearr[]");
--get:在tomcat8及以上版本,內部url編碼(UTF-8)
post:編碼和解碼格式不統一,產生亂碼...
瀏覽器  編碼:UTF-8
服務器默認 解碼:ISO-8859-1 西歐(拉丁文)
指定服務器解碼方式
void setCharacterEncoding(String env)
注意:這哥們必須在post方法的行首
//中文亂碼
request.setCharacterEncoding("utf-8");
//獲取參數
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String[] likes = request.getParameterValues("like");
String[] likeList = request.getParameterValues("likearr[]");

5.請求轉發

* API
  1.通過reuqest對象獲取轉發器對象
  RequestDispatcher getRequestDispatcher(String path)
  2.通過轉發器對象,實現請求轉發
  void forward(ServletRequest request, ServletResponse response) 
* 請求轉發特點
  瀏覽器地址欄沒有發生改變
  瀏覽器只發送了一次請求(request、response只創建一次,多個轉發的servlet共享)
  只能轉發服務器內部資源
* 鏈式編程
  request.getRequestDispatcher("/BServlet").forward(request, response); 

6.域對象(共享數據)

--域對象:一個有作用范圍的對象,可以在范圍內共享數據
--request域:代表一次請求的范圍,一般用於一次請求中轉發的多個資源中共享數據

* API
  1.存數據
  void setAttribute(String name,Object o);
  2.取數據
  Object getAttribute(String name);
  3.刪數據
  void removeAttribute(String name);
* 生命周期
  1.創建?
  用戶發送請求時,創建request
  2.銷毀?
  服務器做出響應,銷毀request
  3.范圍?
  一次請求,多次轉發

7.獲取ServletContext對象

public  ServletContext getServletContext();

此對象為Servlet上下文對象,只會創建一個

 

補充案例和api

視頻防盜鏈

/*
  視頻播放源,判斷...
*/
@WebServlet("/RefererRequest")
public class RefererRequest extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    // 1.獲取請求來源信息(注意:如果瀏覽器直接訪問,這個頭返回的值為null)
    String referer = req.getHeader("referer");
    // 2.判斷是否為家族體系訪問源
    if (referer != null &&
referer.startsWith("http://localhost:8080/web09_request")) {
      resp.getWriter().write("<h3>正常播放視頻...</h3>");
   } else {
      resp.getWriter().write("<h3>想看嗎?來騰訊把...</h3>");
   }
 }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
 }
}

瀏覽器兼容性
user-agent:獲取瀏覽器版本信息

/*
  瀏覽器兼容性
*/
@WebServlet("/UserAgentRequest")
public class UserAgentRequest extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    // 1.獲取瀏覽器信息
    String userAgent = req.getHeader("user-agent");
    // 2.判斷
    if (userAgent.contains("Chrome")) {
      resp.getWriter().write("谷歌體系瀏覽器");
   } else if (userAgent.contains("Firefox")) {
      resp.getWriter().write("火狐體系瀏覽器");
   } else {
      resp.getWriter().write("其他體系瀏覽器");
   }
 }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
 }
}

 

request.getServletPath()    獲取客戶端請求的路徑名如:/object/delObject
request.getServerName()  獲取服務器地址,如:localhost
request.getServerPort()    獲取服務器端口,如8080
request.getLocalName()    獲取本地IP映射名,如:localhost
request.getLocalPort()    獲取本地端口,如:8090
request.getRealPath("/")    獲取項目所在服務器的全路徑,如:D:\Program Files\apache-tomcat-7.0.25\webapps\TestSytem\
request.getRemoteAddr()    獲取遠程主機地址,如:127.0.0.1
request.getRemoteHost()    獲取遠程主機,如:127.0.0.1
request.getRemotePort()    獲取遠程客戶端端口,如:3623
request.getRequestedSessionId()    獲取會話session的ID,如:823A6BACAC64FB114235CBFE85A46CAA
request.getRequestURI()    獲取包含項目名稱的請求路徑,如:/TestSytem/object/delObject
request.getRequestURL().toString()    獲取請求的全路徑,如:http://localhost:8090/TestSytem/object/delObject

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM