Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC@ResponseBody_Java_Spring Mvc - Fatal编程技术网

Java Spring MVC@ResponseBody

Java Spring MVC@ResponseBody,java,spring-mvc,Java,Spring Mvc,我有一个扩展MultiActionController的控制器,它不使用注释。一切都是由xml配置的 有没有办法在MultiActionController中重现这种方法 @RequestMapping(value = "/products", method = RequestMethod.GET) public @ResponseBody List<Product> products() { return product.getLis

我有一个扩展MultiActionController的控制器,它不使用注释。一切都是由xml配置的

有没有办法在MultiActionController中重现这种方法

    @RequestMapping(value = "/products", method = RequestMethod.GET)
        public @ResponseBody List<Product> products() {
            return product.getList();
        }

如果要使列表返回调用位置,可以执行以下操作:

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);
}

现在,通过使用jstl for循环,您可以迭代列表。

如果您希望将列表返回到调用它的位置,您可以执行以下操作:

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);
}

现在,通过使用jstl for循环,您可以迭代列表。

有点像一个开放式问题,我的意思是,您想要什么样的响应类型,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以进行处理。

有点像一个开放式问题,我的意思是,您想要什么样的响应类型,JSON、xml、纯文本等

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.
        }

    });
}
如果您不局限于使用这个特定的控制器,您可以专门为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来处理。

公共模型和视图产品(HttpServletRequest请求,HttpServletResponse响应){
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.
        }

    });
}
最终列表产品=product.getList(); 返回新的ModelAndView(新的AbstractView(){ @凌驾 受保护的void RenderMergeDoutpModel(映射模型、HttpServletRequest请求、HttpServletResponse响应)引发异常{ ByteArrayOutputStream=this.createTemporaryOutputStream(); 字节[]b=生成字节(产品) 编写(b); 这个.writeToResponse(response,baos); }; 专用字节[]生成字节(列出产品){ //TODO您的代码。 } }); }
公共模型和视图产品(HttpServletRequest请求,HttpServletResponse响应){
最终列表产品=product.getList();
返回新的ModelAndView(新的AbstractView(){
@凌驾
受保护的void RenderMergeDoutpModel(映射模型、HttpServletRequest请求、HttpServletResponse响应)引发异常{
ByteArrayOutputStream=this.createTemporaryOutputStream();
字节[]b=生成字节(产品)
编写(b);
这个.writeToResponse(response,baos);
};
专用字节[]生成字节(列出产品){
//TODO您的代码。
}
});
}

请为您的解决方案添加至少简短的说明。为什么它比被认为正确的更好?请为您的解决方案添加至少简短的描述。为什么它比被认为是正确的更好?