我有一个扩展MultiActionController的控制器,它不使用注释。一切都是由xml配置的。
有没有办法在MultiActionController中重现此方法?
@RequestMapping(value = "/products", method = RequestMethod.GET)
public @ResponseBody List<Product> products() {
return product.getList();
}
我面临的问题是如何在@ResponeBody中返回列表。
我的方法如下:
public ModelAndView login(HttpServletRequest request,HttpServletResponse response) throws ServletRequestBindingException {
return new ModelAndView("login", model);
}
答案 0 :(得分:1)
一个开放式问题的排序,我的意思是,你想要什么样的响应类型,json,xml,纯文本等,
如果您不仅限于使用此特定控制器,则可以专门为RESTful响应设置一个新控制器,例如在问题开始时尝试使用@ResponseMapping
。
如果您绑定到此特定控制器,您也可以使用直接servlet路由,并且无法使用注释。例如:
public void generateProductList(HttpServletResponse response) {
OutputStream os = response.getOutputStream();
// This is where you would massage the data into the response type you want
String responseBody = generateResponseBody(productList);
os.write(responseBody.getBytes());
os.flush();
}
我假设如果您直接写入响应主体,这将用于某种AJAX调用。如果是这种情况,我建议使用Jackson(或类似)库将列表转换为JSON,并使用我刚才提到的任何一种方法来编写响应。如果JSON不是一个选项,您可以轻松地将列表转换为CSV响应,然后使用javascript解析CSV以执行某些操作。
答案 1 :(得分:0)
如果您想将列表恢复到调用它的位置,您可以执行以下操作:
public ModelAndView login(HttpServletRequest request,HttpServletResponse response) throws ServletRequestBindingException {
ModelMap model=new ModelMap();
List<Product> productList=product.getList();
model.add("productList",productList);
return new ModelAndView("login", model);
}
例如,您已经从jsp中调用了这个,然后您可以通过编写以下内容来检索jsp中的数据:
{productList}
现在通过使用jstl for循环,您可以迭代列表。
答案 2 :(得分:0)
public ModelAndView products(HttpServletRequest request,HttpServletResponse response) {
final List<Product> products = product.getList();
return new ModelAndView(new AbstractView() {
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
ByteArrayOutputStream baos = this.createTemporaryOutputStream();
byte[] b = generateBytes(products)
baos.write(b);
this.writeToResponse(response, baos);
};
private byte[] generateBytes(List<Product> products) {
// TODO Your codes.
}
});
}