我正在使用Spring 3.2和Spring MVC。杰克逊图书馆包含在我的设置中。
我有一个页面,在初始加载时,需要为Dojo下拉框填充两个数据源(数据源是JSON格式的字符串)和两个文本框。我假设我可以在返回之前将这些添加到模型中作为四个字符串。
我找到了很多例子,其中带有@ResponseBody注释方法的控制器返回单个JSON以响应AJAX请求,但我找不到任何如何处理上述情况的示例(这不是响应一个AJAX请求,包括多个JSON以及简单的字符串)。
我的方法是返回四个字符串(两个包含JSON,和 在模型声音中包含文本框内容的两个?
如果上述(1)的答案为是:如何拉入两个列表 将对象作为JSON对象放入方法并将它们存储在Strings中?
答案 0 :(得分:0)
AJAX是客户端,Spring MVC是服务器。它们是不同的进程,通常在不同的机器上运行。
浏览器中的文档可以根据需要向服务器发送尽可能多的(AJAX)HTTP请求。
因此,如果要使用AJAX加载下拉窗口小部件,请向服务器发出请求以获取数据。
如果您想使用AJAX加载另一个下拉窗口小部件,请向您的服务器发送另一个请求。
或者,为了最大限度地减少请求数量,您可以
a)在第一个响应中将数据作为常规HTML加载,而不是全部使用AJAX
b)将响应组合在不同的控制器动作中,例如:
{
dropDown1Data:[...],
dropDown2Data:[...],
textBox1Data:[...], ...
}
答案 1 :(得分:0)
在您的问题中,您在初始加载时提及 。您不需要在初始加载时将json发送到页面。 JSON适用于AJAX请求。
要在初始加载上填充控件,只需将对象放入模型中并在页面上引用它们。
例如,
List blam1 = new ArrayList();
... populate blam1 ...
Model.addAttribute("blam1", blam1);
然后在页面上(本例中的JSP)
<c:foreach items="blam1" var="current>
Current: ${current}<br/>
</c:foreach>
答案 2 :(得分:0)
我找到了问题第二部分的解决方案(#2)。它基于Jackson ObjectMapper
的基本用法,将List
对象序列化为包含JSON表示法的String
:
@RequestMapping()
protected String initPage(Model model) {
List<StateDropDownEntry> states = stateService.getStates();
List<TownDropDownEntry> towns = townService.getTowns();
ObjectMapper objMapper = new ObjectMapper();
String statesJson = objMapper.writeValueAsString(states); // try|catch removed for clarity
String townsJson = objMapper.writeValueAsString(towns);
model.addAttribute("statesJson",statesJson);
model.addAttribute("townsJson",townsJson);
return "stateTownQueryPage";
}
虽然,我确实承认构建那些能够在第一次提供页面时能够创建的JSON的实现的替代方法作为AJAX调用(就像那些依赖于JSON的那些JSON一样)在服务页面的初始时间之后的用户输入上)到使用@ResponseBody
注释的控制器方法。这种方法也有其优点。
答案 3 :(得分:0)
要获得多个输入,请使用此选项:
@RequestMapping(value = "/....", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public ResponseEntity<RestResponse> functionName(@RequestBody Model model){
//TODO : Your task
return response;
}