流行的框架与新技术 谈谈你对Struts的理解 答: struts是一个按MVC模式设计的Web层框架其实它就是一个大大的servlet这个Servlet名为ActionServlet或是ActionServlet的子类我们可以在webxml文件中将符合某种特征的所有请求交给这个Servlet处理这个Servlet再参照一个配置文件(通常为/WEBINF/strutsconfigxml)将各个请求分别分配给不同的action去处理 一个扩展知识点struts的配置文件可以有多个可以按模块配置各自的配置文件这样可以防止配置文件的过度膨胀 ActionServlet把请求交给action去处理之前会将请求参数封装成一个formbean对象(就是一个java类这个类中的每个属性对应一个请求参数)封装成一个什么样的formbean对象呢?看配置文件 要说明的是 ActionServlet把formbean对象传递给action的execute方法之前可能会调用formbean的validate方法进行校验只有校验通过后才将这个formbean对象传递给action的execute方法否则它将返回一个错误页面这个错误页面由input属性指定(看配置文件)作者为什么将这里命名为input属性而不是error属性我们后面结合实际的运行效果进行分析 action执行完后要返回显示的结果视图这个结果视图是用一个ActionForward对象来表示的actionforward对象通过strutsconfigxml配置文件中的配置关联到某个jsp页面因为程序中使用的是在strutsconfigxml配置文件为jsp页面设置的逻辑名这样可以实现action程序代码与返回的jsp页面名称的解耦 你对struts可能还有自己的应用方面的经验那也要一并说出来 谈谈你对Hibernate的理解 答: 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象建立对象之间的关系调用对象的方法来改变各个对象的状态和对象消亡的过程不管程序运行的过程和操作怎么样本质上都是要得到一个结果程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化 为了在关机和内存空间不够的状况下保持程序的运行状态需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态通常都是保存到关系数据库来保存大量对象信息从Java程序的运行功能上来讲保存对象状态的功能相比系统运行的其他功能来说应该是一个很不起眼的附属功能java采用jdbc来实现这个功能这个不起眼的功能却要编写大量的代码而做的事情仅仅是保存对象和恢复对象并且那些大量的jdbc代码并没有什么技术含量基本上是采用一套例行公事的标准代码模板来编写是一种苦活和重复性的工作 通过数据库保存java程序运行时产生的对象和恢复对象其实就是实现了java对象与关系数据库记录的映射关系称为ORM(即Object Relation Mapping)人们可以通过封装JDBC代码来实现了这种功能封装出来的产品称之为ORM框架Hibernate就是其中的一种流行ORM框架使用Hibernate框架不用写JDBC代码仅仅是调用一个save方法就可以将对象保存到关系数据库中仅仅是调用一个get方法就可以从数据库中加载出一个对象 使用Hibernate的基本流程是配置Configuration对象产生SessionFactory创建session对象启动事务完成CRUD操作提交事务关闭session 使用Hibernate时先要配置hibernatecfgxml文件其中配置数据库连接信息和方言等还要为每个实体配置相应的hbmxml文件hibernatecfgxml文件中需要登记每个hbmxml文件 在应用Hibernate时重点要了解Session的缓存原理级联延迟加载和hql查询 AOP的作用 你对Spring的理解 Spring实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式)这个类名为BeanFactory(实际上是一个接口)在程序中通常BeanFactory的子类ApplicationContextSpring相当于一个大的工厂类在其配置文件中通过元素配置用于创建实例对象的类名和实例对象的属性 Spring提供了对IOC良好支持IOC是一种编程思想是一种架构艺术利用这种思想可以很好地实现模块之间的解耦IOC也称为DI(Depency Injection)什么叫依赖注入呢? 譬如Class Programmer { Computer computer = null; public void code() { //Computer computer = new IBMComputer(); //Computer computer = beanfacotrygetComputer(); computerwrite(); } public void setComputer(Computer computer) { thiscomputer = computer; } } 另外两种方式都由依赖第一个直接依赖于目标类第二个把依赖转移到工厂上第三个彻底与目标和工厂解耦了在spring的配置文件中配置片段如下
Spring提供了对AOP技术的良好封装 AOP称为面向切面编程就是系统中有很多各不相干的类的方法在这些众多方法中要加入某种系统功能的代码例如加入日志加入权限判断加入异常处理这种应用称为AOP实现AOP功能采用的是代理技术客户端程序不再调用目标而调用代理类代理类与目标类对外具有相同的方法声明有两种方式可以实现相同的方法声明一是实现相同的接口二是作为目标的子类在JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类如果要为某个类生成子类则可以用CGLI B在生成的代理类的方法中加入系统功能和调用目标类的相应方法系统功能的代理以Advice对象进行提供显然要创建出代理对象至少需要目标类和Advice类spring提供了这种支持只需要在spring配置文件中配置这两个元素即可实现代理和aop功能例如
谈谈Struts中的Action servlet Struts优缺点 优点 实现MVC模式结构清晰使开发者只关注业务逻辑的实现 .有丰富的tag可以用 Struts的标记库(Taglib)如能灵活动用则能大大提高开发效率 页面导航 使系统的脉络更加清晰通过一个配置文件即可把握整个系统各部分之间的联系这对于后期的维护有着莫大的好处尤其是当另一批开发者接手这个项目时这种优势体现得更加明显 提供Exception处理机制 数据库链接池管理 支持IN 缺点 一转到展示层时需要配置forward如果有十个展示层的jsp需要配置十次struts而且还不包括有时候目录文件变更需要重新修改forward注意每次修改配置之后要求重新部署整个项目而tomcate这样的服务器还必须重新启动服务器 二二 Struts 的Action必需是thread-safe方式它仅仅允许一个实例去处理所有的请求所以action用到的所有的资源都必需统一同步这个就引起了线程安全的问题 三 测试不方便 Struts的每个Action都同Web层耦合在一起这样它的测试依赖于Web容器单元测试也很难实现不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试 四 类型的转换 Struts的FormBean把所有的数据都作为String类型它可以使用工具CommonsBeanutils进行类型转化但它的转化都是在Class级别而且转化的类型是不可配置的类型转化时的错误信息返回给用户也是非常困难的 五对Servlet的依赖性过强 Struts处理Action时必需要依赖ServletRequest 和ServletResponse所有它摆脱不了Servlet容器 六 前端表达式语言方面Struts集成了JSTL所以它主要使用JSTL的表达式语言来获取数据可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱 七 对Action执行的控制困难 Struts创建一个Action如果想控制它的执行顺序将会非常困难甚至你要重新去写Servlet来实现你的这个功能需求 八 对Action 执行前和后的处理 Struts处理Action的时候是基于class的hierarchies很难在action处理前和后进行操作 九 对事件支持不够 在struts中实际是一个表单Form对应一个Action类(或DispatchAction)换一句话说在Struts中实际是一个表单只能 对应一个事件struts这种事件方式称为application eventapplication event和component event相比是一种粗粒度的事件 STRUTS的应用(如STRUTS架构) Struts是采用Java Servlet/JavaServer Pages技术开发Web应用程序的开放源码的framework 采用Struts能开发出基于MVC(ModelViewController)设计模式的应用构架 Struts有如下的主要功能 一包含一个controller servlet能将用户的请求发送到相应的Action对象 二JSP自由tag库并且在controller servlet中提供关联支持帮助开发员创建交互式表单应用 三提供了一系列实用对象XML处理通过Java reflection APIs自动处理JavaBeans属性国际化的提示和消息 说说struts与struts的区别 都是MVC的WEB框架 struts的老牌框架应用很广泛有很好的群众基础使用它开发风险很小成本更低!struts虽然基于这个框架但是应用群众并多相对不成熟未知的风险和变化很多开发人员相对不好招使用它开发项目的风险系数更大用人成本更高! struts毕竟是站在前辈的基础设计出来它会改善和完善struts中的一些缺陷struts中一些悬而未决问题在struts得到了解决 struts的前端控制器是一个Servlet名称为ActionServletstruts的前端控制器是一个filter在struts中叫FilterDispatcher在struts中叫StrutsPrepareAndExecuteFilter struts的action需要继承Action类struts的action可以不继承任何类struts对同一个路径的所有请求共享一个Action实例struts对同一个路径的每个请求分别使用一个独立Action实例对象所有对于struts的Action不用考虑线程安全问题 在struts中使用formbean封装请求参数在struts中直接使用action的属性来封装请求参数 struts中的多个业务方法放在一个Action中时(即继承DispatchAction时)要么都校验要么都不校验对于struts可以指定只对某个方法进行校验当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法那么则只对Xxx()方法进行校验 (一个请求来了的执行流程进行分析struts是自动支持分模块开发并可以不同模块设置不同的url前缀这是通过package的namespace来实现的struts是支持多种类型的视图struts的视图地址可以是动态的即视图的名称是支持变量方式的举例论坛发帖失败后回来还要传递boardid视图内容显示方面它的标签用ognl要el强大很多在国际化方面支持分模块管理两个模块用到同样的key对应不同的消息) 与Struts不同Struts对用户的每一次请求都会创建一个Action所以Struts中的Action是线程安全的 给我印象最深刻的是struts配置文件中的redirect视图的url不能接受参数而struts配置文件中的redirect视图可以接受参数 hibernate中的update()和saveOrUpdate()的区别session的load()和get()的区别 简述 Hibernate 和 JDBC 的优缺点? 如何书写一个 one to many 配置文件 iBatis与Hibernate有什么不同? 相同点屏蔽jdbc api的底层访问细节使用我们不用与jdbc api打交道就可以访问数据 jdbc api编程流程固定还将sql语句与java代码混杂在了一起经常需要拼凑sql语句细节很繁琐 ibatis的好处屏蔽jdbc api的底层访问细节将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能queryForList返回对象集合用queryForObject返回单个对象提供了自动将实体对象的属性传递给sql语句的参数 Hibernate是一个全自动的orm映射工具它可以自动生成sql语句ibatis需要我们自己在xml配置文件中写sql语句hibernate要比ibatis功能负责和强大很多因为hibernate自动生成sql语句我们无法控制该语句我们就无法去写特定的高效率的sql对于一些不太复杂的sql查询hibernate可以很好帮我们完成但是对于特别复杂的查询hibernate就很难适应了这时候用ibatis就是不错的选择因为ibatis还是由我们自己写sql语句 写Hibernate的一对多和多对一双向关联的orm配置? hibernate的inverse属性的作用? 解决方案一按照Object[]数据取出数据然后自己组bean 解决方案二对每个表的bean写构造函数比如表一要查出fieldfield两个字段那么有一个构造函数就是Bean(type filedtype field) 然后在hql里面就可以直接生成这个bean了 在DAO中如何体现DAO设计模式? 解决方案一按照Object[]数据取出数据然后自己组bean 解决方案二对每个表的bean写构造函数比如表一要查出fieldfield两个字段那么有一个构造函数就是Bean(type filedtype field) 然后在hql里面就可以直接生成这个bean了 spring+Hibernate中委托方案怎么配置? 解决方案一按照Object[]数据取出数据然后自己组bean 解决方案二对每个表的bean写构造函数比如表一要查出fieldfield两个字段那么有一个构造函数就是Bean(type filedtype field) 然后在hql里面就可以直接生成这个bean了 spring+Hibernate中委托方案怎么配置? 解决方案一按照Object[]数据取出数据然后自己组bean 解决方案二对每个表的bean写构造函数比如表一要查出fieldfield两个字段那么有一个构造函数就是Bean(type filedtype field) 然后在hql里面就可以直接生成这个bean了 hibernate进行多表查询每个表中各取几个字段也就是说查询出来的结果集没有一个实体类与之对应如何解决 解决方案一按照Object[]数据取出数据然后自己组bean 解决方案二对每个表的bean写构造函数比如表一要查出fieldfield两个字段那么有一个构造函数就是Bean(type filedtype field) 然后在hql里面就可以直接生成这个bean了 介绍一下Hibernate的二级缓存 按照以下思路来回答()首先说清楚什么是缓存()再说有了hibernate的Session就是一级缓存即有了一级缓存为什么还要有二级缓存()最后再说如何配置Hibernate的二级缓存 ()缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中)这个数据结构通常是或类似Hashmap当以后要使用某个对象时先查询缓存中是否有这个对象如果有则使用缓存中的对象如果没有则去查询数据库并将查询出来的对象保存在缓存中以便下次使用下面是缓存的伪代码 引出hibernate的第二级缓存用下面的伪代码分析了Cache的实现原理 Dao { hashmap map = new map(); User getUser(integer id) { User user = mapget(id) if(user == null) { user = sessionget(id); mapput(iduser); } return user; } } Dao { Cache cache = null setCache(Cache cache) { thiscache = cache } User getUser(int id) { if(cache!=null) { User user = cacheget(id); if(user ==null) { user = sessionget(id); cacheput(iduser); } return user; } return sessionget(id); } } ()Hibernate的Session就是一种缓存我们通常将之称为Hibernate的一级缓存当想使用session从数据库中查询出一个对象时Session也是先从自己内部查看是否存在这个对象存在则直接返回不存在才去访问数据库并将查询的结果保存在自己内部由于Session代表一次会话过程一个Session与一个数据库连接相关连所以Session最好不要长时间保持打开通常仅用于一个事务当中在事务结束时就应关闭并且Session是线程不安全的被多个线程共享时容易出现问题通常只有那种全局意义上的缓存才是真正的缓存应用才有较大的缓存价值因此Hibernate的Session这一级缓存的缓存作用并不明显应用价值不大Hibernate的二级缓存就是要为Hibernate配置一种全局缓存让多个线程和多个事务都可以共享这个缓存我们希望的是一个人使用过其他人也可以使用session没有这种效果 ()二级缓存是独立于Hibernate的软件部件属于第三方的产品多个厂商和组织都提供有缓存产品例如EHCache和OSCache等等在Hibernate中使用二级缓存首先就要在hibernatecfgxml配置文件中配置使用哪个厂家的缓存产品接着需要配置该缓存产品自己的配置文件最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中明白了二级缓存原理和有了这个思路后很容易配置起Hibernate的二级缓存扩展知识一个SessionFactory可以关联一个二级缓存也即一个二级缓存只能负责缓存一个数据库中的数据当使用Hibernate 的二级缓存后注意不要有其他的应用或SessionFactory来更改当前数据库中的数据这样缓存的数据就会与数据库中的实际数据不一致 Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性 字符串类型 注入值为 ;Hello; 的 XML 配置文件该怎么写? Jdo是什么? JDO是Java对象持久化的新的规范为java data object的简称也是一个用于存取某种数据仓库中的对象的标准化APIJDO提供了透明的对象存储因此对开发人员来说存储数据对象完全不需要额外的代码(如JDBC API的使用)这些繁琐的例行工作已经转移到JDO产品提供商身上使开发人员解脱出来从而集中时间和精力在业务逻辑上另外JDO很灵活因为它可以在任何数据底层上运行JDBC只是面向关系数据库(RDBMS)JDO更通用提供到任何数据底层的存储功能比如关系数据库文件XML以及对象数据库(ODBMS)等等使得应用可移植性更强 什么是spring的IOC AOP STRUTS的工作流程! spring 与EJB的区别!! |