web项目中js加载慢问题解决思路
最近使用Echarts地图实现世界地图及中国34省地图间切换 (版本为echarts2,echarts3目前无法下载地图版)。
问题描述:之前使用require形式加载,地图首次加载显示要6-7秒,难以接受。
js配置代码如下:
<div class="w_b50 fl bg_x" id="main">
<script type="text/javascript" src="<%=request.getContextPath()%>/js/dist/echarts.js"></script>
<script type="text/javascript">
$(function(){
initMap();
});
$(window).resize(function(){
initMap();
});
function initMap(){
var namemapping={
'Afghanistan':'阿富汗', 'Angola':'安哥拉', 'Albania':'阿尔巴尼亚', 'United Arab Emirates':'阿联酋', 'Argentina':'阿根廷', 'Armenia':'亚美尼亚', 'French Southern and Antarctic Lands':'法属南半球和南极领地','Australia':'澳大利亚',
'Austria':'奥地利', 'Azerbaijan':'阿塞拜疆', 'Burundi':'布隆迪', 'Belgium':'比利时', 'Benin':'贝宁', 'Burkina Faso':'布基纳法索', 'Bangladesh':'孟加拉国', 'Bulgaria':'保加利亚', 'The Bahamas':'巴哈马',
'Belarus':'白俄罗斯', 'Belize':'伯利兹', 'Bermuda':'百慕大', 'Bolivia':'玻利维亚', 'Brazil':'巴西', 'Brunei':'文莱', 'Bhutan':'不丹', 'Botswana':'博茨瓦纳', 'Central African Republic':'中非共和国', 'Canada':'加拿大', 'Switzerland':'瑞士',
'Chile':'智利', 'China':'中国', 'Ivory Coast':'象牙海岸', 'Cameroon':'喀麦隆', 'Democratic Republic of the Congo':'刚果民主共和国', 'Republic of the Congo':'刚果共和国', 'Colombia':'哥伦比亚', 'Costa Rica':'哥斯达黎加',
'Cuba':'古巴', 'Northern Cyprus':'北塞浦路斯', 'Cyprus':'塞浦路斯', 'Czech Republic':'捷克共和国', 'Germany':'德国', 'Djibouti':'吉布提', 'Denmark':'丹麦', 'Dominican Republic':'多明尼加共和国', 'Algeria':'阿尔及利亚',
'Ecuador':'厄瓜多尔', 'Egypt':'埃及','Eritrea':'厄立特里亚','Spain':'西班牙', 'Estonia':'爱沙尼亚', 'Ethiopia':'埃塞俄比亚', 'Finland':'芬兰', 'Fiji':'斐', 'Falkland Islands':'福克兰群岛', 'France':'法国', 'Gabon':'加蓬', 'United Kingdom':'英国',
'Ghana':'加纳', 'Guinea':'几内亚', 'Gambia':'冈比亚', 'Guinea Bissau':'几内亚比绍','Equatorial Guinea':'赤道几内亚', 'Greece':'希腊', 'Greenland':'格陵兰', 'Guatemala':'危地马拉', 'French Guiana':'法属圭亚那',
'Guyana':'圭亚那', 'Honduras':'洪都拉斯', 'Croatia':'克罗地亚', 'Haiti':'海地', 'Hungary':'匈牙利', 'Indonesia':'印尼', 'India':'印度', 'Ireland':'爱尔兰', 'Iran':'伊朗','Georgia':'格鲁吉亚','United States of America':'美国',
'Iraq':'伊拉克', 'Iceland':'冰岛', 'Israel':'以色列', 'Italy':'意大利', 'Jamaica':'牙买加', 'Jordan':'约旦', 'Japan':'日本', 'Kazakhstan':'哈萨克斯坦', 'Kenya':'肯尼亚', 'Kyrgyzstan':'吉尔吉斯斯坦', 'Cambodia':'柬埔寨',
'South Korea':'韩国', 'Kosovo':'科索沃', 'Kuwait':'科威特', 'Laos':'老挝', 'Lebanon':'黎巴嫩', 'Liberia':'利比里亚', 'Libya':'利比亚', 'Sri Lanka':'斯里兰卡', 'Lesotho':'莱索托', 'Lithuania':'立陶宛', 'Luxembourg':'卢森堡',
'Latvia':'拉脱维亚','Morocco':'摩洛哥', 'Moldova':'摩尔多瓦', 'Madagascar':'马达加斯加', 'Mexico':'墨西哥', 'Macedonia':'马其顿', 'Mali':'马里', 'Myanmar':'缅甸', 'Montenegro':'黑山', 'Mongolia':'蒙古', 'Mozambique':'莫桑比克',
'Mauritania':'毛里塔尼亚','Malawi':'马拉维', 'Malaysia':'马来西亚', 'Namibia':'纳米比亚', 'New Caledonia':'新喀里多尼亚', 'Niger':'尼日尔','Nigeria':'尼日利亚', 'Nicaragua':'尼加拉瓜', 'Netherlands':'荷兰', 'Norway':'挪威',
'Nepal':'尼泊尔','New Zealand':'新西兰', 'Oman':'阿曼', 'Pakistan':'巴基斯坦','Panama':'巴拿马','Peru':'秘鲁', 'Philippines':'菲律宾', 'Papua New Guinea':'巴布亚新几内亚', 'Poland':'波兰','Puerto Rico':'波多黎各',
'North Korea':'北朝鲜', 'Portugal':'葡萄牙', 'Paraguay':'巴拉圭', 'Qatar':'卡塔尔', 'Romania':'罗马尼亚', 'Russia':'俄罗斯','Rwanda':'卢旺达', 'Western Sahara':'西撒哈拉', 'Saudi Arabia':'沙特阿拉伯','Sudan':'苏丹',
'South Sudan':'南苏丹', 'Senegal':'塞内加尔', 'Solomon Islands':'所罗门群岛', 'Sierra Leone':'塞拉利昂', 'El Salvador':'萨尔瓦多', 'Somaliland':'索马里兰', 'Somalia':'索马里', 'Republic of Serbia':'塞尔维亚共和国',
'Suriname':'苏里南','Slovakia':'斯洛伐克', 'Slovenia':'斯洛文尼亚','Sweden':'瑞典', 'Swaziland':'斯威士兰', 'Syria':'叙利亚', 'Chad':'乍得', 'Togo':'多哥', 'Thailand':'泰国', 'Tajikistan':'塔吉克斯坦', 'Turkmenistan':'土库曼斯坦',
'East Timor':'东帝汶','Trinidad and Tobago':'特里尼达和多巴哥','Tunisia':'突尼斯','Turkey':'土耳其', 'United Republic of Tanzania':'坦桑尼亚联合共和国', 'Uganda':'乌干达', 'Ukraine':'乌克兰', 'Uruguay':'乌拉圭',
'Uzbekistan':'乌兹别克斯坦', 'Venezuela':'委内瑞拉', 'Vietnam':'越南', 'Vanuatu':'瓦努阿图', 'West Bank':'西岸', 'Yemen':'也门', 'South Africa':'南非', 'Zambia':'赞比亚', 'Zimbabwe':'津巴布韦' ,'Bosnia and Herzegovina':'波斯尼亚和黑塞哥维那'
};
require.config({
paths: {
echarts: '<%=request.getContextPath()%>/js/dist'
}
});
// 使用
require(
[
'echarts',
'echarts/chart/map' // 使用柱状图就加载map模块,按需加载
],
function (ec) {
var myChart = ec.init(document.getElementById('main'));
var option = {
title : {
text: '终端分布',
x:'center',
y:'top',
textStyle : {
fontSize: 18,
fontWeight: 100,
color: '#999',
fontFamily: '"Microsoft Yahei",simhei'
}
},
backgroundColor:$(".w_b50").css('background-color'),
tooltip : {
trigger: 'item',
textStyle : {
fontSize: 11,
fontWeight: 60,
color: '#ccc',
fontFamily: '"Microsoft Yahei",simhei'
},
formatter : function (params) {
var value=params.value;
if(value>=0){
return '设备总数' + '<br/>' + params.name + ' : ' + value;
}else{
return '设备总数' + '<br/>' + params.name + ' : ' + 0;
}
}
},
dataRange: {
show: false,
min: 1,
max: 10,
text:['高','低'], // 文本,默认为数值文本
realtime: false,
calculable : true,
color: ['#da70d6', '#32cd32', '#6495ed','#6b8e23','orange',
'#ba55d3', '#cd5c5c', '#ffa500', '#00fa9a','#ff00ff',
'#ff6347', '#7b68ee', '#3cb371']
},
toolbox: {
show : true,
x:'right',
borderColor:'#ccc',
itemSize:14,
feature : {
selfButtons:{//自定义按钮
show:true,
title:'world', //鼠标移动上去显示的文字
icon:'<%=request.getContextPath()%>/images/world.png',
option:{},
onclick:function(param) {//点击事件
loaddata(null,'dev_country_id'); //回到世界地图
}
},
}
},
series : [
{
name: '设备总数',
type: 'map',
mapType: 'world',
roam: false,
mapLocation: {
y : 40
},
itemStyle:{
normal:{
areaStyle:{color:'lightskyblue'}
},
emphasis:{label:{show:true}},
},
data:[],
nameMap :namemapping //国家英文名映射为中文名
}]
};
function loaddata(cityname,countryField){
$.ajax({
type : "post",
async : true,
data :{"countryField":countryField},
url : "<%=request.getContextPath()%>/cities/devicecountrylist.json",
dataType : "json", //返回数据形式为json
success : function(result) {
var data=[];
for(var i=0;i<result.length;i++){
if(result[i].value>0){//过滤设备数小于0的地址
var d={'name':result[i].name,'value':result[i].value};
data.push(d);
}
}
option.series[0].data=data;
if(countryField=='dev_country_id'){//显示世界地图
option.series[0].mapType='world';
myChart.setOption(option);
}else if(countryField=='dev_province_id'){//显示中国地图
option.series[0].mapType='china';
myChart.setOption(option);
}else if(countryField=='dev_city_id'){//显示省地图
option.series[0].mapType=cityname;
myChart.setOption(option);
}
}
});
};
loaddata(null,'dev_country_id');
var i=0;
myChart.on('click',function(params){
var select= params.name;
if(option.series[0].mapType=='world' && select=='中国'){//进入中国
loaddata(null,'dev_province_id');
}else if(option.series[0].mapType!='world' && select!='中国'){//中国省或市地图
if(i%2==0 && option.series[0].mapType=='china'){//为0进入市图
loaddata(select,'dev_city_id');
}else if(i%2==1 && option.series[0].mapType!='china'){//为1进入中国图
loaddata(null,'dev_province_id');
}
i++;
}
});
}
);
}
</script>
</div>
解决思路:
1、采用单文件加载地图方式:
由于使用的已经是压缩版(官网http://echarts.baidu.com/echarts2/下载后dist目录下),只是加载慢。
其中echarts.js(354KB)、chart目录下的map.js(441KB)。
改用压缩版全图表 echarts-all.js(949KB),对应加载地图配置:
<div class="w_b50 fl bg_x" id="main">
<script type="text/javascript" src="<%=request.getContextPath()%>/dist/echarts-all.js"></script>
<script type="text/javascript">
var namemapping={
'Afghanistan':'阿富汗', 'Angola':'安哥拉', 'Albania':'阿尔巴尼亚', 'United Arab Emirates':'阿联酋', 'Argentina':'阿根廷', 'Armenia':'亚美尼亚', 'French Southern and Antarctic Lands':'法属南半球和南极领地','Australia':'澳大利亚',
'Austria':'奥地利', 'Azerbaijan':'阿塞拜疆', 'Burundi':'布隆迪', 'Belgium':'比利时', 'Benin':'贝宁', 'Burkina Faso':'布基纳法索', 'Bangladesh':'孟加拉国', 'Bulgaria':'保加利亚', 'The Bahamas':'巴哈马',
'Belarus':'白俄罗斯', 'Belize':'伯利兹', 'Bermuda':'百慕大', 'Bolivia':'玻利维亚', 'Brazil':'巴西', 'Brunei':'文莱', 'Bhutan':'不丹', 'Botswana':'博茨瓦纳', 'Central African Republic':'中非共和国', 'Canada':'加拿大', 'Switzerland':'瑞士',
'Chile':'智利', 'China':'中国', 'Ivory Coast':'象牙海岸', 'Cameroon':'喀麦隆', 'Democratic Republic of the Congo':'刚果民主共和国', 'Republic of the Congo':'刚果共和国', 'Colombia':'哥伦比亚', 'Costa Rica':'哥斯达黎加',
'Cuba':'古巴', 'Northern Cyprus':'北塞浦路斯', 'Cyprus':'塞浦路斯', 'Czech Republic':'捷克共和国', 'Germany':'德国', 'Djibouti':'吉布提', 'Denmark':'丹麦', 'Dominican Republic':'多明尼加共和国', 'Algeria':'阿尔及利亚',
'Ecuador':'厄瓜多尔', 'Egypt':'埃及','Eritrea':'厄立特里亚','Spain':'西班牙', 'Estonia':'爱沙尼亚', 'Ethiopia':'埃塞俄比亚', 'Finland':'芬兰', 'Fiji':'斐', 'Falkland Islands':'福克兰群岛', 'France':'法国', 'Gabon':'加蓬', 'United Kingdom':'英国',
'Ghana':'加纳', 'Guinea':'几内亚', 'Gambia':'冈比亚', 'Guinea Bissau':'几内亚比绍','Equatorial Guinea':'赤道几内亚', 'Greece':'希腊', 'Greenland':'格陵兰', 'Guatemala':'危地马拉', 'French Guiana':'法属圭亚那',
'Guyana':'圭亚那', 'Honduras':'洪都拉斯', 'Croatia':'克罗地亚', 'Haiti':'海地', 'Hungary':'匈牙利', 'Indonesia':'印尼', 'India':'印度', 'Ireland':'爱尔兰', 'Iran':'伊朗','Georgia':'格鲁吉亚','United States of America':'美国',
'Iraq':'伊拉克', 'Iceland':'冰岛', 'Israel':'以色列', 'Italy':'意大利', 'Jamaica':'牙买加', 'Jordan':'约旦', 'Japan':'日本', 'Kazakhstan':'哈萨克斯坦', 'Kenya':'肯尼亚', 'Kyrgyzstan':'吉尔吉斯斯坦', 'Cambodia':'柬埔寨',
'South Korea':'韩国', 'Kosovo':'科索沃', 'Kuwait':'科威特', 'Laos':'老挝', 'Lebanon':'黎巴嫩', 'Liberia':'利比里亚', 'Libya':'利比亚', 'Sri Lanka':'斯里兰卡', 'Lesotho':'莱索托', 'Lithuania':'立陶宛', 'Luxembourg':'卢森堡',
'Latvia':'拉脱维亚','Morocco':'摩洛哥', 'Moldova':'摩尔多瓦', 'Madagascar':'马达加斯加', 'Mexico':'墨西哥', 'Macedonia':'马其顿', 'Mali':'马里', 'Myanmar':'缅甸', 'Montenegro':'黑山', 'Mongolia':'蒙古', 'Mozambique':'莫桑比克',
'Mauritania':'毛里塔尼亚','Malawi':'马拉维', 'Malaysia':'马来西亚', 'Namibia':'纳米比亚', 'New Caledonia':'新喀里多尼亚', 'Niger':'尼日尔','Nigeria':'尼日利亚', 'Nicaragua':'尼加拉瓜', 'Netherlands':'荷兰', 'Norway':'挪威',
'Nepal':'尼泊尔','New Zealand':'新西兰', 'Oman':'阿曼', 'Pakistan':'巴基斯坦','Panama':'巴拿马','Peru':'秘鲁', 'Philippines':'菲律宾', 'Papua New Guinea':'巴布亚新几内亚', 'Poland':'波兰','Puerto Rico':'波多黎各',
'North Korea':'北朝鲜', 'Portugal':'葡萄牙', 'Paraguay':'巴拉圭', 'Qatar':'卡塔尔', 'Romania':'罗马尼亚', 'Russia':'俄罗斯','Rwanda':'卢旺达', 'Western Sahara':'西撒哈拉', 'Saudi Arabia':'沙特阿拉伯','Sudan':'苏丹',
'South Sudan':'南苏丹', 'Senegal':'塞内加尔', 'Solomon Islands':'所罗门群岛', 'Sierra Leone':'塞拉利昂', 'El Salvador':'萨尔瓦多', 'Somaliland':'索马里兰', 'Somalia':'索马里', 'Republic of Serbia':'塞尔维亚共和国',
'Suriname':'苏里南','Slovakia':'斯洛伐克', 'Slovenia':'斯洛文尼亚','Sweden':'瑞典', 'Swaziland':'斯威士兰', 'Syria':'叙利亚', 'Chad':'乍得', 'Togo':'多哥', 'Thailand':'泰国', 'Tajikistan':'塔吉克斯坦', 'Turkmenistan':'土库曼斯坦',
'East Timor':'东帝汶','Trinidad and Tobago':'特里尼达和多巴哥','Tunisia':'突尼斯','Turkey':'土耳其', 'United Republic of Tanzania':'坦桑尼亚联合共和国', 'Uganda':'乌干达', 'Ukraine':'乌克兰', 'Uruguay':'乌拉圭',
'Uzbekistan':'乌兹别克斯坦', 'Venezuela':'委内瑞拉', 'Vietnam':'越南', 'Vanuatu':'瓦努阿图', 'West Bank':'西岸', 'Yemen':'也门', 'South Africa':'南非', 'Zambia':'赞比亚', 'Zimbabwe':'津巴布韦' ,'Bosnia and Herzegovina':'波斯尼亚和黑塞哥维那'
};
var option = {
title : {
text: '终端分布',
x:'center',
y:'top',
textStyle : {
fontSize: 18,
fontWeight: 100,
color: '#999',
fontFamily: '"Microsoft Yahei",simhei'
}
},
backgroundColor:$(".w_b50").css('background-color'),
tooltip : {
trigger: 'item',
textStyle : {
fontSize: 11,
fontWeight: 60,
color: '#ccc',
fontFamily: '"Microsoft Yahei",simhei'
},
formatter : function (params) {
var value=params.value;
if(value>=0){
return '设备总数' + '<br/>' + params.name + ' : ' + value;
}else{
return '设备总数' + '<br/>' + params.name + ' : ' + 0;
}
}
},
dataRange: {
show: false,
min: 1,
max: 10,
text:['高','低'], // 文本,默认为数值文本
realtime: false,
calculable : true,
color: ['#da70d6', '#32cd32', '#6495ed','#6b8e23','orange',
'#ba55d3', '#cd5c5c', '#ffa500', '#00fa9a','#ff00ff',
'#ff6347', '#7b68ee', '#3cb371']
},
toolbox: {
show : true,
x:'right',
borderColor:'#ccc',
itemSize:14,
feature : {
selfButtons:{//自定义按钮
show:true,
title:'world', //鼠标移动上去显示的文字
icon:'<%=request.getContextPath()%>/images/world.png',
option:{},
onclick:function(param) {//点击事件
loaddata(null,'dev_country_id'); //回到世界地图
}
},
}
},
series : [{
name: '设备总数',
type: 'map',
mapType: 'world',
roam: false,
mapLocation: {
y : 40
},
itemStyle:{
normal:{
areaStyle:{color:'lightskyblue'}
},
emphasis:{label:{show:true}},
},
data:[],
nameMap :namemapping //国家英文名映射为中文名
}]
};
var myChart; $(function(){
initMap();
});
$(window).resize(function(){
myChart.resize();
});
//初始化地图
function initMap(){
myChart = echarts.init(document.getElementById('main'));
myChart.setOption(option);
loaddata(null,'dev_country_id');
var i=0;
myChart.on("click",function(params){
var select= params.name;
if(option.series[0].mapType=='world' && select=='中国'){//进入中国
loaddata(null,'dev_province_id');
}else if(option.series[0].mapType!='world' && select!='中国'){//中国省或市地图
if(i%2==0 && option.series[0].mapType=='china'){//为0进入市图
loaddata(select,'dev_city_id');
}else if(i%2==1 && option.series[0].mapType!='china'){//为1进入中国图
loaddata(null,'dev_province_id');
}
i++;
}
});
} function loaddata(cityname,countryField){
var url="<%=request.getContextPath()%>/cities/devicecountrylist.json";
ajaxRequestPost(url,{"countryField":countryField},function(result){
var data=[];
for(var i=0;i<result.length;i++){
if(result[i].value>0){//过滤设备数小于0的地址
var d={'name':result[i].name,'value':result[i].value};
data.push(d);
}
}
option.series[0].data=data;
if(countryField=='dev_country_id'){//显示世界地图
option.series[0].mapType='world';
myChart.setOption(option);
}else if(countryField=='dev_province_id'){//显示中国地图
option.series[0].mapType='china';
myChart.setOption(option);
}else if(countryField=='dev_city_id'){//显示省地图
option.series[0].mapType=cityname;
myChart.setOption(option);
}
})
};
</script>
</div>
其中,浏览器缩放时调用echarts的resize方法,不需要每次都重构echarts地图(即重新初始化地图,加载慢)。
采用该方式首次加载时间为4-5秒,仍然不够快。
2、官网自定义构建地图方式:
使用官网 http://echarts.baidu.com/echarts2/ 在线构建工具,构建地图(大小734KB)严重错位,暂时放弃该方式。
3、去除压缩版全图表不相关模块:
压缩版全图表 echarts-all.js(949KB),我们只需要map地图,去除多余其他部分,正好研究下源码。
去除多余的模块如下:
echarts/chart/line
echarts/chart/bar
echarts/chart/scatter
echarts/chart/k
echarts/chart/pie
echarts/chart/radar
echarts/chart/chord
echarts/chart/force
echarts/chart/gauge
echarts/chart/funnel
echarts/chart/eventRiver
echarts/chart/venn
echarts/chart/treemap
echarts/chart/tree
echarts/chart/wordCloud
echarts/chart/heatmap echarts/component/timeline echarts/layout/Chord
echarts/layout/eventRiver
echarts/layout/Force
echarts/layout/forceLayoutWorker
echarts/layout/WordCloudRectZero
echarts/layout/Tree
echarts/layout/TreeMap
echarts/layout/WordCloud
echarts/theme/infographic
echarts/theme/macarons zrender/loadingEffect/Bar
zrender/loadingEffect/Bubble
zrender/loadingEffect/DynamicLine
zrender/loadingEffect/Ring
zrender/loadingEffect/Spin
zrender/loadingEffect/Whirling
zrender/shape/Droplet zrender/shape/Heart
zrender/shape/Star echarts/component/polar
echarts/data/Graph
echarts/data/Tree
echarts/util/coordinates
echarts/util/date
echarts/util/shape/HalfSmoothPolygon
echarts/util/shape/Ribbon
echarts/util/smartLogSteps
每个模块定义标识(define )如下:
define('zrender/zrender', [
'require',
'./dep/excanvas',
'./tool/util',
'./tool/log',
'./tool/guid',
'./Handler',
'./Painter',
'./Storage',
'./animation/Animation',
'./tool/env'
], function (require) {
...
去除后大小为756KB,测试地图首次加载时间为3-4秒,不够快速。
4、异步加载js文件:
H5的js加载属性async (旧的html也具备) 实现异步加载。
但存在一个问题,地图加载时echarts js还未加载,导致无法初始化地图。
1、想到判断js加载完,再执行地图初始化。
$.getScript("<%=request.getContextPath()%>/dist/echarts-all.js",function(){
initMap();//js加载完成,继续执行后续代码
});
执行结果仍类似同步加载js,无法加速。
2、在登录页实现异步加载,再在使用页面引入js文件。
之前还采用了在登录成功后跳转的第一个页面同步加载echarts文件,但导致登录缓慢,影响体验。
联想到浏览器会缓存js等文件,采用在系统登录页异步加载echarts文件,在不影响体验又不影响性能的情况下,将echarts文件加载了,并交由浏览器缓存。
接着只要在使用的地方采用普通方式引入即可,不会再从服务器下载,而使用缓存的js文件。
①登录页login.jsp异步加载js文件:
<script type="text/javascript" src="<%=request.getContextPath()%>/dist/echarts-all.js" async="async"></script>
②登录后地图页面引入js文件( 使用的却是浏览器缓存的js文件)
<script type="text/javascript" src="<%=request.getContextPath()%>/dist/echarts-all.js"></script>
再次测试地图首次加载时间,1-2秒!和普通页面跳转时间一样。
==========================================
总结:利用浏览器缓存特性,可将大的文件或图片在未使用前异步加载,再在使用的地方引入,能有效避免同步加载缓慢问题。
web项目中js加载慢问题解决思路的更多相关文章
- Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)
最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...
- web.xml中filter加载顺序出现的问题
刚刚遇到了一个问题,项目中需要用到characterEncodingFilter和HiddenHttpMethodFilter,但是post请求还是会中文乱码,找了半天原因,后来发现,filter加载 ...
- android项目中如何加载已有so库 <转>
1,在项目根目录下建立文件夹libs/armeabi文件夹 2,将so库放入 libs/armeabi文件夹 注意事项: 1,如果采用静态注册的方式请注意C文件中严格按照命名规则 Java_packa ...
- Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(优先初始化Spring IOC容器)
JavaWebSpringTomcatCache 最近用到在Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且 ...
- 关于Web项目出现懒加载异常的解决方案
manytomany关系中,使用 fetch = FetchType.LAZY 来做懒加载,加快些性能.但是却一直出错,原因是session被关闭,要保持session,需要事务. Hibernate ...
- mvvm模式下在WPF项目中动态加载项目的程序集和类
在mvvm模式的wpf项目中有个需求需要去加载解决方案的程序集,并且根据程序集去动态加载当前程序集的类,做成下拉框形式. 效果: //全局定义 private ComboBox abList= nul ...
- css实现项目中的加载动画
// =========================================第一个动画 <template> <!-- 这个组件用于 页面下滑到底部时 展示加载动画 -- ...
- 用于确保页面中js加载完全,对于优化某网页的加载速度,有什么见解
js方法: <script type="text/javascript"> window.onload = function(){ var userName = &qu ...
- web.xml中配置——加载spring容器
<context-param> <param-name>contextConfigLocation</param-name> <param-value> ...
随机推荐
- Jasper之table报表
这段时间用Jasper画报表,讲真的Jasper IDE真的很难用,网上找很久都没找到用table画的配置方法,以下是直接操作源码画table的方法,不用IDE一样可以做出来(不过样式还是得借助IDE ...
- Python-Blog1-搭建开发环境
注:本系列是根据廖雪峰python实战过程,详情可见(https://www.liaoxuefeng.com/) 环境准备 Python 版本:Python 3.X,查看python版本python ...
- maven部署项目遇到的问题
在构建maven hibernate时候的exception 错误原因:通过maven dependency引入了hibernate5.2.10 final 而hibernate-core中没有上述该 ...
- Mac 管理员变为了普通用户怎么办?
开机的时候一直按住 command+s 出现命令行终端的时候按照以下顺序输入命令: /sbin/mount -uw 回车rm var/db/.AppleSetupDone 回车 reboot ...
- SQL语句-create语句
SQL语法基础 Create database语句 Create database语句是在MySQL实例上创建一个指定名称的数据 库,create schema语句的语义和create databas ...
- 怎样共享windows和linux之间的文件
注:本文参考自:https://www.howtogeek.com/176471/how-to-share-files-between-windows-and-linux/,相当于是原文的翻译. 一. ...
- VS 2017 发布:由于构建错误,发布失败
用17写AspNetCore 也一年了,最近出现了这个问题 : 在点击发布的时候 报错了,构建失败的问题,刚开始还排查日子,删除以往的发布遗留痕迹,后来发现不行, 但是项目在本地运行的时候是好使的,生 ...
- 赋值号和printf
1.赋值号会自动转换类型: int a= 2.1; printf(‘‘%d’’,a); //输出结果是2 2.printf不会转换类型,而是直接将内存中表示的补码数拿出来,最明显的就是 ...
- Django的CBV和FBV
一.FBV FBV(function base views) 就是在视图里使用函数处理请求,也是我们最开始接触和使用的方式,普通项目中最常见的方式. urls.py 1 2 3 4 urlpatter ...
- null undefiend NaN
console.log(typeof NaN) console.log(typeof undefined) console.log(typeof null)