我们以jfreechart为例,自定义一个chart视图及解析器。
首先,自定义视图类ChartView,继承AbstractView, 如下:
自定义视图解析器ChartViewResolver,继承AbstractCachingViewResolver,如下
dispacher-servlet.xml文件的配置,注意视图解析器的顺序
控制层的代码,注意ChartView内的Map中的数据,就是这里modelMap中的数据
首先,自定义视图类ChartView,继承AbstractView, 如下:
public class ChartView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> map,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
JFreeChart chart=null;
//IChart为自定义的接口规范。根据输出类型的不同调用相应的方法
switch (((Integer)map.get(IChart.CHARTTYPE)).intValue()) {
case IChart.BAR:chart=getChartBar(map);break;
case IChart.PIE:break;
default:break;
}
//图片的输出
ChartUtilities.writeChartAsJPEG(response.getOutputStream(), chart, 200,200);
}
private JFreeChart getChartBar(Map<String, Object> map){
JFreeChart chart = ChartFactory.createBarChart3D("产品销量图", "产品名称", "销量",
(CategoryDataset)map.get(IChart.CHARDATASET), PlotOrientation.VERTICAL, true, true, false);
chart.getTitle().setFont(new Font("宋体", Font.BOLD, 20));
chart.getCategoryPlot().getDomainAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 11));
chart.getCategoryPlot().getDomainAxis().setLabelFont(new Font("黑体", Font.BOLD, 12));
chart.getCategoryPlot().getRangeAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 11));
chart.getCategoryPlot().getRangeAxis().setLabelFont(new Font("黑体", Font.BOLD, 12));
chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 11));
return chart;
}
}
自定义视图解析器ChartViewResolver,继承AbstractCachingViewResolver,如下
public class ChartViewResolver extends AbstractCachingViewResolver {
private String chartSuffix;//后缀
private View chartView;
@Override
protected View loadView(String viewName, Locale locale) throws Exception {
View view = null;
if (viewName.endsWith(this.getChartSuffix())){
view =this.getChartView();
}
return view;
}
public String getChartSuffix() {
return chartSuffix;
}
public void setChartSuffix(String chartSuffix) {
this.chartSuffix = chartSuffix;
}
public View getChartView() {
return chartView;
}
public void setChartView(View chartView) {
this.chartView = chartView;
}
}
dispacher-servlet.xml文件的配置,注意视图解析器的顺序
<bean id="chartViewResolver" class="com.zhang.webapp.util.ChartViewResolver">
<property name="chartSuffix" value=".chart"/>
<property name="chartView">
<bean class="com.zhang.webapp.util.ChartView"/>
</property>
</bean>
<!--注意viewResolver应放在最后,让自定义的优先执行 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
控制层的代码,注意ChartView内的Map中的数据,就是这里modelMap中的数据
@RequestMapping(value="/getchart.chart",method=RequestMethod.GET)
public String getChart(ModelMap modelMap){
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(510, "深圳", "苹果");
dataset.addValue(320, "深圳", "香蕉");
dataset.addValue(580, "深圳", "橘子");
dataset.addValue(390, "济南", "梨子");
modelMap.addAttribute(IChart.CHARTTYPE,IChart.BAR);
modelMap.addAttribute(IChart.CHARDATASET,dataset);
return "webanalytics.chart";
}
页面的代码:
<div id="tab_barChart" style="padding:0;display:block;">
<img id="chart_BAR" src="<c:url value='/user/getchart.chart'/>">
</div>
结果如下图所示: