从控制器生成图表

时间:2011-03-18 21:08:46

标签: image spring servlets spring-mvc

我使用spring 3.0,在jsp中,我尝试显示数据和图表......

@Controller
@RequestMapping("/user.htm")
public class UserController {

@Autowired
private IUserService userService;

@RequestMapping(method = RequestMethod.GET)
public ModelAndView user(HttpServletRequest request,
    HttpServletResponse response) {

    ModelAndView modelAndView = new ModelAndView("user");
    modelAndView.addObject("statUser", userService.getStatUser());

    return modelAndView;
}

public void generateChart(HttpServletRequest request,
    HttpServletResponse response){
    try {
        AxisChart axisChart = userService.generateChart();
        ServletEncoderHelper.encodeJPEG13( axisChart, 1.0f, response );
    } catch (ChartDataException ex) {

    } catch (PropertyException ex) {

    } catch (IOException ex) {

    }

  }

}

在jsp中我尝试用

显示图表
<img src="generateChart"/>

我可以看到信息...所以控制器的获取工作正常,但图像永远不会显示

所以我不知道我是否可以使用相同的控制器或只需要创建一个新的控制器来创建图像......

任何想法?

2 个答案:

答案 0 :(得分:1)

我用Jfreechart做了一些similer,我最后创建了另一个图表控制器,其中包含@RequestMapping("/chart.jpg")这样的映射,然后通过<img src="cart.jpg"/>链接到它。在控制器中,您必须设置response.setHeader("Content-Type", "image/jpg");

编辑: 这是我的一个例子(它在groovy中,它是一个png,但它应该有帮助)

@RequestMapping("/chart.png")
def chart(HttpServletRequest request, HttpServletResponse response){
    JFreeChart chart = ChartFactory.createTimeSeriesChart(...)
    //fill & layout the chart
    def pngChart = EncoderUtil.encode(chart.createBufferedImage(600, 400), "png")
    response.setContentType("image/png");
    response.setContentLength(pngChart.length);
    response.getOutputStream().write(pngChart);
    response.getOutputStream().close();
}

答案 1 :(得分:0)

我正在为多个报表处理程序使用单一界面。 结果总是期望ModelAndView。 我认为这是一般情况,当您需要处理不同的报告并以不同的格式返回数据时。

所以,我通过扩展AbstractView解决了问题。 注意:代码示例从磁盘加载文件。 您必须使用自己的图像生成器和模型中表示的数据创建字节数组输出流。

创建ModelAndView的示例:

ModelAndView result = new ModelAndView();
result.setView(new ImageView());
result.addObject("chart_data_param1", "1");
result.addObject("chart_data_param2", "2");
result.addObject("chart_data_param3", "3");

View类的实现:

public class ImageView extends AbstractView {

        public ImageView() {
            setContentType("image/png");
        }

        @Override
        protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
            ByteArrayOutputStream baos = createTemporaryOutputStream();
            byte[] img = FileUtils.readFileToByteArray(new File("<some-file-path>"));
            baos.write(img, 0, img.length);
            baos.close();
            writeToResponse(response, baos);
        }
    }