Я использую Spring MVC
.
У меня есть запрос $.ajax
POST для выполнения некоторых вычислений, и взамен я получаю объект Json.
Пока я делаю это, могу ли я добавить еще один атрибут модели, используя model.addattribute(x,y)
из этого метода.
@RequestMapping(value = "/loadPOAction", method = RequestMethod.POST)
public @ResponseBody OrderSearch loadOrder(HttpServletRequest request, Model model,@RequestBody final OrderSearch search) {
System.out.println(search.getVal());
model.addAttribute("name", "to be added to model");
return search;
}
Возможно ли это? Я попытался, но не смог получить значение ${name}
в JSP
.
Невозможно добавить какие-либо атрибуты JSP, которые вы ранее отображали. Этот JSP был обработан и возвращен клиенту и, таким образом, недоступен для контекста на стороне сервера.
Что касается повторного использования данных/объектов по нескольким запросам, вы, как правило, реализуете стратегию кэширования. Это не относится к сфере вашего вопроса, и я предлагаю прочитать здесь: http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#cache
Если вы хотите вернуть объект JSON, содержащий дополнительные атрибуты, вам нужно
search
(если у него есть необходимые поля)затем верните этот объект (соответственно подгоняя подпись вашего метода).
Например:
@RequestMapping(value = "/loadPOAction", method = RequestMethod.POST)
public @ResponseBody OrderSearch loadOrder(HttpServletRequest request, @RequestBody OrderSearch search) {
// set on search object if possible
search.setName("my name which I retrieved from somewhere");
// alternatively, you could create a map with the values you need and return it
// (requires you to change the method return type to Map
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("name", "my name");
resultMap.put("incomingSearch", search);
resultMap.put("someSearchValue", search.getSomeValue());
// alternatively, create a new "OrderSearchResponse" class and return an instance of it
OrderSearchResponse searchResponse = new OrderSearchResponse();
searchReponse.setName("my name");
searchResponse.setSomeValue("some value");
return search; // or resultMap or searchReponse depending on what you do above
}
Если вы хотите отобразить другой JSP, вы измените свой метод на следующий (обратите внимание на тип возврата String
):
@RequestMapping(value = "/loadPOAction", method = RequestMethod.POST)
public @ResponseBody String loadOrder(HttpServletRequest request, Model model, @RequestBody final OrderSearch search) {
model.addAttribute("search", search);
model.addAttribute("name", "to be added to model");
return "theNameOfYourJspView";
}
Затем в вашем theNameOfYourJspView
вы можете использовать ${search.someValue}
а также ${name}
.
OrderSearch
, то это, вероятно, будет проще всего. В противном случае вам нужно будет перенести данные в другой объект, который вы затем вернете.
JsonOrder
. Объектmodel
которому вы добавляете свой атрибут, больше ни для чего не используется (должен ли он быть возвращен?). Затем вы возвращаетеsearch
который имеет типOrderSearch
. Можете ли вы очистить свой код или предоставить более подробную информацию о том, что именно вы хотите вернуть?