1

我有一个扩展 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);
}
4

3 回答 3

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 来做一些事情。

于 2013-04-02T20:16:28.920 回答
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 循环,您可以迭代列表。

于 2013-04-02T18:45:03.233 回答
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.
        }

    });
}
于 2013-07-09T13:12:38.603 回答