java实现FusionCharts实时图工具

2024-01-27 07:38

本文主要是介绍java实现FusionCharts实时图工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FusionCharts强大无比,使用版本是FusionCharts3.2 (后面提供下载)破解版。web程序中无须jar包,

先看FusionChart如何获取数据:最常用的是setDataXML 和 setDataURL

setDataXML 是接收xml字符串,根据字符串生成图表信息,大多的图表是需要后台动态的获取数据的,适合于实时图表。

setDataURL 是接收xml路径的字符串,如果后台会生成xml文件,也是可以的,不适合实时图表。如果是固定的图表信息这个最适合。

所以setDataXML 比较实用,setDataJSON也一样。

下面的工具类的目的是给Action提供使用,提供最基本的,最常规的属性。如果是自定义很强,需要自己生成相应的xmldata,工具类通用了二十多种效果(可能还有,破解版的swf 不多)。

代码还不完善,基本功能够用了,单列和多列都可以使用,只需要改改相应的swf即可。

JSP中有一个自定义的图表,xmldata直接写在JSP里面了。

自定义的图表实现了很多非常规功能,如导出JPEG/JPG/PDF 导出进度条中文提示,导出按钮中文。断点的,数字和文字格式等,chart显示的效果等,详细用法在JSP中有注释。

由于结构的属性太多了,要查看里面的属性可以去FusionCharts_Evaluation\Code\ChartXSD\xxx.xsd等里面查看有哪些标签,哪些属性,以及属性类型等。

直接上代码

 

chart:<category label='Jun' />       <vLine color='FF5904' thickness='2'/>

chart:<trendlines><line startValue='26000' color='91C728' displayValue='Target' showOnTop='1'/>        </trendlines>

 

import java.util.Random;
/**  图表数据集合*  功能:组合数据,可自定义颜色,没有自定义颜色前12个为randomColor的顺序,*       超过部分随意选择randomColor的一种颜色*  对于下面自定义很强的 需要自己生成xmldata*  set alpha = '50' 透明度为50%  *  set dashed='1' 虚线状态显示*  set 对于Line  anchorSides='7' 显示的点为几边形   anchorRadius = '4' 形状大小 *  set anchorBorderColor='A186BE' 点 的边框颜色     anchorBgColor='8BBA00' 点的背景色*  set 中如果没有value属性 还是留有空间 只是没显示  空元素 */
public class DataSet {private String[] randomColor = new String[] { "AFD8F8", "F6BD0F", "8BBA00","FF8E46","008E8E","D64646","8E468E", "588526", "B3AA00","008ED6", "9D080D", "A186BE" };private String seriesName;  // 标示private String[] setNames; // 名称private String[] setValues;// 值private String[] setColors;// 颜色private String[] setTooltexts;// 提示信息tooltext='信息:{br}xxx...'public String[] getSetNames() {return setNames;}public void setSetNames(String[] setNames) {this.setNames = setNames;}public String[] getSetColors() {return setColors;}public void setSetColors(String[] setColors) {this.setColors = setColors;}public String getSeriesName() {return seriesName;}public void setSeriesName(String seriesName) {this.seriesName = seriesName;}public String[] getSetValues() {return setValues;}public void setSetValues(String[] setValues) {this.setValues = setValues;}/** 多列数据组合*/public String createDataSet() {String dataSet = "<dataset seriesName='" + seriesName + "'>";dataSet+=createSets(dataSet,false);dataSet += "</dataset>";return dataSet;}/** 公用到普通的Column2D Column3D Line2D Line3D 等*/public String createSets(String dataSet,boolean boo) {String newDataSet = "";for (int i = 0; i < setValues.length; i++) {if (setColors != null) {if (setNames != null) {newDataSet += "<set name = '" + setNames[i] + "' value='" + setValues[i] + "' color = '" + setColors[i]+ "'/>";} else{if(boo){if(i>randomColor.length){int ai = new Random().nextInt(12);newDataSet += "<set value='" + setValues[i] + "' color = '" + randomColor[ai] + "'/>";}else{newDataSet += "<set value='" + setValues[i] + "' color = '" + setColors[i] + "'/>";}}else{newDataSet += "<set value='" + setValues[i] + "' color = '" + setColors[i] + "'/>";}}} else {newDataSet += "<set value='" + setValues[i] + "'/>";}}return newDataSet;}
}

 

  ---------------------------------------------------------------------------------------------------

 

 /** 图表工具* 功能:支持MS多列系列图表,和单例系列图标*  对于下面自定义很强的 需要自己生成xmldata*  chart   x轴下标题文字  labelDisplay='Rotate'  垂直显示  slantLabels='1'  45 度倾斜*  chart  x轴下标题文字  labelDisplay = "Stagger"  staggerLines='n' 显示的行数 如果文字过长 就各行对应显示*  chart  x轴下标题文字  labelStep='n' 文字每隔几个一显示 *  chart   x轴 上的柱顶部固定的文字值 rotateValues='1' 垂直显示*  chart connectNullData='1' 对于Line,跳过空元素直接与下一个节点连接    // lineDashGap='6' 虚线显示空元素的连接  需要程序处理上一个节点为dashed='1'*  chart lineDashGap = '5' 虚线的点的间隔*  chart decimals='2' 小数点后2位数  其他类似   对于数据差距比较很小(最大值最小值最少相差在1之内) 适用//  如果想让柱状的值显示小数点后一位 forceDecimals='1' (Y轴显示还是2位或者更多)*  chart  formatNumberScale='0' 显示格式为 234,344,679*  chart formatNumberScale='0'  formatNumber='0' 显示格式为原始格式*/
public class Chart {private String caption;// 标题private String xAxisName;private String yAxisName;private String showValues;private String numberPrefix;private String[] categories;private DataSet[] dataset;private String lineStartValue;private String lineColor;private String lineDisplayValue;private String yAxisMinValue;private String yAxisMaxValue;public String getyAxisMinValue() {return yAxisMinValue;}public void setyAxisMinValue(String yAxisMinValue) {this.yAxisMinValue = yAxisMinValue;}public String getyAxisMaxValue() {return yAxisMaxValue;}public void setyAxisMaxValue(String yAxisMaxValue) {this.yAxisMaxValue = yAxisMaxValue;}public String getCaption() {return caption;}public void setCaption(String caption) {this.caption = caption;}public String getxAxisName() {return xAxisName;}public void setxAxisName(String xAxisName) {this.xAxisName = xAxisName;}public String getyAxisName() {return yAxisName;}public void setyAxisName(String yAxisName) {this.yAxisName = yAxisName;}public String getShowValues() {return showValues;}public void setShowValues(String showValues) {this.showValues = showValues;}public String getNumberPrefix() {return numberPrefix;}public void setNumberPrefix(String numberPrefix) {this.numberPrefix = numberPrefix;}public String[] getCategories() {return categories;}public void setCategories(String[] categories) {this.categories = categories;}public DataSet[] getDataset() {return dataset;}public void setDataset(DataSet[] dataset) {this.dataset = dataset;}public String getLineStartValue() {return lineStartValue;}public void setLineStartValue(String lineStartValue) {this.lineStartValue = lineStartValue;}public String getLineColor() {return lineColor;}public void setLineColor(String lineColor) {this.lineColor = lineColor;}public String getLineDisplayValue() {return lineDisplayValue;}public void setLineDisplayValue(String lineDisplayValue) {this.lineDisplayValue = lineDisplayValue;}/** MS 多列系列*/public String createChartXmlData() {String chartXmlData = "<chart useRoundEdges='1'  caption='" + caption + "' xAxisName='"+ xAxisName + "' yAxisName='" + yAxisName + "' showValues= '"+ showValues + "' numberPrefix='" + numberPrefix + "' "+ " yAxisMinValue = '" + yAxisMinValue + "' yAxisMaxValue = '"+ yAxisMaxValue + "'>";;chartXmlData += "<categories>";for (int i = 0; i < categories.length; i++) {chartXmlData += "<category label='" + categories[i] + "' />";}chartXmlData += "</categories>";for (int i = 0; i < dataset.length; i++) {chartXmlData += dataset[i].createDataSet();}chartXmlData += " <trendlines><line startValue='" + lineStartValue+ "' color='" + lineColor + "' displayValue='"+ lineDisplayValue + "'/></trendlines>";chartXmlData += "</chart>";return chartXmlData;}/** 单个图标系列*/public String createRoutineChartXmlData() {String chartXmlData = "<graph  useRoundEdges='1'  caption='" + caption + "' xAxisName='"+ xAxisName + "' yAxisName='" + yAxisName + "' showValues= '"+ showValues + "' numberPrefix='" + numberPrefix + "' "+ " yAxisMinValue = '" + yAxisMinValue + "' yAxisMaxValue = '"+ yAxisMaxValue + "'>";chartXmlData += dataset[0].createSets("",true);chartXmlData += "</graph>";return chartXmlData;}
}

 

 

Action代码:

 

	public void test() {//  随时测试response.setCharacterEncoding("UTF-8");Chart chart = new Chart();chart.setCaption("图表信息");chart.setxAxisName("月份");chart.setyAxisName("交易额");chart.setShowValues("0");chart.setNumberPrefix("$");String[] cs = { "1月", "2月", "3月", "4月", "5月" };chart.setCategories(cs);DataSet[] ds = new DataSet[3];// 三个进行对比for (int i = 0; i < ds.length; i++) {ds[i] = new DataSet(); // 对比五个月的数据ds[i].setSeriesName("200" + i + "年");int a1 = new Random().nextInt(1000);if (a1 <= 0) {a1 = 100;}int a2 = new Random().nextInt(1000);if (a2 <= 0) {a2 = 100;}int a3 = new Random().nextInt(1000);if (a3 <= 0) {a3 = 100;}int a4 = new Random().nextInt(1000);if (a4 <= 0) {a4 = 100;}int a5 = new Random().nextInt(1000);if (a5 <= 0) {a5 = 100;}String[] sv = { "" + a1, "" + a2, "" + a3, "" + a4, "" + a5 };ds[i].setSetValues(sv);}chart.setDataset(ds);chart.setLineStartValue("26000");chart.setLineColor("91C728");chart.setLineDisplayValue("Target");chart.setyAxisMinValue("0"); // 最小值chart.setyAxisMaxValue("1200");// 最大值String xmlDate = chart.createChartXmlData();PrintWriter pw;try {pw = response.getWriter();pw.print(xmlDate);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void test1() {response.setCharacterEncoding("UTF-8");Chart chart = new Chart();chart.setCaption("图表信息");chart.setxAxisName("月份");chart.setyAxisName("交易额");chart.setShowValues("0");chart.setNumberPrefix("$");String[] cs = { "1月", "2月", "3月", "4月", "5月" };DataSet[] ds = new DataSet[1];// 三个进行对比ds[0] = new DataSet(); // 对比五个月的数据ds[0].setSeriesName("2000年");ds[0].setSetNames(cs);String[] sv = { "" + 190, "" + 334, "" + 799, "" + 888, "" + 900 };String[] sc = { "F6BD0F", "AFD8F8", "FF8E46", "008ED6", "A186BE" };ds[0].setSetColors(sc);ds[0].setSetValues(sv);chart.setDataset(ds);chart.setyAxisMinValue("0"); // 最小值chart.setyAxisMaxValue("1200");// 最大值String xmlDate = chart.createRoutineChartXmlData();PrintWriter pw;try {pw = response.getWriter();pw.print(xmlDate);} catch (IOException e) {e.printStackTrace();}}

  JSP如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>图表Fusioncharts测试</title><script type="text/javascript" src="jquery.js"></script><script type="text/javascript" src="chart/script/FusionCharts.js"></script><script type="text/javascript" src="chart/script/FusionChartsExportComponent.js"></script><script type="text/javascript">window.onload = function(){//chart   x轴下标题文字  labelDisplay='Rotate'  垂直显示  slantLabels='1'  45 度倾斜//chart  x轴下标题文字  labelDisplay = "Stagger"  staggerLines='n' 显示的行数 如果文字过长 就各行对应显示//chart  x轴下标题文字  labelStep='n' 文字每隔几个一显示 // chart   x轴 上的柱顶部固定的文字值 rotateValues='1' 垂直显示// set alpha = '50' 透明度为50%  // set dashed='1' 虚线状态显示// set 对于Line  anchorSides='7' 显示的点为几边形   anchorRadius = '4' 形状大小 // set anchorBorderColor='A186BE' 点 的边框颜色     anchorBgColor='8BBA00' 点的背景色// set 中如果没有value属性 还是留有空间 只是没显示  空元素 // chart connectNullData='1' 对于Line,跳过空元素直接与下一个节点连接    // lineDashGap='6' 虚线显示空元素的连接  需要程序处理上一个节点为dashed='1'// chart lineDashGap = '5' 虚线的点的间隔// chart decimals='2' 小数点后2位数  其他类似   对于数据差距比较很小(最大值最小值最少相差在1之内) 适用//  如果想让柱状的值显示小数点后一位 forceDecimals='1' (Y轴显示还是2位或者更多)// chart  formatNumberScale='0' 显示格式为 234,344,679// chart formatNumberScale='0'  formatNumber='0' 显示格式为原始格式// chart  clickURL='n-http://www.baidu.com'  chart点击打开百度 // chart toolTipBorderColor 提示的边框颜色 toolTipBgColor 提示的背景色 // chart useRoundEdges = '1'  chart展示圆柱状图表 // chart exportHandler='fcExporter1'  chart指定client-side导出组件// 导出功能所需要的三件事情: 1 引入FusionChartsExportComponent.js 2 html中添加导出按钮的div(id = 'xy')  3 并设置相应的属性 exportAtClient = '1'支持客户端导出 exportEnabled = '1' 可导出  4 chart指定exportHandler// chart  exportDialogMessage='已导出 ' 设置导出文件的时候百分比进度前的文字var xx =  "<chart  caption = '自定义图表(点击倒数第二个&右键导出)' bgColor='FF5904,FFFFFF' bgAlpha='100,100' bgRatio='0,100' bgAngle='0'"+" staggerLines='3'  labelDisplay='Stagger' labelStep='1' "+" rotateValues='1' canvasPadding='0' connectNullData='1' lineDashGap='5'"+" decimals='2' formatNumberScale='0'  formatNumber='0' exportEnabled='1'"+" toolTipBorderColor='D9E5F1' toolTipBgColor='D9E5F1' showToolTip='1'   useRoundEdges='1'"+" exportEnabled='1' exportAtClient='1' exportHandler='fcExporter1' exportDialogMessage='已导出 '>" +"<set label='John' value='42900'  tooltext = '第1个值为{br}:420'/>"+"<set label='Const' value='12345'  tooltext = '第2一个值为:295'/>"+"<set label='Ivy' value='52233'  tooltext = '第3个值为:523'  dashed='1'/>" +"<set label='Pery'  />"+"<set label='Erlang'  />"+"<set label='Chuank'   />"+"<set label='Sprone' value='42000'  alpha='50' dashed='1' tooltext = '第1个值为{br}:420'/>"+"<set label='July' value='2295'  tooltext = '第2一个值为:295'/>"+"<set label='Lim' value='52243'  tooltext = '第3个值为:523'/>"+"<set label='Joli' value='35679'  tooltext = '第1个值为{br}:420'/>"+"<set label='Boyka' link='JavaScript:myJS(\"Boyka\");' value='68420'  tooltext = '第2一个值为:295'/>"+"<set label='Abma'  link='JavaScript:myJS(\"Abma\");' value='52463'  tooltext = '第3个值为:523'/>"+"<set label='Lanbo' link='JavaScript:myJS(\"Lanbo\");'  value='49990'  tooltext = '第1个值为{br}:420'/>"+"<set label='Jim'  link='newchart-xml-jim-quarterly'  value='46999'  tooltext = '第2一个值为:295' color='FF5906' />"+"<set label='Chelios' value='49900'  tooltext = '"+"杰森·斯坦森 主要作品{br}"+"▪ 巴西任务 ( 2013)	▪ 帕克 ( 2013){br}"+"▪ 暂告安全 ( 2012)	▪ 玩命追踪 ( 2012){br}"+"▪ 波茨坦广场 ( 2012)▪ 敢死队2 ( 2012){br}"+"▪ 铁血精英 ( 2011)	▪ 机械师 ( 2010){br}"+"▪ 死亡飞车2 ( 2010)▪ 敢死队 ( 2010){br}▪ 怒火攻心2 高压电"+"' color='FF5904' "+" link='JavaScript:myJS(\"49900\");' anchorRadius='5' anchorSides='6' anchorBorderColor='A186BE' anchorBgColor='8BBA00'/>"+" <linkeddata id='jim-quarterly'><chart caption='第一层转向(点击第二个进入)' subcaption='For the year 2004'    xAxisName='中国' yAxisName='GDP'>       <set label='Q1' value='11700'/>       <set label='Q2' link='newchart-xml-a-quarterly'  value='8600'/>       <set label='Q3' value='6900' />       <set label='Q4' value='10600' />"+"<linkeddata id='a-quarterly'><chart caption='第二层转向' subcaption='浙江年度xx'    xAxisName='浙江' yAxisName='GPP'>       <set label='Q1' value='80'/>       <set label='Q2' value='50'/>       <set label='Q3' value='99' />       <set label='Q4' value='90' />    </chart>  </linkeddata></chart>  </linkeddata>"+" <styles><style name='MyFirstBlur' type='Blur' blurX='6' blurY='6' /></styles></chart>";  // exportAtClient   exportEnabled='1'  加入fcexplorer.js   FusionChartsExportComponent.js// FCExporter.swf 详细可见Client_side explorting-simple example //  linkeddata 要转向的图的数据来源var myChart = new FusionCharts("chart/swf/Column2D.swf", "myChartId234", "300", "300");myChart.setDataXML(xx);     myChart.render("test");var myExportComponent = new FusionChartsExportObject("fcExporter1", "chart/swf/FCExporter.swf");myExportComponent.componentAttributes.width = '400';myExportComponent.componentAttributes.height = '60';//Background colormyExportComponent.componentAttributes.bgColor = 'ffffdd';//Border propertiesmyExportComponent.componentAttributes.borderThickness = '2';myExportComponent.componentAttributes.borderColor = '0372AB';//Font propertiesmyExportComponent.componentAttributes.fontFace = 'Arial';myExportComponent.componentAttributes.fontColor = '0372AB';myExportComponent.componentAttributes.fontSize = '9';myExportComponent.componentAttributes.btnWidth = '30';myExportComponent.componentAttributes.btnHeight= '20';myExportComponent.componentAttributes.btnColor = 'E1f5ff';myExportComponent.componentAttributes.btnBorderColor = '0372AB';//Button font propertiesmyExportComponent.componentAttributes.btnFontFace = 'Verdana';myExportComponent.componentAttributes.btnFontColor = '0372AB';myExportComponent.componentAttributes.btnFontSize = '15';myExportComponent.componentAttributes.btnsavetitle = '保存'myExportComponent.componentAttributes.btndisabledtitle = '导出请点击右键...'; myExportComponent.Render("fce");////用configureLink可以指定不行形态的图表展现, 会替代掉原有的linkeddata // 如果只有一个的话,可用下面,如果不是一种的话,下面代码不写。/*FusionCharts("myChartId234").configureLink ( {    swfUrl : "chart/swf/Pie3D.swf",overlayButton:{message: '返回',fontColor : '880000',bgColor:'FFEEEE',borderColor: '660000'}}, 0);*/}// 激发事件function myJS(myVar){window.alert(myVar);}$.ajax({type: "POST", url: "stat!test.action", //请求的actionsuccess: function(data){ //结果  MSColumn2D  MSColumn3D  MSLinevar myChart = new FusionCharts("chart/swf/MSColumn2D.swf", "myChartId1", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv1");myChart = new FusionCharts("chart/swf/MSColumn3D.swf", "myChartId2", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv2");myChart = new FusionCharts("chart/swf/MSLine.swf", "myChartId3", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv3");myChart = new FusionCharts("chart/swf/MSArea.swf", "myChartId3_1", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv3_1");myChart = new FusionCharts("chart/swf/MSCombi2D.swf", "myChartId3_2", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv3_2");//  纯3D 效果 可转动myChart = new FusionCharts("chart/swf/MSColumnLine3D.swf", "myChartId3_3", "350", "350");myChart.setDataXML(data);      myChart.render("chartDiv3_3");myChart = new FusionCharts("chart/swf/Marimekko.swf", "myChartId3_4", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv3_4");myChart = new FusionCharts("chart/swf/MSCombi3D.swf", "myChartId3_5", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv3_5"); }});  $.ajax({type: "POST", url: "stat!test1.action", //请求的actionsuccess: function(data){ //结果 Column2D Column3D Line Pie3Dvar myChart = new FusionCharts("chart/swf/Column2D.swf", "myChartId4", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv4");myChart = new FusionCharts("chart/swf/Column3D.swf", "myChartId4", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv5");myChart = new FusionCharts("chart/swf/Line.swf", "myChartId6", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv6");myChart = new FusionCharts("chart/swf/Pie2D.swf", "myChartId7", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv7");myChart = new FusionCharts("chart/swf/Pie3D.swf", "myChartId8", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv8");其他效果myChart = new FusionCharts("chart/swf/SSGrid.swf", "myChartId9", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv9");// 概率图2DmyChart = new FusionCharts("chart/swf/Pareto2D.swf", "myChartId10", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv10");// 概率图3DmyChart = new FusionCharts("chart/swf/Pareto3D.swf", "myChartId11", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv11");myChart = new FusionCharts("chart/swf/Doughnut2D.swf", "myChartId12", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv12");myChart = new FusionCharts("chart/swf/Doughnut3D.swf", "myChartId13", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv13");myChart = new FusionCharts("chart/swf/Area2D.swf", "myChartId14", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv14");myChart = new FusionCharts("chart/swf/Bar2D.swf", "myChartId15", "300", "300");myChart.setDataXML(data);      myChart.render("chartDiv15");}});</script>
</head>
<body><table><tr><td><div id = "chartDiv1"></div></td><td><div id = "chartDiv2"></div></td><td><div id = "chartDiv3"></div></td></tr><tr><td><div id = "chartDiv3_1"></div></td><td><div id = "chartDiv3_2"></div></td><td><div id = "chartDiv3_3"></div></td></tr><tr><td><div id = "chartDiv3_4"></div></td><td><div id = "chartDiv3_5"></div></td><td><div id = "test"></div><div id = "fce"></div></td></tr><!--  下面是单列的图表 --><tr><td><div id = "chartDiv4"></div></td><td><div id = "chartDiv5"></div></td><td><div id = "chartDiv6"></div></td></tr><tr><td><div id = "chartDiv7"></div></td><td><div id = "chartDiv8"></div></td><td><div id = "chartDiv9"></div></td></tr><tr><td><div id = "chartDiv10"></div></td><td><div id = "chartDiv11"></div></td><td><div id = "chartDiv12"></div></td></tr><tr><td><div id = "chartDiv13"></div></td><td><div id = "chartDiv14"></div></td><td><div id = "chartDiv15"></div></td></tr></table>
</body>
</html>

 

 

这篇关于java实现FusionCharts实时图工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/649522

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听