【问题标题】:return ModelAndView when JSON is returned返回 JSON 时返回 ModelAndView
【发布时间】:2014-06-30 15:15:52
【问题描述】:

我们能否从 spring 控制器返回 JSON 对象并将该 JSON 对象写入 jsp 页面。 下面是我的jsp页面:

  <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

【问题讨论】:

  • 如果你使用 Jackson,你可以简单地在模型中添加一个 ObjectMapper 并将任何其他对象写为 JSON 字符串。
  • 我想你在找@ResponseBody

标签: json jsp spring-mvc


【解决方案1】:

是的,您可以在 Gson API 的帮助下以 JSON response.showing 的形式返回

@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);
}

【讨论】:

  • 我在浏览器控制台上遇到异常,请参阅编辑的初始帖子@Abhishek Mishra。
  • gson.toJson(rowData);是错误的代码,创建一个类,因为 xyz 使用 setter 方法设置您想要的所有值,然后将 xyz 对象说 xyzobj 传递给 gson,如 return gson.toJson(xyzobj);
  • 好的,我会试试的。还有一个问题,如果条件失败,我是否可以返回任何异常页面,因为从我的原始代码中我无法做到这一点,我相信即使使用这段代码,如果发生任何异常,我们也无法返回异常页面,因为此类是只加载道场网格内的数据,但网格已经加载,这就是当我遇到任何异常时它只在道场网格内显示“未找到数据”而不是转发到错误页面 @Abhishek Mishra 的原因。
  • 如果你的动作类需要返回 JSON 响应,那么你不能从控制器重定向到错误页面,但是你可以在 json 中发送错误响应,然后在收到错误响应后重定向到错误页面。
  • 哦,好的。然后我认为我需要在我的 jsp 页面中做很多更改,请参阅初始帖子中发布的 jsp 页面。目前我没有在 jsp 页面上处理任何事情。对吗? @Abhishek Mishra
【解决方案2】:

保持简洁...

这是一个真实的sn-p代码......

 @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);
    }

要考虑的重要一点是发送正确的 Web 标头,以便您的页面期望看到 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);
}

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 2015-10-31
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多