springMvc中前端获取后台数据的方式
最新项目中需要用到不跳转获取后台数据(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字符串。
推荐阅读
-
微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
-
三种AngularJS中获取数据源的方式
-
Android Manifest中meta-data扩展元素数据的配置与获取方式
-
利用js将ajax获取到的后台数据动态加载至网页中的方法
-
在react中,使用axios获取后台服务器数据的方法
-
JPA中的数据获取(Fetching)方式:Eager和Lazy
-
SOA中springmvc中restful服务的数据权限加密方式分享 soaspringmvc restfulsoa 数据安全restful 数据安全
-
springMvc中前端获取后台数据的方式
-
Springbootboot后台获取前台数据的方式
-
通过JSON的方式后台数据返回到前端