httpservletrequest 设置请求头_请求和常用对象
## 一、主要內(nèi)容

## 二、核心目標(biāo)
理解幾個(gè)常用對(duì)象的意義和作用
掌握幾種請(qǐng)求的發(fā)出方式
掌握數(shù)據(jù)的發(fā)送和接收方式
掌握跳轉(zhuǎn)方式
掌握亂碼的解決
## 三、請(qǐng)求的方式
要訪(fǎng)問(wèn)服務(wù)器首先需要由客戶(hù)端主動(dòng)發(fā)出請(qǐng)求,在實(shí)際的操作中,我們可以通過(guò)多種方式向服務(wù)器發(fā)起請(qǐng)求。根據(jù)不同的場(chǎng)景需求,使用不同的請(qǐng)求方式可以達(dá)到不同的效果。
### 3.1 地址欄輸入
在瀏覽器地址欄直接輸入要訪(fǎng)問(wèn)的地址即可,此種方式可以看做是訪(fǎng)問(wèn)服務(wù)器的起始操作。
http://ip:port/path
### 3.2 超鏈接
使用超鏈接也可以向服務(wù)器發(fā)出請(qǐng)求
```html
<a href="百度一下,你就知道">百度</a>
```
### 3.3 Form表單
當(dāng)需要向服務(wù)器發(fā)送請(qǐng)求,并且傳輸一些用戶(hù)輸入的數(shù)據(jù)時(shí),我們優(yōu)先選擇form表單的方式發(fā)起請(qǐng)求。

### 3.4 ajax
通過(guò)ajax發(fā)起的請(qǐng)求,屬于異步請(qǐng)求,能實(shí)現(xiàn)局部刷新的效果,是一種比較常用的請(qǐng)求方式。
通過(guò)jQuery中的ajax(),get(),post(),getJSON()等方法都能發(fā)送請(qǐng)求
### 3.5 請(qǐng)求轉(zhuǎn)發(fā)
通過(guò)服務(wù)器內(nèi)部將請(qǐng)求進(jìn)行一次轉(zhuǎn)發(fā),可以請(qǐng)求到其他資源(后面講)
### 3.6 重定向
服務(wù)器通過(guò)給定一個(gè)新資源的地址,響應(yīng)回客戶(hù)端后,客戶(hù)端自動(dòng)再次發(fā)送一個(gè)請(qǐng)求到新資源的地址處。(后面講)
## 四、HttpServletRequest 對(duì)象
### 4.1 介紹
HttpServletRequest 對(duì)象:主要作用是用來(lái)接收客戶(hù)端發(fā)送過(guò)來(lái)的請(qǐng)求信息,例如:請(qǐng)求的參數(shù),發(fā)送的頭信息等都屬于客戶(hù)端發(fā)來(lái)的信息,service()方法中形參接收的是 HttpServletRequest 接口的實(shí)例化對(duì)象,表示該對(duì)象主要應(yīng)用在 HTTP 協(xié)議上,該對(duì)象是由 Tomcat 封裝好傳遞過(guò)來(lái)。
HttpServletRequest 是 ServletRequest 的子接口,ServletRequest 只有一個(gè)子接口,就是 HttpServletRequest。既然只有一個(gè)子接口為什么不將兩個(gè)合并為一個(gè)?
從長(zhǎng)遠(yuǎn)上講:現(xiàn)在主要用的協(xié)議是 HTTP 協(xié)議,但以后可能出現(xiàn)更多新的協(xié)議。若以后想要支持這種新協(xié)議,只需要直接繼承 ServletRequest 接口就行了。
在 HttpServletRequest 接口中,定義的方法很多,但都是圍繞接收客戶(hù)端參數(shù)的。但是怎么拿到該對(duì)象呢?不需要,直接在 Service 方法中由容器傳入過(guò)來(lái),而我們需要做的就是取出對(duì)象中的數(shù)據(jù),進(jìn)行分析、處理。
### 4.2 常用形式
#### 1) 常用方法
| 常用方法 | 描述 |
| ---------------- | ------------------------------------------ |
| getRequestURL() | 獲取客戶(hù)端發(fā)出的請(qǐng)求時(shí)的完整 URL |
| getRequestURI() | 獲取請(qǐng)求行中的資源名稱(chēng)部分(項(xiàng)目名稱(chēng)開(kāi)始) |
| getQueryString() | 獲取請(qǐng)求行中的參數(shù)部分 |
| getMethod() | 獲取客戶(hù)端請(qǐng)求方式 |
| getProtocol() | 獲取 HTTP 版本號(hào) |
| getContextPath() | 獲取 webapp 名字 |
#### 2) 獲取請(qǐng)求頭
| 方法 | 描述 |
| -------------------------------------- | ------------------------ |
| getHeader(String) | 獲取單個(gè)請(qǐng)求頭內(nèi)容 |
| Enumeration<String> getHeaderNames() | 獲取所有的請(qǐng)求頭名稱(chēng)集合 |
#### 3) 獲取客戶(hù)端請(qǐng)求參數(shù)(客戶(hù)端提交的數(shù)據(jù))
| 方法 | 描述 |
| ------------------------------- | ----------------------------------------------------- |
| getParameter(name) | 獲取指定名稱(chēng)的參數(shù) |
| getParameterValues(String name) | 獲取指定名稱(chēng)參數(shù)的所有值 |
| getParameterNames() | 獲取一個(gè)包含請(qǐng)求消息中的所有參數(shù)名的 Enumeration 對(duì)象 |
| getParameterMap() | 返回一個(gè)保存了請(qǐng)求消息中的所有參數(shù)名稱(chēng)和值的 Map 對(duì)象 |
### 4.3 請(qǐng)求亂碼解決

由于現(xiàn)在的 request 屬于接收客戶(hù)端的參數(shù),所以必然有其默認(rèn)的語(yǔ)言編碼,主要是由于在解析過(guò)程中默認(rèn)使用的編碼方式為 ISO-8859-1(此編碼不支持中文),所以解析時(shí)一定會(huì)出現(xiàn)亂碼。要想解決這種亂碼問(wèn)題,需要設(shè)置 request 中的編碼方式,告訴服務(wù)器以何種方式來(lái)解析數(shù)據(jù)。或者在接收到亂碼數(shù)據(jù)以后,再通過(guò)相應(yīng)的編碼格式還原。
#### 1)方式一:
```java
req.setCharacterEncoding("UTF-8");
```
這種方式只針對(duì) POST 有效(必須在接收所有的數(shù)據(jù)之前設(shè)定)
#### 2)方式二:
```java
new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
```
借助了String 對(duì)象的方法,該種方式對(duì)任何請(qǐng)求有效,是通用的。
**Tomcat8起,以后的GET方式請(qǐng)求是不會(huì)出現(xiàn)亂碼的。**
### 4.4 請(qǐng)求轉(zhuǎn)發(fā)
請(qǐng)求轉(zhuǎn)發(fā),是一種**服務(wù)器的行為**,當(dāng)客戶(hù)端請(qǐng)求到達(dá)后,服務(wù)器進(jìn)行轉(zhuǎn)發(fā),此時(shí)會(huì)將請(qǐng)求對(duì)象進(jìn)行保存,地址欄中的 URL 地址不會(huì)改變,得到響應(yīng)后,服務(wù)器端再將響應(yīng)發(fā)送給客戶(hù)端,**從始至終只有一個(gè)請(qǐng)求發(fā)出**。實(shí)現(xiàn)方式如下,達(dá)到多個(gè)資源協(xié)同響應(yīng)的效果
```java
req.getRequestDispatcher("轉(zhuǎn)發(fā)的路徑").forward(req,resp);
```
### 4.5 request作為域?qū)ο?/p>
通過(guò)該對(duì)象可以在一個(gè)請(qǐng)求中傳遞數(shù)據(jù),作用范圍:**在一次請(qǐng)求中有效**,即服務(wù)器跳轉(zhuǎn)有效。
```java
request.setAttribute(String name, Object o); // 設(shè)置域?qū)ο髢?nèi)容
request.getAttribute(String name); // 獲取域?qū)ο髢?nèi)容
request.removeAttribute(String name); //刪除域?qū)ο髢?nèi)容
```
request 域?qū)ο笾械臄?shù)據(jù)在一次請(qǐng)求中有效,經(jīng)過(guò)請(qǐng)求轉(zhuǎn)發(fā),request 域中的數(shù)據(jù)依然存在,則在請(qǐng)求轉(zhuǎn)發(fā)的過(guò)程中可以通過(guò) request 來(lái)傳輸/共享數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的httpservletrequest 设置请求头_请求和常用对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python字典程序题_急!一道关于py
- 下一篇: 计算机组装虚拟实验,组装计算机的虚拟实验