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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章