>("progamLanguage");
-------- (2).table为字典时(键值对)
直接映射到Dictionary
eg:
Lua
gameLanguage={str1="C#语言",str2="lua语言",str3="C++语言",str4="C语言"}
C#
Dictionary dicGameLan = env.Global.Get>("gameLanguage");
-------- (3).table为类时(Class)
当Lua中的table为类时有三种调用方法,一种是映射到普通class或struct,为值拷贝。一种是映射到接口interface,是引用拷贝。一种是映射到Xlua自身的LuaTable上。
Lua
--定义一个综合表(lua中的oop思想)
GameUser=
{
name="小河",
age=199,
ID="188875221",
Speak=function()
print("lua玩家在讨论中")
end,
Walking=function()
print("lua玩家在健身中")
end,
Calulation=function(this,num1,num2) --说明:this 这里命名可以任意,表示当前对象(即GameUser)
print("lua玩家加年龄和")
return this.age+num1+num2
end
}
----------------- 1)映射到class,值拷贝
定义一个class,有对应table的字段的public属性,而且有无参数构造函数即可。table的属性可以多于或者少于class的属性,可以嵌套其他复杂类型。
eg:
C#
public class GameUser
{
public string name;
public int age;
public int ID;
public void Speak()
{
}
public void Walking()
{
}
public int Calulation(int num1, int num2)
{
return 0;
}
}
public class CsharpCallLuaTableByClass : MonoBehaviour
{
//lua环境(官方建议全局唯一)
LuaEnv env = null;
private void Start()
{
env = new LuaEnv();
//不用加lua后缀
env.DoString("require 'CsharpCallLuaTable' ");
//**********************************************************************************
//方式1: 使用class(struct)来映射得到lua中的table内容。
//值得注意的是,这个过程是值拷贝,如果class比较复杂代价会比较大。(即:较消耗性能)
//而且修改class的字段值不会同步到table,反过来也不会。此种方式可以通过把类型加到
//GCPotimize生成减低开销。
//得到lua中的表信息
GameUser gameuser = env.Global.Get("GameUser");
Debug.Log("GameUser.name=" + gameuser.name);
Debug.Log("GameUser.age="+gameuser.age);
Debug.Log("GameUser.ID="+gameuser.ID);
gameuser.Walking();//调不出来
gameuser.Speak();//调不出来
Debug.Log(gameuser.Calulation(50, 30));//调不出来,值为0
}
性能分析:
这个过程是值拷贝,修改Class的字段值不会同步到Lua中的table。如果class比较复杂代价会比较大(即:较消耗性能。)而且修改class的字段值不会同步到table,反过来也不会。此种方式可以通过把类型加到GCPotimize生成减低开销。
这里要说明的是,后面的方法没有映射到,没有得到Lua中table的方法,可能是我的写法不对,也可能是这种方法不能获得lua中Tbale的函数方法。
----------------- 2)映射到interface,引用拷贝(推荐方式)
这种方式依赖于生成代码(如果没生成代码会抛InvalidCastException异常),代码生成器会生成
这个interface的实例。如果get一个属性,生成代码会get对应的table字段,如果set属性也会
设置对应的字段。甚至可以通过interface的方法访问lua函数。
注意点与性能分析:
A:接口需要添加特性标签[CSarpCallLua],否则无法生成实例代码。
B:为引用拷贝,适合用在复杂表,一般商业项目推荐使用本方式。
eg:
C#
[CSharpCallLua]
public interface IGameUser
{
string name { get; set; }
int age { get; set; }
string ID { get; set; }
void Speak();
void Walking();
int Calulation(int num1, int num2);
}
public class CsharpCallLuaTableByInterfaceComplex : MonoBehaviour
{
//lua环境(官方建议全局唯一)
LuaEnv env = null;
private void Start()
{
env = new LuaEnv();
//
env.DoString("require 'CsharpCallLuaTable' ");
//得到lua中的表信息
IGameUser gameUser = env.Global.Get("GameUser");
//输出显示
Debug.Log("使用接口GameUser.name" + gameUser.ID);
Debug.Log("使用接口GameUser.age" + gameUser.age);
Debug.Log("使用接口GameUser.ID" + gameUser.ID);
//输出调用方法
gameUser.Speak();
gameUser.Walking();
int tmpResult = gameUser.Calulation(100, 200);
Debug.Log("经过lua中计算,结果是"+tmpResult);
}
}
----------------- 3)映射到xlua自身的LuaTable.
这种方式好处是不需要生成代码,但问题就是比较慢(即:效率低下),比interface方式要慢一个数量级,比如没有类型检查。
性能分析:
因为效率较低,所以不推荐常用,适合用在一些较为复杂且使用频率很低的情况下,所以不推荐使用。
eg:
C#
public class CsharpCallLuaTableByLuaTable : MonoBehaviour
{
//lua环境(官方建议全局唯一)
LuaEnv env = null;
private void Start()
{
env = new LuaEnv();
//
env.DoString("require 'CsharpCallLuaTable' ");
//得到lua中的复杂表信息
XLua.LuaTable tabGameUser = env.Global.Get("GameUser");
//输出显示
Debug.Log("name=" + tabGameUser.Get("name"));
Debug.Log("age=" + tabGameUser.Get("age"));
Debug.Log("ID=" + tabGameUser.Get("ID"));
//效率较低,适合用于一些较为复杂且使用频率很低的情况下,所以不推荐使用。
//输出表中函数
XLua.LuaFunction funSpeak = tabGameUser.Get("Speak");
funSpeak.Call();
XLua.LuaFunction funWalking = tabGameUser.Get("Walking");
funSpeak.Call();
XLua.LuaFunction funCalulation = tabGameUser.Get("Calulation");
object[] objArray= funCalulation.Call(tabGameUser,10,20);
Debug.Log("输出结果="+objArray[0]);//输出结果
}
}
---- 3.全局方法函数function
两种方法,映射到委托和映射到Xlua自身的LuaFunction.
Lua
--无参函数
function ProcMyFunc1()
print("ProcMyFunc1 无参函数")
end
--有参函数
function ProcMyFunc2(num1,num2)
print("ProcMyFunc2 两个函数 num1+num2="..num1+num2)
end
---带返回值函数
function ProcMyFunc3(num1,num2)
print("ProcMyFunc3 具备返回数值的函数")
return num1+num2
end
--带有多个参数的函数
function ProcMyFunc4(num1,num2,num3)
print("ProcMyFunc4 三个函数 num1+num2+num3="..num1+num2+num3)
end
--定义具有多个返回数值的函数
function ProcMyFunc5(num1,num2)
local result=num1+num2
print("ProcMyFunc5 函数,具备多个数值")
return num1,num2,result
end
----------------- 1)映射到委托delegate(推荐)
优点:这是建议的方式,性能好很多,而且类型安全。
缺点:要生成代码。
delegate要怎样声明?对于function的每个参数就声明一个输入类型的参数。多返回值要怎么处理?从左往右映射到C#的输出参数,输出参数包括返回值,out参数,ref参数。
返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate.
注意:
1.含有out与ref关键字委托也需要添加特性标签[CSharpCallLua]。
2.委托引用后,退出luaEnv前,需要释放委托引用,否则lua报错。
3.对于Unity与C#中的复杂类型API,必须加入Xlua的配置文件,经过生成代码后才能正确应用。
共三步:
第一步声明委托:含有out与ref关键字委托也需要添加特性标签[CSharpCallLua]
//自定义委托(使用out或者关键字)
[CSharpCallLua]
public delegate void delAddingMutiReturnOut(int num1, int num2, out int res1, out int res2, out int res3);
[CSharpCallLua]
public delegate void delAddingMutiReturnRef(ref int res1, ref int res2, out int result);
//不含out和ref关键字不用加标签
public delegate void delAddings(int num1, int num2);
第二步在xlua的ExampleGenConfig配置文件注册委托类型
[CSharpCallLua]
public static List CSharpCallLua = new List()
{
typeof(Action),
typeof(Action),新加的
typeof(Func),新加的
typeof(Func),
typeof(Action),
typeof(Action),
typeof(UnityEngine.Events.UnityAction),
typeof(System.Collections.IEnumerator)
};
第三步在对应位置调用lua中函数。
public class CsharpCallLuaFunctionByDelegateMultReturn : MonoBehaviour
{
//lua环境(官方建议全局唯一)
LuaEnv env = null;
//委托声明
delAddingMutiReturnOut act1 = null;
delAddingMutiReturnRef act2 = null;
delAddings act3 = null;
private void Start()
{
env = new LuaEnv();
//不用加lua后缀
env.DoString("require 'CsharpCallLuaTable' ");
//得到lua中的具有多个返回数值的函数(通过委托out关键字来进行映射)
act1 = env.Global.Get("ProcMyFunc5");
//使用out
//输出返回结果
int intOutRes1 = 0;
int intOutRes2 = 0;
int intOutRes3 = 0;
act1.Invoke(100, 880, out intOutRes1, out intOutRes2, out intOutRes3);
Debug.Log(string.Format("使用out关键字测试多输出 res1={0},res2={1},res3={2}", intOutRes1, intOutRes2, intOutRes3));
//使用ref
act2 = env.Global.Get("ProcMyFunc5");
//输出返回结果
int intResult = 0;
int intNum1 = 30;
int intNum2 = 20;
act2.Invoke(ref intNum1,ref intNum2,out intResult);
Debug.Log(string.Format("使用ref关键字测试多输出 res1={0},res2={1},res3={2}", intNum1, intNum2, intResult));
act3 = env.Global.Get("ProcMyFunc2");
act3.Invoke(5000,500);
}
private void OnDestroy()
{
act1 = null;
act2 = null;
act3 = null;
//释放LuaEnv
env.Dispose();
}
}
----------------- 2)映射到LuaFunction
使用Xlua自身带有的LuaFunction.
优点:无需生成代码。
缺点:性能不高,不推荐。
这种方式的优缺点刚好和第一种相反。使用也简单。LuaFunction上由个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。
public class CharpCallLuaFunctionByLuaFunction : MonoBehaviour
{
//lua环境(官方建议全局唯一)
LuaEnv env = null;
private void Start()
{
env = new LuaEnv();
//不用加lua后缀
env.DoString("require 'CsharpCallLuaTable' ");
//得到lua中的函数信息(通过LuaFunction来进行映射)
LuaFunction luaFun = env.Global.Get("ProcMyFunc1");
LuaFunction luaFun2 = env.Global.Get("ProcMyFunc2");
LuaFunction luaFun3 = env.Global.Get("ProcMyFunc3");
//调用具有多返回数值
LuaFunction luaFun4 = env.Global.Get("ProcMyFunc5");
//输出
luaFun.Call();
luaFun2.Call(10, 20);
object[] objArray = luaFun3.Call(30, 40);
Debug.Log("调用ProcMyFunc3,结果=" + objArray[0]);
object[] objArray2 = luaFun4.Call(22, 80);
Debug.Log(string.Format("测试多返回数值 res={0},res2={1},res3={2}",objArray2[0],objArray2[1],objArray2[2]));
}
private void OnDestroy()
{
//释放LuaEnv
env.Dispose();
}
}
三.LuaCallCsharp
lua调C#常见情况有(new)实例化,调用字段属性,方法,委托事件。
---- 1.实例化
基本方法:使用CS开头,实例化类。
eg:
C#
UnityEngine.GameObject newGameObject=new UnityEngine.GameObject();
Lua
local newGameObject=CS.UnityEngine.GameObject()
基本规则:
A:Lua里头没有new关键字。
B:所有C#相关的都放到CS下,包括构造函数,静态成员属性,方法。
如果有多个构造函数呢?
xlua支持重载,比如你要调用GameObject的带一个string参数的构造函数,这么写:
local newGameObj2=CS.UnityEngine.GameObject('helloworld')
小技巧:
如果需要经常访问的类,可以先用局部变量引用后访问,除了减少敲代码的时间,还能提高性能。(即:lua写查找与得到组件等方式,推荐与C#中一样,尽量把查找与得到的组件进行缓存,节省系统开销。)
---- 2.访问类中的字段属性方法
eg:
c#
using UnityEngine;
namespace XluaPro
{
public class LuaCallMyClass
{
private string name = "HER";
public int Count = 5;
public string str = "你好";
public string Name
{
get { return name; }
set { name = value; }
}
public LuaCallMyClass(int sum)
{
Debug.Log("执行了构造函数LuaCallMyClass传入了数值:" + sum);
}
public void MyMethod()
{
this.Name = "gaimingle";
Debug.Log("执行了LuaCallMyClass中的MyMethod方法");
}
public static void StaticMyMethod()
{
Debug.Log("执行了LuaCallMyClass中的StaticMyMethod方法");
}
}
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100) --自动调用父类与子类的构造函数
local count= classObj.Count
local str=classObj.str
classObj:MyMethod()
classObj.MyMethod(classObj)
local name=classObj.Name
LuaCallMyClass.StaticMyMethod()
print("取得了c#中类的值count="..count.." str="..str.."name="..name)
注意:
1.Lua中调用函数有两种方式:点和冒号。
冒号是一个语法糖,冒号(:)调用函数时,会默认将调用者自身作为第一个参数。 classObj:MyMethod()和classObj.MyMethod(classObj)是一样的。
3.什么时候用冒号,什么时候用点:
当调用实例化类函数使用冒号,那为什么调用c#实例化类函数要将自身传递进去?这个我的解释是C#实例化类函数方法内都可以使用this关键字。当你在lua中调用实例化类这个函数方法的时候,系统不知道你到底用没用this关键字,万一你用了,lua这边没把自身的值给this,那边this就会报空引用异常,所以不管你用没用,系统强制都把自身作为参数给传进去避免出错。静态方法内不能使用this关键字。
我这个强行解释怎么样?当然以后自身姿势水平越来越高的时候,能给一个更高大上的解释。总之,调用非静态函数要用冒号,表现在代码层面就是这个函数方法内部可以使用this。
---- 3.调用方法
调用方法上面不是说明了吗,这里怎么还有?因为C#中的方法花样五花八门,委托事件其实也算在其中。这里我们把它们一一列举出来。
-------- (1).调用父类属性与方法
xlua支持(通过派生类)访问基类的静态属性,静态方法,(通过派生类实例)访问基类的成员属性,成员方法。
using UnityEngine;
namespace XluaPro
{
public class LuaCallCsharpClassFather
{
public string FatherName = "LuaCallCsharpClassFather";
public LuaCallCsharpClassFather()
{
Debug.Log("这是父类的构造函数");
}
public void MyFatherClass()
{
Debug.Log("这是父类的函数LuaCallCsharpClassFather.MyFatherClass");
}
}
public class LuaCallMyClass:LuaCallCsharpClassFather
{
private string name = "HER";
public int Count = 5;
public string str = "你好";
public string Name
{
get { return name; }
set { name = value; }
}
public LuaCallMyClass(int sum)
{
Debug.Log("执行了构造函数LuaCallMyClass传入了数值:" + sum);
}
public void MyMethod()
{
this.Name = "gaimingle";
Debug.Log("执行了LuaCallMyClass中的MyMethod方法");
}
public static void StaticMyMethod()
{
Debug.Log("执行了LuaCallMyClass中的StaticMyMethod方法");
}
}
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100) --自动调用父类与子类的构造函数
classObj:MyFatherClass()--调用父类的方法
print("父类的字符串FatherName="..classObj.FatherName)--调用父类的字段
-------- (2).调用重载方法
xlua支持方法的重载,但为"有限重载".直接通过不同的参数类型进行重载参数的访问。
xlua只一定程度上支持重载函数的调用,因为lua的类型远远不如C#丰富,存在一对多的情况。比如C#int,float,double都对应于lua的number。所以如果重载类型是int和float则无法区分,只能调用到其中一个(生成代码中排前面的那个)
eg:
using UnityEngine;
namespace XluaPro
{
public class LuaCallMyClass:LuaCallCsharpClassFather
{
private string name = "HER";
public int Count = 5;
public string str = "你好";
public string Name
{
get { return name; }
set { name = value; }
}
public LuaCallMyClass(int sum)
{
Debug.Log("执行了构造函数LuaCallMyClass传入了数值:" + sum);
}
public void MyMethod()
{
this.Name = "gaimingle";
Debug.Log("执行了LuaCallMyClass中的MyMethod方法");
}
public static void StaticMyMethod()
{
Debug.Log("执行了LuaCallMyClass中的StaticMyMethod方法");
}
public void OverLoadMehtod(int a,int b)
{
Debug.Log("执行了OverLoadMehtod(int类型)方法");
}
public void OverLoadMehtod(float a, float b)
{
Debug.Log("执行了OverLoadMehtod(浮点类型)方法");
}
public void OverLoadMehtod(string a, string b)
{
Debug.Log("执行了OverLoadMehtod(字符串)方法");
}
}
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100) --自动调用父类与子类的构造函数
classObj:OverLoadMehtod(60.9,70.9) --lua无法区分整型和浮点型,哪个写在前面执行哪个,这里执行的是整型函数
classObj:OverLoadMehtod(60,70)
classObj:OverLoadMehtod("aaa","BBB")
-------- (3).调用带参方法
各种奇怪的参数一起来吧。
----------------- 1)调用可变参数方法
C#
//可变参数
public void MyMethodParams(int a, int b, params string[] strArrary)
{
Debug.Log("a="+a+"b="+b+ string.Join("", strArrary));
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100)
classObj:MyMethodParams(20,30,"ABC","EFG","HIGK")
----------------- 2)调用参数有结构体的方法
Lua使用一个表,来映射C#的结构体
public struct MyStruct
{
public string x;
public string y;
}
public void MyMethodStruct(MyStruct myStruct)
{
Debug.Log("myStruct.x="+myStruct.x+ " myStruct.y="+myStruct.y);
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100)
mystruct=
{
x="abc",
y="efg"
}
classObj:MyMethodStruct(mystruct)
----------------- 3)调用参数有接口的方法
lua使用一个表,来映射c#的接口。
注意:接口需要加入标记:[CSharpCallLua]
C#
//定义接口
[XLua.CSharpCallLua]
public interface MyInterFace
{
int x { get; set; }
int y { get; set; }
public void Speak();
}
public void MyInterFaceMethod(MyInterFace myInterface)
{
Debug.Log("MyInterFace.x="+myInterface.x+ " MyInterFace.y="+ myInterface.y);
myInterface.Speak();
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100)
--用于映射接口的表
myInterface=
{
x=100,
y=200,
Speak=function()
print("执行了myInterface里面的Speak方法");
end
}
--执行该方法
classObj:MyInterFaceMethod(myInterface)
----------------- 4)调用参数有委托的方法
lua使用一个函数,来映射C#的委托。
委托需要加入标记[CSharpCallLua] 这里不管你有没有带ref,out关键字都要加
eg:
C#
[XLua.CSharpCallLua]
public delegate void MyDelegate(int num);
public void MyDelegateMethod(MyDelegate mydelegate)
{
mydelegate.Invoke(99);
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100)
myDelegate=function(num)
num=num+100
print("执行了myDelegate方法,并且num的值为"..num)
end
classObj:MyDelegateMethod(myDelegate)
-------- (4).调用具有多返回值方法
基本规则:参数的输入输出属性(out,ref)
A:C#的普通参数算一个输入形参,ref修饰的算一个输入形参,out不算,然后从左往右对应lua调用的实参列表。
B:Lua调用返回值处理规则:
C#函数的返回值(如果有的话)算一个返回值,out算一个返回值,ref算一个返回值,然后从左往右对应lua的多返回值。
C#
public int MultReutrnMehtod(ref int a,out int b,ref int c,int d,out int e)
{
b =20;
e = 50;
return a + b + c + d + e;
}
Lua
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100)
returnResult,a,b,c,e= classObj:MultReutrnMehtod(10,30,40)
print("a="..a.." b="..b.." c="..c.." e="..e.." returnResult="..returnResult)
注意:执行结果返回值是第一个,然后依据out,ref按顺序得到多返回值。
lua中的参数个数从左到右out忽略,上面例子在lua中实际上只有三个参数。
-------- (5).调用泛型方法
基本规则:
lua不直接支持C#的泛型方法,但可以通过扩展方法功能进行封装后调用。
使用Extension methods(扩展方法)技术就是C#中在不改变原始类的基础上,使用一种机制可以无限扩展这个类功能的机制。
Eg:原始类为:A 扩展类为:Ext_A
注意事项:
A:Ext_A 必须是一个静态类,且扩展方法也必须是静态的。方法的参数中必须要有被扩展类作为其中一个参数,此参数前面必须有this关键字修饰。
B:lua直接调用扩展方法,需要给"泛型类"与"扩展方法类",都加入特性标记:[xlua.LuaCallCSharp]
---- 4.调用委托事件
这里我有个疑问,我在C#中定义一个委托字段,然后在Lua中给这个委托字段添加委托链,并且在lua执行这个委托链。我自己试了下不行。可能是我的写法有问题。这里我在C#单独写一个添加方法的方法函数和一个执行的方法函数。
eg:
C#
//定义委托
[XLua.CSharpCallLua]
public delegate void MyDelegatestr(string str);
public MyDelegatestr mydelegateMehods;
public void AddAction(MyDelegatestr action)
{
this.mydelegateMehods += action;
}
public void InvokemydelegateMehods()
{
mydelegateMehods.Invoke("我来测试来了");
}
Lua
--委托链方法一
myDelegate1=function(num)
print("执行了方法myDelegate1"..num)
end
--方法二
myDelegate2=function(num)
print("执行了方法myDelegate2"..num)
end
--方法三
myDelegate3=function(num)
print("执行了方法myDelegate3"..num)
end
local LuaCallMyClass= CS.XluaPro.LuaCallMyClass
local classObj=LuaCallMyClass(100)
--使用LuaCallMyClass类的对象访问委托变量action
classObj:AddAction(myDelegate1)
classObj:AddAction(myDelegate2)
classObj:AddAction(myDelegate3)
--执行委托链
classObj:InvokemydelegateMehods()
事件就是加个关键字,只能在外部绑定,不能在外部执行。没啥可说的。这个以后发现了解决办法会回来更新
三.其他注意事项
1:lua调用C#,需要在Xlua中生成"适配代码"。则在这个类打入一个[LuaCallCsharp]的标签。
2.如果lua调用C#的系统API,则无法拿到源代码,无法打入标签。则使用"静态列表"方式解决。
eg:
Public static List mymodule_LuaCallCS_List=new List()
{
typeof(GameObject),
typeof(Dictionary),
};
然后把以上代码放入一个静态类中即可。
3.实际开发过程中,lua调用C#用的比较多。
xlua的优点体现的没有必要每次改的时候,都要生成代码。主要原理是依赖于编译器环境下,
利用反射来动态生成代码接口。
4:在标有"[XLua.LuaCallCsharp]"的C#类中,添加新的方法后,如果是生成了代码类,则必须重新生成或者删除,否则XLua用以前生成的,进行注册查询,会出现Lua异常:“视图访问一个nil的方法”
还有很多问题,先整理到这里,慢慢来。
你可能感兴趣的:(Xlua中lua语言与C#之间的调用)
- 【Multipath网络层协议】MPTCP工作原理
码上为赢
Multipath精通之路multipathMPTCP
常见网络层多路径协议介绍MPTCP(MultipathTCP)MPTCP是在传统TCP基础上进行扩展的协议,它允许在源端和目的端之间建立多个TCP子流,这些子流可以通过不同的网络路径传输数据。例如,一台笔记本电脑同时连接了Wi-Fi网络和以太网网络,当使用MPTCP进行数据传输时,它可以将数据分别通过Wi-Fi和以太网这两条不同的路径发送到目标服务器,从而充分利用两条链路的带宽。LISP(Loca
- 最好Wordpree+Apache+PHP安装教程
伶星37
apachephp开发语言
前提需要PHP的安装最少需要7.4以上Mysql的安装,直接默认最新版就行APache服务器(HTTP服务器,只有用这个你的软件才能在服务器上运行)安装apache安装sudoaptinstallapache2查看防火墙sudoufwapplist如果有Apache那么就可以直接访问安装PHP版本7.4就可以sudoaptinstallphp-mysqlsudosystemctlrestartap
- 【C++】:STL详解 —— list类
-元清-
重制C++版c++开发语言
目录list的概念list的构造函数list的大小size()resize()empty()list的插入push_front()和emplace_front()push_back()和emplace_back()insert()和emplace()list的删除pop_front()pop_back()erase()remove()remove_if()unique()clear()list的拼
- 后端开发技巧:提升代码质量与系统性能
wenbin_java
javaspringbootmavenmybatis
引言后端开发是构建高效、稳定应用的核心环节。无论是处理复杂的业务逻辑,还是优化系统性能,后端开发者都需要掌握一系列技巧和最佳实践。本文将分享一些实用的后端开发技巧,帮助你提升代码质量、优化系统性能并确保应用的安全性。1.提升代码质量的技巧1.1遵循编码规范统一风格:使用工具(如Checkstyle、ESLint)确保代码风格一致。命名规范:变量、函数、类名应具有描述性,避免使用缩写。1.2模块化与
- 【面试实战】Spring基础、IoC、AOP、MVC、Mybatis、Spring Boot
Sivan_Xin
技术实战专栏(已上云)面试mvcspring
version:1.0文章目录SpringSpring基础/IoC♂️面试官:举例Spring的模块?♂️面试官:Spring、SpringMVC、SpringBoot关系?♂️面试官:说说对SpringIoC的了解?♂️面试官:什么是SpringBean?♂️面试官:Bean的作用域?♂️面试官:Bean的生命周期?♂️面试官:单例Bean的线程安全问题了解吗?♂️面试官:@Co
- SQL注入原理即sqli-labs搭建,sql注入简单实战
Cwillchris
网络安全全栈课程渗透测试web安全安全sql
一、SQL注入概述1、SQL注入原理用户登录的基本SQL语句:select*fromuserswhereusername='用户输入的用户名'andpassword='用户输入的密码'用户输入的内容是可控的,例如我们可以在用户名中输入'or1=1--空格select*fromuserswhereusername=''or1=1--空格'andpassword='用户输入的密码'此时我们输入的第一个
- 我在广州学 Mysql 系列——存储过程与存储函数详解
练小杰
数据库相关mysqlandroid数据库学习adbsql
ℹ️大家好,我是练小杰,今天周五了,一周就这样从手上溜走了,还有两星期过年!!本文将学习MYSQL中存储过程与存储函数的概念~~回顾:【索引详解】【索引相关练习】数据库专栏【数据库专栏】~想要了解更多内容,主页【练小杰的CSDN】文章目录存储过程与存储函数存储过程(StoredProcedure)存储函数(StoredFunction)⚠️主要区别选择存储过程还是存储函数创建存储过程命令解释创建存
- 我在广州学 Mysql 系列——数据表查询命令详解
练小杰
数据库相关mysql数据库学习经验分享adb后端
ℹ️大家好,我是LXJ,今天星期二了,本文将讲述MYSQL查询数据的详细命令以及相关例题~~复习:《Mysql函数的练习题》同时,数据库相关内容查看专栏【数据库专栏】~想要了解更多内容请点击我的主页:【练小杰的CSDN】“倒霉,倒霉,倒霉!”——龙叔文章目录前言基本查询语句单个表格查询查询所有字段查询指定字段查询指定记录带IN关键字的查询带BETWEENAND的范围查询带LIKE的字符匹配查询查询
- c++_sort函数
惊讶的猫
c语言算法c++
sort介绍在C/C++中,要想应用排序算法,可以使用c语言的qsort,也可以使用c++的sort。1)qsort是C标准库提供的一个通用排序函数,位于stdlib.h头文件中。qsort适用于C语言中的数组。2)sort是C++中STL的泛型算法(即函数)sort可以排数组,vector(以及其他的容器)sort可以自定义排序规则。引入:#include排静态数组c语言中arr是一个数组名作为
- 通过TensorFlow实现简单深度学习模型(2)
yyc_audio
人工智能深度学习python机器学习
前文我们已经实现了对每批数据的训练,下面继续实现一轮完整的训练。完整的训练循环一轮训练就是对训练数据的每个批量都重复上述训练步骤,而完整的训练循环就是重复多轮训练。deffit(model,images,labels,epochs,batch_size=128):forepoch_counterinrange(epochs):print(f"Epoch{epoch_counter}")batch_
- 小程序中头像昵称填写
葱头的故事
小程序小程序
官方文档参考小程序用户头像昵称获取规则调整公告新的小程序版本不能通过wx.getUserProfile和wx.getUserInfo获取用户信息注意昵称填写,同时绑定了input和change事件(input是用户输入时触发,change是直接选择微信昵称时触发)getAvater(event){console.log(9,event);console.log('event',event.deta
- 多边形顺逆时针判定算法详解
wangzy1982
算法
多边形顺逆时针判定解决的问题是给一个多边形的顶点列表或者边列表,判断该多边形是顺时针还是逆时针。多边形顺逆时针判定算法在几何算法中应用十分广泛。因为很多几何算法都需要要根据几何的拓扑结构,为了方便,往往规定外环多边形是逆时针,内环多边形是顺时针。除了介绍算法,作者还会关于误差对算法稳定性影响有详细介绍。更多几何算法,欢迎关注作者gongzhonghao:几何算法算法一:用最远顶点判断顺逆时针边不包
- php composer 私有包,手把手教你如何搭建Composer私有仓库
超级小嬲
phpcomposer私有包
现在网上到处充斥这各种搭建私有仓库文档,但对于新手来说,总是有那么多的坑。这里我把我的摸索历程写出来给大家参考,希望大家能少踩一些坑。现在网上到处充斥这各种搭建私有仓库文档,但对于新手来说,总是有那么多的坑。这里我把我的摸索历程写出来给大家参考,希望大家能少踩一些坑。一,安装ComposerComposer的安装已经有很完善的教程,这里我就不重复造轮子了。安装Composer安装好之后就能直接在命
- 【AI+智造】基于阿里云Ubuntu24.04系统,使用Ollama部署开源DeepSeek模型并集成到企业微信
邹工转型手札
Duodoo开源Odoo18开源企业信息化制造人工智能数据分析
作者:Odoo技术开发/资深信息化负责人日期:2025年2月28日本方案结合了本地部署与云服务调用的技术路径,涵盖部署步骤、集成逻辑及关键问题点,适用于企业级AI应用场景。一、方案背景与架构设计1.技术选型背景DeepSeek模型:作为开源大模型,支持文本生成、智能问答等场景,适合企业知识库与自动化服务。Ollama工具:轻量化本地模型部署框架,支持一键拉取模型镜像并启动API服务。企业微信集成:
- c语言概率产生字母,智邮普创c语言面试题 ---- 字母概率(示例代码)
飞跃思考
c语言概率产生字母
题目描述小明最近对概率问题很感兴趣。一天,小明和小红一起玩一个概率游戏,首先小明给出一个字母和一个单词,然后由小红计算这个字母在这个单词中出现的概率。字母不区分大小写。例如,给定的字母是a,单词是apple,那么概率是0.20000。输入输入包含多组测试数据。每组数据包含一个字母和一个单词。单词的长度不超过200。输出对于每一个输入,输出对应的概率,结果保留5位小数。样例输入aapplecCand
- c语言字母概率,C/C++知识点之智邮普创c语言面试题 ---- 字母概率
OK up
c语言字母概率
本文主要向大家介绍了C/C++知识点之智邮普创c语言面试题----字母概率,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。题目描述小明最近对概率问题很感兴趣。一天,小明和小红一起玩一个概率游戏,首先小明给出一个字母和一个单词,然后由小红计算这个字母在这个单词中出现的概率。字母不区分大小写。例如,给定的字母是a,单词是apple,那么概率是0.20000。输入输入包含多组测试数据
- Nginx 请求转发配置指南
web13093320398
面试学习路线阿里巴巴nginxlinux运维
Nginx请求转发配置指南1.简介Nginx是一款高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。本文档将介绍如何使用Nginx配置请求转发,并解释一些常用的配置参数。2.Nginx安装在配置之前,确保你的系统已经安装了Nginx。如果未安装,可以使用以下命令进行安装:在CentOS/RHEL上:sudoyuminstallnginx-y在Ubuntu/Debia
- 自动化脚本在Xshell中的应用
这多冒昧啊
运维githubgit运维自动化自动化脚本脚本
Xshell是一款功能强大的终端模拟软件,主要用于远程连接和管理服务器。它支持多种协议,包括SSH、Telnet、SFTP等,使用户能够通过命令行界面对远程服务器进行操作。Xshell提供了丰富的功能和特点,使其成为系统管理员、开发人员和网络工程师的得力工具。目录一、概述二、自动化脚本在Xshell中的应用案例案例一:自动化系统更新与维护案例二:自动化备份与恢复案例三:自动化网络安全检查三、总结一
- AI加速回归测试:如何用大模型预测哪些模块最容易出问题
测试者家园
人工智能测试开发和测试质量效能人工智能质量效能软件测试软件研发大模型预测回归测试风险预测
用ChatGPT做软件测试回归测试是软件开发过程中必不可少的环节,尤其是在持续集成和快速迭代的开发环境下。随着软件系统变得日益复杂,传统的回归测试面临着显著的挑战:测试覆盖面广、执行周期长、资源消耗大,而测试人员又常常无法准确预测哪些模块会出现问题。为了提高回归测试的效率和精准性,AI,特别是大模型技术的引入,为回归测试的智能化提供了前所未有的机遇。通过大模型的预测能力,测试团队能够更加高效地识别
- 说说 Spring MVC 的执行流程?
浮生带你学Java
Java面试题Springspringmvcjava
高频面试题:说说SpringMVC的执行流程?大家好,我是浮生,一个工作了十四年的java程序员!昨天,一个工作2年的粉丝在面试的时候,面试官要求他说SpringMVC的执行流程。他没回答上来,错过了这个offer。一、问题解析SpringMVC的执行流程,一个面试频率超级高的问题,但是缺难倒了无数的程序员。这个问题的考察范围主要是3~5年,甚至5年以上都会问到。和它同类型的问题还有Bean的加载
- -字母概率-
-JMY-
C++题库c++
题目描述小明最近对概率问题很感兴趣。一天,小明和小红一起玩一个概率游戏,首先小明给出一个字母和一个单词,然后由小红计算这个字母在这个单词中出现的概率。字母不区分大小写。例如,给定的字母是a,单词是apple,那么概率是0.20。输入输入包含多组测试数据。每组数据包含一个字母和一个单词。单词的长度不超过200。输出对于每一个输入,输出对应的概率,结果保留2位小数。样例输入aapple样例输出0.20
- 15天大厂真题带刷day1
练习时长两年半1
算法数据结构
牛客网在线编程_算法面试_15天大厂真题带刷(nowcoder.com)ZT123年OPPO-a的翻转描述数字a翻转数位得到数字b,计算+a+b。输入描述:一个正整数 (1⩽⩽109)a(1⩽a⩽109)。保证a在十进制下每一位都非00。输出描述:一个正整数表示答案。示例1输入:12输出:33说明:正整数=12a=12,翻转得到=21b=21,+=33a+b=33。示例2输入:23输出:55im
- 蓝桥杯二分题
练习时长两年半1
算法数据结构java蓝桥杯
P1083[NOIP2012提高组]借教室题目描述在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为,,dj,sj,tj,
- SpringCloud/Boot集成LogBack
azoon.top
springcloudlogbackspringlog4jslf4j
一.简要介绍什么是SLF4J?官网介绍:SimpleLoggingFacadeforJava(SLF4J)充当简单的各种日志记录框架的Facade或抽象(e.g.java.util.logging、logback、log4j)允许最终用户在部署时插入所需的日志记录框架。类似java中的接口,如果只集成SLF4J,日志只能输出在控制台,并没有输出到文件的能力,要实现真正的日志能力,需要引入其实现层:
- 图论刷题计划与题解1(最短路问题)
cqust_qilin02811
#最短路与分层图图论算法深度优先
文章目录图论刷题计划与题解1(最短路问题)题目1:P1629邮递员送信(建反图做两次dijkstra)题目2:P1144最短路计数题目3:P1828[USACO3.2]香甜的黄油SweetButter题目4:P1576最小花费题目5:P5767[NOI1997]最优乘车题目6:P5764[CQOI2005]新年好图论刷题计划与题解1(最短路问题)题目1:P1629邮递员送信(建反图做两次dijks
- 图论题解索引
JLU_LYM
各类型题解索引图论算法数据结构题解索引解题攻略
前言作图论的题的时候,无论何时,DFS,BFS加剪枝,都是你可靠的方法,如果第一眼没有具体思路,完全可以先按照刚才的两个方法思考下去,可能想着想着,这道题真实的样子(即真正合适的算法),你就发现了。并查集1、并查集计算连通分量数:力扣547省份数量2、并查集维护一个大集合问题(是一个集合不可以连线)+计算连通分量变种题目力扣684冗余连接3、并查集维护连通分量是否为1的Kruskal算法:力扣15
- 讯飞星火 VS 文心一言:谁是中文大语言模型的TOP1?
沉迷单车的追风少年
深度学习-计算机视觉人工智能文心一言讯飞星火百度科大讯飞
在百度发布文心一言一个多月后,科大讯飞也发布了自己的大模型“讯飞星火大模型”。本篇博客就测评一下这两个在中文圈最受好评的大语言模型,顺便辅以ChatGPT为参考。大家一起来看看到底谁是中文大语言模型的TOP1?目录体验网址1、旅游攻略2、数理逻辑题3、故事创作4、古诗创作5、图片创作6、文案创作7、代码编写8、互联网黑话9、中文梗对比10、英文写作结论体验网址1、文心一言:文心一言2、ChatGP
- Eureka vs Zookeeper:谁才是微服务世界的“寻人启事”之王?
码农技术栈
eurekazookeeper微服务架构springcloud
引言:为什么需要“服务发现”?想象一下,你走进一家巨大的购物中心,里面有1000家店铺,但没有任何地图或指示牌。你需要找到一家奶茶店,却只能挨家挨户敲门问路——这就是没有服务发现的微服务世界。服务发现(ServiceDiscovery)就像购物中心的智能导航系统:它能自动告诉你奶茶店的位置、哪家正在营业,甚至哪家人最少。而Eureka和Zookeeper就是两套不同的“导航系统”,但它们的底层逻辑
- Eureka、Zookeeper、Nacos 三国杀:谁才是微服务“全家桶”的终极答案?
码农技术栈
eurekazookeeper微服务springcloudspringboot后端
引言:微服务世界的“三大护法”如果你在微服务领域摸爬滚打过,一定听过这三个名字:Eureka、Zookeeper、Nacos。它们看似都解决了“服务发现”问题,但背后的定位天差地别——Eureka是Netflix的“退休老干部”(已停更),主打高可用;Zookeeper是Apache的“强迫症管家”,专注强一致性;Nacos是阿里的“全能新秀”,号称“服务发现+配置管理”二合一。到底怎么选?我们通
- Unity(游戏)中五种数据存储的方法
别皱眉inging
unity3d游戏存储存储方式
Unity(游戏)中五种数据存储的方法一、PlayerPrefsunity3d提供了一个用于本地持久化保存与读取的类-------PlayerPrefs.工作原理很简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值(注:PlayerPrefs运用起来很方便,随时都可以存取与读取)。Playerprefs类支持3中数据类型的保存和读取,分别是浮点型、整型和字符串型:P
- 继之前的线程循环加到窗口中运行
3213213333332132
javathreadJFrameJPanel
之前写了有关java线程的循环执行和结束,因为想制作成exe文件,想把执行的效果加到窗口上,所以就结合了JFrame和JPanel写了这个程序,这里直接贴出代码,在窗口上运行的效果下面有附图。
package thread;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util
- linux 常用命令
BlueSkator
linux命令
1.grep
相信这个命令可以说是大家最常用的命令之一了。尤其是查询生产环境的日志,这个命令绝对是必不可少的。
但之前总是习惯于使用 (grep -n 关键字 文件名 )查出关键字以及该关键字所在的行数,然后再用 (sed -n '100,200p' 文件名),去查出该关键字之后的日志内容。
但其实还有更简便的办法,就是用(grep -B n、-A n、-C n 关键
- php heredoc原文档和nowdoc语法
dcj3sjt126com
PHPheredocnowdoc
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Current To-Do List</title>
</head>
<body>
<?
- overflow的属性
周华华
JavaScript
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&q
- 《我所了解的Java》——总体目录
g21121
java
准备用一年左右时间写一个系列的文章《我所了解的Java》,目录及内容会不断完善及调整。
在编写相关内容时难免出现笔误、代码无法执行、名词理解错误等,请大家及时指出,我会第一时间更正。
&n
- [简单]docx4j常用方法小结
53873039oycg
docx
本代码基于docx4j-3.2.0,在office word 2007上测试通过。代码如下:
import java.io.File;
import java.io.FileInputStream;
import ja
- Spring配置学习
云端月影
spring配置
首先来看一个标准的Spring配置文件 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=&q
- Java新手入门的30个基本概念三
aijuans
java新手java 入门
17.Java中的每一个类都是从Object类扩展而来的。 18.object类中的equal和toString方法。 equal用于测试一个对象是否同另一个对象相等。 toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示.(toString 方法是一个很重要的方法) 19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。
- 《2008 IBM Rational 软件开发高峰论坛会议》小记
antonyup_2006
软件测试敏捷开发项目管理IBM活动
我一直想写些总结,用于交流和备忘,然都没提笔,今以一篇参加活动的感受小记开个头,呵呵!
其实参加《2008 IBM Rational 软件开发高峰论坛会议》是9月4号,那天刚好调休.但接着项目颇为忙,所以今天在中秋佳节的假期里整理了下.
参加这次活动是一个朋友给的一个邀请书,才知道有这样的一个活动,虽然现在项目暂时没用到IBM的解决方案,但觉的参与这样一个活动可以拓宽下视野和相关知识.
- PL/SQL的过程编程,异常,声明变量,PL/SQL块
百合不是茶
PL/SQL的过程编程异常PL/SQL块声明变量
PL/SQL;
过程;
符号;
变量;
PL/SQL块;
输出;
异常;
PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言PL/SQL 是对 SQL 的扩展,sql的执行时每次都要写操作
- Mockito(三)--完整功能介绍
bijian1013
持续集成mockito单元测试
mockito官网:http://code.google.com/p/mockito/,打开documentation可以看到官方最新的文档资料。
一.使用mockito验证行为
//首先要import Mockito
import static org.mockito.Mockito.*;
//mo
- 精通Oracle10编程SQL(8)使用复合数据类型
bijian1013
oracle数据库plsql
/*
*使用复合数据类型
*/
--PL/SQL记录
--定义PL/SQL记录
--自定义PL/SQL记录
DECLARE
TYPE emp_record_type IS RECORD(
name emp.ename%TYPE,
salary emp.sal%TYPE,
dno emp.deptno%TYPE
);
emp_
- 【Linux常用命令一】grep命令
bit1129
Linux常用命令
grep命令格式
grep [option] pattern [file-list]
grep命令用于在指定的文件(一个或者多个,file-list)中查找包含模式串(pattern)的行,[option]用于控制grep命令的查找方式。
pattern可以是普通字符串,也可以是正则表达式,当查找的字符串包含正则表达式字符或者特
- mybatis3入门学习笔记
白糖_
sqlibatisqqjdbc配置管理
MyBatis 的前身就是iBatis,是一个数据持久层(ORM)框架。 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis对JDBC进行了一次很浅的封装。
以前也学过iBatis,因为MyBatis是iBatis的升级版本,最初以为改动应该不大,实际结果是MyBatis对配置文件进行了一些大的改动,使整个框架更加方便人性化。
- Linux 命令神器:lsof 入门
ronin47
lsof
lsof是系统管理/安全的尤伯工具。我大多数时候用它来从系统获得与网络连接相关的信息,但那只是这个强大而又鲜为人知的应用的第一步。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。
有趣的是,lsof也是有着最多
- java实现两个大数相加,可能存在溢出。
bylijinnan
java实现
import java.math.BigInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BigIntegerAddition {
/**
* 题目:java实现两个大数相加,可能存在溢出。
* 如123456789 + 987654321
- Kettle学习资料分享,附大神用Kettle的一套流程完成对整个数据库迁移方法
Kai_Ge
Kettle
Kettle学习资料分享
Kettle 3.2 使用说明书
目录
概述..........................................................................................................................................7
1.Kettle 资源库管
- [货币与金融]钢之炼金术士
comsci
金融
自古以来,都有一些人在从事炼金术的工作.........但是很少有成功的
那么随着人类在理论物理和工程物理上面取得的一些突破性进展......
炼金术这个古老
- Toast原来也可以多样化
dai_lm
androidtoast
Style 1: 默认
Toast def = Toast.makeText(this, "default", Toast.LENGTH_SHORT);
def.show();
Style 2: 顶部显示
Toast top = Toast.makeText(this, "top", Toast.LENGTH_SHORT);
t
- java数据计算的几种解决方法3
datamachine
javahadoopibatisr-languer
4、iBatis
简单敏捷因此强大的数据计算层。和Hibernate不同,它鼓励写SQL,所以学习成本最低。同时它用最小的代价实现了计算脚本和JAVA代码的解耦,只用20%的代价就实现了hibernate 80%的功能,没实现的20%是计算脚本和数据库的解耦。
复杂计算环境是它的弱项,比如:分布式计算、复杂计算、非数据
- 向网页中插入透明Flash的方法和技巧
dcj3sjt126com
htmlWebFlash
将
Flash 作品插入网页的时候,我们有时候会需要将它设为透明,有时候我们需要在Flash的背面插入一些漂亮的图片,搭配出漂亮的效果……下面我们介绍一些将Flash插入网页中的一些透明的设置技巧。
一、Swf透明、无坐标控制 首先教大家最简单的插入Flash的代码,透明,无坐标控制: 注意wmode="transparent"是控制Flash是否透明
- ios UICollectionView的使用
dcj3sjt126com
UICollectionView的使用有两种方法,一种是继承UICollectionViewController,这个Controller会自带一个UICollectionView;另外一种是作为一个视图放在普通的UIViewController里面。
个人更喜欢第二种。下面采用第二种方式简单介绍一下UICollectionView的使用。
1.UIViewController实现委托,代码如
- Eos平台java公共逻辑
蕃薯耀
Eos平台java公共逻辑Eos平台java公共逻辑
Eos平台java公共逻辑
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年6月1日 17:20:4
- SpringMVC4零配置--Web上下文配置【MvcConfig】
hanqunfeng
springmvc4
与SpringSecurity的配置类似,spring同样为我们提供了一个实现类WebMvcConfigurationSupport和一个注解@EnableWebMvc以帮助我们减少bean的声明。
applicationContext-MvcConfig.xml
<!-- 启用注解,并定义组件查找规则 ,mvc层只负责扫描@Controller -->
<
- 解决ie和其他浏览器poi下载excel文件名乱码
jackyrong
Excel
使用poi,做传统的excel导出,然后想在浏览器中,让用户选择另存为,保存用户下载的xls文件,这个时候,可能的是在ie下出现乱码(ie,9,10,11),但在firefox,chrome下没乱码,
因此必须综合判断,编写一个工具类:
/**
*
* @Title: pro
- 挥洒泪水的青春
lampcy
编程生活程序员
2015年2月28日,我辞职了,离开了相处一年的触控,转过身--挥洒掉泪水,毅然来到了兄弟连,背负着许多的不解、质疑——”你一个零基础、脑子又不聪明的人,还敢跨行业,选择Unity3D?“,”真是不自量力••••••“,”真是初生牛犊不怕虎•••••“,••••••我只是淡淡一笑,拎着行李----坐上了通向挥洒泪水的青春之地——兄弟连!
这就是我青春的分割线,不后悔,只会去用泪水浇灌——已经来到
- 稳增长之中国股市两点意见-----严控做空,建立涨跌停版停牌重组机制
nannan408
对于股市,我们国家的监管还是有点拼的,但始终拼不过飞流直下的恐慌,为什么呢?
笔者首先支持股市的监管。对于股市越管越荡的现象,笔者认为首先是做空力量超过了股市自身的升力,并且对于跌停停牌重组的快速反应还没建立好,上市公司对于股价下跌没有很好的利好支撑。
我们来看美国和香港是怎么应对股灾的。美国是靠禁止重要股票做空,在
- 动态设置iframe高度(iframe高度自适应)
Rainbow702
JavaScriptiframecontentDocument高度自适应局部刷新
如果需要对画面中的部分区域作局部刷新,大家可能都会想到使用ajax。
但有些情况下,须使用在页面中嵌入一个iframe来作局部刷新。
对于使用iframe的情况,发现有一个问题,就是iframe中的页面的高度可能会很高,但是外面页面并不会被iframe内部页面给撑开,如下面的结构:
<div id="content">
<div id=&quo
- 用Rapael做图表
tntxia
rap
function drawReport(paper,attr,data){
var width = attr.width;
var height = attr.height;
var max = 0;
&nbs
- HTML5 bootstrap2网页兼容(支持IE10以下)
xiaoluode
html5bootstrap
<!DOCTYPE html>
<html>
<head lang="zh-CN">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">