最新項目中需要用到不跳轉獲取後臺數據(List對象集合),百度操作一波,發現CSDN的帖子真水,根本沒有一遍講的比較全面的,而且帖子大多數是錯的(可能作者執行成功了,但是那只是你剛好條件巧合罷了,換個條件,你就失敗了,所以帖子沒深度。),所以我花了兩天時間整理試驗一波,總結如下,有不對的地方請大家指出,虛心求教。
跳轉獲取
1 Servlet
Servlet是最底層的方式,需要HttpServletRequest和HttpServletResponse相配合,把相關值保存在request、session、cookie、application作用域的某一個(如何獲取相關作用域,我在這裏不作詳解),之後直接用el(這只是其中的一種方式)語句讀取。相關代碼如下:
@RequestMapping("allCity3")
public String queryAllCity3(HttpServletRequest request, HttpServletResponse response) {
List<City> cities = cityService.queryAllCity();
for (City city : cities) {
city.setAreas(null);
}
// 保存到session中
/*HttpSession session = request.getSession();
session.setAttribute("cities", cities);*/
// 保存到request中
request.setAttribute("cities", cities);
// 返回的頁面(這裏配合相應的springMvc視圖解析器)
return "main";
}
注:以上代碼還不是最底層的,視圖層就用了springMvc的視圖解析配置(上面代碼“return “main””),如何你想更底層,直接使用request或response實現跳轉(代碼我就不貼了)。
2 ModelAndView
把數據保存到ModelAndView中,直接傳送到前端頁面,用jstl(當然不止一種方式,就不多說)讀取。相應的代碼如下:
// 以下代碼是控制器(controller)裏面的方法的子代碼
// 把要保存的數據保存進ModelAndView中
modelAndView.addObject("areaStatisticsList", areaStatisticsList);
// 設置跳轉頁面
modelAndView.setViewName("areaStatistics");
// 返回值
return modelAndView;
ajax獲取
ajax獲取也就是異步獲取,一般不進行頁面跳轉,作爲頁面局部刷新的一種解決方案。
1 HttpServletResponse
這個是Servlet的解決方案,也是底層解決方案。其他高級的方案大都是建立在其基礎上的。配合空返回void的controller類方法使用使用,利用其內部對象PrintWriter把傳送值輸送到前端,之後ajax回調函數調用其數據實現頁面局部更新。相關代碼如下:
try {
// 設置響應格式(如果不加會出現中文亂碼)
response.setContentType("html/text;charset=utf-8");
// 把數據輸送到前端,供ajax回調函數調用
response.getWriter().print(cities);
} catch (IOException e) {
e.printStackTrace();
}
2 @ResponseBody
@ResponseBody作爲springMvc控制層的返回數據的註解(感覺這個可以有更好表述),是springMvc框架推薦的方法解決方案。默認最終轉換爲json數據(也就是返回值是json格式),分兩組方式轉換:
2.1 人工轉換(個人自己命名的)
人工轉換就是在控制層直接裝換成json格式的字符串,下面舉了一個list對象集合轉換成JSONArray格式的字符串的例子,代碼如下:
// 對應json的maven依賴(json工具依賴包太多,我沒有做過多的研究,或許其他依賴包也能人工轉換呢,有待大家一起去研究
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.3</version>
<classifier>jdk15</classifier><!-- 指定jdk版本 -->
</dependency>
@RequestMapping(value = "queryAreasByCity", produces = {"text/html;charset=utf-8"})
@ResponseBody
public String queryAreaByCityName(@RequestParam("cName") String cName){
City city = cityService.queryCityByCName(cName);
List<Area> areas = city.getAreas();
// 轉換爲JSONArray類型
JsonConfig config = new JsonConfig();
config.setExcludes(new String[]{"city", "enterprises"});
JSONArray jsonArray = JSONArray.fromObject(areas, config);
String json = jsonArray.toString();
return json;
}
2.2 spring配置方式
spring配置方式,就是把轉換成json工作交給spring管理(也就是controller層返回值是List也會自動轉換成JSON格式字符串),直接在springMvc層配置相關轉換器bean。相關代碼如下:
// maven依賴
<!--javabean轉換成json的依賴-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
// springMvc框架的spring(IOC)配置,方法一:
<!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter"/>
<!--json轉換器-->
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<property name = "supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name = "supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="text"/>
<constructor-arg index="1" value="plain"/>
<constructor-arg index="2" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="*"/>
<constructor-arg index="1" value="*"/>
<constructor-arg index="2" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="text"/>
<constructor-arg index="1" value="*"/>
<constructor-arg index="2" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="application"/>
<constructor-arg index="1" value="json"/>
<constructor-arg index="2" value="UTF-8"/>
</bean>
</list>
</property>
</bean>
// springMvc框架的spring(IOC)配置,方法二:
<mvc:annotation-driven>
<mvc:message-converters>
<!--後臺對前端的轉換器-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!--解決亂碼問題-->
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
注:上面提到的兩種配置轉換器方法,我也是從網上找來的,我實踐了一下,都可以。至於原理我就不多探討了。
總結
springMvc中以上兩種獲取後臺數據的方式,都按照兩種思路來進行的,一是採用Servlet原始解決方案,二是採用SpringMvc現行的解決方案。跳轉方式傳給前端的是model數據,按照鍵值對來傳值,按照屬性訪問;ajax方式傳給前端的數據有多種形式(json、html、text等),後臺的model數據傳給前端需要進行數據轉換,一般轉換成json格式(其他數據我沒研究,但是我覺得沒必要研究,js的語言基本格式是json,在前端你最終還是需要轉換成json(個人之間)),然而request和response裏面好像實現了model轉換成json字符串(我試驗了一下,確實,有可能理解有問題,歡迎大家指出),SpringMvc則需要轉換成json字符串。