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字符串。

发布了39 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a1920135141/article/details/100181863