HashMap&Hashtable:
Map接口的实现类,将惟一键映射到特定的值上:<key,value>.
HashMap 允许key或value为null.
Hashtable的方法是Synchronize的.多个线程访问Hashtable时,不需要为方法实现同步.
Collection &Collections:
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法.
Collection是个java.util下的接口,它是各种集合结构的父接口.
Set里的元素是不能重复的,用iterator()方法来区分重复与否.
equals()是判读两个Set是否相等.equals()和==方法决定引用值是否指向同一对象.
equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值.
ArrayList&Vector:
同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快.
Collection –List(LinkedList| ArrayList| Vector(Stack)) & Set
Map (Hashtable ,HashMap …)
Java不支持多继承,某个类或对象要使用分别在几个类或对象里面的方法或属性,使用接口有更高的灵活性:接口中没有任何实现代码.当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口.
一个类被声明为final类型,表示该类不能被继承,是顶级类
匿名的内部类是没有名字的内部类.不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现.
静态内部类:创建一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的对象访问外部类对象
Overload&Override:
重写Overriding是父类与子类之间多态性的一种表现,
重载Overloading是一个类中多态性的一种表现.
如果在子类中定义某方法与其父类有相同的名称和参数:该方法被重写 (Overriding).子类的对象使用这个方法时,将调用子类中的定义,.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型:方法的重载.
Overloaded的方法是可以改变返回值的类型.
抽象类与接口都用于抽象,但是抽象类可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能).
接口可以继承接口.抽象类可以实现接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数.
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading.
垃圾回收的优点和原理.并考虑2种回收机制.
垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域".
回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收.
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 会执行,在return前执行.
运行时异常与一般异常有何异同?
方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常
线程:
线程同步的方法.
wait():使一个线程处于等待状态,并且释放所持有的对象的lock.
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常.
notify():唤醒一个处于等待状态的线程,不能确切的唤醒某个等待状态的线程,由JVM确定,而且不是按优先级.
Allnotity():唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争.
sleep() 和 wait() 有什么区别?
sleep()方法是使线程停止一段时间的方法.在sleep 时间间隔期满后,线程不一定立即恢复执行.这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞.wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到.
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run()方法可以产生必须退出的标志来停止一个线程.
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问.
多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
谈谈final, finally, finalize的区别.
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
&和&&的区别.&是位运算符.&&是布尔逻辑运算符.
String s = new String("xyz");创建了几个String Object?
两个对象,一个是"xyx",一个是指向"xyx"的引用对象s.
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型.可修改为s1 =(short)(s1 + 1) .short s1 = 1; short s1 = 1;s1 += 1正确.
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 不对,有相同的hash code.
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,这里是值传递.Java 编程语言只由值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用.对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式.因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte.long,string 都不能作用于swtich.
作用域public,private,protected,以及不写时的区别
作用域当前类同一package 子孙类其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
float型float f=3.4是否正确? 不正确.精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
STRING与StringBuffer的区别.
STRING的长度是不可变的, StringBuffer的长度是可变的.如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。
JAVA类实现序列化的方法(二种)如在COLLECTION框架中,实现比较要实现什么样的接口?
JAVA类实现序例化的方法是实现java.io.Serializable接口
Collection框架中实现比较要实现Comparable 接口和 Comparator 接口
char型变量中能不能存贮一个中文汉字?为什么?
是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的
JDBC,xml,JSP,Servlet
JavaScript如何校验数字型?
var re=/^d{1,8}$|.d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null) {
sign=-4;
break;
}
else document.form1.all(i).value=parseFloat(str);
数据库方面:
存储过程和函数的区别
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,
而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表.
事务是什么?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行.
一致性:事务在完成时,必须使所有的数据都保持一致状态.在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性.事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的.
隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离.事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据.这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同.
持久性:事务完成之后,它对于系统的影响是永久性的.该修改即使出现系统故障也将一直保持.
游标的作用?如何知道游标已经到了最后?
游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后.
触发器分为事前触发和事后触发,这两种触发有和区别.语句级触发和行级触发有何区别.
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后.通常事前触发器可以获取事件之前和新的字段值.语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次.
xml有哪些解析技术?区别是什么? 有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问.
SAX:不同于DOM,SAX是事件驱动型的XML解析方式.它顺序读取XML文件,不需要一次全部装载整个文件.当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 .
STAX:Streaming API for XML (StAX)
你在项目中用到了xml技术的哪些方面?如何实现的?
用到了数据存贮,信息配置两方面.在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理.在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中.
Class.forName的作用?为什么要用? 调用该访问返回一个以字符串指定类名的类的对象.
JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API.JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用).这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上.另外,JDO很灵活,因为它可以在任何数据底层上运行.JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强.
Servlet的生命周期?
servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束.这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达. àServlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doGet/doPost,当服务器决定将实例销毁的时候调用其destroy方法.
jsp有哪些内置对象?作用分别是什么?
request用户端请求,此请求会包含来自GET/POST请求的参数. | 表示HttpServletRequest对象.它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法
response网页传回用户端的回应
表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
pageContext网页的属性是在这里管理 | 表示一个javax.servlet.jsp.PageContext对象.它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法
session与请求有关的会话期
表示一个请求的javax.servlet.http.HttpSession对象.Session可以存贮用户的状态信息
application servlet 正在执行的内容
表示一个javax.servle.ServletContext对象.这有助于查找有关servlet引擎和servlet环境的信息
out用来传送回应的输出
是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果
config servlet的构架部件
表示一个javax.servlet.ServletConfig对象.该对象用于存取servlet实例的初始化参数.
page JSP网页本身 |表示从该页面产生的一个servlet实例
exception针对错误网页,未捕捉的例外
jsp有哪些动作?作用分别是什么?
jsp:include:在页面被请求的时候引入一个文件.
jsp:useBean:寻找或者实例化一个JavaBean.
jsp:setProperty:设置JavaBean的属性.
jsp:getProperty:输出某个JavaBean的属性.
jsp:forward:把请求转到一个新的页面.
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
四种会话跟踪技术/会话作用域:
page与一个页面相关的对象和属性.
request与Web 客户机发出的一个请求相关的对象和属性.
session与某个 Web 客户机的一个用户体验相关的对象和属性.
application与整个 Web 应用程序相关的对象和属性.
JSP中动态INCLUDE与静态INCLUDE的区别?
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.htm" %>
两种跳转方式分别是什么?有什么区别?
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面.执行完后还会回来,相当于函数调用.并且可以带参数.后者完全转向新页面,不会再回来.相当于go to 语句.
JAVA Servlet API中forward() 与redirect()的区别?
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接.这样,从浏览器的地址栏中可以看到跳转后的链接地址.所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接.在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法.
JSP页面里是怎么分页的?
页面需要保存以下参数:
总行数:根据sql语句得到总行数
每页显示行数:设定值
当前页数:请求参数
页面根据当前页数和每页行数计算出当前页第一行行数,定位结果集到此行,对结果集取出每页显示行数的行即可.
j2ee中的几种常用模式:
Session Facade Pattern:使用SessionBean访问EntityBean
Message Facade Pattern:实现异步调用
EJB Command Pattern:使用Command JavaBeans取代SessionBean,实现轻量级访问
Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性
Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性
Business Interface:通过远程/本地接口和Bean类实现相同接口规范业务逻辑一致性
开发中都用到了那些设计模式?用在什么场合?
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心.通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作.主要用到了MVC的设计模式.用来开发JSP/Servlet或者J2EE的相关应用.简单工厂模式等.
J2EE中常用的名词解释:
web 容器:给处于其中的应用程序组件:JSP,Servlet提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互. EJB容器:提供给运行在其中的组件EJB各种管理功能.只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理.并且可以通过现成的接口来获得系统级别的服务.例如邮件服务、事务管理.
JNDI:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序.
JMS:JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.
JTA:JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.
RMI/IIOP:主要用于通过远程调用服务.例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用.当然这是要通过一定的规范才能在异构的系统之间进行通信.RMI是JAVA特有的.
SSH:
Hibernate工作原理及为什么要用?
读取并解析配置文件à读取并解析映射信息,创建SessionFactoryà打开Sesssionà创建事务Transation
à持久化操作à提交事务à关闭Session à关闭SesstionFactory
1.Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码.
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO层的编码工作
3.Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性.
4.Hibernate的性能非常好是轻量级框架.映射的灵活性很出色.支持各种关系数据库,从一对一到多对多的各种复杂关系.
Hibernate是如何延迟加载?
1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能.
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
Hibernate的缓存机制
1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2. 二级缓存: a) 应用级缓存b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现
Hibernate的查询方式
Sql、Criteria,object comptosition Hql (属性查询,参数查询.命名参数查询,关联查询,分页查询,统计函数)
如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰
Struts工作机制?为什么要使用Struts?
工作机制:
Struts的工作流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象当ActionServlet接收到一个客户请求时,将执行如下流程.
-(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
-(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
-(4)如果ActionForm的validate()返回null或返回一个不包含ActionMessage的ActuibErrors对象, 表示表单验证成功;
-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
-(6)Action的execute()返回ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
为什么要用:
JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能.但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生.
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
STRUTS的应用(如STRUTS架构)
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework. 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架. Struts有如下的主要功能:
一.包含一个controller servlet,能将用户的请求发送到相应的Action对象.
二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用.
三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息.
Struts的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用.
Struts的设计模式
MVC模式: web应用程序启动时就会加载并初始化ActionServlet.用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据, ActionServlet根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute().execute()从ActionForm对象中获取数据,完成业务逻辑,返回ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户.
MVC的各个部分都有那些技术来实现?如何实现?
MVC是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现.这些组件可以进行交互和重用.
spring工作机制及为什么要用?
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端.
为什么用:
AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中.使用 AOP 后,公共服务 (比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性.
IOC允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象.正如单词倒置所表明的,IOC 就像反过来的 JNDI.没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的.因此是由容器管理协作对象(collaborator).
Spring即是一个AOP框架,也是一IOC容器. Spring 最好的地方是它有助于您替换对象.有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象).然后可以很容易地在需要时替换具有类似接口的协作对象.
Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现.每个模块的功能如下:
☆核心容器:核心容器提供 Spring 框架的基本功能.核心容器的主要组件是 BeanFactory,它是工厂模式的实现.BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开.
☆ Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息.Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能.
☆ Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中.所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP.Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务.通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中.
☆ Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息.异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接).Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构.
☆ Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map.所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构.
☆ Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文.所以,Spring 框架支持与 Jakarta Struts 的集成.Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作.
☆ Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现.通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI.
Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境.Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象.毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用.
IOC 和 AOP
控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器(在 Spring 框架中是 IOC 容器) 负责将这些联系在一起.
在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法.
面向方面的编程
面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化.AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中.
AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题.在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能.在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上.当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码.所以,用 Spring AOP 编写的应用程序代码是松散耦合的.
AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中.
IOC 容器
Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用.这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介.下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象.BeanFactory 也可以管理对象之间的关系.
BeanFactory 支持两个对象模型.
□单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索.Singleton 是默认的也是最常用的对象模型.对于无状态服务对象很理想.
□原型模型确保每次检索都会创建单独的对象.在每个用户都需要自己的对象时,原型模型最适合.
bean 工厂的概念是 Spring 作为 IOC 容器的基础.IOC 将处理事情的责任从应用程序代码转移到框架.正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系.
学习Struts,你有什么收获: 你在用Struts做项目的过程中感到Struts有什么用.
分层:职责单一.最重要的是:数据与显示分开. MVC框架又把显示分离出了控制.
JSP只专注于显示,控制交给Servlet.控制器的职责:得到表单数据,调用模型,转向.
Struts框架是经典的MVC,ActionServlet根据URL进行分发到不同的Action.
ActionMapping:一次业务请求对应一个具体的Action配置信息.
Action:创建Action,放到Map里.执行execute方法.返回ActionForward:
在Action中不要混入业务逻辑层的代码.在业务逻辑层抛出异常,在Action中捕捉和处理.
声明式异常:ExceptionHandler.默认转到input.配置了path,path优先input.
ActionForm:创建ActionForm实例,放到scope里,收集数据放到ActionForm里.
Converter转换器:把表单中的字符串转成ActionForm中指定的类型.
表单级验证:验证表单数据,注意与异常概念上的区别.默认转向到input指向的页面.
ActionForward:封装了转向信息.可以定义成转发或重定向.
动态创建ActionForward,动态修改URL比如参数的添加.
DispatchAction:一个模块CRUD可以得到统一处理.方法参数和返回值必须和execute一样.
页面的调用的参数值必须和方法名一样.动态调用.参数需要执行,采用parameter属性.
Hibernate:
* 关联映射: 2009.9.24-9.26
对象模型-关系模型.
实体类的普通数据--映射文件中的property.
实体类的引用,Set--对应实体类的映射文件的标签:
many-to-one,one-to-one,one-to-many,many-to-many
注意理解对应实体类的映射文件:
如果某个实体类有引用对象,或者引用关联对象的集合.
那么在这个实体类对应的映射文件中就有响应的标签来关联这种关系.
如果没有引用或集合,那么这个实体类对应的映射文件就只是property了.
约定:
单向关联:A->B.加载方A,被加载方:B.
双向关联A<->B.
A->B:加载方A -> 被加载方:B.
B->A:绝对即A<->B,A在左,A:加载方,B:被加载方.
被加载方B -> 加载方A.
加载方,即从一方加载到另一方的第一方.
如果加载方对象模型中有引用,就在加载方的映射文件中配置关系标签.
如果被加载方也有对象的引用,也在被加载方配置关系标签.
单向的,就是从加载方加载到被加载方.
双向的,除了提供从加载方加载到被加载方,还会提供从被加载方加载到加载方(绝对的,从加载方看).
相对来说,也是从加载方加载到被加载方看(从被加载方主动加载来看)
一般配置双向关联的映射文件,从加载方加载到被加载方,配置跟单向一样.
从被加载方加载到加载方(绝对),要在被加载方持有加载方的引用对象,
在被加载方中添加标签,指示如何加载加载方.
1.多对一关联:
加载方配置<many-to-one>,会在多的一端加入一个(字段)外键,指向一的一端(参照一的一端的主键).
2.一对一主键关联:
加载方加入one-to-one标签,指示hibernate怎么加载它的关联对象:默认根据主键加载.
让两个实体对象的id(主键)保持相同, 加载方主键生成策略是foreign,被加载方是native.
就可以根据加载方的id找到被加载方的id,因为是主键值相同,所以可以加载.
必须配置constrained="true":表明当前主键上存在一个外键约束,主键作为外键参照了另一个表的主键
双向:被加载方的对象模型持有加载方的引用.在被加载方也配置one-to-one标签,
默认根据主键加载.不用配置constrained
3.一对一唯一外键关联:
在加载方加入外键.采用<many-to-one>标签,many-to-one会在多的一端添加一个外键指向一的一端.
因为是外键可以重复,指定多的一端的unique=true,限制了多的一端的多重性为一. 就映射一对一唯一外键关联.
双向:在被加载方采用one-to-one标签,指定如何加载关联对象,默认根据主键加载,
必须指定property-ref,因为是外键关联,不再通过主键加载,而是通过外键加载.
4.一对多关联:
一的一端持有多的一端的集合引用.在一的端,即加载方勇set集合来映射.
在加载方配置one-to-many标签.在多的一端,即被加载方加入外键,指向加载方.
一对多单向关联,存储加载方时(一的一端),要先存储被加载方(多的一端).
会发出多余的 update语句更新外键的值.因为维护关系是在一的一端.
如果设置外键非空,就加不上数据.通常做成双向关联.维护的关系是从多指向一.在多的一端来存储.
双向:多的一端存储,要先存储一的一端,就不会发出多余的update语句.关系是多指向一.
并使一的一端失效设置inverse属性.不维护一指向多的关系了.交给多的一端来维护.
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
(Person->Group)在多的一端添加many-to-one标签.
5.多对多关联:
many-to-many,借助第三方表完成映射.分别添加两个外键分别指向两张表的主键.
双向:字段名必须一致.
* hibernate flush:按照save(insert),update、delete顺序提交相关操作
* hibernate支持lazy策略只有在session打开状态下有效,否则抛出LazyInitializationException异常
[关于Hibernate的lazy] 2009.9.26顿悟...
1.lazy:只有真正使用该对象时,才会创建,对于hibernate而言,真正使用的时候才会发出sql. lazy特性只对普通属性起作用
2.理解这句话:
load加载对象时,由于是对象,所以支持延迟加载,不会发出select语句.
使用对象时,就是使用对象里的属性.由于是属性,不支持延迟加载,会马上发出SQL语句.
如果通过load加载到的对象,这个对象还有一个引用对象,通过get方法得到该引用对象,
由于得到的是一个对象,所以也支持延迟加载,是不会发出select语句的.
只有使用该引用对象的属性时,由于lazy属性只对普通属性起作用,所以这时会发出SQL语句.
3.总之:
如果加载上来的是对象,那么会延迟加载,HIbernate帮我们生成的是一个代理对象,是不会发出select语句.
只有真正使用对象时,即要使用对象里的属性时,才会发出SQL语句的.
4.hibernate支持lazy策略只有在session打开状态下有效,否则抛出LazyInitializationException 异常
5.支持lazy策略,与只对属性起作用是相反的:
支持lazy策略,表示支持延迟加载,不会发出select语句.
lazy只对属性起作用,表示只有使用属性的时候,才会发出SQL语句.
EJB
EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别.
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑.EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.
Session Bean:Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体.
Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行.
从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态
EJB与JAVA BEAN的区别?
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean.但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性.Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的.Enterprise Java Bean 相当于DCOM,即分布式组件.它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机).但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问.EJB容器是EJB组件的代理,EJB组件由容器所创建和管理.客户通过容器来访问真正的EJB组件.
EJB容器提供的服务:声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务.
EJB的角色和三个对象
EJB角色主要包括Bean开发者应用组装者部署者系统管理员 EJB容器提供者 EJB服务器提供者
三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类
EJB的类型
会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种
实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种
bean 实例的生命周期
对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量.
激活机制
以Statefull Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例.状态变迁前会调用对应的ejbActive和ejbPassivate方法.
remote接口和home接口主要作用
remote接口定义了业务方法,用于EJB客户端调用业务方法
home接口是EJB工厂用于创建和移除查找EJB实例
客服端调用EJB对象的几个基本步骤
设置JNDI服务工厂以及JNDI服务地址系统属性
查找Home接口
从Home接口调用Create方法创建Remote接口
通过Remote接口调用其业务方法
SOAP、UDDI
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议.
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的分布式的为Web Service提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准.
CORBA是什么?用途是什么?
CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化.它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议. 其目的为: 用不同的程序设计语言书写 | 在不同的进程中运行 | 为不同的操作系统开发
LINUX下线程,GDI类的解释.
LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现. | GDI类为图像设备编程接口类库.
weblogic
1、 如何给weblogic指定大小的内存?
在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M
2、 如何设定的weblogic的热启动模式(开发模式)与产品发布模式?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一.或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true.
3、 如何启动时不需输入用户名与密码?
修改服务启动文件,增加 WLS_USER和WLS_PW项.也可以在boot.properties文件中增加加密过的用户名和密码.
4、 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中?
保存在此Domain的config.xml文件中,它是服务器的核心配置文件.
5、 说说weblogic中一个Domain的缺省目录结构?
比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办?
Domain目录"服务器目录"applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名.
6、 如何查看在weblogic中已经发布的EJB?
可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB
7、 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置
缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书.可以配置此SSL连接是单向还是双向的.
8、在weblogic中发布ejb需涉及到哪些配置文件
不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml
9、EJB需直接实现它的业务接口或Home接口吗,请简述理由.
远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用.
10、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方式的消息将被丢弃.