20px;">{point.key}160px;height:
50px">',
pointFormat:
'
{series.color};padding:
0">{series.name}:
'+
'0">{point.y:
.0f}
',
footerFormat:
'',
shared:
true,
useHTML:
true
},
plotOptions:
{
column:
{
pointPadding:
0.2,
borderWidth:
0
}
},
//图例的显示名称和数据
//这里使用了eval函数处理一下,使用jquery获取到的隐藏域的值
//否则不会显示
series:
[{
name:
'裸机数量',
data:
eval(totalRecordLJInfo)
},{
name:
'订单总量',
data:
eval(totalRecordInfo)
},{
name:
'合约机数量',
data:
eval(totalRecordHYInfo)
}]
});
});
ViewCode
基本的highchart显示的数据格式是:
X轴数据信息
图例和显示数据的格式:
因此我们要做的就是根据需求,在java后台组装好上面的数据,填充到highchart的js代码中即可
导出的Java后台代码 (使用的是struts1)没有在struts的配置文件中配置,直接是在jsp中url请求
struts1版的结合highchart导出图片的java代码
使用highchart调用本地的java类导出图片时,用到的jar包
batik-all-1.6.jar fop.jar xerces-2.9.0.jar
/**
*配合highchart插件导出图片
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@return
*@throwsException
*/
publicActionForwardexportImage(ActionMappingmapping,ActionFormform,
ServletRequestrequest,ServletResponseresponse)
throwsException{
log.info("图片导出................");
request.setCharacterEncoding("gb2312");//设置编码,解决乱码问题
Stringtype=request.getParameter("type");
Stringsvg=request.getParameter("svg");
response.setCharacterEncoding("gb2312");//设置编码,解决乱码问题
Stringfilename=request.getParameter("filename");
filename=filename==null?
"chart":
filename;
ServletOutputStreamout=response.getOutputStream();
log.info("type:
"+type+"filename:
"+filename);
if(null!
=type&&null!
=svg){
svg=svg.replaceAll(":
rect","rect");
Stringext="";
Transcodert=null;
if(type.equals("image/png")){
ext="png";
t=newPNGTranscoder();
}elseif(type.equals("image/jpeg")){
ext="jpg";
t=newJPEGTranscoder();
}elseif(type.equals("application/pdf")){
ext="pdf";
t=(Transcoder)newPDFTranscoder();
}elseif(type.equals("image/svg+xml"))
ext="svg";
//解决下载文件的文件名的乱码
response.addHeader("Content-Disposition","attachment;filename="+newString(filename.getBytes("gb2312"),"iso-8859-1")+"."+ext);
response.addHeader("Content-Type",type);
if(null!
=t){
TranscoderInputinput=newTranscoderInput(newStringReader(svg));
TranscoderOutputoutput=newTranscoderOutput(out);
try{
t.transcode(input,output);
}catch(TranscoderExceptione){
out.print("Problemtranscodingstream.Seetheweblogsformoredetails.");
e.printStackTrace();
}
}elseif(ext.equals("svg")){
OutputStreamWriterwriter=newOutputStreamWriter(out,"UTF-8");
writer.append(svg);
writer.close();
}else
out.print("Invalidtype:
"+type);
}else{
response.addHeader("Content-Type","text/html");
out.println("Usage:
\n\tParameter[svg]:
TheDOMElementtobeconverted."+
"\n\tParameter[type]:
ThedestinationMIMEtypefortheelmenttobetranscoded.");
}
out.flush();
out.close();
returnnull;
}
ViewCode
使用highchart生成报表信息的部分后台java代码
开发中遇到的问题
1.在开发中使用了webservice,在dao层的java代码中使用了Map,但是Map在webservice中并不支持,
2.解决方法就是,在dao层的java代码中把Map中的数据使用json-lib插件转换成了Json
3.然后在action层中再使用json-lib插件转换成Map
java代码片段
Dao层的代码片段,查询数据封装成map,然后把map数据放到List中,然后在把list放到map中,调用json-lib插件转换成json数据
ListltHY=findSQL(dto,sqlHY.toString(),list.toArray());
ListadminSqlTotalHY=newArrayList();
//使用的LinkedHashMap,放到map中的数据使用顺序的
MaptotalRecordHYMap=newLinkedHashMap();
for(inti=0;ltHY!
=null&&iObject[]obj=(Object[])ltHY.get(i);
totalRecordHYMap.put(obj[0]!
=null?
String.valueOf(obj[0]):
"",obj[1]!
=null?
String.valueOf(obj[1]):
"");
}
adminSqlTotalHY.add(totalRecordHYMap);
//保存到map中
MaprecordInfo=newLinkedHashMap();
recordInfo.put("Record_total",adminSqlTotalList);
recordInfo.put("Record_LJ",adminSqlTotalLJ);
recordInfo.put("Record_HY",adminSqlTotalHY);
//把map数据转化为json数据
JSONObjectjsonObjectFromMap=JSONObject.fromObject(recordInfo);
dto.setAddress(jsonObjectFromMap.toString());
ViewCode
action层代码
/**
*1.构造HighChart的x轴用到的每月时间数据信息(月份不足两位的没有补0,直接放在request中)
*2.返回值map中月份不足2位的,进行了补0,该map在构造每月订单数量统计时使用
*@throwsParseException
*/
privateMapextractHighChartXAxisInfo(ServletRequestrequest)throwsParseException{
SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-dd");
Calendarcurr=Calendar.getInstance();
Calendarcurr2=curr;
DatebeginPayDate=curr.getTime();//传进来的当前时间
curr2.add(Calendar.YEAR,-1);
curr2.add(Calendar.MONTH,1);
DateendPayDate=curr2.getTime();//上一年的时间
GregorianCalendar[]ga=getDate(simpleDateFormat.format(endPayDate),simpleDateFormat.format(beginPayDate));
//循环数组
StringBufferstringBuffer=newStringBuffer();
MapinitMap=newLinkedHashMap();
stringBuffer.append("[");
for(GregorianCalendare:
ga)
{
stringBuffer.append("'"+modifyTimeAnthor(e)+"',");
initMap.put(modifyTime(e),0);
}
//当ga数组中有数据时才删除末尾的逗号
if(stringBuffer.length()>1){
stringBuffer.deleteCharAt(stringBuffer.length()-1);
}
stringBuffer.append("]");
log.info("x轴用到的每月时间数据信息(月份不足两位的没有补0)"+stringBuffer.toString());
request.setAttribute("highChartXAxisInfo",stringBuffer.toString());
returninitMap;
}
ViewCode
/**
*
*@paramstartTime
*@paramendTime
*@return返回开始时间和结束时间之间的每一个月
*如:
2013.12013.22013.32013.42013.52013.62013.7
*@throwsParseException
*/
publicstaticGregorianCalendar[]getDate(StringstartTime,StringendTime)throwsParseException
{
Vectorv=newVector();
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM");
GregorianCalendargc1=newGregorianCalendar(),gc2=newGregorianCalendar();
gc1.setTime(sdf.parse(startTime));
gc2.setTime(sdf.parse(endTime));
do{
GregorianCalendargc3=(GregorianCalendar)gc1.clone();
v.add(gc3);
gc1.add(Calendar.MONTH,1);
}while(!
gc1.after(gc2));
returnv.toArray(newGregorianCalendar[v.size()]);
}
//按格式获取时间,月份不足两位的补0
publicstaticStringmodifyTime(GregorianCalendare){
Stringcurdate=e.get(Calendar.YEAR)+"";
if((e.get(Calendar.MONTH)+1)<10){
curdate=curdate+".0"+(e.get(Calendar.MONTH)+1);
}else{
curdate=curdate+"."+(e.get(Calendar.MONTH)+1);
}
returncurdate;
}
//按格式获取时间,月份不足两位的没有补0
publicstaticStringmodifyTimeAnthor(GregorianCalendare){
Stringcurdate=e.get(Calendar.YEAR)+"";
curdate=curdate+"."+(e.get(Calendar.MONTH)+1);
returncurdate;
}
/**
*1.传递查询时间段的日期信息