Java 摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全
的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;它实现了热点代码检
测和运行时编译及优化,这使得 java 应用能随着运行时间的增加而获得更高的性能。
JDK:java 程序设计语言、java 虚拟机、java API 类库。Java API 类库中的 java SE API 子集
和 java 虚拟机这两部分统称为 JRE。
Java 技术关注的重点业务领域划分:
Card:支持一些 java 小程序运行在小内存设备上的平台。
ME:支持 java 程序运行在移动终端上的平台。
SE:支持面向桌面级应用的 java 平台。
EE:支持使用多层架构的企业应用。
运行时数据区:
1.程序计数器:一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号
指示器。Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的。
此内存区域是唯一一个在 java 虚拟机规范中没有规定任何 outofmemoryerror 情况的区域。
虚拟机栈:是线程私有的。它的生命周期与线程相同。虚拟机描述的是 java 方法执行
的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、
动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应于一个栈帧在
虚拟机栈中从入栈到出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛
出 stackoverflowerror 异常;如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存时
会抛出 outofmemoryerror 异常
3.本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执
行 java 方法服务,而本地方法栈则是为虚拟机使用到的 native 方法服务。
堆:java 堆是被所有线程共享的一块内存区域。用来存放对象实例。是垃圾收集器管
理的主要区域。现在收集器基本上都是采用的分代收集算法。
5.方法区:是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态
变量、即使编译器编译后的代码等数据。运行时常量池:是方法区的一部分。用于存放编译
期生成的各种字面量和符号引用。
如果使用直接指针访问方式,java 堆对象的布局中就必须考虑如何放置访问类型数据的相关
信息,reference 中直接存储的就是对象地址。
如果是内存泄漏,可进一步通过工具查看泄漏对象到 GC Roots 的引用链。掌握了泄漏对象
的类型信息,以及 GC Roots 引用链的信息,就可以比较准确的定位出泄漏代码的位置。
不存在泄漏,那么应当检查虚拟机的堆参数,与机器物理内存对比看是否可以调大。
为什么要了解 GC 和内存分配:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成
为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
我们只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态
的,垃圾收集器所关注的是这部分内存。
引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加
1,当引用失效时,计数器就减 1;任何时刻计数器都为 0 的对象就是不可能再被使用的。
有个例子:objA 和 objB 都有字段 instance,赋值令 =objB 及 =objA。
除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是他们因
为互相引用着对方,导致它们的引用计数都不为 0,于是引用计数算法无法通知 GC 收集器
回收他它们。
()。
虚拟机并没有因为这两个对象互相引用就不回收它们。说明虚拟机并不是通过引用计数算法
判断对象是否存活。
根搜索算法:通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,
搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此
对象是不可用的。
GC Roots 的对象包括下面几种:
虚拟机栈中的引用的对象;方法区中的类静态属性引用的对象;方法区中的常量引用的对象;
本地方法栈中 JNI 的引用的对象。
对象回收:首先对象在进行跟搜索后发现没有与 GC Roots 相连接的引用链,那它将会被第
一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize()的方法。当对象
没有覆盖 finalize()方法或者 finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为
“没有必要执行”。如果这个对象被判定为有必要执行 finalize()方法,那么这个对象将会
被放置在一个名为 F-Queue 的队列中,并在稍后由一条有虚拟机自动建立的、低优先级的
finalizer 线程去执行。这时,在进行第二次小规模的标记,如果此时有对象重新与引用链的
任何一个对象建立关联,那么就被移除出“即将回收”的集合。剩下的,就等着回收。
垃圾收集算法:
1.最基础的收集算法是“标记-清除”算法:首先标记出所有需要回收的对象,在标记完成后统
一回收所有被标记的对象。缺点:效率不高;会产生大量不连续的内存碎片。
2.复制算法。将内存容量划分为大小的两块。每次只使用其中的一块。当这一块的内存用完
了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
3.标记-整理算法:标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进
行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
4.分代收集算法:根据对象的存活周期的不同将内存划分为几块。一般是把 java 堆分为新生
代和老生代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃
圾收集时发现大批对象死去,只有少量存活,那么选用复制算法。在老生代中,对象存活率
高,没有额外的空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行
回收。
23 种设计模式:
1.抽象工厂模式:
他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模
式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象
类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂
模式所提供的产品则是衍生自不同的接口或抽象类。
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品
族进行约束。 产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产
品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划
分是非常重要的。
2.工厂方法模式:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延
迟到其子类。
优点:可以使代码结构清晰,有效地封装变化;对调用者屏蔽具体的产品类;降低耦合度。
3.单例模式:
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机
系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
这些应用都或多或少具有资源管理器的功能。
Singleton 通过将构造方法限定为 private 避免了类在外部被实例化,在同一个虚拟机范围内,
Singleton 的唯一实例只能通过 getInstance()方法访问。
由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现
何种功能,整个应用程序都会同享一个实例对象。
4.代理模式:
代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用.
代理模式涉及的角色:
1:抽象主题角色.声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用
代理主题代替.
2:代理主题角色.含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供
和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不
但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些
操作.
3:真实代理对象.定义了代理角色所代表的具体对象.
java 对代理模式的支持 ---动态代理
上面的代理,我们强迫代理类 RedWineProxy 实现了抽象接口 SellInterface.这导致我们的代理
类无法通用于其他接口,所以不得不为每一个接口实现一个代理类.幸好,java 为代理模式提
供了支持.
java 主要是通过 Proxy 类和 InvocationHandler 接口来给实现对代理模式的支持的.
通过上面的代码可以看出,代理主题 ProxyObject 类并没有实现我们定义的 SellInterface 借口,
而是实现了 java 的 InvocationHandler 接口,这样就把代理主题角色和我们的业务代码分离开
是实现了 java 的 InvocationHandler 接口,这样就把代理主题角色和我们的业务代码分离开来,
使代理对象能通用于其他接口. 其实 InvocationHandler 接口就是一种拦截机制,当系统中有
了代理对象以后,对原对象(真实主题)方法的调用,都会转由 InvocationHandler 接口来处理,并
把方法信息以参数的形式传递给 invoke 方法,这样,我们就可以在 invoke 方法中拦截原对象
的调用,并通过反射机制来动态调用原对象的方法来,使代理对象能通用于其他接口.
5.责任链模式:
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引
用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不
影响客户端的情况下动态地重新组织和分配责任。
6.观察者模式:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这
个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
观察者模式的组成:
1.抽象主题角色
2.抽象观察者角色:
3.具体主题角色(Watched):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角
色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般
用一个抽象类或接口来实现。
4.具体观察者角色(Watcher):为所有具体的观察者定义一个接口,得到主题的通知时更新自
己
1.抽象主题角色类
2.抽象观察者角色
3.具体主题角色(Watched)
4.具体观察者角色(Watcher)
从 开始图形系统的事件模型采用观察者模式,因此观察者模式在 Java 语言中的地
位极其重要。在 xml 解析中的 SAX 也采用了观察者模式来实现。Java 也提供了对观察者模
式的内置支持
7.策略模式:
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让
算法的变化独立于使用算法的客户。策略模式的好处在于你可以动态的改变对象的行为。
策略模式中有三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2) 抽象策略对象:它可由接口或抽象类来实现。
(3) 具体策略对象:它封装了实现同不功能的不同算法。
Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素
(Elements)。一些 Collection 允许相同的元素而另一些不行。一些能排序而另一些不行。
所有实现 Collection 接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建
一个空的 Collection,有一个 Collection 参数的构造函数用于创建一个新的 Collection,这个
新的 Collection 与传入的 Collection 有相同的元素。后一个构造函数允许用户复制一个
Collection。
List 是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用
索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,这类似于 Java 的数
组。除了具有 Collection 接口必备的 iterator()方法外,List 还提供一个 listIterator()方法,返
回一个 ListIterator 接口,和标准的 Iterator 接口相比,ListIterator 多了一些 add()之类的方法,
允许添加,删除,设定元素,还能向前或向后遍历。
LinkedList 实现了 List 接口,允许 null 元素。此外 LinkedList 提供额外的 get,remove,insert
方法在 LinkedList 的首部或尾部。这些操作使 LinkedList 可被用作堆栈(stack),队列
(queue)或双向队列(deque)。
注意 LinkedList 没有同步方法。如果多个线程同时访问一个 List,则必须自己实现访问同步。
一种解决方法是在创建 List 时构造一个同步的 List:
List list = (new LinkedList(...));
ArrayList 实现了可变大小的数组。它允许所有元素,包括 null。ArrayList 没有同步。size,
isEmpty,get,set 方法运行时间为常数。但是 add 方法开销为分摊的常数,添加 n 个元素需
要 O(n)的时间。其他的方法运行时间为线性。
Vector 非常类似 ArrayList,但是 Vector 是同步的。由 Vector 创建的 Iterator,虽然和 ArrayList
创建的 Iterator 是同一接口,但是,因为 Vector 是同步的,当一个 Iterator 被创建而且正在
被使用,另一个线程改变了 Vector 的状态(例如,添加或删除了一些元素),这时调用 Iterator
的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。
Stack 继承自 Vector,实现一个后进先出的堆栈。Stack 提供 5 个额外的方法使得 Vector 得
以被当作堆栈使用。基本的 push 和 pop 方法,还有 peek 方法得到栈顶的元素,empty 方法
测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置。Stack 刚创建后是空栈。
Set 是 一 种 不 包 含 重 复 的 元 素 的 Collection , 即 任 意 的 两 个 元 素 e1 和 e2 都 有
(e2)=false,Set 最多有一个 null 元素。很明显,Set 的构造函数有一个约束条件,传
入的 Collection 参数不能包含重复的元素。
请注意,Map 没有继承 Collection 接口,Map 提供 key 到 value 的映射。一个 Map
中不能包含相同的 key,每个 key 只能映射一个 value。Map 接口提供 3 种集合
的视图,Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组
key-value 映射。
Hashtable 继 承 Map 接 口 , 实 现 一 个 key-value 映 射 的 哈 希 表 。 任 何 非 空
(non-null)的对象都可作为 key 或者 value。添加数据使用 put(key, value),取
出数据使用 get(key),这两个基本操作的时间开销为常数。
Hashtable 通过 initial capacity 和 load factor 两个参数调整性能。通常缺省的 load
factor 较好地实现了时间和空间的均衡。增大 load factor 可以节省空间但
相应的查找时间将增大,这会影响像 get 和 put 这样的操作。
HashMap 和 Hashtable 类似,不同之处在于 HashMap 是非同步的,并且允许
null,即 null value 和 null key。,但是将 HashMap 视为 Collection 时(values()
方法可返回 Collection),其迭代子操作时间开销和 HashMap 的容量成比例。因
此,如果迭代操作的性能相当重要的话,不要将 HashMap 的初始化容量设得过
高,或者 load factor 过低。
TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的
Comparator 进行排序,具体取决于使用的构造方法。此实现不是同步的。
Collections 工具类:
Arrays:用于操作数组工具类,里面定义了常见操作数组的静态方法。
常见的有:二分查找。排序。将数组变成字符串。
平衡二叉树:
题目:定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数
min、push 以及 pop 的时间复杂度都是 O(1)。
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个
辅助栈。每次 push 一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元
素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push 到辅助栈中;
每次 pop 一个元素出栈的时候,同时 pop 辅助栈。
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个
子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结
点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如
果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回
到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保
返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上
是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过
程。
题目:输入 n 个整数,输出其中最小的 k 个。
例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4。
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点
都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
用两个栈实现队列:
当 m_stack2 中不为空时,在 m_stack2 中的栈顶元素是最先进入队列的元素,可以 pop 出去。
如果 m_stack2 为空时,我们把 m_stack1 中的元素逐个 pop 出来并 push 进入 m_stack2。由
于先进入队列的元素被压到 m_stack1 的底端,经过 pop 和 push 之后就处于 m_stack2 的顶
端了,又可以直接 pop 出去。
反转链表:
网易游戏,网易邮箱,有道搜索,网易博客,网易相册,网易泡泡,
网易笔试:
Select * from User where id < any(select id from User where age > All(select age from User)).
top 5 photoid from photo,user where = and userid=”dragon” order
by accesscount des;
view middle as select userid, sum(size) as total_size from photo group by userid order by
total_size
Select top 10 userid from middle;
C.索引可以加快查询速度。
数据库连接池的作用,设计连接池的时候有哪些注意事项。 .
数据库连接池负责分配、管理和释放数据库连接,数据库连接池在初始化时将创建一定数量
的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论
这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最
大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接
数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最
大连接数的设置要考虑到下列几个因素: 1) 最小连接数是连接池一直保持的数据库连
接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据
库连接请求将被加入到等待队列中,这会影响之后的数据库操作。说出数据连接池的工作机
制是什么? J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连
接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为“忙”。如
果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。
当使用的池连接调用完成后,池驱动程序将此连接表记为“空闲”,其他调用就可以使用这个
连接。
两阶段提交协议:
可以保证数据的强一致性,许多分布式关系型数据管理系统采用此协议来完成分布式事务。
它是协调所有分布式原子事务参与者,并决定提交或取消(回滚)的分布式算法。同时也是
解决一致性问题的一致性算法。在两阶段提交协议中,系统一般包含两类机器(或节点):
一 类 为 协 调 者 ( coordinator ), 通 常 一 个 系 统 中 只 有 一 个 ; 另 一 类 为 事 务 参 与 者
(participants,cohorts 或 workers),一般包含多个,在数据存储系统中可以理解为数据副本
的个数。协议中假设每个节点都会记录写前日志(write-ahead log)并持久性存储,即使节
点发生故障日志也不会丢失。协议中同时假设节点不会发生永久性故障而且任意两个节点都
可以互相通信。当事务的最后一步完成之后,协调器执行协议,参与者根据本地事务能够成
功完成提交事务或者回滚事务。
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割
的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么
都执行,要么都不执行。
数据库事务必须具备 ACID 特性,ACID 是 Atomic(原子性)、Consistency(一致性)、
Isolation(隔离性)和 Durability(持久性)的英文缩写。
原子性:指整个数据库事务是不可分割的工作单位。只有使据库中所有的操作执行成功,
才算整个事务成功;事务中任何一个 SQL 语句执行失败,那么已经执行成功的 SQL 语句也
必须撤销,数据库状态应该退回到执行事务前的状态。
一致性:指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银
行转帐事务,不管事务成功还是失败,应该保证事务结束后 ACCOUNTS 表中 Tom 和 Jack
的存款总额为 2000 元。
隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各
自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务
查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改
它之后的状态,事务不会查看到中间状态的数据。
持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使
发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
Java classloader 原理:
当我们写好一个 Java 程序之后,不是管是 CS 还是 BS 应用,都是由若干 个.class 文件组织
而成的一个完整的 Java 应用程序,当程序在运行时,即会调用该程序的一个入口函数来调
用系统的相关功能,而这些功能都被封装在不同的 class 文件当中,所以经常要从这个 class
文件中要调用另外一个 class 文件中的方法,如果另外一个文件不存在的,则会引发系统异
常。而程序在启动的时候,并不会一次性加载程序所要用的所有 class 文件,而是根据程序
的需要,通过 Java 的类加载机制(ClassLoader)来动态加载某个 class 文件到内存当中的,
从而只有 class 文件被载入到了内存之后,才能被其它 class 所引用。所以 ClassLoader 就是
用来动态加载 class 文件到内存当中用的。
原理: ClassLoader 使用的是双亲委托模型来搜索类的,每个 ClassLoader 实例都有一个父
类加载 器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(Bootstrap
ClassLoader)本身没有父类加载器,但可以用作其它 ClassLoader 实例的的父类加载器。当
一个 ClassLoader 实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委
托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的类加载器 Bootstrap
ClassLoader 试图加载,如果没加载到,则把任务转交给 Extension ClassLoader 试图加载,如
果也没加载到,则转交给 App ClassLoader 进行加载,如果它也没有加载得到的话,则返回
给委托的发起者,由它到指定的文件系统或网络等 URL 中加载该类。如果它们都没有加载
到这个类时,则抛出 ClassNotFoundException 异常。否则将这个找到的类生成一个类的定义,
并将它加载到内存当中,最后返回这个类在内存中的 Class 实例对象。
1、简单说说 tomcat 的配置?
JAVA_HOME=JDK 的根目录
CATALINA_HOME=tomcat 的根目录
CATALINA-HOME\conf\:可以配置 tomcat 的端口,可以配置 tomcat 中下连接池。
CATALINA-HOME\common\lib:存放公用的类包
在 My eclipse 中如何配置 tomcat
在 eclipse 中,选择 windows->preference->MyEclipse->ApplicationServer->Tomcat
选择 Tomcat 的安装目录,并选择 TomCat 所需的 jdk,选择 enable,确定即可。
2、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?
jsp:include:在运行时调用另一个页面,变量是可以重复的。
<%@include file=””%>:在转译时合在一起,会成为同一个类,变量不可以重复。
3、forward 和 redirect 的区别?
forward: 转发,在下一个页面中,request 保留上一个页面中的 request 的所有值
redirect: 跳转,不传递 request 对象。
4、Servlet 的体系结构是什么?
Servlet
GenericServlet
HttpServlet
自定义
5、如何实现一个自定义的 servlet?
extends HttpServlet 并覆盖 doPost 或 doGet 方法
在 中进行部署
6、Servlet 的生命周期是什么?
Init
多次执行 doGet 或 doPost
destroy
7、jsp 就是一个 servlet 是否正确?
对
8、请罗列 jsp 中的脚本、指令及动作?
脚本
<%%> <%=%> <%!%> <%----%>
指令
<%@page contentType=”text/html;charset=utf-8” language=”java” import=””%>
<%@include file=””%>
<%@taglib uri=”” prefix=””%>
动作:
<jsp:useBean class=”” id=”” scope=””> 在 scope 中如果没有实例化一个对象,
如果有直接用以前的。
<jsp:getProperty name=”” property=””> 向一个 bean 中设置属性值
<jsp:forward > jsp 页的转发
<jsp:include page=””> 导入一个 jsp 页面
数据库:
Sqlserver:
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*(页数-1) id
FROM 表
ORDER BY id))
ORDER BY ID
--pageSize=5 页大小
--pageIndex=2 所要的页
--如果有主键可以,没以及键不行
select top 5 *
from aa where a1 not in
(select top 5 a1 from aa order by a1)
order by a1;
oracle:
select * from '||v_sql||' where rownum<'||
pageLastRow||'minus select * from '||v_sql
||' where rownum<'||pageFirstRow;
Session
先取出数据中的所有信息封装到对象并保存在 session 中,转发到 jsp 页面做如下处理。
<table border="1">
<tr>
<td>a1</td>
<td>a2</td>
</tr>
<%
List l=(List)("as");
//一页显示多少行
int pageSize=3;
//总页数
int pageCount=0;
int currentPage=1;
if(l!=null && ()>0)
{
pageCount=(()/pageSize)+(()%pageSize==0?0:1);
if(("page")!=null)
{
currentPage=(("page"));
}
if(currentPage<1)
{
currentPage=1;
}
if(currentPage>pageCount)
{
currentPage=pageCount;
}
for (int i = (currentPage-1)*pageSize; i <(currentPage-1)*pageSize+pageSize; i++)
{
if(i>=())
{
break;
}
Aa aa=(Aa)(i);
%>
<tr>
<td><%=()%></td>
<td><%=()%></td>
</tr>
<%
}
}
%>
<tr>
<td colspan="2">
<%
if(currentPage!=1)
{
%>
<a href="
<a href="
<%
}
if(currentPage!=pageCount)
{
%>
<a href="
<a href="
<%
}
%>
</td>
</tr>
</table>
11、include 的两种实现方式的区别?
<@include file>:在将 jsp 生成 servlet 类前将两个文件和在一起,生成一个 java 类,一起运行
的。所以是一家子,当中的变量名不能重名。
<jsp:include page>:是两个类,是一个调用关系,在运行时动态的调用,不是一家子,可以重
复变量。
12、jsp 页面中两种跳转方式分别是什么?有什么区别?
转发: 保留上次的 request
<jsp:forward>
(“”);
();
(“”).forward(request,response)
跳转:不保留上次的 request
(“”)
13、描述 JSP 和 Servlet 的区别、共同点、各自应用的范围
Jsp 主要在于页面的显示动态生成页面,可以与 html 标记一起使用,其还是要生成为一个
servlet。
Servlet:主要是控制的处理,如调用业务层,跳转不同的 jsp 页面。
Mvc:
Jsp:v
Servlet:c
14、在 JSP 中如何读取客户端的请求,如何确定某个 Jsp 文件的真实路径?
(“”)
<%=("") %>
15、描述 Cookie 和 Session 的作用,区别和各自的应用范围,Session 工作原理。
Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有
限。
Session:保存在服务端,每一个 session 在服务端有一个 sessionID 作一个标识。存储的数据
量大,安全性高。占用服务端的内存资源。
16、说明 Jsp 中 errorPage 的作用,应用范围。
正常页面中
%@page erropage=””%
错误页面
<%@page iserrorpage=”true”%>
有一内置对象:exception
17、介绍在 Jsp 中如何使用 JavaBeans
<jsp:useBean class=”” id=”” scope=””/>
<%
New 类();
%>
19、简单介绍 JSP 的标记库
做一个标记处理类 extends TagSupport
通过 tld 说明标记处理的类的前缀及后缀
在 中说明 tld 文件
<taglib>
<taglib-uri>
<taglib-location>
<taglib>
在 jsp 页面是引用 tld<%@taglib uri=”” prefix=””%>
20、Servlet 中的核心类有那些,各有什么特点?
ServletContext:容器,放置全局变量
setAtribute()
getAttribute()
ServletConfig:一个 servlet 的配置
getInitParameter(”名称”)
HttpServletRequest:封装的所有的请求
getParameterValue(”名称”)
getParameterValues(”称”)
getSession();
getAttribute(” 名称”);
getRequestDispatch(””).forward(request,response)
HttpServletResponse:响应
getOut();
sendRedirect(””)
HttpSession:一个用户多个页面共享同一变量
setAttribute(””,””)
21、Servlet 中重要的包有那些,有什么区别?
.*;.*;
22、说出 Servlet 的生命周期,并说出 Servlet 和 CGI 的区别?
Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service
方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例销
毁的时候调用其 destroy 方法。
与 cgi 的区别在于 servlet 处理服务器进程中,它通过多线程方式运行其 service 方法,一个
实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,
服务完成后就销毁,所以效率上低于 servlet。
23、什么情况下调用 doGet()和 doPost()?
Jsp 页面中的 form 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用
doPost()。
25、如何现实 servlet 的单线程模式
在 doGet 及 doPost 方法前加入 synchoronized
JSP:
<%@ page isThreadSafe="true"%>
27、Request 对象的主要方法:
setAttribute(String name,Object):设置名字为 name 的 request 的参数值
getAttribute(String name):返回由 name 指定的属性值
getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的 Body 的长度
实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有 name 指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚
举的实例
getParameterValues(String name):获得有 name 指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的 IP 地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关 Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性
28、我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso8859-1 等,如何输出
一个某种编码的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(("ISO-8859-1"), "GBK");
tempStr = ();
}
catch (Exception e) {
(());
}
return tempStr;
}
30、Servlet 执行时一般实现哪几个方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()