@RequestMapping(value = "returnType3") public void returnType3(HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception{ System.out.println("執行TestController"); List<ex_Order> orderList = new ArrayList<ex_Order>(); ex_Order item = new ex_Order(); item.setOrderId("T006"); item.setOrderDate(null); orderList.add(item); response.setContentType("text/html;charset=utf-8"); ObjectMapper jsonTool = new ObjectMapper(); response.getWriter().write(jsonTool.writeValueAsString(orderList)); }
1、Model和ModelAndView的區別
Model只是用來傳輸數據的,並不會進行業務的尋址。
ModelAndView則可以進行業務尋址,即可以設置對應的要請求的靜態文件(jsp等)。
Model是每次請求可以自動創建的,放到方法參數上即可,而ModelAndView是需要自行new的。
2、接受數據方式
2.1、方法常見參數類型
1)處理器方法內如果要使用response和Request對象,則需要在方法上增加該兩個參數。
HttpServletRequest requ,HttpServletResponse resp,
2)處理器如果要通過Model方式返回數據,則需要在參數上提供Model model,也可以用Map<string,Object> map對象替代。
Model model
通過如下方法添加數據:
model.addAttribute("orderList",orderList);
2)處理器如果要通過Map方式返回數據,則需要在參數上提供Map<string,Object> map,等價與Model
Map<String,Object> map
通過如下方法添加數據
map.put("orderList",orderList);
3)參數綁定所需要的相關參數和參數註解。
2.2、通過Request獲取參數
最原始的方式,所有客戶端提交的數據都可以通過該對象獲取。
//獲取某個參數的值 String id = request.getParameter("id"); System.out.println(id); { //獲取數組參數的值 String[] list = request.getParameterValues("id"); for (String item:list) { System.out.println(item); } } { //獲取所有請求的參數名信息 Enumeration<String> list = (Enumeration<String>) request.getParameterNames(); while (list.hasMoreElements()) { String item = list.nextElement(); System.out.println(item); } }
2.3、簡單類型綁定
只要請求的參數name值和處理器方法的參數名保持一致,則會自動把前端的參數值傳遞給處理器的參數。
2.4、Bean類型綁定
參數定義
數據請求
調試輸出
2.5、集合類型綁定 - 簡單變量方式1
2.6、集合類型綁定 - 複雜對象方式2
定義模型類:包含複雜類型的集合。
ItemsPo是一個複雜類型,內部包含很多的屬性。
前端界面格式:
後臺處理器方法:
2.7、集合類型綁定 - Map方式
定義模型類,包含Map對象
前端頁面格式:
後臺處理器方法:
集合方法引入自:https://blog.csdn.net/chizhuyuyu/article/details/82414259,未進行驗證測試。
2.8、通過註解接受參數
@PathVariable(value = "name",defaultValue = "張三",required = true) String name
設定接受Get方式中的請求參數(url參數),可以設定默認值,可以設定是否必須,並且可以設定前端參數名和變量名不統一。
@RequestParam(value = "name",defaultValue = "張三",required = true) String name
設定接受Get和Post提交請求方式,可以設定默認值,可以設定是否必須,並且可以設定前端參數名和變量名不統一。
@ModelAttribute(value = "order") ex_Order order
被@ModelAttribute
註解的方法會在Controller
每個方法執行之前都執行,因此對於一個Controller
中包含多個URL的時候,要謹慎使用。
3、返回數據方式
3.1、方法返回參數類型
處理方法常用的返回類型有:
1)String,返回的結果只包含邏輯視圖名稱,返回的數據通過Model對象傳遞。
@RequestMapping(value = "returnType1") public String returnType1(Model model) { System.out.println("執行TestController"); List<ex_Order> orderList = new ArrayList<ex_Order>(); ex_Order item = new ex_Order(); item.setOrderId("T006"); item.setOrderDate(null); orderList.add(item); model.addAttribute("orderList",orderList); return "/test/index"; }
2)ModelAndView,返回的結果包含數據和邏輯視圖名稱。
@RequestMapping(value ="/returnType2",method = RequestMethod.GET) public ModelAndView returnType2() throws Exception { System.out.println("執行TestController"); List<ex_Order> orderList = new ArrayList<ex_Order>(); ex_Order item = new ex_Order(); item.setOrderId("T006"); item.setOrderDate(null); orderList.add(item); //創建返回的視圖對象 ModelAndView viewResult = new ModelAndView(); //添加返回的數據和視圖,視圖映射到/WEB-INF/jsp/test/index.jsp視圖 viewResult.addObject("orderList",orderList); viewResult.setViewName("/test/index"); return viewResult; }
3)返回Void類型,這個是沒有視圖的返回結果,返回JSON的例子
具體返回什麼內容,通過response.setContentType來設定。
@RequestMapping(value = "returnType3") public void returnType3(HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception{ System.out.println("執行TestController"); List<ex_Order> orderList = new ArrayList<ex_Order>(); ex_Order item = new ex_Order(); item.setOrderId("T006"); item.setOrderDate(null); orderList.add(item); response.setContentType("text/html;charset=utf-8"); ObjectMapper jsonTool = new ObjectMapper(); response.getWriter().write(jsonTool.writeValueAsString(orderList)); }
例如文件下載,圖片輸出,JSON結果等相關應用都是用該返回類型。
3.2、返回數據方式
1)通過ModelAndView返回數據
2)通過Model返回數據
3)通過Map<sting,Object>返回數據
4)通過response直接輸出內容