2012-04-17 7 views
1

Извините, если это дубликат, но я не нашел ничего конкретного в качестве примера.springmvc using json response

У меня есть следующий контроллер в springmvc.

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

/** 
* Handles requests for the application home page. 
*/ 
@Controller 
public class HomeController { 

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 

    /** 
    * Simply selects the home view to render by returning its name. 
    */ 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Locale locale, Model model) { 
     logger.info("Welcome home! the client locale is "+ locale.toString()); 

     Date date = new Date(); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

     String formattedDate = dateFormat.format(date); 

     model.addAttribute("serverTime", formattedDate); 

     return "main"; 
    } 

} 

Это означает, что я могу то доступ к $ {ServerTime}, мой вопрос, есть ли способ я могу получить этот ответ будет ответом JSON, без жесткого кода всего кода преобразования JSON в этом контроллере , Есть ли способ, которым я могу просто поместить некоторый XML в конфиг, чтобы он знал, чтобы преобразовать ответ в ...

{"serverTime": "12 12 2012"} (игнорируйте лицо, это, вероятно, не в правильном формате даты)

Следует отметить, что «main» - это имя представления (main.jsp), поэтому я хочу, чтобы это работали одинаково.

ответ

1

Аннотировать свой метод @ResponseBody.

Тогда просто верните свой товар, formattedDate.

@RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Locale locale, Model model) { 
     logger.info("Welcome home! the client locale is "+ locale.toString()); 

     Date date = new Date(); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

     String formattedDate = dateFormat.format(date); 

     model.addAttribute("serverTime", formattedDate); 

     return "main"; 
    } 

    @RequestMapping(value = "/serverTime", method = RequestMethod.GET) 
    @ResponseBody 
    public String serverTime(Locale locale, Model model) { 
     Date date = new Date(); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

     return dateFormat.format(date); 
    } 
+0

Ах, я сделал это, но вы заметите в нижней строке моего вопроса, это нарушает мои взгляды. Можно ли сделать и то и другое? – david99world

+0

А, простите об этом. Можете ли вы использовать AJAX? Загрузите ваше представление, главное, а затем выполните запрос данных JSON. – bvulaj

+0

Да, мой запрос AJAX в основном делает запрос к контроллеру для страницы, на которую он должен пойти, что он делает, но он также должен вернуть полезную нагрузку JSON. Вы предлагаете мне перейти на один URL-адрес для ответа JSON, а другой для html? Это кажется немного противным. – david99world

0

Там есть библиотека для преобразования объектов Java в формат JSON называется gson:

http://code.google.com/p/google-gson/

Кстати, если Вы желаете отправить ответ Ajax, а не обновлять страницу, добавьте @ResponseBody к вашему объявлению методы :

public @ResponseBody String home(Locale locale, Model model) { .. } 

и вернуть строку JSON (если вы не обновляете свою модель, если это так).

+0

Ах, если вы обратите внимание на нижнюю часть моего вопроса, это похоже, что нарушит обработку вида, как он возвращает вид «основной», можно сделать этот ответ JSON и поддерживать обработку моих взглядов в пределах контроллер? – david99world

+0

Я думаю, что BrandonV ответил на это. – JazzHands