使用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變量值賦值。
它們作用的結果:
- 如果括號前出現了對應的大括號變量,映射時會替換掉,這裏如果傳來的type爲"top",則映射的url對應位置爲/news/list/top
- 如果括號前沒有出現對應的大括號變量,則會將括號裏對應的變量變爲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