2014-06-30 53 views
0

我們可以從spring控制器返回JSON對象並在jsp頁面上寫入該JSON對象。 下面是我的jsp頁面:返回JSON返回時的ModelAndView

<script type="text/javascript"> 
dojo.require("dojox.grid.EnhancedGrid"); 
      dojo.require("dojox.data.QueryReadStore"); 
    dojo.ready(function(){ 

       mystore=new dojo.data.ItemFileReadStore({url:"<%=request.getContextPath()%>/showData.htm"}); 

       var layout= [ 
       {field: 'ID', name: 'SID',formatter: hrefFormatter,datatype:"number" }, 
       {field: 'SPREAD',name: 'SPREAD',autoComplete: true} 
] 
var grid = new dojox.grid.EnhancedGrid({ 
         id: 'myGrid', 
         ---- 
         }); 
</script> 

控制器:

@RequestMapping(value = "/showData", method = RequestMethod.GET) 
    public void getSTIDData(HttpServletRequest request, 
      HttpServletResponse response, @ModelAttribute VINDTO vinData, 
      BindingResult beException) throws IOException { 
     try { 
       ...... 
       ...... 
      XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { 
       public HierarchicalStreamWriter createWriter(Writer writer) { 
        return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE); 
       } 
      }); 

      xstream.alias("items", com.loans.auto.DTO.VINRequestDTO.class); 
      String str = xstream.toXML(vinListCopy); 

      StringBuffer rowData = new StringBuffer(); 
      rowData.append("{'numRows':").append(vinListCopy.size()) 
        .append(",'items':").append(str).append("}"); 
      PrintWriter out = response.getWriter(); 
      out.print(rowData); 
} 

相反getSTIDData(..)返回void的,我想這個方法返回ModelAndView對象,但是當我返回ModelAndView對象,在jsp頁面數據沒有被加載,並且顯示「找不到數據」。請建議。謝謝。

下面是當我用GSON

SyntaxError {stack: "SyntaxError: Unexpected identifier↵ at Object.d… at signalWaiting (/MYWebProject/dojo/Deferred.js:28:4)", message: "Unexpected identifier"} 
message: "Unexpected identifier" 
stack: "SyntaxError: Unexpected identifier↵ at Object.dojo.fromJson (/MYWebProject/dojo/_base/json.js:26:23)↵ at Object.dojo._contentHandlers.dojo.contentHandlers.json (/MYWebProject/dojo/_base/xhr.js:78:16)↵ at Object.dojo._contentHandlers.dojo.contentHandlers.json-comment-optional (/MYWebProject/dojo/_base/xhr.js:156:28)↵ at _deferredOk (/MYWebProject/dojo/_base/xhr.js:432:42)↵ at notify (/MYWebProject/dojo/_base/Deferred.js:187:23)↵ at complete (/MYWebProject/dojo/_base/Deferred.js:168:4)↵ at resolve.callback (/MYWebProject/dojo/_base/Deferred.js:248:4)↵ at eval (/MYWebProject/dojo/_base/xhr.js:627:8)↵ at signalListener (/MYWebProject/dojo/Deferred.js:37:21)↵ at signalWaiting (/MYWebProject/dojo/Deferred.js:28:4)" 
__proto__: Error 
+0

如果使用傑克遜,你可以簡單地添加一個'ObjectMapper'到模型上,寫任何其他對象作爲JSON字符串。 – Bart

+0

我認爲你正在尋找[@ResponseBody](http://docs.spring.io/spring/docs/4.0.x/javadoc-api/org/springframework/web/bind/annotation/RequestBody.html)。 –

回答

1

是你可以爲JSON response.showing返回與GSON API

@RequestMapping(value = "/showData", method = RequestMethod.GET) 
public @ResponseBody String getUserHomePage(HttpServletRequest request,HttpServletResponse response, @ModelAttribute VINDTO vinData,BindingResult beException) throws IOException { 
//you code stuff to create model object bean 
Gson gson = new Gson(); 
return gson.toJson(objectBean); 
} 
+0

iam在瀏覽器控制檯上得到例外,請參閱編輯的初始文章@Abhishek Mishra。 – user3684675

+0

gson.toJson(rowData); 是錯誤的代碼,創建一個類爲XYZ設定所有你想與setter方法是什麼,然後再通過XYZ對象說xyzobj到GSON 像 回報gson.toJson(xyzobj)的值; –

+0

好的,我會試試。如果條件失敗,我可以返回任何異常頁面,因爲從我的原始代碼我無法做到這一點,我相信即使這個代碼我們正在談論,我們不能返回異常頁面,如果任何異常發生,因爲這個類是隻加載dojo gird內的數據,但網格已經加載,這就是我得到任何異常的原因,它只在dojo網格中顯示「NO DATA FOUND」,而不是轉發到錯誤頁面@Abhishek Mishra。 – user3684675

0

的幫助保持乾淨和簡單生成的異常...

這裏是一個代碼現實生活中的片段......

@RequestMapping(value = "/actions/getImplGroups", method = RequestMethod.POST) 
    public ResponseEntity<String> getImplGroups(HttpServletRequest request, HttpServletResponse response) { 

     List<String> groups = bpmClient.getAllGroups(); 

     ObjectMapper mapper = new ObjectMapper(); 
     String jsonString; 
     try { 
      jsonString = mapper.writeValueAsString(groups); 
     } catch (JsonGenerationException e) { 
      jsonString = "Error with json generation: " + e.getMessage(); 
     } catch (JsonMappingException e) { 
      jsonString = "Error with json mapping: " + e.getMessage(); 
     } catch (IOException e) { 
      jsonString = "Error with json: " + e.getMessage(); 
     } 

     HttpHeaders responseHeaders = new HttpHeaders(); 
     responseHeaders.setContentType(MediaType.APPLICATION_JSON); 
     return new ResponseEntity<String>(jsonString, responseHeaders, HttpStatus.CREATED); 
    } 

要考慮的重要一點是發送正確的網頁標題,以便您的網頁能夠看到json。

我上面我們的情況下使用的Jackson庫來創建JSON,但實際上,你可以格式化你的JSON喜歡的任何方式。下面是一個簡單,手動格式化字符串的例子...

@RequestMapping(value = "/actions/getTicketsNotUpdatedWithinShift", method = RequestMethod.POST) 
public ResponseEntity<String> getTicketsNotUpdatedWithinShift(String center, String sections, String minutesInShift, Model model) { 

    String[] sectionArray = sections.split(","); 

    String json = ""; 
    String rowsString = ""; 

    for (String section : sectionArray) { 
     List<Map<String, String>> rows = service.getMinutesSinceLastTicketUpdate(center, section); 

     for (Map<String, String> row : rows) { 
      int minutesSinceUpdate = Integer.parseInt(row.get("minutes")); 

      if (minutesSinceUpdate > Integer.parseInt(minutesInShift)) { 
       String description = row.get("description"); 
       rowsString = rowsString + "\"" + description + "\","; 
      } 
     } 
    } 

    // Build the json structure 
    if (!rowsString.isEmpty()) { 
     // Trim the trailing comma. 
     rowsString = rowsString.replaceAll(",$", ""); 
     json = "[" + rowsString + "]"; 
    } else { 
     json = "[]"; 
    } 


    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.setContentType(MediaType.APPLICATION_JSON); 
    return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED); 
}