最新项目中需要用到不跳转获取后台数据(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字符串。