成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在SpringBoot項目中這幾個注解你們還用嗎?

開發 前端
SpringMVC會自動將請求URI中的占位符數據綁定到當前ProductDTO對象上,這個綁定與@ModelAttribute注解沒有關系。

環境:SpringBoot3.3.0

1. 簡介

在SpringBoot應用開發中,傳統的請求屬性處理方式如@ModelAttribute,@SessionAttribute,@RequestAttribute以及RedirectAttributes似乎用的越來越少了,但是在一些特定場景下它們發揮著不可或缺的作用尤其是當涉及到表單提交、會話狀態管理和重定向屬性傳遞時。

  • @ModelAttribute:主要用于綁定請求中的數據到方法參數或模型屬性上,常用于處理表單提交,使得復雜的對象綁定變得簡單直接。它允許你預處理傳入的數據,或者初始化一個命令對象供表單使用。
  • @SessionAttribute:用于從HttpSession中存取屬性,這對于存儲非敏感的用戶信息或臨時數據非常有用,比如用戶設置或購物車信息。
  • @RequestAttribute:處理單一請求上下文,允許你在控制器間通過HttpServletRequest傳遞自定義屬性,適合傳遞那些不需要跨請求持久化的數據。
  • RedirectAttributes:是在執行重定向操作時用來傳遞閃存屬性的利器,這些屬性在重定向后的一次請求中可用,之后自動移除,非常適合于向用戶展示操作成功或失敗的消息,同時保持URL的干凈。

接下來將詳細接上上面幾個注解及類的使用。

2. 實戰案例

2.1 @ModelAttribute

該注解可用于方法參數及方法上;

用于方法參數

@GetMapping("/product/{cateId}/{id}")
public ProductDTO test(@ModelAttribute ProductDTO dto) {
  return dto ;
}

圖片圖片

首先,SpringMVC會自動將請求URI中的占位符數據綁定到當前ProductDTO對象上,這個綁定與@ModelAttribute注解沒有關系。而這里注解的作用是將當前ProductDTO對象綁定到模型數據中,接下來如果你使用的thymeleaf則可以直接在頁面中訪問,如下示例:

@GetMapping("/product/{cateId}/{id}")
public String test(@ModelAttribute ProductDTO dto) {
  return "modelattribute" ;
}

在頁面中直接訪問ProductDTO;

<div th:if="${productDTO}">
  <ul>
    <li>cateId: <a th:text="${productDTO.cateId}"></a></li>
    <li>id: <a th:text="${productDTO.id}"></a></li>
  </ul>
</div>

頁面顯示

圖片圖片

在上面你看到了,默認訪問的key是當前類型的首字母改為小寫,我們可以通過配置屬性修改默認key

public String test(@ModelAttribute("dto") ProductDTO dto)

這樣在頁面中訪問的key將是:dto。

用于方法

@GetMapping("/product/{cateId}/{id}")
public String test() {
  return "modelattribute" ;
}
@ModelAttribute("dto")
public ProductDTO dto(ProductDTO dto) {
  System.out.println("dto....") ;
  return dto ;
}

將注解用于方法上后,當前的Controller中的所有接口都會先執行該方法將請求中的參數信息綁定到ProductDTO對象中,最后將該dto綁定到模型數據上。通過上面的配置你在頁面上一樣也可以訪問該對象數據。

2.2 @SessionAttribute

該注解只能用于方法參數上。

該注解的作用用于讀取session中的數據到當前的參數中,如下示例:

@GetMapping("/user")
@ResponseBody
public User user(@SessionAttribute("user") User user) {
  return user ;
}
// 模擬登錄后將User對象存入Session中
@GetMapping("/login")
@ResponseBody
public String login(HttpSession session) {
  session.setAttribute("user", new User(666L, "Admin")) ;
  return "login success" ;
}

這里會讀取Session中key=user的數據到當前User對象中,你需要先登錄,然后再訪問/user接口。

如果session中沒有user,那么程序將會報錯

圖片圖片

錯誤提示,session對象中沒有user屬性。通過如下方式設置不是必須的;

public User user(@SessionAttribute(value = "user", required = false) User user)

也可以將參數設置為Optional;

public User user(@SessionAttribute("user") Optional<User> user)

通過上面2中方式設置,在Session中不存在對應的屬性時也不會報錯。

注:還有一個@SessionAttributes注解,該注解可以用于類上。

2.3 @RequestAttribute

該注解同樣只能用于方法參數上。

與 @SessionAttribute 類似,你也可以使用 @RequestAttribute 注解來訪問先前創建的請求屬性(例如,由 Servlet Filter或 HandlerInterceptor 創建的屬性),如下示例:

先定義一個Filter,該Filter作用是向Request中設置值;

@Component
public class UserFilter extends OncePerRequestFilter {


  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {
    request.setAttribute("user", new User(888L, "Guest")) ;
    filterChain.doFilter(request, response) ;
  }
}

接下來在Controller中通過@RequestAttribute訪問user屬性。

@GetMapping("/user")
@ResponseBody
public User user(@RequestAttribute("user") Optional<User> user) {
  return user.orElse(new User()) ;
}

圖片圖片

與@SessionAttribute一樣,參數可以通過Optional設置不是必須的。

2.4 RedirectAttributes

當頁面通過redirect進行跳轉時,可以通過該類定義在接口方法參數中,將數據保存到該對象中后,你就可以在調整到的頁面中使用配置的屬性了,如下示例:

@GetMapping("")
public String index(RedirectAttributes ra) {
  // 將你需要的數據存入該對象中
  ra.addFlashAttribute("message", "hello") ;
  // redirect其它頁面
  return "redirect:/page/tm" ;
}
@GetMapping("tm")
public String tm(RedirectAttributes ra) {
  return "test" ;
}

test.html頁面如下:

<body>
  <h1>Test Page</h1>
  <div th:if="${message}">
    <h2 th:text="${message}" />
  </div>
</body>

訪問上面的/page,將redirec到最終的test.html頁面;

圖片圖片

redirect過來后我們可以訪問到配置的數據。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2021-06-11 13:59:22

CSS原子類

2021-10-27 10:07:59

GitHub代碼開發者

2024-07-01 08:31:14

Spring工具類代碼

2024-08-19 01:10:00

RedisGo代碼

2022-11-28 10:24:10

Spring更新JVM

2024-07-10 10:08:36

項目多表關聯哈希

2022-08-02 10:01:42

架構

2021-03-30 10:46:42

SpringBoot計數器漏桶算法

2021-03-23 08:39:27

SpringBootRedis管道技術

2019-03-27 09:40:49

程序員技能開發者

2022-04-07 07:36:04

APIJava 8JWT

2022-07-12 12:05:22

JavaSemaphore

2020-10-27 14:15:42

SpringBoot

2023-08-04 07:22:32

SpringBoot項目

2017-09-23 15:17:21

散熱筆記本電腦藍屏

2020-01-30 17:58:56

GitHub代碼開發者

2020-10-21 09:19:27

Flutter開源項目

2017-11-06 16:32:53

PythonC++Java

2020-02-03 09:29:32

JavaScript代碼斷點

2019-02-28 20:20:43

Python技巧編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 无码一区二区三区视频 | 99热精品在线观看 | 欧美精品二区 | 欧美 日韩 国产 在线 | 自拍偷拍中文字幕 | 99久久久久 | 国产午夜在线观看 | 国产精品亚洲一区二区三区在线 | 国产成人艳妇aa视频在线 | 中文字幕一区在线观看视频 | 国产女人与拘做受免费视频 | 国产精品国产精品国产专区不片 | 自拍偷拍中文字幕 | 欧美极品在线 | 国产精品免费一区二区三区四区 | 精品国产乱码久久久久久88av | 日韩精品视频在线免费观看 | 日本午夜在线视频 | 黄色骚片 | 国产美女免费视频 | 午夜理伦三级理论三级在线观看 | 九九伦理片 | 久久久久久久综合色一本 | 欧美成人精品二区三区99精品 | 国产成人高清成人av片在线看 | 成人影院一区二区三区 | 久久免费精品视频 | 亚洲精品欧洲 | 奇色影视| 亚洲一区视频在线 | 97av视频| 久久综合一区 | 亚洲高清在线视频 | 一区二区三区欧美在线 | 男女网站免费观看 | 米奇7777狠狠狠狠视频 | 337p日本欧洲亚洲大胆鲁鲁 | 日韩免费看视频 | 欧美视频免费在线 | 电影91久久久| 91看片在线观看 |