欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springMvc中前端获取后台数据的方式

程序员文章站 2022-07-12 19:11:55
...

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