генерировать график из контроллера - PullRequest
0 голосов
/ 19 марта 2011

Я использую 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 ]

1 голос
/ 19 марта 2011

Я сделал что-то похожее с Jfreechart, в итоге я создал еще один контроллер диаграммы с отображением типа @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();
}
0 голосов
/ 26 декабря 2013

Я использую единый интерфейс для нескольких обработчиков отчетов.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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...