怎么使用Echart-Java类库+thymeleaf渲染后台数据到前端Echarts图形?

本人在学习Echarts方面知识找到该链接作者的博客,很有收获,遇到些问题,特此 记录一下

首先介绍一下什么是Echarts-Java类库?

Echarts-Java就是一个基于java的Echarts开发包,即可以用Java类去构造 Echarts可能需要的全部数据结构。简单来说就是可以用java类为Echarts提供需要的数据。实现方式:后台以json的形式返回到前端,前端以js引用即可。

具体方式

1. 前端Echarts:

<div id="test" style="width: 800px ;height: 600px"></div>
<script th:src="@{/js/echarts.min.js}"></script>
<script type="text/javascript" th:src="@{/js/jquery-1.12.4.min.js}"></script>
<script type="text/javascript">
    var mychart=echarts.init(document.getElementById('test'));
    function show() {
     mychart.clear();
     mychart.showLoading({text:"正在努力读取数据"})
        $.getJSON("/inout/getOption",function (data) {
        if(data){
            console.log(data)
            mychart.setOption(data);
            mychart.hideLoading();
        }
        });
    }
    show();
</script>'

2.后台用Echarts-Java提供的类去写接口,返回Json数据

(1)导入依赖:Echarts-Java依赖

<dependency>
            <groupId>com.github.abel533</groupId>
            <artifactId>ECharts</artifactId>
            <version>2.2.6</version>
        </dependency>

(2)用Echarts-Java提供的Option类去写一个接口,返回json

@RequestMapping("/getOption")
    @ResponseBody
    public Option getOption(){
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
    List<Inouts> inoutsList = inoutService.selectByTime(format.format(new Date()));
    Option option=new Option();
    option.title("近七天手机销售情况").tooltip(Trigger.axis).legend("评价人数");
    CategoryAxis categoryAxis=new CategoryAxis();
    Bar bar=new Bar("评价人数");
    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
    for (Inouts inouts : inoutsList) {
        bar.data(inouts.getIncome());
        categoryAxis.data(simpleDateFormat.format(inouts.getTime()));
    }
    option.yAxis(new ValueAxis().boundaryGap(0d, 0.01));
    option.xAxis(categoryAxis);
    option.series(bar);
    return  option;
}

(3)运行项目,得到结果

3.如果出现数据渲染不完整的情况,即Echarts表格加载异常,比如没有显示坐标轴(我出现的就是没有显示坐标轴的情况)。

  • 问题产生原因:Option对象在转化为json对象的过程中,为null的属性(因为有些属性我们没有配置,自然为null)也转换为json了,这会影响Echarts一些属性无法正常渲染。
  • 解决方式:
    写一个配置类,过滤掉json中的null即可。
@Configuration
//使用echarts-java
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

        // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
        // Include.Include.ALWAYS 默认
        // Include.NON_DEFAULT 属性为默认值不序列化
        // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
        // Include.NON_NULL 属性为NULL 不序列化
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

        // 字段保留,将null值转为""
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

总结

把后台数据渲染到前端Echarts图形中,就四点注意:

  • 后端导入Echarts- Java的依赖,写好接口,返回json数据
  • 前端用js引用json渲染即可
  • 如果数据渲染异常,则写配置类,过滤json中的null字段
  • 还有就是版本问题,echarts-java类库的版本2.x 和3.x是不一样的,开始我用的3.x报错了,我猜测是跟Echarts的版本冲突了,所以我改成2.x就没错了