在 JSP 頁面中直接嵌入圖表生成邏輯會導致代碼混亂、難以復用。最佳實踐是將 JFreeChart 封裝為自定義標簽庫,頁面僅需聲明式調用:
<mytag:chart width="790" height="460" type="bar" data="${requestScope.dataVO}" chartType="3D" />
繼承 TagSupport,重寫 doStartTag(),流程如下:
DataVONTASChartFactory,注入尺寸、風格(2D/3D)createNTASChart(type) 生成圖片文件<img> 標簽及關聯的 <map> 熱區public class NtasChartTag extends TagSupport {
private static final long serialVersionUID = 1L;
private int width = 790;
private int height = 460;
private String type;
private DataVO datavo;
private String attrbuteName = NtasConst.REQUEST_DATAVO_KEY;
private String chartType = "2D";
@Override
public int doStartTag() throws JspException {
StringBuffer sb = new StringBuffer();
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
HttpSession session = request.getSession(true);
datavo = (DataVO) request.getAttribute(attrbuteName);
NTASChartFactory factory = new NTASChartFactory(datavo, session);
factory.setPicWidth(width);
factory.setPicHeight(height);
factory.setChartstyle(chartType);
try {
factory.createNTASChart(type);
} catch (Exception e) {
e.printStackTrace();
}
String picFileName = factory.getFileName();
String picURL = factory.getPicURL();
sb.append(factory.getChartMapHtml()); // 圖片熱區
sb.append(String.format(
"<img border='0' width='%d' height='%d' src='%s%s' useMap='#%s' />",
width, height, request.getContextPath(), picURL, picFileName
));
try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}
// getter/setter 省略...
}
getChartMapHtml() 返回 <map>,實現圖表區域點擊交互。WEB-INF/lib.tld 文件定義標簽屬性,放入 WEB-INF<%@ taglib uri="/WEB-INF/mytags.tld" prefix="mytag" %>DataVO 放入 Request此模式可輕鬆擴展支持折線圖、餅圖、散點圖等多種圖表類型,構建企業級報表門戶的基石。