• 关于

    不相关变量怎么用

    的搜索结果

回答

一。zval、引用计数、变量分离、写时拷贝我们一步步来理解1、php语言特性PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都会被PHP解析器解析执行PHP的执行是通过Zend engine(ZE, Zend引擎),ZE是用C编写的用户编写的PHP代码最终都会被翻译成PHP的虚拟机ZE的虚拟指令(OPCODES)来执行也就说最终会被翻译成一条条的指令既然这样,有什么结果和你预想的不一样,查看php源码是最直接最有效的 2、php变量的存储结构在PHP中,所有的变量都是用一个结构zval结构来保存的,在Zend/zend.h中可以看到zval的定义:zval结构包括:① value —— 值,是真正保存数据的关键部分,定义为一个联合体(union)② type —— 用来储存变量的类型 ③ is_ref —— 下面介绍④ refcount —— 下面介绍 声明一个变量$addr="北京";PHP内部都是使用zval来表示变量的,那对于上面的脚本,ZE是如何把addr和内部的zval结构联系起来的呢?变量都是有名字的(本例中变量名为addr)而zval中并没有相应的字段来体现变量名。PHP内部肯定有一个机制,来实现变量名到zval的映射在PHP中,所有的变量都会存储在一个数组中(确切的说是hash table)当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的信息,然后将这个变量的名字和指向这个zval的指针填入一个数组中。当你获取这个变量的时候,PHP会通过查找这个数组,取得对应的zval 注意:数组和对象这类复合类型在生成zval时,会为每个单元生成一个zval3、我们经常说每个变量都有一个内存地址,那这个zval和变量的内存地址,这俩有什么关系吗?定义一个变量会开辟一块内存,这块内存好比一个盒子,盒子里放了zval,zval里保存了变量的相关信息,需要开辟多大的内存,是由zval所占空间大小决定的zval是内存对象,垃圾回收的时候会把zval和内存地址(盒子)分别释放掉 4、引用计数、变量分离、写时拷贝zval中的refcount和is_ref还没有介绍,我们知道PHP是一个长时间运行的服务器端脚本。那么对于它来说,效率和资源占用率是一个很重要的衡量标准,也就是说,PHP必须尽量减少内存占用率。考虑下面这段代码:第一行代码创建了一个字符串变量,申请了一个大小为9字节的内存,保存了字符串“laruence”和一个NULL(0)的结尾第二行定义了一个新的字符串变量,并将变量var的值“复制”给这个新的变量第三行unset了变量var 这样的代码是很常见的,如果PHP对于每一个变量赋值都重新分配内存,copy数据的话,那么上面的这段代码就要申请18个字节的内存空间,为了申请新的内存,还需要cpu执行某些计算,这当然会加重cpu的负载而我们也很容易看出来,上面的代码其实根本没有必要申请两份空间,当第三句执行后,$var被释放了,我们刚才的设想(申请18个字节内存空间)突然变的很滑稽,这次复制显得好多余。如果早知道$var不用了,直接让$var_dup用$var的内存不就行了,还复制干嘛?如果你觉得9个字节没什么,那设想下如果$var是个10M的文件内容,或者20M,是不是我们的计算机资源消耗的有点冤枉呢?呵呵,PHP的开发者也看出来了: 刚才说了,PHP中的变量是用一个存储在symbol_table中的符号名,对应一个zval来实现的,比如对于上面的第一行代码,会在symbol_table中存储一个值“var”,对应的有一个指针指向一个zval结构,变量值“laruence”保存在这个zval中,所以不难想象,对于上面的代码来说,我们完全可以让“var”和“var_dup”对应的指针都指向同一个zval就可以了(额,鸟哥一会说hash table,一会说symbol_table,暂且理解为symbol_table是hash table的子集) PHP也是这样做的,这个时候就需要介绍一下zval结构中的refcount字段了refcount,引用计数,记录了当前的zval被引用的次数(这里的引用并不是真正的 & ,而是有几个变量指向它)比如对于代码:第一行,创建了一个整形变量,变量值是1。 此时保存整形1的这个zval的refcount为1第二行,创建了一个新的整形变量(通过赋值的方式),变量也指向刚才创建的zval,并将这个zval的refcount加1,此时这个zval的refcount为2所以,这个时候(通过值传递的方式赋值给别的变量),并没有产生新的zval,两个变量指向同一zval,通过一个计数器来共用zval及内存地址,以达到节省内存空间的目的当一个变量被第一次创建的时候,它对应的zval结构的refcount的值会被初始化为1,因为只有这一个变量在用它。但是当你把这个变量赋值给别的变量时,refcount属性便会加1变成2,因为现在有两个变量在用这个zval结构了 PHP提供了一个函数可以帮助我们了解这个过程debug_zval_dump输出:long(1) refcount(2)long(1) refcount(3)如果你奇怪 ,var的refcount应该是1啊?我们知道,对于简单变量,PHP是以传值的形式传参数的。也就是说,当执行debug_zval_dump($var)的时候,$var会以传值的方式传递给debug_zval_dump,也就是会导致var的refcount加1,所以只要能看到,当变量赋值给一个变量以后,能导致zval的refcount加1这个结果即可现在我们回头看上面的代码, 当执行了最后一行unset($var)以后,会发生什么呢?unset($var)的时候,它删除符号表里的$var的信息,准备清理它对应的zval及内存空间,这时它发现$var对应的zval结构的refcount值是2,也就是说,还有另外一个变量在一起用着这个zval,所以unset只需把这个zval的refcount减去1就行了上代码:输出:string(8) "laruence" refcount(2) 但是,对于下面的代码呢?很明显在这段代码执行以后,$var_dup的值应该还是“laruence”,那么这又是怎么实现的呢?这就是PHP的copy on write机制(简称COW):PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的过程(在Zend引擎中,分离是破坏一个引用对的过程)对于上面的代码,当执行到第三行的时候,PHP发现$var想要改变,并且它指向的zval的refcount大于1,那么PHP就会复制一个新的zval出来,改变其值,将改变的变量指向新的zval(哪个变量指向新复制的zval其实已经无所谓了),并将原zval的refcount减1,并修改symbol_table里该变量的指针,使得$var和$var_dup分离(Separation)。这个机制就是所谓的copy on write(写时复制,这里的写包括普通变量的修改及数组对象里的增加、删除单元操作)如果了解了is_ref之后,上面说的并不严谨 上代码测试:输出:long(1) refcount(2)string(8) "laruence" refcount(2) 现在我们知道,当使用变量复制的时候 ,PHP内部并不是真正的复制,而是采用指向相同的zval结构来节约开销。那么,对于PHP中的引用,又是如何实现呢?这段代码结束以后,$var也会被间接的修改为1,这个过程称作(change on write:写时改变)那么ZE是怎么知道,这次的复制不需要Separation呢?这个时候就要用到zval中的is_ref字段了:对于上面的代码,当第二行执行以后,$var所代表的zval的refcount变为2,并且设置is_ref为1到第三行的时候,PHP先检查var_ref对应的zval的is_ref字段(is_ref 表示该zval是否被&引用,仅表示真或假,就像开关的开与关一样,zval的初始化情况下为0,即非引用),如果为1,则不分离,直接更改(否则需要执行刚刚提到的zval分离),更改共享的zval实际上也间接更改了$var的值,因为引擎想所有的引用变量都看到这一改变php源码做了这样一个判断,大体逻辑示意如下:如果这个zval中的if_ref为1(即被引用),或者该zval引用计数小于2任何一种方式:都不会进行分离 尽管已经存在写时复制和写时改变,但仍然还存在一些不能通过is_ref和refcount来解决的问题对于如下的代码,又会怎样呢?这里$var、$var_dup、$var_ref三个变量将共用一个zval结构(其实这是不可能的,一个zval不可能既被&,又被指向),有两个属于change-on-write组合($var和$var_ref),有两个属于copy-on-write组合($var和$var_dup),那is_ref和refcount该怎样工作,才能正确的处理好这段复杂的关系呢?答案是不可能!在这种情况下,变量的值必须分离成两份完全独立的存在当执行第二行代码的时候,和前面讲过的一样,$var_dup 和 $var 指向相同的zval, refcount为2当执行第三行的时候,PHP发现要操作的zval的refcount大于1,则PHP会执行Separation(也就是说php将一个zval的is_ref从0设为1 之前,当然此时refcount还没有增加,会看该zval的refcount,如果refcount>1,则会分离), 将$var_dup分离出去,并将$var和$var_ref做change on write关联。也就是,refcount=2, is_ref=1;所以内存会给变量var_dup 分配出一个新的zval,类型与值同 $var和$var_ref指向的zval一样,是新分配出来的,尽管他们拥有同样的值,但是必须通过两个zval来实现。试想一下,如果三者指向同一个zval的话,改边 $var_dup 的值,那么 $var和$var_ref 也会受到影响,这样就乱套了图解:下面的这段代码在内核中同样会产生歧义,所以需要强制复制!也就是说一个zval不会既被引用,又被指向,必须分离 基于这样的分析,我们就可以让debug_zval_dump出refcount为1的结果来:输出:string(8) "laruence" refcount(1) 为什么结果是refcount(1)呢debug_zval_dump()中参数是引用的话,refcount永远为1这两段代码在执行的时候是这样的逻辑:PHP先看变量指向的zval是否被引用,如果是引用,则不再产生新的zval甭管哪个变量引用了它,比如有个变量$a被引用了,$b=&$a,就算自己引用自己$a=&$a,$a所指向的zval都不会被复制,改变其中一个变量的值,另一个值也被改变(写时改变)如果is_ref为0且refcount大于1,改变其中一个变量时,复制新的zval(写时复制) 还有一个知识点需要了解下,就是PHP数组复制的机制复制一个数组,就是把一个数组赋值给一个变量便可。会把数组指针位置一同复制。这里面有两种情况:① 指针位置合法,这时直接复制,无影响② 原数组指针位置非法时(移出界),“新”数组指针会初始化(这里的新为什么要加引号?请看下文),而老的数组指针位置不变,还是false先看例子: 结果:!结果:出现这种情况好像不对?$arr2 难道不是新数组?新数组的数组指针应该重置了啊这里注意了:$arr2 = $arr1 ,在俩变量都没发生写操作时,他们其实引用的是同一个内存地址。在其中一个变量发生写操作后,内存地址会复制一份,发生改变的变量会去引用它,并把数组指针初始化。所以 $arr1 会去引用复制的内存地址,并将指针初始化二。.foreach循环时调用current等函数!结果: 56按照之前说的,foreach先赋值,再移动指针,再执行循环体,第一次结果为2可以理解为什么三次都是2呢?咋就这么2呢?因为current函数是按引用传递的函数 在zval笔记中说了,一个zval不能既被引用,又被指向所以,变量分离,重新拷贝一份数组专门用于current函数 当然,如果数组zval的is_ref为1,则不会拷贝数组了或者:结果:current是引用传参

杨冬芳 2019-12-02 02:26:33 0 浏览量 回答数 0

回答

js这种动态弱类型需要什么数据结构啊,js本身的特性就把路子放得很宽了。自己封装一下几个变量,搞明白闭包、原型之类的,把这些用熟了其关键,js的数据结构就已经够用了。我记得有一句话,js一切皆是方法。 至于算法,算法是不分语言的,你大概是想知道怎么用js实现一些算法吧,那就是看算法相关的书籍了语言无关

行者武松 2019-12-02 01:22:25 0 浏览量 回答数 0

问题

关于ios 与xib视图加载相关的内存管理问题

爵霸 2019-12-01 20:15:41 1027 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

什么是java反射机制?我们又为什么要学它?当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射。IT行业里这么说,没有反射也就没有框架,现有的框架都是以反射为基础。在实际项目开发中,用的最多的是框架,填的最多的是类,反射这一概念就是将框架和类揉在一起的调和剂。所以,反射才是接触项目开发的敲门砖! 一、Class类什么是Class类?在面向对象的世界里,万事万物皆是对象。而在java语言中,static修饰的东西不是对象,但是它属于类。普通的数据类型不是对象,例如:int a = 5;它不是面向对象,但是它有其包装类 Integer 或者分装类来弥补了它。除了以上两种不是面向对象,其余的包括类也有它的面向对象,类是java.lang.Class的实例化对象(注意Class是大写)。也就是说:Class A{}当我创建了A类,那么类A本身就是一个对象,谁的对象?java.lang.Class的实例对象。那么这个对象又该怎么表示呢?我们先看一下下面这段代码: 1234public class Demo(){F f=new F();}class F{}这里的F的实例化对象就可以用f表达出来。同理F类也是一个实例化对象,Class类的实例化对象。我们可以理解为任何一个类都是Class类的实例化对象,这种实例化对象有三种表示方法: 123456789101112131415public class Demo(){F f=new F();//第一种表达方式Class c1=F.class;//这种表达方式同时也告诉了我们任何一个类都有一个隐含的静态成员变量class//第二种表达方式Class c2=f.getClass();//这种表达方式在已知了该类的对象的情况下通过getClass方法获取//第三种表达方式Class c3 = null;try {c3 = Class.forName("com.text.F");//类的全称} catch (ClassNotFoundException e) {e.printStackTrace();}}class F{}以上三种表达方式,c1,c2,c3都表示了F类的类类型,也就是官方解释的Class Type。那么问题来了: 1System.out.println(c1 == c2)? or System.out.println(c1 == c3)?答案是肯定的,返回值为ture。这表明不论c1 or c2 or c3都代表了F类的类类型,也就是说一个类只可能是Class类的一个实例对象。理解了Class的概念,我们也可以通过类的类类型创建该类的对象实例,用c1 or c2 or c3的newInstance()方法: 12345678910111213Public class Demo1{try {Foo foo = (Foo)c1.newInstance();//foo就表示F类的实例化对象foo.print();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}class F{void print(){}}这里需要注意的是,c1是F类的类类型,创建出来的就是F类的对象。如果a是A类的类类型,那么创建出来的对象也应该与之对应,属于A类的对象。 二、方法的反射Class类有一个最简单的方法,getName(): 1234567891011public class Demo2 {public static void main(String[] args) {Class c1 = int.class;//int 的类类型Class c2 = String.class;//String类的类类型Class c3 = void.class;System.out.println(c1.getName());System.out.println(c2.getName());System.out.println(c2.getSimpleName());System.out.println(c3.getName());}}本的数据类型以及void关键字都是存在类类型的。 案例: 123456789101112131415161718192021222324252627282930313233public class ClassUtil {public static void printClassMethodMessage(Object obj){//要获取类的信息》》首先我们要获取类的类类型Class c = obj.getClass();//我们知道Object类是一切类的父类,所以我们传递的是哪个子类的对象,c就是该子类的类类型。//接下来我们要获取类的名称System.out.println("类的名称是:"+c.getName());/**我们知道,万事万物都是对象,方法也是对象,是谁的对象呢? 在java里面,方法是Method类的对象*一个成员方法就是一个Method的对象,那么Method就封装了对这个成员 *方法的操作*///如果我们要获得所有的方法,可以用getMethods()方法,这个方法获取的是所有的Public的函数,包括父类继承而来的。如果我们要获取所有该类自己声明的方法,就可以用getDeclaredMethods()方法,这个方法是不问访问权限的。Method[] ms = c.getMethods();//c.getDeclaredMethods()//接下来我们拿到这些方法之后干什么?我们就可以获取这些方法的信息,比如方法的名字。//首先我们要循环遍历这些方法for(int i = 0; i < ms.length;i++){//然后可以得到方法的返回值类型的类类型Class returnType = ms[i].getReturnType();//得到方法的返回值类型的名字System.out.print(returnType.getName()+" ");//得到方法的名称System.out.print(ms[i].getName()+"(");//获取参数类型--->得到的是参数列表的类型的类类型Class[] paramTypes = ms[i].getParameterTypes();for (Class class1 : paramTypes) {System.out.print(class1.getName()+",");}System.out.println(")");}}}总结思路:通过方法的反射得到该类的名称步骤:1.获取该类的类类型2.通过类类型获取类的方法(getMethods())3.循环遍历所获取到的方法4.通过这些方法的getReturnType()得到返回值类型的类类型,又通过该类类型得到返回值类型的名字5.getName()得到方法的名称,getParameterTypes()获取这个方法里面的参数类型的类类型。 三、成员变量的反射首先我们需要认识到成员变量也是对象,是java.lang.reflect.Field类的对象,那么也就是说Field类封装了关于成员变量的操作。既然它封装了成员变量,我们又该如何获取这些成员变量呢?它有这么一个方法: 12345public class ClassUtil {public static void printFieldMessage(Object obj){Class c = obj.getClass();//Field[] fs = c.getFields();}这里的getFields()方法获取的所有的public的成员变量的信息。和方法的反射那里public的成员变量,也有一个获取所有自己声明的成员变量的信息:Field[] fs = c.getDeclaredFields(); 我们得到它之后,可以进行遍历(既然封装了Field的信息,那么我们就可以得到Field类型) 12345678for (Field field : fs) {//得到成员变量的类型的类类型Class fieldType = field.getType();String typeName = fieldType.getName();//得到成员变量的名称String fieldName = field.getName();System.out.println(typeName+" "+fieldName);}四、构造函数的反射不论是方法的反射、成员变量的反射、构造函数的反射,我们只需要知道:要想获取类的信息,首先得获取类的类类型。 12345678910111213141516171819202122public static void printConMessage(Object obj){Class c = obj.getClass();/* 首先构造函数也是对象,是java.lang.Constructor类的对象 也就是java.lang. Constructor中封装了构造函数的信息 和前面说到的一样,它也有两个方法: getConstructors()方法获取所有的public的构造函数 getDeclaredConstructors()方法得到所有的自己声明的构造函数*/ //Constructor[] cs = c.getConstructors();Constructor[] cs = c.getDeclaredConstructors();for (Constructor constructor : cs) {//我们知道构造方法是没有返回值类型的,但是我们可以:System.out.print(constructor.getName()+"(");//获取构造函数的参数列表》》得到的是参数列表的类类型Class[] paramTypes = constructor.getParameterTypes();for (Class class1 : paramTypes) {System.out.print(class1.getName()+",");}System.out.println(")");}}五、Class类的动态加载类如何动态加载一个类呢?首先我们需要区分什么是动态加载?什么是静态加载?我们普遍认为编译时刻加载的类是静态加载类,运行时刻加载的类是动态加载类。我们举一个例子: 123456789101112Class A{Public static void main(String[] args){if("B".equal(args[0])){B b=new B();b.start();}if("C".equal(args[0])){C c=new C();C.start();}}}上面这一段代码,当我们在用eclipse或者myeclipse的时候我们并不关心是否能够通过编译,当我们直接在cmd使用javac访问A.java类的时候,就会抛出问题: 1234567891011121314151617A.java:7:错误:找不到符号B b=new B();符号: 类B位置: 类AA.java:7:错误:找不到符号B b=new B();符号: 类B位置: 类AA.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类AA.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类A4个错误或许我们理所当然的认为这样应该是错,类B根本就不存在。但是如果我们多思考一下,就会发现B一定用吗?不一定。C一定用吗?也不一定。那么好,现在我们就让B类存在 12345Class B{Public static void start(){System.out.print("B...satrt");}}现在我们就先 javac B.class,让B类先开始编译。然后在运行javac A.class。结果是: 123456789A.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类AA.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类A2个错误我们再想,这个程序有什么问题。如果你说没有什么问题?C类本来就不存在啊!那么问题来了B类已经存在了,假设我现在就想用B,我们这个程序用得了吗?答案是肯定的,用不了。那用不了的原因是什么?因为我们这个程序是做的类的静态加载,也就是说new创建对象是静态加载类,在编译时刻就需要加载所有的,可能使用到的类。所以不管你用不用这个类。现在B类是存在的,但是我们这个程序仍然用不了,因为会一直报C类有问题,所以B类我也用不了。那么在实际应用当中,我们肯定需要如果B类存在,B类我就能用,当用C类的时候,你再告诉我错了。如果说将来你有100个类,只要其中一个类出现问题,其它99个类你都用不了。所以这并不是我们想要的。我们想要的就是我用那个类就加载那个类,也就是常说的运行时刻加载,动态加载类。如何实现动态加载类呢?我们可以建这么一个类: 1234567891011Class All{Public static void start(){try{Class cl= Class.forName(args[0]);//通过类类型,创建该类的对象cl.newInstance();}catch(Exception e){e.printStackTrace();}}}前面我们在分析Class实例化对象的方式的时候,Class.forName(“类的全称”),它不仅仅表示了类的类类型,还表示了动态加载类。当我们javac All.java的时候,它不会报任何错误,也就是说在编译的时候是没有错误的。只有当我们具体用某个类的时候,那个类不存在,它才会报错。如果加载的类是B类,就需要: 1B bt = (B) cl.newInstance();万一加载的是C类呢,可以改成 1C ct = (C) cl.newInstance();但是如果我想用很多的类或者加载很多的类,该怎么办?我们可以统一一个标准,不论C类还是B类或者其他的类,比如定义一个标准 1Stand s = (Stand) cl.newInstance();只要B类和C类都是这个标准的就行了。 123456789101112131415Class All{Public static void start(){try{Class cl= Class.forName(args[0]);//通过类类型,创建该类的对象Stand s = (Stand) cl.newInstance();s.start();}catch(Exception e){e.printStackTrace();}}}interface Stand {Public void start();}现在如果我想要用B类,我们只需要: 12345Class B implements Stand{Public void start(){System.out.print("B...satrt");}}加载B类,编译运行。 123javac B.javajavac Stand.javajava Stand B结果: 1B...satrt如果以后想用某一个类,不需要重新编译,只需要实现这个标准的接口即可。只需要动态的加载新的东西就行了。这就是动态加载类。

auto_answer 2019-12-02 01:50:24 0 浏览量 回答数 0

问题

[精品问答]Java一百问第一期

问问小秘 2019-12-01 21:51:20 791 浏览量 回答数 1

回答

客户端没携带cookies,开发接口不用session######android没开启cookie吧?######session机制你还是没理解了啊,如果非得用session的话,初次请求后,你给an返回sessionid,下次an请求的时候顺便把这个sessionid也传输过去,php那边获取到设置下sessionid就行了,不建议这样做;你放到缓存不就行了啊;######回复 @CHwithkey : 不是啊;######放到缓存是什么意思?是指在PHP端将接收的消息放到cookie里面?######没开cookie也可以每次携带一个seesion id。 ######回复 @CHwithkey : 放URL里面可以,或者放在post参数里面也可以!######携带的session id是放在url里面吗,我是用http client来进行交流的.######传递过来的参数里面带sid######用开放平台那套,自己签名啊 ######自己签名是什么意思?######想了解php端到底怎么保存android端发送的值。在单纯使用Http client而不是json的情况下。###### php怎么接收android传过来的数据  求代码######不好意思,代码已经丢失了而且也不碰这个东西很久了。这个是我当时做的笔记,“……当android端将账户和密码传递给PHP服务端,PHP服务端通过一个叫做$_POST的超级变量,根据传送的“id”接收并提取相关数值……”。然后回传给android的话就用echo好像就可以了。不知道帮不帮的上什么忙

kun坤 2020-06-06 23:44:35 0 浏览量 回答数 0

回答

" 这个异常应该和源码没有关系。 class文件结构里最开头4字节是Magic Number,也就是0xCAFEBABE。 后面接的4个字节就是题主异常信息中的Minor version和Major version。 第5、第6是Minor version,第7、第8则是Major version。 而Java的版本号是从45开始的,参考: J2SE 8 = 52, J2SE 7 = 51, J2SE 6.0 = 50, J2SE 5.0 = 49, JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45 真不知道知道这些有什么用,题主试试用Java7以上编译。 参考:http://en.wikipedia.org/wiki/Java_class_file###### java 版本不对###### 源码的话,应该没问题,如果是这样报错的话,我遇到过,是因为环境变量和conf文件指定的问题,找不到你所指定的URLCat这个类,你只要配置好你所需要使用的集群的配置文件,并且指定好对应集群的客户端,以及相关的各种库就可以了,当时我也是搞了很久,在书上对配置的东西弱化了,没怎么讲,只能自己去实践。 你可以参考一下这个文章:http://segmentfault.com/blog/akunamatata/1190000002610514 这里面详细讲了如何配置环境变量,编译,执行,以及如何指定配置文件###### 从异常提示的信息的来看就是不支持的class文件版本异常,建议更换更高版本的jdk" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/6b33e51e20354f0cb29e0d35a8d70fca.png)

因为相信,所以看见。 2020-05-27 10:09:01 0 浏览量 回答数 0

回答

迭代器是一个指针,怎么操作指针的就怎么玩迭代器cout<<*iter;回复<aclass='referer'target='_blank'>@izmm:你说的是迭代器的下标吧?回复<aclass='referer'target='_blank'>@小耶果:比如迭代器指向第n个元素,则输出n回复<aclass='referer'target='_blank'>@izmm:指迭代器地址?我要的不是输出迭代器指向的元素的值,而是迭代器本身。大神,还有没有其他方法?输出内容?解引用啊(*iter)*itercout<<*iter;你想怎么输出,拷贝出内存打印一下,不是所有东西都可以以人眼可识别的方式输出的stl用的不多,你可以看下list有没有相关的成员函数获取迭代器的位置,或者在你移动迭代器的时候自己做个计数器变量比如迭代器指向第n个元素,则输出n支持cout的基本都是做了操作符重载,在重载时定义了对象的输出方式

爱吃鱼的程序员 2020-06-22 17:12:27 0 浏览量 回答数 0

问题

2020年阿里、字节:一套高效的iOS面试题(二)

montos 2020-04-13 15:08:17 39 浏览量 回答数 1

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 455812 浏览量 回答数 21

回答

为什么要从配置文件中获取?一个工程对应一个web.root,你写成工程名就行,固定。######从几个地方进行处理 1、如果启动的时候通过-DwebRookey=web.root,则优先使用这个配置,否则 2、如果该含该配置的配置文件路径不在类路径下,则使用该配置,否则 3、如果类路径下有该配置,使用该配置,否则 4、如果环境变量中有该配置则使用该配置,否则 5、设定一个默认值,所有都没有配置也能使用,直接默认值 以上是基本上写框架的话都这么做的######-DwebRookey这个怎么在启动的时候设置 我没搜到对应的知识######placeholder 可以的######回复 @ForTheFree : 其实,除非你要设置的参数是相关路径,一般是不用另外读取配置文件来设置的,直接在web.xml写死就可以了,反正你改动了配置文件都是要重启的######回复 @ForTheFree : <context-param> <param-name>loggingRoot</param-name> <param-value>${catalina.base}/logs/app</param-value> </context-param> 如上${catalina.base},你可以设置在tomcat启动配置里面设置。######这应该是在spring的配置文件中去读取配置文件数据用的吧,那怎么设置到web.root里面###### 引用来自“chrischeng03”的评论 从几个地方进行处理 1、如果启动的时候通过-DwebRookey=web.root,则优先使用这个配置,否则 2、如果该含该配置的配置文件路径不在类路径下,则使用该配置,否则 3、如果类路径下有该配置,使用该配置,否则 4、如果环境变量中有该配置则使用该配置,否则 5、设定一个默认值,所有都没有配置也能使用,直接默认值 以上是基本上写框架的话都这么做的 tomcat的启动脚本中,或将tomcat内嵌到应用程序中启动

kun坤 2020-06-05 13:33:36 0 浏览量 回答数 0

回答

你下面不是有logger.info这行代码这是可以捕捉到异常的,看异常一点一点分析吧。 “如果有一条数据报错,那么全部数据都不能执行成功”,这个可以用oracle事务。 java倒是不大了解,应该可以根据oracle返回值判断事务是否执行成功,然后中断吧。 你看看报错信息,应该会有相关的SQL语句信息在里面,然后你再去找对应的SQL了。 查看日志文件,找对应的错误 报错之前打印出来。或者存在局部变量中,catch异常之后,把这个局部变量的值打印出来。例如: Strings=null;try{x=next-data();xxxxx其他处理代码。xxxx }catch(Exceptione){这里打印s即可。} 你这里应该可以只记录索引i。异常时打印出来。 事务的特性,你虽然1000条执行一次,但是没有提交,如果有一条报错肯定都回滚了,你可以1000条执行一次,然后马上提交,这样如果一个批次出现异常,那么只会影响这1000条,这1000条会回滚,然后查看后台日志,看看具体是哪一条 这是我打印的SQL。 我是想把所有的数据导进新的库中,其中我还要对数据进行相应的改变,所以需要写这个程序。 其次我要执行的任务是晚上下班时,将程序跑起来,然后第二天所有程序导进新的数据库,然后错误的数据能够打印到日志里面。 可以程序验证数据有效性,有误的log、跳过。 有人给我说过可以自定义异常,这样只要能定到是那条数据有错了,能拿到错误的Object数组就好处理了,所以想问问,到底该怎么做

爱吃鱼的程序员 2020-06-23 00:06:09 0 浏览量 回答数 0

回答

动过/etc/environment? ######装jdk的时候,自己配置,动了 /etc/environment,就会出现这个问题,以前我也经常被这个问题弄了###### 肯定是某个配置文件大意了~ 也许是bashrc啊也许是profile啊也许是bashprofile啊什么的涉及到登陆后载入的用户个性配置(~/.xxxx)或者是登陆后用户的总配置(/etc/xxxx) 可能你少了个分号什么的大意原因结果挂了。 尝试进入文字界面终端:Ctrl+Alt+F1~F7,如果进不去那就证明可能真是用户配置文件了 那就只有在grub里选恢复模式 或者直接在grub启动init 3 / bash 等等干净的进入文字系统 检查之前改的总配置文件和用户个性配置文件 如果总文件没问题又确定不了用户个性启动配置文件的问题所在,那就干脆放弃这个用户,重建一个用户。 ---- 其实在使用linux之初,应该建立几个用户以备不同需要,同时尽量不去动总配置文件,因为几乎所有的软件和系统相关配置都可以相对于用户去个性配置。。。这样即使出错也能快速定位甚至嫌麻烦直接舍弃某个被自己搞死的账号。O(∩_∩)O ######啊,越发觉得英语的世界里资料尤其丰富得多——而且,也更加钦佩 Google了,这是我所找到的与自己的问题相同的问题,只不过,我这里是由于改环境变量时少了个在$号,而导致整个环境变量完全没有了, after 12.04 upgrade: can't log in although password is correct 不过,至少我记起了ctl+alt+F1等操作 ###### 引用来自“明月照大江”的答案 装jdk的时候,自己配置,动了 /etc/environment,就会出现这个问题,以前我也经常被这个问题弄了 嗯,动过/etc/profile,里面的path设置动过,问题原因是找到了,但是怎么解决这个问题呢? ###### 引用来自“hdzw_Rock”的答案 肯定是某个配置文件大意了~ 也许是bashrc啊也许是profile啊也许是bashprofile啊什么的涉及到登陆后载入的用户个性配置(~/.xxxx)或者是登陆后用户的总配置(/etc/xxxx) 可能你少了个分号什么的大意原因结果挂了。 尝试进入文字界面终端:Ctrl+Alt+F1~F7,如果进不去那就证明可能真是用户配置文件了 那就只有在grub里选恢复模式 或者直接在grub启动init 3 / bash 等等干净的进入文字系统 检查之前改的总配置文件和用户个性配置文件 如果总文件没问题又确定不了用户个性启动配置文件的问题所在,那就干脆放弃这个用户,重建一个用户。 ---- 其实在使用linux之初,应该建立几个用户以备不同需要,同时尽量不去动总配置文件,因为几乎所有的软件和系统相关配置都可以相对于用户去个性配置。。。这样即使出错也能快速定位甚至嫌麻烦直接舍弃某个被自己搞死的账号。O(∩_∩)O 是的,后来在英文网站里找到相同问题及其解决方法,可惜的是:当我改为原来的PATH环境后,重启,还是进不去,采用虚拟终端进去后,发现环境变量又恢复为其默认的错误PATH环境! ######http://forum.ubuntu.org.cn/viewtopic.php?t=377149######http://m.baidu.com/bd_page_type=1/pu=sz%401320%5F1001%2Cusm%400%2Cta%40iphone%5F2%5F2%2E3%5F3%5F533/uid=C2875365951B482C9053DF9A09989B0A/t=iphone/w=0_10_%E5%AE%8C%E7%BE%8E%E8%A7%A3%E5%86%B3+ubuntu+%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%90%8E%E4%B8%8D%E8%83%BD%E7%99%BB+%E5%BD%95/ssid=0/from=844b/l=3/tc?pn=15&m=8&sec=24976&di=a40ffd9d1a694f45&src=hi%2Ebaidu%2Ecom%2F%25B2%25A9%25B2%25C5anan%2Fblog%2Fitem%2F720356dd1052cbaecd1166c6%2Ehtml######用12.04安装java的时候遇到过这个问题,也是由于将环境变量配置在 /etc/envirenment造成的,换个地方配置就可以了######ssh远程登录修改 /etc/envirenment或者用ubuntu 光盘用live模式进入修改/etc/envirenment

kun坤 2020-06-06 14:55:01 0 浏览量 回答数 0

问题

迷你书下载 精彩片段: 恶名昭著的指针究竟是什么:报错

kun坤 2020-06-09 15:10:04 4 浏览量 回答数 1

问题

【分享】WeX5的正确打开方式(2)

小太阳1号 2019-12-01 21:17:14 3935 浏览量 回答数 1

问题

荆门开诊断证明-scc

游客5k2abgdj3m2ti 2019-12-01 22:09:00 1 浏览量 回答数 0

回答

只能自己顶一下了...数据库给的连接时间应该比较短印象中H有个timeout配置参数现在在外面抓节柳龟回去再看看 atcom.lohanry.ntqreg.Reg.RegToChannel_id(Reg.java:87) 这是哪一行呢?session.createQuery()这句跟着就是说查询时候发现连接断开.  mTransaction=session.beginTransaction(); mTransaction不是local变量?<atarget='_blank'>@ajavaloser<arel='nofollow'target='_blank'>http://developer.baidu.com/wiki/index.php?title=docs/cplat/rt/java/mysql这个是百度的文档,关于数据库很简单<atarget='_blank'>@Lohanry<aclass='referer'target='_blank'>@Lohanry有相关文档链接吗,CC<atarget='_blank'>@ajavalosergoogle之类均提议是使用连接池,但是bae不支持,不知道怎么解决.回复<aclass='referer'target='_blank'>@Lohanry:担心多线程的问题貌似多余了,毕竟只有你一个人在操作,不知道是不是和你的BAE环境有关系回复<aclass='referer'target='_blank'>@ajavaloser:刚刚试了下,报的错是一样的.你的session也不是local的,贴出变量的声明我倒是找到了一个,<arel="nofollow">http://developer.baidu.com/wiki/index.php?title=docs/cplat/rt/java#Hibernate 下载示例应用sshdemo,你看看,看起来是支持连接池的,但只是spring自带的连接池,可能<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">c3p0,proxpool这些太复杂了吧,dbcp有没有试过书上写着意思不用第三方就是自带的了.话说回来,hibernate一定需要连接池吗?看了下hibernatereference,hibernate也有内置连接池的啊,BAE总不会连这都不支持吧<atarget='_blank'>@ajavaloser刚刚搭建完数据库,试了一下,本地是可以连接的,我打算去问下BAE<atarget='_blank'>@Lohanry你现在有错也找不出来啊,所以先在本地试一下不好吗?如果这样的话,我代码是不是有地方错了,一直找不出来.对了,你有没有用本地数据库测过?如果本地没问题,就是BAE环境的问题了呗<atarget='_blank'>@Lohanry<imgsrc="/js/ke/plugins/emoticons/36.gif"alt="36"/>我已经换到了3的版本,但是错误出现了,BAE边也没有给我回复....<atarget='_blank'>@ajavaloser这个我还真给忘记了,不过要明天了,测试下.我现在在win下没有环境.回复<aclass='referer'target='_blank'>@Lohanry:对了,为什么要用ServiceRegistryBuilder?你用的hibernate4吗,BAE似乎支持hibernate3哦刚刚搭建完数据库,试了一下,本地是可以连接的,我打算去问下BAE遇到同样问题,楼主解决了吗?回复<aclass='referer'target='_blank'>@Lohanry:麻烦指导下用什么呢?官方不是支持Hibernate的嘛,再说我们有没有配置数据库连接池。。。好像是BAE的问题,无法使用连接池,后来我就没有用Hibernate,用其他的了

爱吃鱼的程序员 2020-06-22 18:29:08 0 浏览量 回答数 0

问题

2018python技术问答集锦,希望能给喜欢python的同学一些帮助

技术小能手 2019-12-01 19:31:10 2040 浏览量 回答数 2

回答

怎么 没人来呀 @中山野鬼###### 1、如果想去掉while(true),可以考虑通知实现; 2、关于自动重连的问题,可以考虑重发送逻辑中抽离出来,采用心跳检测完成; 3、另外发送速率统计部分也应该抽离出来。 4、上多通道要考虑资源使用可控。 5、实在不行按照业务拆分成多模块,用redis 或mq类的扩展一下架构设计; ######回复 @OS小小小 : map =(Map)JSONObject.parse(SendMsgCMPP2ThredPoolByDB.ZhangYi.take()); 换成take,阻塞线程,试试。######回复 @OS小小小 : 1、通知只是告知队列里有新的数据需要处理了; 5、内存队列换成redis队列 实现成本增加,但是可扩展性增加;######1、通知实现的话 ,岂不是 无法保证 最少发送么,又会陷入另一个问题中 是吗? 或者是我的想法不对么? 2、嗯,这一块可以这样做。谢谢你 3、速率统计这里 我目前想不到怎么抽离、既可以控制到位,又可以保证不影响。。。 5、redis 是有的 但是 redis的队列的话 跟我这个 没啥区别吧,可能速度更快一点。######while(true) 里面 没数据最起码要休眠啊,不停死循环操作,又没有休眠cpu不高才怪######回复 @OS小小小 : 休眠是必须的,只是前面有数据进来,可以用wait notify 的思路通知,思路就是这样,CountDownLatch 之类多线程通讯也可以实现有数据来就能立即处理的功能######嗯,目前在测试 排除没有数据的情况,所以这一块没有去让他休眠,后面会加进去。 就针对于目前这种情况,有啥好办法吗###### 我的思路是:一个主线程,多个任务子线程。 主线程有一层while(true),这个循环是不断的扫描LinkedBlockingQueue是否有数据,有则交个任务子线程(也就是你这里定义的线程池)处理,而不是像你这样每个子任务线程都有一个while(true) ######这才是对的做法######嗯,这思路可以。谢谢哈###### 引用来自“K袁”的评论 我的思路是:一个主线程,多个任务子线程。 主线程有一层while(true),这个循环是不断的扫描LinkedBlockingQueue是否有数据,有则交个任务子线程(也就是你这里定义的线程池)处理,而不是像你这样每个子任务线程都有一个while(true) 正确做法. 还有就是 LinkedBlockingQueue 本身阻塞的,while(true)没问题,主要在于不需要每个发送线程都去block######while(true)不加休眠就会这样###### java 的线程数量大致要和cpu数量一致,并不是越多越快,线程调度是很消耗时间的。要用好多线程,就需要设计出好的多线程业务模型,不恰当的sleep和block是性能的噩梦。利用好LinkedBlockingQueue,队列空闲时读队列的线程会释放cpu。利用消息触发后续线程工作,就没必要使用while(true)来不停的扫描。 ######@蓝水晶飞机 看到你要比牛逼,我就没有兴趣跟你说话了######回复 @不日小鸡 : 我就是装逼怎么啦,特么的装逼装出样子来的,起码也比你牛逼啊。######回复 @蓝水晶飞机 : 你说这话不能掩盖你没有回复我的问题又来回复我导致装逼失败的事实。 那你不是楼主你回复我干什么,还不是回答我的问题。 不要装逼了好么,装多就成傻逼了######回复 @不日小鸡 : 此贴楼主不是你,装什么逼。######回复 @王斌_ : 这些我都知道,我的意思是你这样回复可能会误导其他看帖子的人或者新手,让他们以为线程数就等于CPU数###### 引用来自“OS小小小”的评论 怎么 没人来呀 @中山野鬼 抬举我了。c++ 我还敢对不知深浅的人说,“权当我不懂”,java真心只是学过,没有实际工程上的经验。哈。而且我是c的思维,面对c适合的应用开发,是反对使用线程的。基本思维是,执行模块的生命周期不以任务为决定,同类的执行模块,可根据物理硬核数量,形成对应独立多个进程,但绝对不会同类的任务独立对应多个线程。哈。所以java这类面向线程的设计,没办法参与讨论。设计应用目标不同,系统组织策略自然有异。 唯一的建议是:永远不要依赖工具,特别是所谓的垃圾资源处理回收机制,无论它做的再好,一旦你依赖,必然你的代码,在不久的将来会因为系统设计规模的变大,而变的垃圾。哈。 听不懂的随便喷,希望听懂的,能记得这个观点,这不是我一个人的观点。 ######给100万像素做插值运算进行染色特效,请问单线程怎么做比多线程快?###### @乌龟壳 : 几种方法都可以,第一是按照计算步骤,每个进程处理一个步骤,然后切换共享空间(这没有数据传递逻辑上的额外开销),就是流水思维。第二个是block的思维,同样的几个进程负责相同计算,但负责不同片区。同时存在另一类的进程是对前期并发处理完的工作进行边界处理。 你这个例子体现不出进程和线程的差异的。 如果非要考虑进程和线程在片内cache的差异,如果没记错(错了大家纠正哈),进程之间的共享是在二级缓存之间吧。即便线程能做到一级缓存之间的共享,但对于这种大批量像素的计算,用进程仍然是使用 dma,将数据成块载入一级缓存区域进行处理,而这个载入工作和计算工作是同步的。不会有额外太多的延迟。 你举的这个例子,还真好是我以前的老本行。再说了。像素计算,如今都用专用计算处理器了吧。还用x86或arm来处理,不累死啊。哈。 而且这种东西java不适合,同样的处理器,用c写,基本可以比java快1到2倍。因为c可以直接根据硬件特性和计算逻辑特点有效调度底层硬件驱动方式。而java即便你用了底层优化的官方库,仍然不能保证硬件与计算目标特性的高度整合。 ######回复 @中山野鬼 : 简单来说,你的多个进程处理结果进行汇总的时候,是不是要做内存复制操作?如果是多线程天然就不用,多进程用系统的共享内存机制也不用,问题是既然用了共享内存,和多线程就没区别了。######回复 @乌龟壳 : 两回事哦。共享空间是独立的,而线程如果我没记错,全局变量,包括文件内的(静态变量)是共享的。不同线程共享同一个进程内的变量嘛。这些和业务逻辑相关的东西,每个线程又是独立一套业务逻辑,针对c语言,这样去设计,不是没事找事嘛。面向对象语言,这块都帮你处理好了,自然没有关系。######既然有共享空间了,那你所说的进程和线程实际就是一回事了。###### @乌龟壳   ,数据分两种,一种和算法或处理相关的。一种是待处理的数据。 前者,不应该共享,后者属于数据加工流程,必然存在数据传递或流动,最低成本的传递/流动方式就是共享内存,交替使用权限的思路。 但这仅仅针对待加工的数据和辅助信息,而不针对程序本身。 进程不会搞混乱这些东西特别是(待加工数据的辅助信息),而线程,就各种乱吧。哈。 进程之间,虽然用共享空间,但它本质是数据传递/流动,当你采用多机(物理机器)并发处理时,进程移动到另外一个物理主机,则共享空间就是不能选择的传递/流动方式了。但线程就没有这些概念。 ######回复 @中山野鬼 : 是啊,java天然就不是像C一样对汇编的包装。######@乌龟壳 面向企业级的各种业务,java这些没问题的。而且更有优势,面向计算设备特性的设计开发,就不行了。哈。######回复 @中山野鬼 : 也算各有场景吧,java同样可以多进程可以分布式来降低多线程的风险。java也可以静态编译成目标机器码。总之事在人为。######回复 @乌龟壳 : 高手,啥都可以,低手,依赖这些,就是各种想当然。哈哈。######回复 @中山野鬼 : 那针对java的垃圾回收,这个东西是可以调节它算法的,不算依赖工具吧,哈。不然依赖C语言语法也算依赖工具咯。哈。;-p

kun坤 2020-05-31 13:04:51 0 浏览量 回答数 0

回答

    默认就是支持 web 上下文路径的,无需干预,例如 contextPath为 "app" ,则首页访问路径为  http://localhost/app###### 老大没明白我的意思,我现在把demo的例子改成oracle的了,首页也出来了。但首页上面的连接不对。比如博客管理的连接是/blog,但我的web应用是有个上下文xxx,那么博客管理的连接就应该是/xxx/blog,这个问题不知道怎么解决?我用的是tomcat 7 ###### /**   * 配置处理器   */  public void configHandler(Handlers me) {   me.add(new ContextPathHandler("dataplatform"));  } 在 config中添加了handler还是不行啊。   ######肯定可以的,有几个朋友用上了###### 引用来自“jincy”的答案 老大没明白我的意思,我现在把demo的例子改成oracle的了,首页也出来了。但首页上面的连接不对。比如博客管理的连接是/blog,但我的web应用是有个上下文xxx,那么博客管理的连接就应该是/xxx/blog,这个问题不知道怎么解决?我用的是tomcat 7 用了 new ContextPathHandler("ctx")以后,还需要在页面使用一下,如  src="${ctx}/blog/list" ###### 1.按照你说的方法,在每个url的链接前加"${ctx}/"是好用的。 但设置 <base href="${ctx}"/>的方法不好用 2.另外你在另外一片帖子里面说到的类:com.jfinal.ext.interceptor.ContextPathInterceptor 不存在啊。 ###### 引用来自“jincy”的答案 1.按照你说的方法,在每个url的链接前加"${ctx}/"是好用的。 但设置 <base href="${ctx}"/>的方法不好用 2.另外你在另外一片帖子里面说到的类:com.jfinal.ext.interceptor.ContextPathInterceptor 不存在啊。 1:<base href="${ctx}" /> 纯属 html 用法了,查看相关的文档一定可以搞定 2:笔误了,应该是:com.jfinal.ext.handler.ContextPathHandler ###### 刚才试过了,如果采用<base href="${ctx}"/> 的方式,你的ctx变量需要返回的值是这样的才行:http://localhost:8080/xxx/ ,而不是仅仅返回一个上下文xxx .而且下面的链接前面不能带反斜杠。 <li><a href=""><b>首页3</b></a></li>  <li><a href="blog"><b>Blog管理</b></a></li> 但如何才能返回一个http://localhost:8080/xxx/ 这样的字符串呢? 关于<base>的用法,希望楼主抽空试试,我是没有成功,但这的确很有用。  

kun坤 2020-06-14 17:49:57 0 浏览量 回答数 0

回答

    默认就是支持 web 上下文路径的,无需干预,例如 contextPath为 "app" ,则首页访问路径为  http://localhost/app###### 老大没明白我的意思,我现在把demo的例子改成oracle的了,首页也出来了。但首页上面的连接不对。比如博客管理的连接是/blog,但我的web应用是有个上下文xxx,那么博客管理的连接就应该是/xxx/blog,这个问题不知道怎么解决?我用的是tomcat 7 ###### /**   * 配置处理器   */  public void configHandler(Handlers me) {   me.add(new ContextPathHandler("dataplatform"));  } 在 config中添加了handler还是不行啊。   ######肯定可以的,有几个朋友用上了###### 引用来自“jincy”的答案 老大没明白我的意思,我现在把demo的例子改成oracle的了,首页也出来了。但首页上面的连接不对。比如博客管理的连接是/blog,但我的web应用是有个上下文xxx,那么博客管理的连接就应该是/xxx/blog,这个问题不知道怎么解决?我用的是tomcat 7 用了 new ContextPathHandler("ctx")以后,还需要在页面使用一下,如  src="${ctx}/blog/list" ###### 1.按照你说的方法,在每个url的链接前加"${ctx}/"是好用的。 但设置 <base href="${ctx}"/>的方法不好用 2.另外你在另外一片帖子里面说到的类:com.jfinal.ext.interceptor.ContextPathInterceptor 不存在啊。 ###### 引用来自“jincy”的答案 1.按照你说的方法,在每个url的链接前加"${ctx}/"是好用的。 但设置 <base href="${ctx}"/>的方法不好用 2.另外你在另外一片帖子里面说到的类:com.jfinal.ext.interceptor.ContextPathInterceptor 不存在啊。 1:<base href="${ctx}" /> 纯属 html 用法了,查看相关的文档一定可以搞定 2:笔误了,应该是:com.jfinal.ext.handler.ContextPathHandler ###### 刚才试过了,如果采用<base href="${ctx}"/> 的方式,你的ctx变量需要返回的值是这样的才行: http://localhost:8080/xxx/ ,而不是仅仅返回一个上下文xxx .而且下面的链接前面不能带反斜杠。 <li><a href=""><b>首页3</b></a></li>  <li><a href="blog"><b>Blog管理</b></a></li> 但如何才能返回一个 http://localhost:8080/xxx/ 这样的字符串呢? 关于<base>的用法,希望楼主抽空试试,我是没有成功,但这的确很有用。  

kun坤 2020-06-02 16:25:23 0 浏览量 回答数 0

回答

"    默认就是支持 web 上下文路径的,无需干预,例如 contextPath为 "app" ,则首页访问路径为  http://localhost/app###### 老大没明白我的意思,我现在把demo的例子改成oracle的了,首页也出来了。但首页上面的连接不对。比如博客管理的连接是/blog,但我的web应用是有个上下文xxx,那么博客管理的连接就应该是/xxx/blog,这个问题不知道怎么解决?我用的是tomcat 7 ###### /**   * 配置处理器   */  public void configHandler(Handlers me) {   me.add(new ContextPathHandler("dataplatform"));  } 在 config中添加了handler还是不行啊。   ######肯定可以的,有几个朋友用上了###### 引用来自“jincy”的答案 老大没明白我的意思,我现在把demo的例子改成oracle的了,首页也出来了。但首页上面的连接不对。比如博客管理的连接是/blog,但我的web应用是有个上下文xxx,那么博客管理的连接就应该是/xxx/blog,这个问题不知道怎么解决?我用的是tomcat 7 用了 new ContextPathHandler("ctx")以后,还需要在页面使用一下,如  src="${ctx}/blog/list" ###### 1.按照你说的方法,在每个url的链接前加"${ctx}/"是好用的。 但设置 <base href="${ctx}"/>的方法不好用 2.另外你在另外一片帖子里面说到的类:com.jfinal.ext.interceptor.ContextPathInterceptor 不存在啊。 ###### 引用来自“jincy”的答案 1.按照你说的方法,在每个url的链接前加"${ctx}/"是好用的。 但设置 <base href="${ctx}"/>的方法不好用 2.另外你在另外一片帖子里面说到的类:com.jfinal.ext.interceptor.ContextPathInterceptor 不存在啊。 1:<base href="${ctx}" /> 纯属 html 用法了,查看相关的文档一定可以搞定 2:笔误了,应该是:com.jfinal.ext.handler.ContextPathHandler ###### 刚才试过了,如果采用<base href="${ctx}"/> 的方式,你的ctx变量需要返回的值是这样的才行:http://localhost:8080/xxx/ ,而不是仅仅返回一个上下文xxx .而且下面的链接前面不能带反斜杠。 <li><a href=""><b>首页3</b></a></li>  <li><a href="blog"><b>Blog管理</b></a></li> 但如何才能返回一个http://localhost:8080/xxx/ 这样的字符串呢? 关于<base>的用法,希望楼主抽空试试,我是没有成功,但这的确很有用。   "

montos 2020-06-01 21:17:38 0 浏览量 回答数 0

问题

【精品问答】大数据计算技术1000问

问问小秘 2019-12-01 21:57:13 6895 浏览量 回答数 2

问题

【精品问答】130+大数据面试汇总

问问小秘 2019-12-01 21:52:42 1644 浏览量 回答数 2

问题

ECSwindows服务器tomcat环境配置必看教程

我的中国 2019-12-01 21:34:04 11146 浏览量 回答数 6

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 38841 浏览量 回答数 14

问题

Nginx性能为什么如此吊

小柒2012 2019-12-01 21:20:47 15038 浏览量 回答数 3

问题

基础语言百问-Python

薯条酱 2019-12-01 20:12:27 56807 浏览量 回答数 30

问题

JFinal.start()如何用非当前项目的工作目录作为部署目录?:报错

kun坤 2020-06-12 22:21:43 0 浏览量 回答数 1

问题

JFinal.start()如何用非当前项目的工作目录作为部署目录? - 服务报错

montos 2020-05-31 23:19:05 0 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅