您的位置:首页 > 编程语言 > Java开发

自己的java知识整理二

2012-03-25 19:16 417 查看
什么是J2EE?

J2EE是sun公司提出的多层(mulit-diered),分布式,基于组件的企业应用模型.在这样一个应用中,按照功能不同可以划分为不同的组件,这些组件

可以运行不同的计算机上,并且处于不同的层中.所属层次包括客户层和组件,web层和组件,Business层和组件,企业信息系统(EIS)层.

J2EE是技术还是平台还是框架?什么是J2EE?

J2EE本身是一个标准,它为企业分布式应用开发提供一个标准的平台.

J2EE也是一个框架,它包括EJB,JTA,JMS,JNDI,JDBC,RMI等技术/

请对以下在J2EE中常用的名词进行解释.

web容器:为在其中的应用程序提供一个运行环境,是的jsp/servlet直接跟容器中的环境变量接口交互,不必关注其它系统问题,比如web服务器:tomcat,该

容器提供的接口严格遵守J2EE规范中的WEB APPLICATION标准.我们把遵守以上标准的WEB服务器叫做J2EE的web容器.

EJB容器:java enterprise bean容器,更加具有行业特色,它提供给运行在其中的组件EJB各种管理功能,只要满足了J2EE规范的EJB放入了该容器,马上就会

被容器高效率的管理,并且可以通过现成的接口来获取系统级别的服务.

JTA:java transaction API ,java事务服务,提供各种分布式事务服务.应用程序只需要调用其接口就行了/

JMS:java Message service ,java消息服务,为各个应用程序提供通讯.包括点对点和广播.

RMI/IIOP:Remote Method Invocation/intemet请求中介协议.主要用于远程调用服务.java特有的.

JNDI:java naming Directory interface,java命名目录.提供一个目录系统,让其他的应用程序在其上留下自己的索引,从而满足快速查找和定位

分布式应用程序的功能.

JAF:javaAction FrameWork.java安全认证架构.提供一些安全性控制方面的框架.让开发者通过各种不熟和自定义实现自己的个性化安全控制策略.

2012-3-18:

159-169:

谈谈Struts中的Action Servlet:

1.检索和匹配用户请求的ActionMapping实例,如果不存在,则向用户返回请求路径无效的消息.

2.如果ActionMapping实例存在,检索ActionForm是否存在,如果不存在,则创建一个ActionForm对象保存用户提交的表单数据信息.

3.根据配置信息,检测是否需要进行表单验证,如果需要验证,则调用action中的validate()方法,如果此方法返回null或者返回一个不包含ActionMessage的

ActionErrors对象,就表示表单验证成功.如果此方法返回一个或者多个ActionMessage的ActionErros,说明表单验证失败.ActionServlet会直接把请求转发

给包含用户请求的JSP组件.此时,就不会创建Action对象并且调用execute方法.

4.ActionServlet根据ActionMapping包含的映射信息决定将请求转发给哪一个action,如果action不存在,就会创建出一个action,并且执行execute方法.

5.Action中的execute方法返回一个ActionForward对象,ActionServlet再把请求转发给ActionForward对象指向的JSP组件.

6.ActionForward指向的JSP组件生成动态页面,返回给客户.

struts优缺点:

优点:

1.实现MVC,结构清晰,使得开发人员只需要关注业务层

2.丰富的tag,Struts的标记库(Taglib)增大了开发效率

3.页面导航,使得系统脉络更加清楚,通过一个配置文件,即可把握系统的各个部分之间的联系,对后期维护有很大的帮助.

4.实现的i18n

5.数据库连接池机制

6.实现了exception机制

缺点:

1.每次更改配置文件,必须得要将整个项目重新部署

2.在页面跳转的时候,需要配置forward,每个forward都需要配置一遍.

3.对action的事物支持不够,Action中,一个表单form对应一个事件.

4.使用JSTL来获取客户端数据,在Colection和索引属性方面处理显得很弱.

5.Struts的action要求必须是线程安全的,即只能有一个实例去处理所有的请求.所以action用到的所有资源必须同步,这个就会引起线程的安全性问题.

6.测试不方便.Action和web层耦合在一起,它的测试依赖于web容器,不过有个junit扩展工具Struts testCast可以实现它的单元测试.

7.Struts的FormBean都是String类型.它可以使用工具Commons-BeanUtils类型转化,但是它的转化都是在class级别上的,而且转化的类型是不可以配置的.

8.对action执行的控制困难,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。

9.对Servlet的依赖性过强.Struts处理action时必须使用ServletRequest和servletResponse.它摆脱不了servlet.

hibernate中的update()和saveOrUpdate()的区别,session的load和get():

saveOrUpdate会根据所给对象的id不同,来选择save还是update.当id为null,对象id从来没有present的,对象是一个present对象的一个新Version时,

就会save,除了以上的情况就是执行update.

update()是对暂态(transient)或只是脱管(detached)的更新操作,对暂态对象的更新操作通常不产生效果,对于脱管对象是做了同步的操作.

即数据库的数据发生变化并且对象状态也成为脱管对象更新,没有主键会报错.

saveOrUpdate也是对暂态或只是脱管的操作.至于是插入还是更新,要根据所给对象的id来确定.

没有主键也可以插入.

load()在你想获取的对象不存在的时候,会抛出异常,而是用get()则会返回一个null.

在配置文件<class>元素的lazy属性设为true时,代表延迟加载,当你是用load加载一个对象时,返回的是这个对象的动态代理类实例,并不是一个实体.但是

该代理类实例中包含了对象的所有属性,该代理类实例除了id不为null,其他的属性都为空,这时你可以看到控制台没有hql语句打印出来,说明并没有执行查

询操作.当你在通过getXXX()获取值的时候,才会真正去数据库中执行查询操作.当lazy属性值为false时,使用load返回的就是一个实体,不再是代理类实例.

hql语句也会打印出来.不管lazy的属性值为什么,使用get都是返回一个实体.

load()和get()都是先会在session中查找,如果没有找到对应的对象.则查询hibernate的二级缓存.如果还是找不到,就会发一条sql语句查询,\

ibatis与hibernate有什么不同?

相同点:屏蔽了jdbc api 的底层代码,使我们不用于jdbc api打交道,就可以访问数据库,

jdbc api的编程模式固定,还将sql与java代码混编,代码繁琐,容易出错.

ibatis:屏蔽了jdbc api的底层代码.将sql与java代码分离,提供给了将结果集自动封装成为实体对象和对象的集合的功能,queryForList返回对象集合,

queryForObject返回单个对象,提供自动将实体对象的属性传递给sql作为参数

hibernate是一个全自动化的orm映射工具,它可以自动生成sql语句,功能比ibatis强大很多.而ibatis需要我们自己编写.hibernate不允许我们修改sql语句,所以在遇见需要使用到复杂

的sql语句或者是高性能的sql语句的时候,就需要使用ibatis来编写了.

hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决;

1.按照Object[]数据取出数据,然后自己组bean

2.对每个对象的bena写构造函数.

Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写?

依赖注入就是通过配置文件解决代码问题.

<bean>

<property name="message">hello</property>

</bean>

相当于一个工厂,工厂帮你创建了这个bean对象,然后调用了setMessage方法将hello设置到了bean对象中

2012-3-19:

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 的优势却在于他可以维持使用者的状态。

javabean和ejb的区别:

javaBean是可复用的组件,对javaBean没有太多了严格要求,任何一个java类都可以是一个bean.但是通常情况下,javabean是需要

被容器锁创建的,比如(tomcat),所以javaBean应该具有一个自己的构造器,为了能够实现持久性,还需要实现序列化.javaBean实

际上相当于微软COM模型中的本地进程内的COM组件.只能被本地访问,不能实现远程(跨进程)访问.而Enterprise java Bean相当于

DCOM,即分布式组件,它是基于java远程方法调用(RMI)技术的,所以EJB可以被远程(跨进程)访问的.但是EJB必须被部署在像Webspere

和WebLogic这样的容器中.EJB客户从来不直接访问EJB组件,而是通过它的容器来进行访问.EJB容器是EJB组件的代理,EJB组件由容器

所创建和管理.客户通过容器来访问真正的EJB组件.

EJB包括(SessionBean,Entity Bean)说出他们的生命周期,以及如何管理事务的?

SessionBean:

Stateless Session Bean:无状态的Bean的生命周期是由容器决定的,当客户机发出要求建立一个bean实例的时候,EJB容器是不一定

创建一个新的bean实例返回给客户机调用,而是返回一个现有的实例.

Stateful Session Bean:当客户机第一次使用stateful bean时,EJB容器必须立即在服务器中创建一个新的bean实例,关联到客户机上,

以后客户机调用statefulBean的方法时,容器就会把调用分派到与这个客户机关联的bean实例.

EntityBean:entity bean 能存活的时间是很长的,并且状态是持续的.只要数据库存在,entity beans就一直存在,就算容器崩溃了,

entity beans依旧还是存在的.entity bean的生命周期可以由容器和它自己管理.

EJB通过以下技术管理事务:

对象管理组织(OMG)的对象事务服务(OTS),JTS,JTA,开发组的XA接口.

ejb容器提供的服务:

主要提供声明周期的管理,代码产生,安全,持续性管理,事务管理,锁和并发行管理等服务.

ejb的几种类型:

ejb分为: 会话bean(Session bean),实体bean(Entity bean) 和 消息驱动bean( Message Drivern bean).

Session bean又分为stateful和stateless两种bean.

实体bean又分为Bean管理的持续性(BMP)和容器管理的持续性(CMP);

ejb部分:

客服调用EJB对象的几个基本步骤:

JDNI-->home-->remote

设置JNDI服务工厂和JDNI服务地址的系统属性,查找home接口,从home接口调用create方法调用remote接口,

使用remote接口调用其业务方法.

EJB的激活机制

以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: