JVM会将申请到的内存从逻辑上划分为三个区域:堆、栈、方法区。这三个区域分别用于存储不同的数据。
堆:用于存储使用new关键字所创建的对象以及对象的属性成员变量。
栈:用于存储程序运行时在方法中声明的所有的局部变量。
方法区:用于存储静态资源,类的各种信息(包括方法)。
成员变量:
- 定义在类中,方法外;
- 由系统设定默认初始值,可以不显式初始化;
- 所在类被实例化后,存在堆中,对象被回收时,成员变量失效;
局部变量: - 定义在方法中;
- 没有默认值,必须自行设定初始值;
- 方法被调用时,存在栈中,方法调用结束时局部变量从栈中清除;
1.创建一个新对象,会把这个新对象的实例放在新生代的Eden区域,当Eden区空间不足,无法创建新的对象时会触发MinerGC进行清理
2.当经过一次MinorGC进行清理后Eden区还存活的一些对象会通过复制算法把它复制到Survivor区(存活区)的from 区(原to区).
3.Survivor区的两块区域是相同大小的两块区域,是可以互相交换的,交换以后form的叫to,to的叫from,交换的过程中会把其中一个的对象复制到另外一个,保证有一个是空的。
4.当原from区进行MinorGC清理后往原to区复制的时候,原to区复制一部分对象满了的情况下,会将原form区的剩余对象复制到老年代区域.
5.老年代区域没有可用空间时会触发Full GC,Full GC会扫描整个老年代区域将还存活的对象进行标记,然后把不存活的对象进行清除.
优点:空间内存活对象多的情况下,效率高.
缺点:直接回收不存活对象所
占用的内存空间,回收后造成整个空间不连贯,产生内存碎片.
3.面向对象三大特征及详细理解?封装,继承,多态
封装:把描述一个对象的属性和行为封装成一个类,把具体的业务逻辑功能实现封装成一个方法,其次封装的意义还有效的保护属性通过访问修饰符私有化属性(成员变量),公有化方法.
继承:实现代码的复用,所有的子类所共有的行为和属性抽取为一个父类,所有的子类继承该类可具备父类的属性和行为,继承具有单一性和传递性.
多态:程序中定义的引用类型变量所指向的具体类型和调用具体的方法在编译期无法确定,而是在运行期才能确定该引用类型变量指向具体哪个对象而调用在哪个类中声明的方法.
多态的表现形式有强制类型转换,向上造型等,多态可分为行为多态和对象多态:
行为多态:同一个run(){}方法,不同的对象调用时会有不同的实现,猫调用时是跑,鱼调用时是游,鸟调用时是飞.
对象多态:同一个对象,可以被造型为不同的类型,比如同一个人对象,可以被造型为儿子,父亲,员工等.
4.重载(overload)与重写(override)的区别?Overload是重载的意思,Override是覆盖的意思,也就是重写。
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
4.1 重写的两同两小一大规则?
重写要遵循"两同两小一大"原则:
两同:1)方法名相同 2)参数列表相同
两小: 1)子类方法的返回值类型小于或等于父类的
1.1)void时必须相等
1.2)基本类型时必须相等
一大:子类访问权限大于父类
5.接口和抽象类区别?含有abstract修饰符的class即为抽象类,抽象类不能创建的实例对象。含有抽象方法的类必须定义为abstract class.
接口(interface)可以说成是一种特殊的抽象类,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
- 抽象类中可以有普通成员变量,接口中没有普通成员变量
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse不报错,但也不行,默认类型子类不能继承),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型.
- 抽象类中可以包含静态方法,接口中JDK1.8之前不可以有不能包含静态方法和成员方法,JDK1.8之后可以包含.但成员方法必须使用default修饰
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
- 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口并且可以继承多个接口,用逗号隔开.
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
7.八大基本类型及字节数和位数? 8.switch case是否支持byte,short和long,是否支持String?在switch(expr1)中,expr1只能是一个整数表达式,整数表达式可以是int基本类型或Integer包装类型,由于byte,short,char都可以自动转换成int型,所以可以使用.
long类型由于不能自动转换成int类型,所以不能使用.
关于字符串类型,在JDK是1.7版本之前,swicth case中不可以使用字符串,但在JDK1.7之后是可以用字符串的,这是最新版本新加入的特性.
9.String中和Array中是否有length属性和length()方法?数组没有length()这个方法,有length的属性.
String有length()这个方法.
集合没有length()方法,有size()方法.
10.==和equals的区别?==比较基本数据类型时比较的时值是否相等,比较引用类型时比较的是对象的地址值是
否相同,也就是否是同一对象。
未重写的equals方法调用的是Object的方法,用法==一样,重写后的equals方法是用
于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的
两个对象是独立的。
11.String str=new String("abc");创建了几个对象?再以上基础上又String str1=new String("abc");一共创建几个对象?
创建了两个对象,一个str引用指向堆内存中的String对象,另外一个则是String类有参构造方法中的直接量字符串对象,该字符串对象在字符串常量池中.
把创建的对象过程拆分成两部分就比较直观了:
String s="abc";
String str=new String(s);
延伸问题:
如果再执行一次String str1=new String("abc");此时共创建了几个对象?
上一次 *** 作创建了2个对象,这一次 *** 作创建了1个对象,一共3个.
因为在第一次常量池中已经有一个"abcdefg"字符串对象,第二个创建时并没有创建新的,而是拿过来直接用,只是创建了1个str1指向堆内存中的String对象,共3个.
12.String,StringBuffer,StringBulider的区别?String类是final修饰的,该类所表示的字符串对象不可变,一旦发生改变即创建新对象, 当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它.
StringBuffer和StringBuilder是可变字符串对象,对字符串的修改 *** 作不会创建新对象,都是在原有对象基础上进行修改,内部有很多 *** 作字符串的方法,比如append()等.另外StringBuffer是线程安全的,同步处理的,性能稍慢;StringBuilder是非线程安全的,并发处理的,性能稍快。
13.怎么把ISO8859-1编码的字符串转换成GBK或者UTF-8的字符串?String类有一个重载的构造方法:
String(byte bytes[], String charsetName)
第一个参数为一个byte数组,第二个参数为指定的字符集类型
14.Integer i 127;Integer i2=127;i1==i2结果为true还是false?Integer i3=Integer.valueOf(127);Integer i4=Integer.valueOf(127);
i3==i4结果为true还是false?
Integer i3=Integer.valueOf(127);Integer i4=Integer.valueOf(127);
i3==i4结果为true还是false?
是引用类型取的地址值从Integer缓存区拿出来的 第一个是true 第二个是是fasle记住缓存区范围是-127~-128之间
List是可重复集合,Set是不可重复集合,这两个接口都实现了Collection父接口.
Map未继承Collection,而是独立的接口, Map是一种把键对象和值对象进行映射的集合,它的每一个元素都包含了一对键对象和值对象, Map中存储的数据是没有顺序的,其key是不能重复的,它的值是可以有重复的。
List的实现类有ArrayList, Vector和linkedList.
ArrayList和Vector内部是线性动态数组结构,在查询效率上会高很多,Vector是线程安全的,相比ArrayList线程不安全的,性能会稍慢一些.
linkedList:是双向链表的数据结构存储数据,在做查询时会按照序号索引数据进行前向或后向遍历,查询效率偏低,但插入数据时只需要记录本项的前后项即可,所以插入速度较快。
Set的实现类有HashSet和TreeSet;
HashSet: 内部是由哈希表(实际上是一个 HashMap 实例)支持的。它不保证 set元素的迭代顺序.
TreeSet: TreeSet使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序.
Map接口有三个实现类:Hashtable,HashMap,TreeMap,linkedHashMap
Hashtable: 内部存储的键值对是无序的是按照哈希算法进行排序,与HashMap最大的区别就是线程安全.键或者值不能为null,为null就会抛出空指针异常
HashMap: 内部存储的键值对是无序的是按照哈希算法进行排序,与Hashtable最大的区别就是非线程安全的,键或值可以为null
TreeMap: 基于红黑树(red-black tree)数据结构实现, 按 key 排序,默认的排序方式是升序.
linkedHashMap:有序的Map集合实现类,相当于一个栈,先put进去的最后出来,先进后出.
16.ArrayList和linkedList的区别?List的实现类有ArrayList, Vector和linkedList。
ArrayList和Vector内部是线性动态数组结构,在查询效率上会高很多,Vector是线程安全的,相比ArrayList线程不安全的,性能会稍慢一些.
linkedList:是双向链表的数据结构存储数据,在做查询时会按照序号索引数据进行前向或后向遍历,查询效率偏低,但插入数据时只需要记录本项的前后项即可,所以插入速度较快。
1.HashMap: 内部存储的键值对是{无序、散列存放的}的是按照哈希算法进行排序,与Hashtable最大的区别就是非线程安全的,键或值可以为null
2.Hashtable: 内部存储的键值对是无序的是按照哈希算法进行排序,与HashMap最大的区别就是线程安全.键或者值不能为null,为null就会抛出空指针异常
18.HashMap内部存储数据的原理?使用put方法向HashMap存储数据,key会计算出一个hashcode值,然后再使用hash算法,计算出一个地址值,如果这个地址值的桶中没有数据,就直接将value值存储再这里,如果已经有值,会使用equals方法,对地址值进行比较,如果地址值相同,就会将原先的value值替换掉,不相等,则将这个值挂载到原先值的后面,形成链表。产生链表会影响查询效率,所以被存入的键值对对象都会重写equals和hashcode方法,但链表不能完全避免,原因是可能存在巧合key不相同但HashCode值相同.
当调用get方法时传入key,key会计算出一个hashcode值,然后再使用hash算法,计算出一个地址值,,通过该地址找到元素后在调用equals方法来比较key是否存在,若存在则返回其value值。
19.创建线程有几种方式?有何区别?1.继承Thread类重写run方法
2.实现Runnable接口重写run方法
实现Runnable接口的好处:
1).java仅支持单继承,实现接口可以把继承的机会留给其他类,实现接口更灵活一些
2). 可以将线程与线程要执行的任务分离开减少耦合度
另外:一个线程仅需要一个实例时可以使用匿名内部类创建,这种方式有助于简化代码
继承Thread类:
实现Runnable接口:
20.线程运行中的五种状态?New(新建):当我们创建一个线程时该线程并没有纳入线程调度处于一个new状态。
Runnable(就绪):当调用线程的start方法后,该线程纳入线程调度的控制,其处于一个可运行状态,等待分配时间片段以并发运行。
Running(运行):当该线程被分配到时间片段后被CPU运行,该线程处于running状态。
Blocked(阻塞):当线程在运行过程中可能会出现阻塞现象,比如等待用户输入信息等。但阻塞状态不是百分百出现的,具体要看代码中是否有相关需求。
Dead(结束):当线程的任务全部运行完毕,或在运行过程中抛出了一个未捕获的异常,那么线程结束,等待GC回收.
当使用new线程创建完毕后调用start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当该线程获得synchronized对象锁后,由阻塞状态转为运行,在这种情况下可以调用wait 方法转为挂起状态,当线程关联的代码执行完毕后,线程变为结束状态.
21.线程中synchronized的用法?java中有一个关键字名为:synchronized,该关键字是同步锁,用于将某段代码变为同步 *** 作,从而解决线程并发安全问题.
用于将某段代码变为同步 *** 作,解决线程并发的问题
锁普通方法:是同步方法,上锁对象是this,同一对象访问时,需要等待顺序执行,如果创建两个对象,可以执行各自的同步方法,互不影响
锁静态方法:因为静态方法只有一份,所以上锁对象是类对象,必须等待顺序执行
锁代码块:为了缩小同步范围,提高多线程并发效率,上锁对象是this
优化?
就是从偏向级锁升级为轻量级锁在升级为重量级锁,不可回退;
咋区分轻量级锁和重量级锁?
会根据一个个对象头(英文:马克我的)进行判断,对象头的话他会去进行一个二进制进行一个判断他尾部的一个数字状态;
多个线程 同一对象 同一个加锁的方法时,看到的上锁对象是同一个
多个线程 同一对象 不同加锁方法时, 看到的上锁对象时同一个 23.什么是死锁?怎么解决死锁?
理解多线程死锁前先理解这个小故事:
假设有A、B、C、D四个人在一起吃饭,每个人左右各有一只筷子。所以,这其中要是有一个人想吃饭,他必须首先拿起左边的筷子,再拿起右边的筷子。现在,我们让所有的人同时开始吃饭。那么就很有可能出现这种情况。每个人都拿起了左边的筷子,或者每个人都拿起了右边的筷子,为了吃饭,他们现在都在等另外一只筷子。此时每个人都想吃饭,同时每个人都不想放弃自己已经得到的一那只筷子。所以,事实上大家都吃不了饭。
死锁: 就是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
线程死锁可能发生在以下的情况:
1)当两个线程相互调用Thread.join();
2)当两个线程使用嵌套的同步块时,一个线程占用了另一个线程的必需的锁,互相等待时被阻塞,就有可能出现死锁。
死锁一般都是由于对共享资源的竞争所引起的。但对共享资源的竞争又不一定就会发生死锁,死锁的发生必需满足4个必要条件:
互斥: 所谓互斥就是进程在某一时间内独占资源。
等待/持有: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
非抢占: 进程已获得资源,在末使用完之前,不能强行剥夺。
形成等待环: 若干进程之间形成一种头尾相接的循环等待资源关系。
如何解决死锁:可以从死锁的四个条件去解决,只要破坏了一个必要条件,那么死锁问题就解决了,在java中使用多线程的时候一定要考虑是否有死锁的问题.
24.Exception和RuntimeException区别?throw和throws的区别?
1.继承Exception时自定义异常属于检查型异常,编译器会做检查,会主动提示抛出…
2.继承RuntimeException时自定义异常属于运行时异常,编译期不会检查,运行时会抛出相关异常.
throw和throws的区别?
throws:是用来声明一个方法可能抛出的所有异常信息,多个异常之间逗号隔开,写在方 法上, 通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级调用者.
throw:是指抛出的一个具体的异常类型,写在方法的内部, 需要用户自己捕获相关的异 常,而后在对其进行相关包装,最后在将包装后的异常信息抛出.
25.请说出五种以上常见运行时异常的名字以及产生的原因和解决方案?ArrayIndexOutOfBoundsException: 数组下标越界异常。当对数组的下标为负数或大于等于数组大小时抛出。
ArithmeticException: 算术条件异常。如:整数除以零。
NullPointerException:空指针异常, 调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等.
ClassNotFoundException: 找不到类异常。根据字符串形式的类名在遍CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
NegativeArraySizeException 数组长度为负异常
ArrayStoreException 数组中包含不兼容的值抛出的异常
SecurityException 安全性异常
IllegalArgumentException 非法参数异常
ClassCastException 类型转换异常类
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException *** 作数据库异常类
NoSuchFieldException 字段未找到异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转换为数字抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IllegalAccessException 不允许访问某类异常
- IOException的子类:
IOException: *** 作输入流和输出流时可能出现的异常。
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常
26.final,finalize,finally的区别?使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的,另外final修饰的方法不能被重写,修饰的类不可被继承,修饰的成员变量不可改变.
finalize:方法名
在垃圾回收器将内存中的没有引用指向的对象清空之前,调用finalize() 进行清理工作.
finally:异常处理中的程序块
在异常处理时,使用finally块来进行必要的清理工作,不论是否有异常发生,finally语句块中的语句都会被执行,如果发生了异常,则执行catch语句,再执行finally块.
反射是Java 动态执行机制,可以实现动态执行功能:
- 反射提供了在运行时判断任意一个对象所属的类型并可以检查解析类型的内部结构。
- 反射可以动态加载类型,并能够动态创建对象反射可以动态访问对象的属性。
- 反射可以动态执行对象的方法。
- 利用反射API还可以动态的访问,不可见的属性和方法,打破面向对象的封装性.
优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类 *** 作总是慢于直接执行java代码。
JDBC中,利用反射动态加载了数据库驱动程序。
Web服务器中利用反射调用了Sevlet的服务方法。
很多框架用到反射机制,注入属性,调用方法,如Hibernate、Struts2、Spring等
CSS/JS 28.表单控件有哪些?表单是浏览器向服务器传送数据的手段,使用标签将表单元素及书写包裹在内.
有三个主要属性:
action:表单提交的URL地址路径
method: 表单的提交方式,默认为get请求方式,可设置为post请求方式.
enctype:表单数据的编码方式
表单控件分为input元素和其他元素:
input元素:
文本框:
密码框:
主要属性:value:用户输入的文本数据 maxlength:最大输入字符数 readonly:只读
单选框:男性
女性
复选框:篮球
足球
主要属性:value:单/复选框文本 name:分组,一组单/复选框name属性必须相同checked:设置选中
按钮元素:
提交按钮::自带表单提交效果
重置按钮::重置表单内容
普通按钮::普通按钮
主要属性:value:按钮名字
隐藏框,文件选择框元素:
隐藏框::一个用户看不到的框体
文件框::选择要上传的文件
其他元素:
文本域:
主要属性:cols:列数 rows:行数 readonly:只读
下拉选:
主要属性: selected: 设置默认选中,如果设置多个,位置最下的生效value: select的value值,主要是用作表单提交的时候将用户选中的option的value值的传递给服务器
注:input元素中的name属性规定 input 元素的名称, 只有设置了 name 属性的表单元素才能在提交表单时传递它们的value值.比如在servlet中可以通过request.getParameter(name 属性的值)来获取浏览器提交表单时传递给服务器的value值数据.
对于不同的input 元素,value 属性的用法也不同:
type="button", "reset", "submit" -按钮上的显示的文本
type="text", "password", "hidden" -框体内的初始值
type="checkbox", "radio" -与单/复选框相关联的值
注意: 和 中必须设置 value 属性,在表单提交时会将chekcd(选中的)单选和复选框的value属性值发送给服务器.
比如在Jquery中可以通过选择器以及val()获取浏览器表单中标签元素的value值$('#id').val();
29.三种d出框分别是?提示对话框:alert():d出并显示字符串文本信息
function f1(){
alert("你好");
}
确认对话框:confirm():d出确认框,点击确定返回true,点击取消返回false.
function f2(){
var b=confirm("你吃了吗");
console.log(b);
}
输入对话框: prompt():d出输入框,让用户输入信息
function f3(){
var r=prompt("你吃了吗?");
console.log(r);
}
30.什么是盒子模型?盒子模型计算公式?盒子模型指的是页面标签的实际宽高
公式:宽:左外边距+左边框线+左内边距+内容的宽+右内边距+右外边距+右边框线
高:上外边距+上边框线+左内边距+内容的高+右内边距+下外边距+下边框线
在没用on()函数之前是前绑定事件,一般用加on函数来实现后绑定比较方便;
on() 方法在被选元素及子元素上添加一个或多个事件处理程序。
使用 on() 方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素)
32.怎么获取select下来选选中的option的value值?$("select option :selecetd").val();
可以使用层次选择器+过滤选择器,获取id为city的父元素下的符合状态过滤选择器是selected(选中状态)的option元素
33.怎么获取checkbox选中的多个value值?$("checkbox :checked").val();
使用层次选择器+过滤选择器,获取id为good的父元素下的符合表单元素选择器:checkbox的元素再次使用状态过滤选择器:checked定位到被选中的复选框.
34.怎么获取radio单选框选中的value值?$("radio :checked").val();
可以使用层次选择器+过滤选择器,获取id的值再加具体的判断条件radio的第几个?最后在点个val;
35.CSS选择器有哪些?类选择器:根据class属性选择具有某一类共同特点的元素,使用点加class属性名选择.
.girl{color:pink;}
id选择器:根据id属性选择唯一的元素,使用#号加id属性名
#p4{color:blue;}
选择器组:选中每个选择器所对应目标的并集(合),两个选择器之间用逗号隔开.
.girl,#p4{font-weight:bold;}
派生选择器:选择父元素下符合条件的子元素,父元素空格子元素
#p5 b{color:red;}
伪类选择器:根据状态选择元素,元素冒号加上状态
img:hover{width:250px;height:250px;}
元素选择器:根据标签元素选择元素,比如div
div{width:250px;height:250px;}
36.JQuery选择器有哪些?选择器是为了定位节点,对节点进行增删改 *** 作,在JQery中常用选择器有:
--基本选择器:依据id,class,元素,选择器组定位元素.
比如:$('#id'),$('.class'),$('div'),$('div,#id');
--层次选择器:类似CSS中的派生选择器,在父节点下找符合条件的子元素
比如:$("div p"):选中父元素div下的所有的子元素p
--过滤选择器:依据元素的基本特征,文本内容,元素可见性,元素的属性和状态定位元素
基本过滤选择器:依据元素的基本特征定位元素,一般用在表格和列表中.
:first 第一个元素
:last 最后一个元素
:eq(index) 下标等于index的元素
比如:$("tr:first"):选择tr下的第一个元素内容
过滤选择器:根据文本内容定位元素
:contains(text) 匹配包含text的元素
:empty 匹配所有不包含子元素或文本的空的元素
比如:$("p:contains('java')"):匹配元素中包含有java字符串内容的元素
可见性过滤选择器:根据元素的可见性定位元素
:hidden 匹配所有不可见或type为hidden的元素
:visible 匹配所有的可见性元素
比如:$('input:hideen'):配备input标签下所有不可见的元素
属性过滤选择器:根据属性定位元素
[attribute] 匹配所有带有attribut属性的元素
[attribute=value] 匹配属性等于value的元素
[attribute!=value] 匹配属性不等于value的元素
比如:$("input[value='你好']"):在input标签中匹配value属性等于'你好'的元素
状态过滤选择器:根据状态定位元素
:checked 在checkbox(复选框)中匹配checked(选中)的元素
:selected 在select(下拉选)中匹配option被选中的元素
比如:$("input:selected"):在input标签中匹配下拉选中option是选中状态的元素.
--表单选择器:通过form表单控件的类型来匹配元素
:text 匹配文本框
:password 匹配密码框
:button 匹配普通按钮
:summit 匹配提交按钮
:reset 匹配重置按钮
:radio 匹配单选框
:checkbox 匹配复选框
:file 匹配文件框
:hidden 匹配隐藏框
比如:$(":text"):匹配文本框
37.JQuery中val(),val("值"),html(),html("值"),text(),text("值")有什么区别?分别支持哪些类型标签?val() 获取元素 value 值; val()只支持form表单控件中的标签
val(‘值’) 设定元素的 value 值;
html() 获取元素的 html 内容; html()返回选择器中的页面值,包括标签
html(“html 内容”) 设定元素的 html 内容;
text() 获取元素的文本内容,不包含 html ; text()只获取文本值,不获取标签
不能获取form表单中的标签的值,除了select下拉框
text(“text 内容”) 设置元素的文本内容,不包含 html;
38.JQuery中addClass("样式名");removeClass("样式名");hasClass("样式名");data("绑定名");data("绑定名","绑定值");attr("属性名","属性值");attr("属性名");函数都是做什么用的?
添加样式class选择器:addClass()
删除样式class选择器:removeClass()
hasClass():判断是否有某个class选择器
data(“绑定名”); 给元素添加属性
data(“绑定名”,“绑定值”); 给属性赋值
data是保存在jquery对象里,attr是保存在DOM元素上);
attr(“class”) 获取 class 属性的值,即样式名称
attr(“class”,”样式名”) 修改 class 属性的值,修改样式
数据库/JDBC 39.mysql和oracle的端口号?mysql:3306
oracle:1521
40.oracle和mysql中的聚合函数和空值函数有哪些?聚合函数:是对查询结果集进行进一步处理的函数(求和,求平均,计数,最大值,最小值)sum(),avg(),count(字段名)/count(*),max(),min()
空值函数:判断某个字段是否为null,如果为空可以将其替换成其他值
41.oracle和mysql中各自的分页查询怎么写?Oracle分页:需要用到ROWNUM:
查看公司工资排名的6-10名?
SELECT * FROM(SELECt ROWNUM rn,t. * FROM(SELECt ename,sal,deptno FROM emp ORDER BY sal DESC) t WHERe ROWNUM <=10) WHERe rn >=6
第一步:先将要查询的数据进行排序若在分页中有排序需求时,那么应当先进行排序,因为排序的优先级是最低的.
SELECt ename,sal,deptno
FROM emp
ORDER BY sal DESC
第二步:拿到排序后的结果集后将该结果集作为一张表进行查询,并使用ROWUNM进行编号并过滤出只显示前10条数据
SELECt ROWNUM rn,t.*
FROM(SELECt ename,sal,deptno
FROM emp
ORDER BY sal DESC) t
WHERe ROWNUM <=10
第三步:拿到前10条数据的结果集后再把该结果当做一张表对该表进行过滤查询,过滤出第6条到第10条的数据.
SELECt * FROM(SELECt ROWNUM rn,t.* FROM(SELECt ename,sal,deptno FROM empORDER BY sal DESC) t WHERe ROWNUM <=10) WHERe rn >=6
实际开发业务中<=10和>=6是被通过公式计算出来的,<=10等于start,>=6等于end
pageSize:每页显示的条目数
page:第几页
根据上述两个参数,计算结果集的范围:
start:(page-1)*pageSize+1
end:pageSize*page
MySQL的分页:需要用到limit
MySQL的分页查询相对于Oracle简单很多,只需要使用limit关键字后面跟2个参数,第一个参数是起始的查询位置,第二个参数是每次查询多少条,需要注意,MySQL中第一条数据是从0开始.
假设查询第前10条数据,SQL语句为:
SELECt * FROM emp LIMIT 0,10;
42.oracle和mysql中怎么做行列转换?oracle
1.case when then end;/通用/
2.结合聚合函数中的sum或者count
3.若需要分组使用group by
mysql
1.if(条件,值1,值2);/mysql特有
2.结合聚合函数中的sum或者count
3.若需要分组使用group by
43.复制表:包含结构和数据以及只包含结构不包含数据分别怎么实现?带数据复制 create table 新表名 as select * from 原始表名 where 1=1;
不带数据复制 create table 新表名 as select * from 原始表名 where 1=2;
44.将一个表中的数据插入到另外一张表结构相同的表中怎么实现?批量插入 insert into 目标表 select * from 原始表名;
45.oracle中的rowid和rownum分别是什么?rownum:伪列:对查询结果集生成一个编号,作为过滤条件时不能大于几
rowid :伪id:是每一条添加到数据库表中的数据的物理地址
46.数据库约束有哪些?约束(CONSTRAINT):限制条件,均用于创建表时对字段进行添加限制条件.
约束类型:
非空约束(NOT NULL):简称NN 1)确保字段值不为空;
唯一性约束(UNIQUE):简称UK 2)保证指定的字段不允许有重复的值(NULL除外);
主键约束(PRIMARY KEY):简称:PK 3)约定的字段非空且唯一,并且一个表中只能有一个主键或者联合主键;
外键约束(FOREIGN KEY):简称:FK 4)一张表保存的是另一张表的主键字段的值, 两个方面的数据约束:
检查约束(CHECK):简称:CK 5)用来强制在字段上的每个值都满足check 中定义的条件;
非空约束:确保字段值不为空
创建表时对字段添加约束:
CREATE TABLE emp(
id NUMBER(6),
name VARCHAr2(30) NOT NULL)
修改表时对字段添加约束:
ALTER TABLE emp MODIFY ( id NUMBER(6) NOT NULL);
取消非空约束:可采用重建表或者修改表的方式
ALTER TABLE emp MODIFY(id NUMBER(6) NULL);
唯一性约束:保证指定的字段不允许有重复的值(NULL除外)
创建表时添加唯一性约束:
CREATE TABLE emp(
id NUMBER(6) UNIQUE, --------------------创建表跟在字段后
name VARCHAr2(30),
email VARCHAr2(59),
ConSTRAINT emp_uk UNIQUE(email) --------------字段写完单独设置,可设
--------------置多个,逗号隔开
);
修改表添加唯一性约束:
ALTER TABLE emp ADD ConSTRAINT emp_uk UNIQUE(name);-----可设置多个
删除唯一性约束:
ALTER TABLE DROp ConSTRAINT emp_uk;
注:emp_uk是给唯一性约束起的名字.
主键约束:约定的字段非空且唯一,并且一个表中只能有一个主键或者联合主键
创建表时添加主键约束:
CREATE TABLE emp(
id NUMBER(6) PRIMARY KEY, ------------创建表时添加在字段后
name VARCHAr2(30));
创建表完毕在进行修改添加:
CREATE TABLE emp(
id NUMBER(6) ,
name VARCHAr2(30));
ALTER TABLE emp ADD ConSTRAINT emp_pk PRIMARY KEY (id);---修改时添加
外键约束:一张表保存的是另一张表的主键字段的值, 两个方面的数据约束:
从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL;
当主表参照列的值被从表参照时,主表的该行记录不允许被删除。
注:因使用麻烦,关系复杂目前基本不使用这种方式.不再做详细叙述.
检查约束:用来强制在字段上的每个值都满足CHECK 中定义的条件
比如:设置员工工资必须大于2000的约束
ALTER TABLE emp ADD ConSTRAINT emp_check CHECK(sal>2000);
对sal字段设置过检查约束时对sal字段执行的插入,更新语句该字段的值小于2000时会报错违反检查性约束.
47.where过滤子句和having过滤子句的区别?WHERe过滤子句是查询过程中对表中数据的过滤条件, 不允许使用聚合函数作为过滤条件,原因在于时机不对,聚合函数是对表中数据查询后的结果集进行统计处理的,两者的执行时机不一致.
HAVINg过滤子句是对查询结果集进行过滤的,可以在该子句后使用聚合函数,因为时机相同,聚合函数是处理结果集的,HAVINg子句又是过滤结果集的,可以在一起使用,另外HAVINg不能单独使用,只能跟在GROUP BY分组子句后面使用.
49.truncate和delete以及drop的区别?--TRUNCATE语句属于DDL语句,删除表中数据保留表结构,立即生效,不可以回滚,大数据量删除记录时效率高.
--DELETE语句属于DML语句,删除表中数据保留表结构,逐行删除记录,大数据量删除效率低,可执行条件删除,若不指定条件是全表删除.
--DROP语句是DDL语句,是删除数据库中表的 *** 作语句.
48.删除表中重复数据保留一条怎么实现? 49.union和unionall的区别?并集:对多个查询结果集的数据进行合并
union:结果集合并时会去重
select * from u where id=4
union
select * from u where id=8
union
select * from u where id=8;
union all:结果集合并时不会去重
select * from u where id=4
union all
select * from u where id=8
union all
select * from u where id=8;
50.创建用户并授权?
create user 新的用户名 identified by 密码;
grant 权限名字(select,update…) on 库名.表名(*所有表) to 用户名;
flush privileges; 授权后刷新权限表
revoke 权限名字(select,update…) on 库名.表名(*所有表) from 用户名;
注:all是所有权限
查看权限:
show grants for 用户名;
真删除: 真的使用delete语句删除数据
假删除: 使用update语句改变数据库表中数据的状态
假分页:从数据库中取出所有的数据,然后分页在界页面上显示。访问一次数据库,但由于选择的数据量比较大,所以第一次花费时间比较长,但之后每一页的显示都是直接、快速的,避免对数据库的多次访问。
真分页:确定要显示的数量和内容,然后每次都去数据库取出该少量数据,优点是数据量小,缺点是访问数据库频繁。在大型网站中往往采用真分页。
注:假分页,如果数据量较多,在首次页面加载的时候会比较慢,严重影响用户体验.
真分页, 对于大数据量可以从容的面对,每次点击下一页,客户端访问服务器的时间基本一样,提高用户体验,更加的人性化。
52.什么是事务?事务有哪4项特性?事务:保护数据库数据可靠交易的安全机制
事务特性ACID:
- 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的 *** 作要么都发生,要么都不发生。
- 一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。
- 隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
- 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变 就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务的隔离级别:
- read uncommitted : 读未提交 :最低级别,任何情况都无法保证。
- read committed:读已提交 :可避免脏读的发生。 ---- oracle、sql server默认
- repeatable read:可重复读:可避免脏读、不可重复读的发生。 —mysql默认的
- serializable:串行化:可避免脏读、不可重复读、幻读的发生—相当于锁表
脏读:B事务读取到了A事务尚未提交的数据 ------ 要求B事务要读取A事务提交的数据
不可重复读:一个事务中两次读取的数据的内容不一致 ----- 要求的是一个事务中多次读取时数据是一致的
— update
幻读/虚读:一个事务中 两次读取的数据的数量不一致 ----- 要求在一个事务多次读取的数据的数量是一致的
–insert delete
悲观锁:认为 *** 作一定会发生数据冲突,每次 *** 作前都要获取锁
- 排他锁:对一资源增加排他锁后,只有自身可以进行增删改查 *** 作,其他人无法进行 *** 作。默认对增删改假排他锁对查询语句加排他锁:select * from goods_lock where id=1 for update ; 表示id等于1的资源不能被其他人 *** 作
- 共享锁:对一资源加共享锁后,自身可以进行增删改查,别人只可以进行查询,其他 *** 作必须等共享锁释放对查询语句加共享锁: select * from goods_lock where id=1 lock in share mode;
乐观锁:认为 *** 作不会导致数据冲突, *** 作数据时,不加任何特殊处理,在 *** 作完成后,判断是否有冲突。它属于开发人员编写的锁,与数据库无关。具体是,开发人员给相关表增加version字段,修改前,先将version查询出来,然后将查询的结果做为where中的一个条件,满足条件时,表明没有其他 *** 作同时进行,可以对数据进行新,并将version+1,保证每次修改后version是一个新值。如果条件不满足,表明有其他 *** 作同时进行,本次 *** 作失败,重新查询version值,并将结果再次做为where条件,进行判断
55.JDBC的运行过程?JDBC是java应用程序访问数据库的解决方案
JDBC访问数据库的工作过程:
1)注册加载驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
2)建立连接:
Connection conn =DriverManager.getConnection(url,username,password);
3)创建执行SQL语句对象及SQL语句:
Statement stmt=conn.createStatement();
String sql="SELECt * FROM emp";
4)执行SQL语句:
ResultSetrs = stmt.executeQuery(sql);
5)处理结果集
while (rs.next()) {
rs.getInt(...);
rs.getString(...);
rs.getDate(...);
}
6)关闭连接
conn.close();
56.Statement和Preparedstatement的区别?JDBC执行SQL必须编译成执行计划才能运行,创建执行计划很耗效率,执行计划缓存在数据库上,相同的SQL复用一个执行计划.
Statement执行两条相同结构的语句,只是参数不同时被认定2个不同的SQL,需要创建两个执行计划,如:
select * from emps where empno=1
select * from emps where empno=2
所以Statement执行有条件的语句时效率低,更适合执行不带条件的静态语句(DDL)
PreparedStatement执行有条件的语句时,条件参数使用?代替,无论参数怎么改变,对应的SQL都一样,执行计划一样,可以进行复原,更适合执行这种动态参数的SQL.另外还能避免SQL注入攻击,如:
select * from emps where empno=?
Servlet/JSP 57.什么是HTTP协议?包含哪些数据包,各数据包内又有什么?
Http协议也叫超文本传输协议:由w3c制订的一种网络应用层协议,规定了浏览器与web服务器之间如何通信及相应的数据格式。
请求数据包:Request Message
请求行:包含请求类型GET/POST、请求路径、协议类型/版本
消息头:访问主机的IP和端口号,浏览器版本,接受的资源类型等
实体内容:GET请求时为空,POST请求时为请求时,实体内容为要提交的表单数据
响应数据包:Response Message
状态行: 包括协议类型/版本、状态码、状态描述
消息头:响应给浏览器的相关信息:响应数据类型,数据大小,服务器版本信息,响应时间等
实体内容:响应给浏览器的具体数据,浏览器逐行解析.
58.有几种方式可以修改tomcat的端口号?- 在本地文件夹 外部端的应用服务器server.xml,
- 在开发工具中修改
实例化:在第一次访问或启动tomcat时,tomcat会调用此无参构造方法实例化servlet
初始化:tomcat在实例化此servlet后,会立刻调用init方法初始化servlet
就绪:容器收到请求后会调用servlet的service方法来处理请求
销毁:容器依据自身算法删除servlet对象,删除前会调用destroy方法
其中实例化,初始化和销毁只执行一次,service方法执行多次,默认情况下servlet 是在第一次接收到用户请求的情况下才会被实例化,可以在web.xml中的
cookie和Session都是负责状态管理的,因为HTTP协议是无状态协议,需要利用cookie和Session来记录状态.
cookie默认保存在浏览器端,随着浏览器的关闭而生命结束,可以调用setMaxAge(int seconds)方法来设置cookie的生命时长,以秒为单位:
当seconds>0时保存在本地硬盘
当seconds<0时保存在浏览器,默认保存在浏览器
当seconds=0时立刻结束cookie的生命
另外存储的数据大小只能为4K左右的数据,安全性较低, 别人可以分析存放在本地的cookie并进行cookie欺骗.
Session保存在服务器,当第一次用户请求时,服务器为其分配一个内存来保存session对象,并生成一个SID,在响应时将该SID以cookie的形式发送给浏览器被保存在内存中,当同一用户再次发起请求时会携带SID到服务器,服务器会依据SID来找到对应的session并使用该session对象中保存的数据,由于数据保存的服务器,数据相对
全,但保存的session较多时会影响服务器性能.
session默认在服务器端保存30分钟,可以调用setMaxInactiveInterval(int seconds)方法来设置生命时长,seconds单位为秒.
想要删除session可以使用invalidate()进行删除.
63.转发和重定向的区别以及是哪个对象调用其哪个方法执行的?转发和重定向都是解决WEB组件之间跳转问题的
转发:一次请求,地址不改变,共用1个request对象,只能转发到项目内组件。
request.getRequestDispatcher("emp_list.jsp").forward(req, res);
重定向:二次请求,向浏览器响应信息时会响应302状态码和要重定向的地址,地址会发生改变,两个请求中不能共享request对象,可以重定向到项目外的组件。
通常查询时候用转发,增删改之后重定向到查询。
response.sendRedirect("findEmp");
64.get和post请求的区别?请求方式分为:get请求和post请求.
get请求:浏览器发送请求默认都是get请求,使用请求路径传参,将参数附加在路径上发送服务器, 由于请求路径是在请求数据包中的请求行中,所以参数在传递过程中可见,隐私性差, 只能携带少量参数(2k左右).
post请求: 在form表单上增加method="post"时,请求方式为post请求, 将参数存放在请求数据包的实体内容中通过实体内容传参, 参数在传递过程中不可见,隐私性好,传递的参数大小没有限制.
一般向服务器索取(查询)数据时用get, 向服务器提交数据时用post.
框架 66.SpringIOC和DI?假设现在有两个类A类和B类,在A类中execute()方法中调用B类中的f1()方法,以往的 *** 作时在A类中自己去new B()对象,然后通过调用B类的f1()方法,现在不需要自己去new,降低程序之间的耦合度,交给Spring容器来管理对象并将B对象注入到A类中.
IOC是控制反转:对象之间的依赖关系交给容器来建立.
DI是依赖注入:容器通过调用对象的set方法或者构造方法来建立对象之间的依赖关系.
注:IOC是目标,DI是手段.
依赖注入的方式有三种:
1.通过set方法注入 2.通过构造方法注入 3.通过自动装配
1)set 方法注入:
假设现在有两个类A类和B类,在A类中execute()方法中调用B类中的f1()方法,需要在A类中声明B类型的引用,在创建该引用的set方法,并声明B类型参数,在set方法内部将参数赋值给B类型的引用.
写配置文件:
启动容器创建对象并调用方法:
执行过程:
- 启动容器是先读取配置文件,将singleton的bean创建实例.
- 读配置文件时发现有property标签则取找该bean的set方法,具体找那个set方法看name的Bean属性值,并且需要通过ref来执行在该set方法中传入的谁的实例作为参数,比如:setB(B b):则是调用setB方法传入B的引用作为形参.
- setB(B b)方法内部将形参b的引用赋值给引用类型变量this.b
- this.b得到对象的地址指向对象.
- 通过容器的getBean()方法,传入bean id和类对象,在容器中找到对应的实例返回.
- 通过实例的引用调用execute()方法,方法内部通过this.b引用调用了f1()方法
以上配置过程繁琐,后期可以被@Resource注解替换,简化开发.
2)构造器注入:
假设现在有两个类A类和B类,在A类中execute()方法中调用B类中的f1()方法,需要在A类中声明B类型的引用,创建A类的有参构造器,并声明B类型参数,在构造方法内部将参数赋值给B类型的引用.
写配置文件:
启动容器进行测试:省略
执行过程:
- 启动容器是先读取配置文件,将singleton的bean创建实例.
- 读配置文件时发现有constructor-arg标签则取找该bean的有参构造方法,ref是要注入的对象,注入给谁参考index的下标.
- 有参构造方法内部将形参b的引用赋值给引用类型变量this.b
- this.b得到对象的地址指向对象.
- 通过容器的getBean()方法,传入bean id和类对象,在容器中找到对应的实例返回.
- 通过实例的引用调用execute()方法,方法内部通过this.b引用调用了f1()方法
以上配置过程繁琐,后期可以被@Autowired注解替换,简化开发.
3)自动装配:(了解)
默认情况下,容器禁止自动装配。
设置autowire属性让容器自动装配。比如:autowire="byType"
byName:容器查找id等于属性名称的bean,然后调用对应 的set方法来完成注入。
注意:如果找不到对应的bean, 会注入null值。
byType:容器查找与属性类型一致的bean,然后调用对应 的set方法来完成注入。
注意:如果找不到对应的bean, 会注入null值。如果找到多个对应的bean,会出错。
constructor:类似byType,只不过调用的是构造器来 完成注入。
67.SpringMVC的五大核心组件及工作流程?五大核心组件分别是:
- DispatcherServlet (前端控制器)
- HandlerMapping (映射处理器)
- Controller (处理器)
- ModelAndView
- ViewResolver 视图解析器
工作流程:
- 在tomcat启动时会实例化一个DispatcherServlet对象,该对象负责接收请求.
- DispatcherServlet接收到用户请求后依据HandlerMapping中的配置路径与请求 路径进行比对,比对成功调用相应的Controller进行业务处理.
- 处理完毕后将结果封装到ModelAndView对象中(视图名和响应数据)返回给DispatcherServlet, DispatcherServlet依据ViewResolver的解析,将视图名与 ViewResolver视图解析器中的前缀和后缀进行拼接得到一个具体的视图信息.比如 hello.jsp, 调用相应的视图对象(比如jsp)来生成相应的页面.
- 然后DispatcherServlet将该页面响应给浏览器.
68.持久层接口和Mapper映射文件的对应关系?
1)接口名和namespace保持一致
2)方法名和sql标签的id保持一致
3)方法参数和sql标签的parameterType保持一致
4)方法返回值类型与sql标签的resultType保持一致
小故事:话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi ,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”,你一定说:这人有病!直接说开车不就行了?!通过以上小故事可以看出,如果按照这种方式去设计程序是存在弊端的,为了解决这个弊端我们可以使用工厂模式,最终解决的方案就是:暴发户直接说开车就行了.
工厂模式分为:普通工厂模式,抽象工厂模式,工厂方法模式.
如下以普通工厂模式模式(也叫普通静态工厂模式)来解决以上小故事的弊端:
1.创建一个Car接口,封装开车的方法,让老板下达统一的开车命令,而非下达开某种车命令
2.创建不同品牌的具体汽车实例类来实现Car接口,重写开车的方法
3.创建一个工厂类,本案例的核心,通过该工厂类来实例化不同品牌汽车的具体实例
重点出场:工厂类
70.Ajax技术(js版和jquey版,axios版)?
ajax是一种用来改善用户体验的技术,是利用浏览器提供的XMLHttpRequest对象,也可以称为ajax对象异步地向服务器发送请求,服务器返回部分数据,浏览器利用这些数据对当前页面做部分更新,整个过程,页面无刷新,不打断用户的 *** 作。
常用属性和事件:
onreadystatechange:绑订一个事件处理函数,用来 处理readystatechange事件。
注:当readystate的值发生了任何的改变(比如,从0 变成了1),就会产生readystatechange事件。
readyState:有五个值(0,1,2,3,4),表示ajax对象与服务器通信的进展。
0:请求尚未初始化
1:正在发送请求
2:请求发送完成
3:请求成功,正在接收服务器返回数据
4:表示ajax对象已经获得了服务器返回的所有的数据。
responseText:获得服务器返回的文本数据。
responseXML:获得服务器返回的xml数据。
status:获得服务器返回的状态码:200,404,500等
常用方法:
open("请求类型","请求地址",true/false):创建请求,准备发送请求
注:true是异步,false是同步,默认为true是异步请求
send(null):发送请求
注: get请求时null不加也可以,但是个别浏览器不加不行,为了兼容性,还是考虑加上
post请求时参数为参数及参数值,比如:send('username='+'zhangsan');
setRequestHeader('content-type','application/x-www-form-urlencoded'):指定请求消息头
注:post请求时需要添加该方法来执定请求消息头,get请求时不需要
运行流程图如下:
71.JSON技术?JSON是一种轻量级的数据交换格式。将要交换的数据转换成一种与平台无关的数据,然后发送给接收方来处理,有解析速度快,JSON文档小等优点.
语法:
{属性名:属性值,属性名:属性值,....}
注意:
a. 属性名必须使用双引号括起来。
b. 属性值可以string,number,null,true/false,object。
c. 属性值如果是string,必须使用双引号括起来。
在我们的实际应用中,数据交换指的是在服务端将java对象转换成JSON字符串对象,然后将数据发送给客户端浏览器,客户端拿到JSON字符串对象后再将其转换成JS对象.
原理如下图:
1)将java对象转换成JSON字符串对象:
相关的API有很多,本案例演示实验jackson的ObjectMapper对象的writevalueAsString();
Stock s=new Stock();
s.setCode("600015");
s.setName("山东高速");
s.setPrice(10);
//将java对象转换成json字串
ObjectMapper om=new ObjectMapper();
String str=om.writevalueAsString(s);
System.out.println(str);
输出结果如下:
{"code":"600015","name":"山东高速","price":10}
另外,也可以将多个对象组成的数组或集合转成JSON字符串:
List
for(int i=0;i<3;i++){
Stock s=new Stock();
s.setCode("60001"+i);
s.setName("山东高速"+i);
s.setPrice(10+i);
list.add(s);
}
//将集合转换成json字符串
ObjectMapper om=new ObjectMapper();
String str=om.writevalueAsString(list);
System.out.println(str);
输出结果为:
[{"code":"600010","name":"山东高速0","price":10},{......}]
2)将JSON字符串转换为JS对象:
使用prototype提供的evalJSON函数来做转换,需要引入prototype-1.6.0.3.js文件
//将json字符串转换成javascript对象
function f4(){
var str='{"name":"Tom","age":22}';
//使用prototype提供的evalJSON函数来做转换
var obj=str.evalJSON();
alert(obj.name);
}
另还有其他方式:
JSON提供的parse():JSON.parse(str);等
72.Spring框架的 组件扫描 注解有哪些?容器会扫描指定包及其子包下面的所有的类,如果该类包 含有特定的注解(比如@Component),则容器会将该类纳入 容器进行管理,创建对象并管理对象.
注:相当于配置文件当中有一个
组件扫描注解有4个,写在类名上面:
@Component 通用组件
@Service 业务层组件
@Repository 持久层组件
@Controller 控制层组件
需要在配置文件当中,配置组件扫描。
@RequestMapping url和控制器请求,映射注解,能够处理所有请求类型,也可以添加method属性处理特定请求。
@ResponseBody 返回json数据,Ajax请求结束,返回字符串本身,不执行mvc的视图解析器。
74.什么是AOP?通知方式有几种?切入点有哪些?切面 = 切入点表达式 + 通知方法
AOP(面向切面编程) 主要利用(动态代理的模式) 降低程序的耦合度,扩展业务功能方法.
也就是说,可以在不修改原代码逻辑的基础上添加新的逻辑。
@Aspect{阿斯拜课的} 标注切面类注解
通知(Advice{饿德外死})方式:
before: 在目标方法执行之前执行
afterReturning: 在目标方法执行之后返回时执行
afterThrowing: 在目标方法执行之后,抛出异常时执行
after: 无论程序是否执行成功,都要最后执行的通知
around: 在目标方法执行前后 都要执行的通知(完美体现了动态代理模式)
功能最为强大 只有环绕通知可以控制目标方法的执行
关于通知方法总结:
1.环绕通知是处理业务的首选. 可以修改程序的执行轨迹
2.另外的四大通知一般用来做程序的监控.(监控系统) 只做记录
切入点:
1)使用注解做为切入点 @annotation(包名.注解名)
2)使用execution(访问权限 返回值类型 包名.类名.方法名(参数列表)) 万能切入点表达式,可以使用进行代替
3)bean(“bean的ID”) 根据beanId进行拦截 只能匹配一个
4)within(包名.类名)可以使用通配符? 能匹配多个
75.拦截器和过滤器的区别?都能实现:权限认证,过滤方法;
拦截器是spring中的组件,在HandlerMapping之前执行,只能拦截action请求;
1.创建拦截器(Interceptor (音特色不特)),实现HandlerInterceptor接口,重写
preHandle():前端控制器调用的方法,结果为true是才能调用HandlerMapping处理器
postHandle():处理器执行完请求后返回结果之前执行,可以在该方法中设置ModleAndView对象
afterCompletion():最后执行的方法,处理处理器抛出的异常;
2.过滤器(filter(费油特)),是servlet中的组件,在servlet之前执行,可以对所有请求进行过滤创建过滤器实现Filter接口,重写init()、doFilter()、destroy()方法,分别是初始化、过滤器逻辑、销毁过滤器的方法
76.MyBatis中#{}和${}的区别?
1.#{} 表示创建的是prepareStatement,对象即sql 预编译,防止sql注入;
2.${}表示创建的是statement对象,即 sql 拼接,还需要加上单引号。
3.总结:能用#{}就不用或者少用¥{},要想插入一条不可变的sql,比如排序时,数据对象中的表名等,是可以用的;
项目77.项目某模块思路
1)该模块是解决用户什么问题的?
2)牵涉到了那些数据库相关表,表里有哪些主要字段,多表的情况下表之间的关系?
3)项目中都用到了那些技术?每个技术都在请求流程中哪些环节生效?
4)从请求发起时以一个完整的流程把相关技术和业务穿插到该请求中?
跨域访问:让不同域名,端口,协议之间的项目可以进行访问.
Ajax本身不支持跨域访问,并且很多浏览器需要遵守同源策略,目的是处于安全性考虑,但是实际项目中很多时候需要跨域访问,此时可以借助于JSONP, CROS等技术.
JSONP:
$.ajax({
url: 请求路径,
dataType:“jsonp”,
jsonpCallback:jsonp回调函数的名字,
jsonp:和控制器的请求参数保持一致
})
CROS:
前端正常发ajax请求,后台在控制器上添加注解@CrossOrigin(origins="允许跨域的域名") 79.SpringBoot的相关注解? 80.Linux系统命令知道哪些? 81.Nginx是什么技术? 82.Redis是什么技术? 83.Dubbo框架和Zookeeper框架? 84.SpringCloud各个组件的作用和使用方法? 85.分布式事务解决方案?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)