springMvc自定义视图及解析器

来源:互联网 发布:淘宝dmp是什么意思 编辑:程序博客网 时间:2024/05/22 13:35
我们以jfreechart为例,自定义一个chart视图及解析器。
首先,自定义视图类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>


结果如下图所示:


0 0