Передача объекта JSON из контроллера в представление (jsp)

#spring-mvc #view #controller

#spring-mvc #Вид #контроллер

Вопрос:

Я пытаюсь отправить объект JSON в мое представление с контроллера, но не могу его отправить. Пожалуйста, помогите мне!

Я использую следующий код

 public class SystemController extends AbstractController{

    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("SystemInfo", "System", "S");

        response.setContentType("application/json;charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        JSONObject jsonResult = new JSONObject();

        jsonResult.put("JVMVendor", System.getProperty("java.vendor"));
        jsonResult.put("JVMVersion", System.getProperty("java.version"));
        jsonResult.put("JVMVendorURL", System.getProperty("java.vendor.url"));
        jsonResult.put("OSName", System.getProperty("os.name"));
        jsonResult.put("OSVersion", System.getProperty("os.version"));
        jsonResult.put("OSArchitectire", System.getProperty("os.arch"));

        response.getWriter().write(jsonResult.toString());
     //   response.getWriter().close();

        return mav;             // return modelandview object
    }
}
  

и на стороне представления я использую

 <script type="text/javascript">

Ext.onReady(function(response) {
     //Ext.MessageBox.alert('Hello', 'The DOM is ready!');
     var showExistingScreen = function () {
        Ext.Ajax.request({
            url                     : 'system.htm',
            method                  : 'POST',
            scope                   : this,
            success: function ( response ) {
                alert('1');
                var existingValues = Ext.util.JSON.decode(response.responseText);
                alert('2');
              }
        });
    };

    return showExistingScreen();
});
  

Ответ №1:

Для отправки JSON обратно клиенту я успешно использую следующее решение:

1) клиент (браузер) отправляет запрос AJAX POST, содержащий значения в формате JSON (но также возможен GET), на мой контроллер SpringMVC.

 $.postJSON("/login", login, function(data)
{
    checkResult(data);
});
  

2) Сигнатура метода контроллера SpringMVC:

 @RequestMapping(value = "/login", method = RequestMethod.POST)
public @ResponseBody Map<String, String> 
login(@RequestBody LoginData loginData, 
HttpServletRequest request, HttpServletResponse response)
  

@ResponseBody — это ключ, он «… указывает, что возвращаемый тип должен быть записан непосредственно в теле HTTP-ответа (а не помещен в модель или интерпретирован как имя представления)». [Справочный документ Spring]
LoginData — это простой POJO-контейнер для значений JSON из клиентского запроса, заполняемый автоматически, если вы помещаете jar-файл jackson (я использую jackson-all-1.7.5.jar ) в ваш путь к классу.
В результате метода контроллера я создаю HashMap<Строка, String> . (например, с ключами «ошибка» или «просмотр» и соответствующими значениями). Затем эта карта автоматически сериализуется в JSON, который интерпретируется клиентом (опять же, обычная HTML-страница, включая Javascript)

 function checkResult(result)
{
    if (result.error)
    {
      // do error handling
    }
    else
    {
      // use result.view
    }
}