Thymeleaf拼接URL,字符和請求參數使用

使用Thymeleaf來創建一個

http://localhost:8081/news/list/all?page=1&size=10

這樣的url,現在希望“all”、“page”、“size”變化,其他的不變:“all”可能自身變爲其他字符串,如"top",而“page”“size”只改變數值,如"3"和"30"。結果希望變爲:

http://localhost:8081/news/list/top?page=3&size=30

解決方案:
Controller如下,“all”其實就是下面的type變量,通過

model.addAttribute("type", type)

傳給前端,“page”“size”作爲請求參數@RequestParam:

/**
 * 查詢所有新聞
 * @return 新聞列表
 */
@GetMapping("list/all")
public String listAll(Model model,
                      @RequestParam(value = "page", defaultValue = PAGE_DEFAULT) Integer page,
                      @RequestParam(value = "size", defaultValue = SIZE_DEFAULT) Integer size) {
    String type = "all";
    logger.info("List news:" + type);
    PageHelper.startPage(page, size);
    List<News> list = mNewsService.selectAll();
    PageInfo<News> pageInfo = new PageInfo<>(list);
    model.addAttribute("type", type);
    model.addAttribute("newsList", list);
    int pages = pageInfo.getPages();
    model.addAttribute("indexPage", page < 0 ? 1 : (page > pages ? pages : page));
    model.addAttribute("size", size);
    model.addAttribute("totalPage", pages);
    return "list/index";
}

前端的話,【絕對路徑】th:href中是@{/news/list/}那麼url會映射成:

http://localhost:8081  +   /news/list/

【相對路徑】如果去掉第一個斜槓@{news/list/},從以上的Controller路徑點擊,則url會映射成:

http://localhost:8081/news/list/ + /news/list/

我們這裏使用絕對路徑,如下:

<a th:href="@{/news/list/{type}(type=${type},page=${indexPage},size=${size})}">上一頁</a>

括號裏的表示括號左邊被大括號包起來的變量應該取得值,這裏:

  • type會被後端傳來的type變量值賦值,
  • page會被後端傳來的indexPage變量值賦值,
  • size會被後端傳來的size變量值賦值。
    它們作用的結果:
  1. 如果括號前出現了對應的大括號變量,映射時會替換掉,這裏如果傳來的type爲"top",則映射的url對應位置爲/news/list/top
  2. 如果括號前沒有出現對應的大括號變量,則會將括號裏對應的變量變爲url參數形式,即?page=1&size=10

如果按照我以上的th:href點擊,最終得到的url映射爲:

http://localhost:8081/news/list/all?page=1&size=10

如果後端傳參:

type = "top";
indexPage = "3";
size = "30";

那麼url會變爲:

http://localhost:8081/news/list/top?page=3&size=30

參考鏈接:
https://blog.csdn.net/u010992313/article/details/96102790

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章