SpringMVC中Controller類數據響應的方法
上篇博客我們瞭解瞭請求參數的獲取,那麼獲取到請求參數之後,需要對參數進行出來,然後進行數據響應。那麼這篇博客我們就來瞭解 Controller 類如何進行數據響應。
1. 方法返回值類型
在 web 階段我們也瞭解過數據響應,我們可以簡單的將數據響應分為:頁面跳轉和回寫數據
Controller 類的業務返回的返回值類型有很多,但歸根結底就是用於完成頁面跳轉和回寫數據。我們瞭解一下常用的幾個返回值類型:ModelAndView, Model,ModelMap,Map,View, String, void ,@ResponseBody,HttpHeaders
。
2. 頁面跳轉
在 SpringMVC 中完成頁面跳轉有兩種方式:直接返回字符串和返回 ModelAndView 對象
2.1 直接返回字符串
當直接返回一個字符串時,會自動通過視圖解析器解析為物理視圖地址。
@RequestMapping("/user") public class MyController { //請求地址:localhost:8080/user/testReturnString @RequestMapping("/testReturnString") public String testReturnString() { System.out.println("MyController 的 testReturnString 方法執行 瞭。。。。"); return "success.jsp"; } }
當你的視圖不是位於 user 文件夾下時,客戶端會報 404 錯誤,因為在找不到該視圖。這種方式設置是視圖的相對地址,相對 MyController 類的請求地址,所以我們可以將其設置為絕對地址return "\success.jsp";
。
2.2 返回 ModelAndView 對象
ModelAndView 對象我們可以進行分解, Model 表示模型用於封裝數據,View 表示視圖用於展示數據。 ModelAndView 對象的一些方法:
使用 ModelAndView 對象完成頁面跳轉:
@RequestMapping("test01") public ModelAndView test01(){ //創建 modelAndView 對象 ModelAndView modelAndView =new ModelAndView(); //設置視圖名稱 modelAndView.setViewName("/user.jsp"); //設置模型數據 modelAndView.addObject("user","zhangsan"); return modelAndView; }
也可以不手動創建 ModelAndView 對象,直接在方法上添加形參,這種方式的ModelAndView 對象創建實參
@RequestMapping("test02") public ModelAndView test02(ModelAndView modelAndView){ //設置視圖名稱 modelAndView.setViewName("/user"); //設置模型數據 modelAndView.addObject("user","lisi"); return modelAndView; }
這兩種方式是一樣的,隻不過 ModelAndView 對象的創建角色改變瞭,除瞭這種兩種方式還有其他方式,我們可以通過View
和Model
將 ModelAndView 對象拆分。
@RequestMapping("test03") public String test03(Model model){ model.addAttribute("user","wangwu"); return "user.jsp"; } @RequestMapping("test04") public String test04(ModelMap modelMap){ modelMap.addAttribute("user","zhaoliu"); return "user.jsp"; }
2.3 視圖前綴和後綴
在返回視圖時,我們需要給定一個視圖名,除瞭視圖名還需要前綴和後綴。前綴就是視圖存放的路徑,後綴就是視圖類型。而 SpringMVC 可以配置內部資源視圖解析器,將前綴和後綴提取出來,在 SpringMVC 的配置文件中進行配置:
<!--配置內部資源視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
在 Controller 類的業務方法中就可以省略前綴和後綴,SpringMVC 將返回的字符串與在視圖解析器的前後綴拼接後跳轉:
@RequestMapping("test01") public ModelAndView test01(){ //創建 modelAndView 對象 ModelAndView modelAndView =new ModelAndView(); //設置視圖名稱 modelAndView.setViewName("user"); //設置模型數據 modelAndView.addObject("user","zhangsan"); return modelAndView; }
2.3 重定向和轉發
- 轉發:請求轉發是指將請求再轉發到其他地址,轉發過程中使用的是同一個請求,轉發的地址欄內容不變。重
- 定向:是指由原請求地址重新定位到某個新地址,原有的請求失效,客戶端看到的是新的請求返回的相應結果。
在SpringMVC 中默認是通過轉發完成跳轉的,當然也可以設置為重定向:
//轉發到user.jsp @RequestMapping("test05") public String test05(VO vo){ return "forward:user.jsp"; } //重定向user.jsp @RequestMapping("test05") public String test05(VO vo){ return "redirect:user.jsp"; }
註意:如果在方法返回值前加 forward:或者redirect: 則SpringMVC配置文件中的自定義視圖解析器無效。return “forward:/main”表示轉發到映射名為main的controller,而return “forward:/main.jsp”表示轉發到main.jsp頁面。
在方法上隻有@RequestMapping 時,無論方法返回值是什麼,都需要進行跳轉。
3. 回寫數據
回寫數據也有兩種方式:直接返回字符串和返回對象或集合
3.1 直接返回字符串
Web基礎階段,客戶端訪問服務器端,如果想直接回寫字符串作為響應體返回的話,隻需要使用response.getWriter().print(“hello world”) 即可,所以我們通過SpringMVC框架註入的response對象,此時不需要視圖跳轉,業務方法返回值為void。
@RequestMapping("test05") public void test05(HttpServletResponse response) throws IOException { response.getWriter().println("zhangsan"); }
除瞭這種方式,還有通過@ResponseBody
註解告知SpringMVC框架,方法返回的字符串不是跳轉是直接在http響應體中返回:
@RequestMapping("test06") @ResponseBody //告知 SpringMVC框架 不進行視圖跳轉,直接進行數據響應 public String test06() throws IOException { return "lisi"; }
在實際開發中,一般不會直接返回 “lisi” 這是類型的字符串,一般返回的是有一定格式的字符串,例如 json 格式。在返回 json 格式的字符串時,我們需要用到額外添加Jackson的jar包,在xml 文件中添加:
<!--json轉換工具jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.11.1</version> </dependency>
@RequestMapping("test07") @ResponseBody //告知 SpringMVC框架 不進行視圖跳轉,直接進行數據響應 public String test07() throws IOException { User user = new User(); user.setAge(18); user.setUsername("zhangsan"); ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); return json; }
3.2 返回對象或集合
通過 SpringMVC 幫助我們對對象或集合進行json字符串的轉換並回寫,為處理器適配器配置消息轉換參數,指定使用jackson進行對象或集合的轉換,因此需要在spring-mvc.xml中進行如下配置:
<!-- 配置處理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </bean> </list> </property> </bean>
通過配置瞭消息轉換器之後,我們就不需要在業務方法中進行手動轉換瞭:
@RequestMapping("test08") @ResponseBody //告知 SpringMVC框架 不進行視圖跳轉,直接進行數據響應 public User test08() throws IOException { User user = new User(); user.setAge(18); user.setUsername("zhangsan"); return user; }
在上述方法中我們通過配置處理器映射器完成瞭json格式的字符串的轉換,但是這種配置方式比較繁瑣,配置代碼比較多,因此,我們可以使用mvc的註解驅動代替上述配置。使用<mvc:annotation-driven>自動加載 RequestMappingHandlerMapping(處理映射器)和RequestMappingHandlerAdapter( 處 理 適 配 器 ),可用在Spring-xml.xml配置文件中使用<mvc:annotation-driven>替代註解處理器和適配器的配置。
<!--mvc的註解驅動--> <mvc:annotation-driven/>
到此這篇關於SpringMVC中的數據響應的文章就介紹到這瞭,更多相關SpringMVC數據響應內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 基於SpringMVC入門案例及講解
- SpringMVC執行步驟、Model的使用詳解
- 淺談springMVC中controller的幾種返回類型
- 使用springmvc配置視圖解析器和重定向方式
- 解決springboot整合cxf-jaxrs中json轉換的問題