整理的一些java面试题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整理的一些java面试题相关的知识,希望对你有一定的参考价值。
Java类型:8种基本类型,3种引用类型;
基本类型 : Byte short int long float double char boolean
字节长度 : 1 2 4 8 4 8 2 1
引用类型 : 类,接口,数组
简述你所知道的JAVA修饰符及各自的使用机制:
Abstract:修饰类,会使这个类称为抽象类,这个类将不能生成对象实例,但可以作为对象变量声明的类型,需要子类继承并覆盖其中的抽象方法。 修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,需要子类继承实现(覆盖)
Final:修饰的变量会变成常量(一旦赋值不能改变(可以在初始化时直接赋值,也可以在构造方法里面赋值)) 修饰的方法将不能被其子类覆盖,保持方法的稳定不能被覆盖。 被修饰的类将不能被继承。Final类中的方法也都是final的。
Synchronized:是java中的关键字,是一种同步锁。修饰对象有以下几种:
1.修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括
号{}括起来的代码,作用的对象是调用这个代码块的对象;
2.修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法, 作用的对象是调用这个方法的对象;
- 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个 类的所有对象;
4.修饰一个类,其作用的范围是synchronized后面括起来的部分,作用主的
对象是这个类的所有对象
Super:这项自己父类对象的一个指针
String、StringBuffer、StringBuilder之间的区别,简述各自的执行效率
答:String类的声明是:public final,而且,String类中使用字符数组保存字符串,如下:因为有‘final’修饰符,所以可以知道String对象是不可变的。
private final char value [ ] ;
所以是改变不了的,如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串。
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
静态变量和实例变量的区别?
答:在语法定义上的区别:静态变量前要加static关键字,而实例变量前不加。
在程序运行时的区别:静态变量从属与类,实例变量从属与对象。
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量即类变量,只要程序加载了类的字节码文件,不用创建
任何实例对象,静态变量就会被分配空间,即可使用
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
是否可以从一个static方法内部发出对非static方法的调用?
答:不可以,因为非static方法要与对象关联在一起,必须创建一个对象后,才可以在该对象上进行方法的调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,一个static方法被调用时,可能还没有创建任何实例对象,所以,一个static方法内部不可以发出对非static方法的调用。
全局变量和局部变量的区别:
1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等。
2.内存存储方式不同:全局变量存储在全局数据区(堆)中,局部变量存储在栈区。
3.生命周期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不纯在了
4.使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。(函数内部会优先使用局部变量再使用全局变量)
你所知道的集合类都有哪几类?主要区别有哪些并简单描述
List,Set继承了Collection接口,map没有继承collection
(Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。?
注意:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。?)
List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复,重复元素会被覆盖掉(注意:元素虽然无放入顺序,但是元素在set中的位置是由该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表数据结构实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList:底层基于动态数组的数据结构实现。
ArrayList和Vector的区别:ArrayList是非线程安全的。效率高;Vector是基于线程安全的,效率低
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
介绍你所知道的J2EE中常用的设计模式,并简单介绍工厂模式
单例模式、工厂模式、包装模式、代理模式等
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类。该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
一、设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
线程和进程的区别?实现多线程的方式有哪几种?如何实现多线程
一个程序至少有一个进程,一个进程至少有一个线程。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。
Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。
前两种方式启动的线程没有返回值,启动后与主线程没有任何关系,主线程也不知道子线程是否执行结束;后一种方式线程有返回值,启动后主线程可以根据线程对象来判断显示是否结束以及获取线程执行结果,前者多用于,当执行一个主要任务时需要执行一个辅助耗时任务,但是主任务并不关心辅助任务是否执行成功,执行成功的结果是什么,后者多用于执行主任务时需要执行一个耗时的辅助任务,但是主任务的执行结果或者执行流向依赖于辅助任务的执行结果。
线程同步的方法(类里有哪些方法来支持线程同步)
为何要使用同步??
??? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),?
??? 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,?从而保证了该变量的唯一性和准确性。
同步方法的7种方式(也有的说5种,没有最后面两种)
(参考博客: http://www.cnblogs.com/XHJT/p/3897440.html)
1.同步方法?
??? 即有synchronized关键字修饰的方法。?
??? 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,?
??? 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
2.同步代码块?
??? 即有synchronized关键字修饰的语句块。?
??? 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
3.使用特殊域变量(volatile)实现线程同步
??? a.volatile关键字为域变量的访问提供了一种免锁机制,?
??? b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,?
??? c.因此每次使用该域就要重新计算,而不是使用寄存器中的值?
??? d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量?
4.使用重入锁实现线程同步
??? 在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。?
??? ReentrantLock类是可重入、互斥、实现了Lock接口的锁,?
??? 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力
??? ReenreantLock类的常用方法有:
??????? ReentrantLock() : 创建一个ReentrantLock实例?
??????? lock() : 获得锁?
??????? unlock() : 释放锁?
5.使用局部变量实现线程同步?
??? 如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,?
???副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响
6.使用阻塞队列实现线程同步
7.使用原子变量实现线程同步
Error和Exception有什么区别
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等,对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception),运行时异常:ArithmaticException(算术异常),IllegalArgumentException(非法参数异常),编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try...catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
Integer与int的区别?
1.Int是java提供的8种基本数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的包装类。
2.Int的默认值是0,而Integer的默认值是null。
3.声明Integer的变量需要实例化,而声明为int的变量不需要实例化;
4.Integer是对象,用一个引用指向这个对象,而int是基本类型,直接存储数值.
Final Finally Finalize的区别:
(参考:http://blog.csdn.net/lichaohn/article/details/5424519)
Final :用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
Fianlly :异常处理语句结构的一部分,表示总是执行。
Finalize:是Object类的一个方法,在垃圾收集器(GC)执行的时候会调用被回收对象的此方法。
重写和重载的区别?
重写是子类的方法重写父类的方法,要求方法名和参数都相同。重载是在同一个类中,方法名相同,参数列表不同,(方法体也不同),最常见的重载的例子就是类的构造函数。
重写方法的规则:
1.参数列表必须完全与被重写的方法相同,否则不能称其为重写,而是重载.
2.返回的类型必须一直与被重写的方法的返回值类型相同,否则不能称其为重写,而是重 载.
3.访问修饰符的限制一定要大于被重写方法的访问修饰符
4.重写方法一定不能抛出新的检查异常或者比如被重写方法申明更加宽泛的检查型异 常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法时就 不能抛出Exception,只能抛出IOException的子类异常。
重载的规则:
1.方法名相同,参数列表不同;
2.可以有不同的返回类型,只要参数列表不同即可;
3.可以有不同的访问修饰符;
4.可以抛出不同的异常;
所谓子类方法重写父类方法遵循“两同两小一大”的规则
两同:
1)方法名 2)形参列表
两小:
1)返回值类型比父类更小或相等 2)异常比父类方法更小或相等
一大:
子类权限比父类大或相等
1.什么是事务:
事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。
2.事务特性:
事务特性分为四个:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)简称ACID。
1.原子性(Atomicity):事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败。
2.一致性(Consistency):事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说数据库处于一致性状态。如果在执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于不一致状态。
3.隔离性(Isolation):一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
4.持续性(Durability):即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。
JDBC的操作步骤:
加载驱动,建立连接; 创建语句对象,执行SQL语句; 处理结果集; 关闭连接.
什么是序列化?
序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。
什么是反序列化?
将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
为什么需要序列化?转换为二进制串后才好进行网络传输嘛!为什么需要反序列化?将二进制转换为对象才好进行后续处理
Statement和PreparedStatement
1.它们的联系
都是用来执行SQL的
PreparedStatement extends Statement
2.它们的区别
Statement适合执行静态(无条件)SQL
PreparedStatement适合执行动态(有条件)SQL
PreparedStatement优点:
(1)提高效率
(2)防止SQL注入
(3)批量更新时减少次数,提高效率。
(PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)
3.Statement原理(理解)
JDBC对分页的支持
1.假分页(内存分页)
?第1次查询时获取所有数据,并将其存入内存(List)
?第N次查询时不再访问数据库,而是从内存中(List)取数
?特点: 第1次查询巨慢,再次查询快,耗内存
适合数据量很小的小项目
2.真分页(物理分页)*
?每次查询时都是获取一页的数据
?使用分页的SQL进行查询
?特点: 每次查询速度都一样,不耗内存
?适合任意的项目
abstract class和interface有什么区别?
(可参考:http://blog.csdn.net/b271737818/article/details/3950245)
接口是完全抽象的抽象类;
1、abstract类可以有包含实体的方法 但是接口不可以
2、接口定义的变量都是final的 而abstract类定义的可以不是final的
3、abstract类可以通过get....()方法实现类的实例 但是接口不可以
4、“抽象类”是一种不能实例化而必须从中继承的类。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能。
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
JDBC: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
JDBC的操作步骤,正确的顺序是
加载驱动,建立连接; 创建语句对象,执行SQL语句; 处理结果集; 关闭连接.
JDBC的访问步骤?
1)注册驱动,
2)获取连接
3)获取statement对象
4)获取结果集
5)关闭Connection
import java.sql.*;
public class TestSelect {
/**建立与数据库的连接
- 目标IP: 172.16.0.203
- SID: orcl
- 用户名和密码 openlab open123
**/
public static void main(String[] args) {
Connection con = null;
try{
//将ojdbc6.jar资源载入类加载器
//注册驱动类
Class.forName("oracle.jdbc.OracleDriver");
//编写一个连接字符串
String url = "jdbc:oracle:thin:@172.16.0.203:1521:orcl";
//获取Connection对象,getConnection(连接字符串,用户名,密码)
con = DriverManager.getConnection(url,"jsd1402","jsd1402");
//执行select语句
String sql ="select empno,ename,sal from emp order by sal";
//获取Statement
Statement stat = con.createStatement();
//执行select语句获取查询结果
ResultSet rs = stat.executeQuery(sql);
//遍历rs结果数据
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
double sal = rs.getDouble("sal");
System.out.println(empno+" "+ename+" "+sal);
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
try {
con.close();//释放连接资源
} catch (SQLException e) {
}
}
}
}
Spring:开源的,用来简化企业级应用开发的轻量级的应用开发框架
1.简化开发:Spring对常用的api(比如jdbc)做了封装,这样,可以大大简化
这些api的使用。(比如使用springjdbc访问数据库,就不用考虑如何
获取连接和关闭连接了)。
2.解耦:Spring帮我们建立对象之间的依赖关系,这样,对象之间的耦合度
会大大降低,代码的维护性会大大提高。
3.集成其他框架:Spring可以将其它的一些框架集成进来(比如用于定时任务处理的Quartz 等),方便这些框架的使用。
2.Spring容器
(1)什么是Spring容器?
Spring框架中的一个核心模块,用于管理对象。
SpringMVC:用来简化基于MVC架构的web应用程序开发的框架。
注:SpringMVC是spring中的一个模块。
有五大组件
1)有哪五大组件?
DispatcherServlet 前端控制器
HandlerMapping 映射处理器
Controller 处理器
ModelAndView
ViewResolver 视图解析器
2)它们之间的关系
a.请求发送给DispatcherServlet来处理,DispatcherServlet
会依据HandlerMapping的配置调用对应的Controller来处理。
b.Controller将处理结果封装成ModelAndView,然后返回给
DispatcherServlet。
c.DispatcherServlet会依据ViewResolver的解析调用对应的
视图对象(比如jsp)来生成相应的页面。
何时使用Spring?
当需要管理JavaBean对象时就可以使用,Spring是最简洁的对象管理方案之一。
Spring框架中bean规范?
JavaBean
1)必须有package
2)有无参数构造器
3)实现序列化接口
4)实现get,set方法
1.Spring框架的作用和好处
Spring框架提供了一个容器,该容器可以管理应用程序的组件,还提供了IoC和AoP机制,实现组件之间解耦,提高程序结构的灵活性,
增强系统的可维护和可扩展性。
在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和Service,Service和DAO之间低耦合调用。
利用AoP机制实现事务管理、以及共通功能的切入等。
功能是整合,好处是解耦。
1、什么是IOC
Inversion of Control,
控制反转,是一种解耦的设计思想。其目的是让业务代码交出对象创建的控制权,由原先的主动创建对象变为被动接受注入的对象,
即由Spring来负责创建对象,并注入给业务代码。由于Spring采用XML来配置组件以及组件的关系,所以可以将关联组件解耦。
2、Spring IOC实现原理
Spring采用DI(Dependency Injection)技术来实现IOC,即采用依赖注入来实现了IOC。
Spring允许我们在配置文件声明组件时,指定当前组件所依赖的组件,然后在使用Spring容器创建当前组件时,
它会先创建依赖的组件并注入给当前组件。
1.依赖注入DI(补充)
*a.setter方式注入使用方法(推荐)
<bean id="jdbcDataSource" class="com.tarena.dao.JdbcDataSource">
<property name="driver" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.0.26:1521:tarena" />
<property name="user" value="openlab" />
<property name="pwd" value="open123" />
</bean>
<bean id="userDao" class="com.tarena.dao.OracleUserDao">
<property name="dataSource" ref="jdbcDataSource"></property>
(了解)b.构造方式注入使用方法(参考Test1示例)
---在使用一方定义一个接口类型变量,添加一个带参数的构造方法
---在applicationContext.xml的Bean定义中指定注入配置
public Phone(CPU cpu,SIM sim){...}
<bean id="" class="">
<constructor-arg index="参数索引0 有参构造器的第一个参数" ref="Bean组件id值"/>
<constructor-arg index="0" ref="cpu"/>
<constructor-arg index="1" ref="sim"/>
</bean>
<bean id="cpu" class="com.tarena.CPU"/>
<bean id="sim" class="com.tarena.SIM"/>
springmvc工作流程
常用注解有什么?都怎么使用?
1)在applicationContext.xml中,开启对注解
的自动扫描。
<context:component-scan base-package="com.tarena"/>br/>开启自动扫描后,当Spring容器初始化时,它会自动的扫描这个包下所有类中的注解,并将注解配置过的bean纳入到Spring容器中,
当程序执行时,就可以使用Spring容器来创建这个bean了。
2)使用注解配置bean
a、在类上使用注解,标识该类是一个组件,
它将被Spring容器管理
@RequestMapping("/notebook")
@ResponseBody注解,将Controller方法返回值做成json输出。br/>@Controller控制器,用于标识Action组件,控制层组件注解
@Service服务,用于标识一个业务组件,业务层组件注解br/>@Resource标识属性
private String driver;
@Value("#{jdbc.url}")
标识属性(@Autowired)
@Autowired
@Qualifier("jdbcCostDao")
@Repository存储,用于标识DAO组件,持久化层组件注解
@Component用于标识其他的通用组件,通用注解
@Named 作用同上,通用注解,sun公司提供的,需要导包才可用。
b、
指定组件的作用域
通常受Spring管理的组件,默认的作用域是“singleton”。如果需要其他的作用域可以使用@Scope注解,只要在注解中提供作用域的名称即可
在类上使用注解,标识对象的创建方式
@Scope("singleton")
<mapper namespace="com.tarena.entity.DeptMapper">
<select id="findDeptById"
resultType="com.tarena.entity.Dept"
parameterType="java.lang.Integer">
select deptno, dname, loc from robin_dept
where deptno=#{deptno}
</select>
/*自定义注解,用来标识DAO接口,MapperScannerConfigurer会自动扫描带有这个注解的接口。/
public @interface MyBatisRepository {
}
Mybatis:(1)MyBatis是什么?
开源的持久层框架。
注:MyBatis底层仍然是jdbc。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射
工作原理:
- 返回Map类型的结果
(1) MyBatis会将记录中的数据先放到一个Map对象里面
(以字段名作为key,以字段值作为value,一条记录对应一个Map对象),
然后 再将Map中的数据放到对应的实体对象里面。
(2)返回Map类型的结果,好处是不用实体类了,但是不方便
(因为要获得字段值,还需要调用Map对象提供的get方法,
注意,oracle数据库中,字段名统一都是大写)。
3.解决字段名与实体类的属性名不一致
(1)方式一 使用别名。(就是让别名与属性名一样)。
(2)方式二 使用resultMap解决。
Ajax: (asynchronous javascript and xml 异步的javascript和xml)
(1)ajax是什么? 是一种创建交互式网页应用的网页开发技术
是一种用来改善用户体验的技术,本质上是利用浏览器提供的一个
特殊对象(XMLHttpRequest对象,一般也可以称之为ajax对象)向
服务器发送异步请求;服务器返回部分数据,浏览器利用这些数据
对当前页面做部分更新;整个过程,页面无刷新,不打断用户的操作。
注:
异步请求,指的是,当ajax对象发送请求时,浏览器不会销毁
当前页面,用户仍然可以对当前页面做其它操作。
(a. Ajax应用程序的优势在于?
- 通过异步模式,提升了用户体验
- 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
- Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
b. AJAX最大的特点是什么?
Ajax可以实现动态不刷新(局部刷新) 就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。)
(3)ajax对象的几个重要属性
onreadystatechange: 绑订事件处理函数,用来处理readystatechange事件。
注:当ajax对象的readyState属性值发生了任何的改变,比如
从0变成了1,就会产生readystatechange事件。
readyState:有5个值(分别是0,1,2,3,4),用来获取ajax对象与服务
器通信的进展。其中,4表示ajax对象已经获得了服务器返回的所有的数据。
responseText:获得服务器返回的文本数据。
responseXML:获得服务器返回的xml数据。
status:获得状态码。
ajax优点:
(1)改善用户的体验:页面无刷新,不打断用户的操作。
(2)提升程序的性能:按需要获取数据,客户端(浏览器)与服务器端之间数据传输大大减少。(不再需要返回一个完整的新的页面,只需要返回部分的数据)
(3)一种标准化的技术:不需要用户下载任何的插件。(有些类似ajax的技术,比如Flex,是需要下载插件的)。
(4)缓存问题
a,当发送get请求时,ie浏览器内置的ajax对象会检查请求地址是否访问过,如果访问过,则不再向服务器发送请求。
b,解决方式:
方式一,在请求地址后面添加一个随机数,比如:
xhr.open(‘get‘,‘getNumber.do?‘ + Math.random(),true);
方式二,使用post方式发请求。
(5) 编码问题
1)发送get请求
ie浏览器内置的ajax对象会使用"gbk"对参数值进行编码,而其它浏览器内置的ajax对象会使用"utf-8"编码。
服务器端会使用"iso-8859-1"解码。这样,会出现乱码问题。
解决方式:
step1,要让服务器对于get请求发送过来的数据进行正确地解码(按照指定的编码格式进行解码)。
对于tomcat,可以修改Tomcat_home/conf/server.xml
<Connector URIEncoding="utf-8",改完之后,需要重新启动tomcat。(只对get请求有效,对post无效)
step2,要保证浏览器内置的ajax对象也使用"utf-8"对参数值进行编码。encodeURI函数(uri)
function check_username(){
//获得ajax对象
var xhr = getXhr();
//发请求
var uri = ‘check_username.do?username=‘ + $F(‘username‘);
//encodeURI(uri)防止乱码
xhr.open(‘get‘,encodeURI(uri),true);
xhr.onreadystatechange=function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
//服务器处理正常
//获得服务器返回的文本数据
var txt = xhr.responseText;
$(‘username_msg‘).innerhtml = txt;
}else{
$(‘username_msg‘).innerHTML = ‘验证用户名出错‘;
}
}
};
$(‘username_msg‘).innerHTML = ‘正在检查...‘;
xhr.send(null);
}
2)发送post请求
所有浏览器内置的ajax对象都会使用"utf-8"这种编码格式对请求参数进行编码。注意,服务器会使用"iso-8859-1"去解码(URIEncoding只对get请求起作用)。
解决方式:request.setCharacterEncoding("utf-8");
1、状态管理
(1)什么是状态管理?
将浏览器与服务器之间多次的交互当做一个整体来看待,并且将多次交互所涉及的数据保存下来。
(2)如何进行状态管理?
第一类方案:将状态(多次交互所涉及的数据)保存到客户端(浏览器)。
第二类方案:将状态保存到服务器端(web服务器,比如tomcat)。
(3)cookie
1)什么是cookie?
浏览器在访问服务器时,服务器会将一些数据(少量的)以set-cookie消息头的方式发送给浏览器;浏览器会将这些数据保存下来。
当浏览器下次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
2)如何创建一个cookie?
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
PrintWriter out = response.getWriter();
Cookie c = new Cookie("username","jetty");
response.addCookie(c);
Cookie c2 = new Cookie("city","bj");
response.addCookie(c2);
out.println("添加cookie成功");
------------------------------------------
out.close();
3)如何查看cookie?
Cookie[] cookies = request.getCookies();
注意:
a,浏览器之前可能保存了多个cookie,在访问服务器时,会一起发送给服务器,所以返回的是一个数组。
b,该方法有可能返回null。
遍历这个数组时,会用到两个方法。
String cookie.getName();
String cookie.getValue();
------------------------------------------
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
out.println(cookie.getName()+" "+cookie.getValue()+"<br/>");
}
}else{
out.println("没有找到cookies");
}
out.close();
(4)session
1)session是什么?
servlet容器负责为HttpSession分配唯一的ID
a,session是服务器端的状态管理技术;
b,当浏览器访问服务器时,服务器会创建一个session对象(每个session对象都有唯一的一个id属性值,称之为sessionId),
接下来服务器在默认情况下会使用set-cookie消息头将sessionId发送给浏览器(即使用cookie技术),
浏览器会将sessionId保存下来(内存);当浏览器再次访问服务器时,浏览器会将sessionId发送给服务器,
服务器会依据这个sessionId找到之前创建的session对象。
2)如何获得session
a, HttpSession s = request.getSession(boolean flag);
当flag = true时:
服务器先查看请求当中是否有sessionId,
如果没有,则创建一个session对象;
如是有,则依据这个sessionId去查找之前创建的session对象,
如果找到,则返回,找不到,会创建一个新的session对象。
当flag=false时:
服务器先查看请求当中是否有sessionId,
如果没有,返回null;
如是有,则依据这个sessionId去查找之前创建的session对象,
如果找到,则返回,找不到,返回null。
b,HttpSession s = request.getSession();
该方法等价于request.getSession(true);
3)session的几个常用的方法
String session.getId(); //返回sessionId
//绑订一个对象到session。
session.setAttribute(String name,Object obj);
//依据绑订名找到绑订值,注意有可能返回null。
Object session.getAttribute(String name);
//解除绑订
session.removeAttribute(String name);
4)session的超时
a,什么是session的超时?
服务器会将空闲时间过长的session对象从内存空间里面删除掉。大部分服务器空闲时间是30分钟。
b,如何修改?
方式一:改服务器的配置,比如,修改tomcat的web.xml文件。也可以放在应用的web.xml里。
conf/web.xml。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式二:session.setMaxInactiveInterval(int seconds)。
5)立即删除session
session.invalidate();
6)session案例
a, session验证
step1,登录成功以后,在session对象上绑订相关的数据。
比如:
session.setAttribute("user",user);
step2,对于需要保护的资源(即访问某个地址时,需要检查用户是否登录,如果没有登录,则不能访问该地址)。
比如:在main.jsp中添加
<%
Object obj = session.getAttribute("user");
if(obj == null){
//没有登录,或者session超时,跳转到登录页面
response.sendRedirect("login.jsp");
return;
}
%>
为什么jsp文件里面,可以直接使用session?
因为在默认情况下,容器在将.jsp转换成对应的.java文件时(即servlet时),会自动添加session的获得语句。
session优点
a,session比较安全(session将状态保存在服务器端,而cookie将状态保存在浏览器端),session是服务器端生成的,
cookie是用户可以查看的;
b,session保存的数据类型更加丰富(cookie只能保存字符串)
c,session能够保存的数据大小更大(cookie只能保存大约4k左右的数据)
d,cookie可以被用户禁止,而session没有这个问题。
session缺点
a,session会将数据放在服务器端,所以给服务器的资源消耗比较大。而cookie会将数据保存在浏览器端,
对服务器不会占用过多的内存空间。
b,session在默认情况下,会将sessionId以cookie的方式发送给浏览器,浏览器会将session保存到内存里面,
如果浏览器关闭,浏览器发请求时就没有sessionId,服务器端的session对象就找不到了。
Json :
- json (javascript object notation)
(1)json是什么?
是一种轻量级的数据交换格式。
注:json借鉴了javascript的部分语法
注:
数据交换:指的是将要交换的数据转换成一种与平台无关的
数据格式(比如xml),然后发送给接收方来处理。
轻量级:json相对于xml而言,文档更小,解析速度更快。
(2)语法
1)表示一个对象
{属性名:属性值,属性值:属性值...}
注意:
a.属性名必须使用双引号括起来。
b.属性值可以string,number,true/false,null,object。
c.属性值如果是string,必须使用双引号括起来。
2)表示对象组成的数组
[{},{},{}...]
(3)使用json
1)java对象如何转换成json字符串?
使用jackson提供的api(ObjectMapper)。
2)将json字符串转换成javascript对象?
使用javascript内置对象JSON提供的parse()函数。
Servlet:
1.静态网页
?开发手册网页,百科,小说,新闻
?无论谁看结果都一样
?服务器直接保存一份HTML,并向浏览器发送此HTML
2.动态网页
?淘宝,微博
?每个人看的结果有差异
?服务器保存一个对象,由它动态拼一个网页,发送给浏览器
在Java中该对象是Servlet
3.Servlet的特征
?是满足规范(sun)的对象,也叫组件
?存储在服务器上
?可以动态的拼资源(HTML,IMG). 术语:处理HTTP协议
4.什么是Servlet?
?是sun推出的用来在服务器端处理HTTP协议的组件
是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
三.XML和HTML对比
1.XML
?可扩展(自定义)标记语言
?标记、属性、标记之间的关系都可以扩展
?用来存储或传输数据
2.HTML
?超文本标记语言
?标记、属性、标记之间的关系都是固定的(w3c)
?某些版本的HTML严格遵守XML规范
可以将HTML理解为标签固定的XML
1.什么是HTTP协议?
?就是W3C制定的一个规范
?规定了浏览器和服务器如何通信、通信的数据格式
2.GET和POST的区别
1)GET
采用路径传参
参数在传递过程中可见,隐私性差
路径大小有限制,所有传递的参数大小受限 2k
所有的请求默认都是GET请求
2)POST
采用实体内容传参
参数在传递过程中不可见,隐私性好
实体内容专门用来传参,大小不受限制
在表单上加method="post"
3)建议
参数需要保密时用POST
参数较多时用POST
3.Servlet运行原理
Jsp: jsp原理
1.jsp处理请求的过程
2.jsp翻译的详细过程
五.jsp隐含/内置对象(笔试题)
1.request() 客户端的请求信息被封装在request对象中,获得请求参数值,
?HttpServletRequest
2.response 响应客户请求的有关信息
?HttpServletResponse
3.out 用来传送回应的输出
?JSPWriter
?和PrintWriter一样
4.config 是ServletConfig的实例,用来读取servlet初始化参数。将jsp当作一个 servlet去配置。
ServletConfig
5.application servlet上下文,用户间数据的共享,同一应用内部才可以访问
?ServletContext
6.exception 针对错误网页(<%@page isErrorPage="true"%> 才能在jsp中 <%=exception.getMessage()%>)
?Throwable
7.session() 与请求有关的会话期
?HttpSession
?后面讲
8.page JSP 网页本身
?Object
?就是this,指代jsp生成的那个Servlet
9.pageContext(*) jsp页面上下文,只在自己的jsp可以访问到
?PageContext
?是一个管理者,通过它可以获得其他8个隐含对象
如何使用隐含对象?
?<%String user = request.getParameter("user");%>
?<%=request.getMethod()%>
整合: 什么是servlet?
sun公司制订的一种用来扩展web服务器功能的组件规范。
(1)扩展web服务器功能
a,早期的web服务器(比如,apache web server,iis等),只能够处理对静态资源(需要事先将html文件写好,
存放在服务器相应的文件夹下面)的请求。
b,如果用户的请求需要进行处理,需要对这些web服务器的功能进行扩展,即让这些web服务器能够处理动态资源的请求。
c,早期,使用cgi(common gateway interface)程序来扩展这些web服务器的功能。可以perl,c或者其它一些语言来开发cgi程序。开发这样的程序比较麻烦,需要解析请求参数,另外,程序的可移值性不好。 除此之外,每到服务器收到一个请求之后,会启动一个cgi进程,系统的开销比较大。
d,使用servlet可以扩展web服务器的功能。
当请求到达这些web服务器时,web服务器依据请求类型分别处理:如果是对静态资源的请求,比如,要访问某个.html文件,web服务器直接查找该文件即可;如果是对动态资源的请求,会调用servlet容器(是一种程序,负责调用servlet,并且提供servlet运行的环境)来处理。
servlet容器,比如tomcat,同时,也是一个完整的web服务器。所以,直接使用servlet容器充当web服务器也是可以的。
servlet不依赖某个特定的servlet容器
(2)组件规范
组件是按照规范开发、并且实现了部分功能的软件模块。组件需要部署到相应的容器里面才能运行。
所谓容器,指的是按照规范来开发的一种程序,该程序会提供组件的运行环境(主要指的为组件提供一些基础服务)。
什么是容器?
符合规范,提供组件运行环境的程序。
组件:servlet,监听器
容器:tomcat
5、servlet是如何运行的?
比如,当我们在浏览器地址栏输入了
http://localhost:8080/web01/sayHello?name=huahua
step1,浏览器依据ip,port连接服务器。
step2,浏览器将请求数据打包(依据http协议),发送请求。
step3,服务器收到请求之后,解析数据包,然后将解析之后的数据保存到request对象上。同时,服务器还会创建一个response对象。
step4,服务器接下来要依据请求资源路径(/web01/sayHello?name=huahua)找到web.xml,然后,创建对应的servlet对象。
step5,服务器调用servlet对象的service()方法,在调用该方法时,会将事先创建好的request,response对象作为 参数传递,所以,可以在service方法里,调用request获得请求参数值,也可以将处理结果写到response对象上。 这样做的好处是:开发人员在编写servlet时,不用关心网络编程相关的问题,比如,要获得请求参数值,就不用 去解析请求数据包,又比如,要向浏览器发送处理结果,也不用去创建响应数据包了。
step6,服务器从response对象里获取处理结果,生成一个响应数据包,发送给浏览器。浏览器从响应数据包里取出 相应的数据,生成对应的界面。
6、常见错误及解决办法
200为正确
(1)404
404是一个状态码(是一个三位数,由服务器发送给浏览器,表示不同的含义)。
404表示,依据请求资源路径,找不到对应的资源。
解决办法:按照http://ip:port/appname/servlet-url规则检查你的请求地址。
(2)405
405表示找不到service方法。
(3)500
500产生的原因,一般是系统出错。
解决办法:仔细检查程序代码(比如,有没有对用户输入的参数值进行非空的检查等等),另外,还要检查 程序对应的配置文件(web.xml)。
1)什么是servlet的生命周期?
servlet容器如何创建servlet对象、如何为其分配资源、调用其方法完成请求以及如何销毁servlet对象的整个过程。
Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找、创建以及整个生命周期的管理。
(2)生命周期的四个阶段
1)实例化
a,含义:指的是容器调用servlet的构造器,创建servlet对象。
b,什么时候实例化?
第一种情况:容器收到请求之后才创建servlet对象。(在默认情况下,容器只会为servlet创建唯一的一个实例。)
第二种情况:容器启动时,先创建好这个servlet对象(需要配置load-on-startup) <load-on-startup>参数1</load-on-startup>
参数值必须是>=0的整数,越小,优先级越高
<servlet>
<servlet-name>actionName</servlet-name>
<servlet-class>web.ActionServlet</servlet-class>
以上是关于整理的一些java面试题的主要内容,如果未能解决你的问题,请参考以下文章