HttpServletRequest和@Requestparam、@RequestBody、直接实体接收请求参数的区别与示例
文章目錄
- 概述
- 1.HttpServletRequest
- 2.@RequestParam
- 3.@RequestBody
- 4.直接實體接收
- HttpServletRequest請求方法詳解:
概述
客戶端的網絡請求首先會被Http服務器接收(也叫Web服務器、web容器,其需要提供web應用運行所需的環境,接收客戶端的Http請求);
Web服務器根據請求的路徑將請求轉交給對應的Servlet容器(也稱Servlet引擎,為Servlet的運行提供環境支持,可以理解為tomcat或其他服務器);
Servlet容器根據對應的虛擬路徑(@WebServlet中配置的)來加載Servlet,如果Serlvet沒有被實例化則創建該Servlet的一個實例(調用init方法);
Servlet容器根據用戶的HTTP請求,創建一個ServletRequest對象(HTTP的請求信息被封裝在其中)和一個可以對HTTP請求進行響應的ServletResponse對象(類似于寄信,并在信中說明回信的地址),然后調用HttpServlet中重寫的service(ServletRequest req, ServletResponse res)方法,并在這個方法中,將ServletRequest、ServletResponse這兩個對象向下轉型,得到我們非常熟悉的HttpServletRequest和HttpServletResponse兩個對象,然后將客戶端的請求轉發到HttpServlet中protected修飾的service(HttpServletRequest req, HttpServletResponse resp)
HttpServletRequest和@Requestparam、@RequestBody三種都是常用的在http請求中接收前端參數的方式,而后端用于響應的有HttpServletResponse,今天實驗了一下用于請求的幾種方式:
1.HttpServletRequest
例子
public Object updateSongMsg(HttpServletRequest req){JSONObject jsonObject = new JSONObject();String id = req.getParameter("id").trim();String singer_id = req.getParameter("singerId").trim();String name = req.getParameter("name").trim();String introduction = req.getParameter("introduction").trim();String lyric = req.getParameter("lyric").trim();Song song = new Song();song.setId(Integer.parseInt(id));song.setSingerId(Integer.parseInt(singer_id));song.setName(name);song.setIntroduction(introduction);song.setUpdateTime(new Date());song.setLyric(lyric);boolean res = songService.updateSongMsg(song);if (res){jsonObject.put("code", 1);jsonObject.put("msg", "修改成功");return jsonObject;}else {jsonObject.put("code", 0);jsonObject.put("msg", "修改失敗");return jsonObject;}}參數用HttpServletRequest req,相當于把前端的請求內容包裝了起來,個人認為傳送時可以類似于Requesparam,下面用postman實驗:
localhost:8888/song/update?id=1&singerId=1&name=直接&introduction=煩煩煩&lyric=123
下面查看數據庫:
從源碼可以看到 HttpServletRequest extends ServletRequest,是一個抽象接口
可以用它獲得更多的客戶端信息:
我們在上面的方法中輸出:
再次發起請求時可以看到:
2.@RequestParam
有一些特殊情況,我們的服務端的接口變量名可能和前端不一致,這個時候我們可以通過 @RequestParam 注解來解決
修改上面的請求參數變為:
下面發送請求
localhost:8888/song/update?id=1&singerId=1&name=修改&introduction=煩煩煩&lyric=123
再次看數據庫:
可以看到name發生了改變。其中數據庫字段為singer_id,而我們傳的是singerId,相當于把@RequestParam注解中的singerId中傳過去的值給了參數中的singer_id,起到的效果與上面的HttpServletRequest相同
3.@RequestBody
@requestbody要求傳遞的是一個json格式的字符串
如:
注意上面的data是字符串(有單引號)
@RequestBody 注解用于接收前端傳來的實體,接收參數也是對應的實體,比如前端通過json 提交傳來兩個參數username 和password,此時我們需要在后端封裝一個實體來接收。
此時必須以json字符串的形式接收。
即
{
“username":“nihao”,
“password”:“123456”
}
4.直接實體接收
使用實體接收的話,我們不能在前面加@RequestParam 注解了,直接使用即可。這個適合于實體字段非常多,用@RequestParam比較麻煩的場景
public class User { private String username; private String password; // set get } @PostMapping("/form2") public String testForm(User user) {//需注意方法的參數 System.out.println("獲取到的username 為:" + user.getUsername()); System.out.println("獲取到的password 為:" + user.getPassword()); return "success";注意發送時必須以key-values的格式發送,而不是json格式
HttpServletRequest請求方法詳解:
HttpServletRequest可以獲得的參數更多,它可以獲得客戶端的請求行和請求頭、請求體信息。
當訪問Servlet時,會在請求消息的請求行中,包含請求方法、請求資源名、請求路徑等信息,為了獲取這些信息,在HTTPServletRequest接口中,定義了一系列用于獲取請求行的方法
ttpServletResponse:服務端處理完Http的請求后,根據HttpServletResponse對象將處理結果作為Http響應返回給客戶端
且注意HttpServletRequest的不同實現類有實現不同的方法。
獲得請求行:一些請求行方法的解釋:
獲得請求頭
除了請求行,在HttpServletRequest接口中,也定義了一系列用于獲取HTTP請求頭字段的方法:
獲得請求體:這也是上面的示例獲得參數的方法。
在實際開發中,經常需要獲取用戶提交的表單數據,例如,用戶名,密碼、電子郵件等,為了方便獲取表單中的請求參數,在HttpServletRequest接口總,定義了一些列獲取請求參數的方法
總結
以上是生活随笔為你收集整理的HttpServletRequest和@Requestparam、@RequestBody、直接实体接收请求参数的区别与示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis-plus与jpa在操作数
- 下一篇: 【多线程学习笔记】sychronized