現狀:Controller 方法加 @ResponseBody 直接返回 Map 序列化為 JSON 顯示在當前頁,無法跳轉到新頁面 B 並展示數據。
ModelAndView 或 String (視圖名)。Model / ModelMap / ModelAndView。@RequestMapping("/saleout/precheck")
public ModelAndView precheckStoreInForm(HttpServletRequest request, SaleOut saleout, PageInfo sopg) {
List<SaleOut> results = service.query(saleout, sopg);
List<SaleOut> ls = new ArrayList<>(results);
Map<String, Object> data = new HashMap<>();
data.put("rows", ls);
data.put("total", ls.size());
ModelAndView mav = new ModelAndView("pageB"); // 視圖名 pageB.jsp
mav.addObject("jsonData", data); // 模型鍵值
return mav;
}
@RequestMapping("/saleout/precheck")
public String precheck(Model model, HttpServletRequest request, SaleOut saleout, PageInfo sopg) {
// ... 查詢邏輯 ...
model.addAttribute("jsonData", data);
return "pageB"; // 視圖解析器解析為 pageB.jsp
}
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<script>
var jsonData = ${jsonData}; // JSTL 直接輸出對象,需確保無 XSS 風險
// 或用 Jackson 序列化
var jsonData = <%= new ObjectMapper().writeValueAsString(jsonData) %>;
console.log(jsonData.rows);
</script>
@ResponseBody 返回 JSON,前端 JS 回調處理跳轉/渲染。@ResponseBody 表示「直接寫入 HTTP Response Body」,適用於 REST API。
無註解時,返回值視為視圖名,模型數據由 ViewResolver 渲染模板 (JSP/Thymeleaf/FreeMarker)。
根據請求類型選擇:頁面跳轉用視圖解析,API 用 @ResponseBody。