【问题标题】:generate a chart from a controller从控制器生成图表
【发布时间】:2011-03-18 21:08:46
【问题描述】:

我使用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"/>

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

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

有什么想法吗?

【问题讨论】:

    标签: image spring servlets spring-mvc


    【解决方案1】:

    我用 Jfreechart 做了一些类似的事情,我最终创建了另一个图表控制器,其映射类似于 @RequestMapping("/chart.jpg"),然后通过 &lt;img src="cart.jpg"/&gt; 链接到它。然后你必须在控制器中设置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();
    }
    

    【讨论】:

    • 遇到了同样的问题这个控制器永远不是调用者@Controller @RequestMapping("/userStat.jpg") public class ImageController { @Autowired private IUserService userService; 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) { } } }
    • 我会尝试使用 jfreechart,但无法使用 jchart
    • 我需要在配置文件中设置一些东西吗?
    • 你指的是哪个配置文件?
    【解决方案2】:

    我正在为多个报告处理程序使用单一界面。 结果总是期望 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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      相关资源
      最近更新 更多