Struts复习.docx
- 文档编号:25395394
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:26
- 大小:31.35KB
Struts复习.docx
《Struts复习.docx》由会员分享,可在线阅读,更多相关《Struts复习.docx(26页珍藏版)》请在冰豆网上搜索。
Struts复习
Struts复习
1.Struts的工作原理
在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。
每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。
2.Struts优点与缺点
Struts是开源软件,使开发者能更深入的了解其内部实现机制。
Struts优点:
业界"标准"(很多成功案例),学习资源丰富。
Struts的优点主要集中体现在两个方面:
Taglib和页面导航。
a、利用Struts提供的taglib可以大大节约开发时间。
b、维护扩展比较方便。
通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
c、表现与逻辑分离
d、表单验证解决了请求数据的验证问题,增强了系统健壮性。
e、便于团队开发
Struts缺点:
a、大量的使用标签,对于初学者难度较大。
b、ActionForms使用不便、无法进行单元测(StrutsTestCase只能用于集成)
3.Struts提供了几个标签库?
都是什么标签库?
Struts提供了五个标签库,即:
HTML、Bean、Logic、Template和Nested。
HTML标签用来创建能够和Struts框架和其他相应的HTML标签交互的HTML输入表单
Bean标签在访问JavaBeans及其属性,以及定义一个新的bean时使用
Logic标签管理条件产生的输出和对象集产生的循环
Template标签随着Tiles框架包的出现,此标记已开始减少使用
Nested标签增强对其他的Struts标签的嵌套使用的能力
form>, submit>, button>, text>, select> iterate>, forward>, redirect>, iterate>, present>, empty>...参考: strutsLogic标签说明 write>, message>, parameter>, size> 4.Tiles框架是什么? Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。 5.你对MVC的理解,MVC有什么优缺点? 结合Struts,说明在一个Web应用如何去使用? MVC设计模式(应用观察者模式的框架模式) M: Model(Businessprocesslayer),模型,操作数据的业务处理层,并独立于表现层 (Independentofpresentation)。 V: View(Presentationlayer),视图,通过客户端数据类型显示数据,并回显模型层的执 行结果。 C: Controller(Controllayer),控制器,也就是视图层和模型层桥梁,控制数据的流向, 接受视图层发出的事件,并重绘视图 MVC框架的一种实现模型 模型二(Servlet-centric): JSP+Servlet+JavaBean,以控制为核心,JSP只负责显示和收集数据,Sevlet,连接视图 和模型,将视图层数据,发送给模型层,JavaBean,分为业务类和数据实体,业务类处 理业务数据,数据实体,承载数据,基本上大多数的项目都是使用这种MVC的实现模式。 StrutsMVC框架(Webapplicationframeworks) Struts是使用MVC的实现模式二来实现的,也就是以控制器为核心。 Struts提供了一些组件使用MVC开发应用程序: Model: Struts没有提供model类。 这个商业逻辑必须由Web应用程序的开发者以 JavaBean或EJB的形式提供 View: Struts提供了actionform创建formbean,用于在controller和view间传输数 据。 此外,Struts提供了自定义JSP标签库,辅助开发者用JSP创建交互式的以表单为基 础的应用程序,应用程序资源文件保留了一些文本常量和错误消息,可转变为其它语言, 可用于JSP中。 Controller: Struts提供了一个核心的控制器ActionServlet,通过这个核心的控制器来 调用其他用户注册了的自定义的控制器Action,自定义Action需要符合Struts的自定 义Action规范,还需要在struts-config.xml的特定配置文件中进行配置,接收JSP输入 字段形成Actionform,然后调用一个Action控制器。 Action控制器中提供了model的逻 辑接口。 hibernate题 1.Hibernate有哪几种查询数据的方式 (1)导航对象图查询 (2)OID查询 (3)HQL (4)QBC (5)本地SQL 2.load()和get()的区别 load加载方法: Java代码 Usersuser=(Users)session.load(Users.class,userId); Usersuser=(Users)session.load(Users.class,userId); get加载方法: Java代码 Usersuser=(Users)session.get(Users.class,userId); Usersuser=(Users)session.get(Users.class,userId); 两加载方法区别: 区别1: 如果数据库中,没有userId的对象。 如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常: org.hibernate.ObjectNotFoundException; 区别2: load支持延迟加载,get不支持延迟加载。 也就是说: Java代码 Usersuser=(Users)session.load(Users.class,userId); Usersuser=(Users)session.load(Users.class,userId); 这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。 而: Java代码 Usersuser=(Users)session.get(Users.class,userId); Usersuser=(Users)session.get(Users.class,userId); 则立即去执行数据库查询。 所以Usersuser=(Users)session.load(Users.class,userId);不会执行任何sql。 注意: Java代码 Usersuser=(Users)session.load(Users.class,userId); System.out.println(user.getId()); Usersuser=(Users)session.load(Users.class,userId); System.out.println(user.getId()); 上面这2句代码,不会去执行数据库操作。 因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。 所以不会报任何错。 不会执行任何数据库操作。 3.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。 他很大程度的简化DAO层的编码工作 3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4.hibernate的性能非常好,因为它是个轻量级框架。 映射的灵活性很出色。 它支持各种关系数据库,从一对一到多对多的各种复杂关系。 4.Hibernate是如何延迟加载? 1.Hibernate2延迟加载实现: a)实体对象b)集合(Collection) 2.Hibernate3提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 5.Hibernate中怎样实现类之间的关系? (如: 一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 5.说下Hibernate的缓存机制 1.内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2.二级缓存: a)应用及缓存 b)分布式缓存 条件: 数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c)第三方缓存的实现 6.Hibernate的查询方式 Sql、Criteria,objectcomptosition Hql: 1、属性查询 2、参数查询、命名参数查询 3、关联查询 4、分页查询 5、统计函数 7.如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6.继承类使用显式多态 7.表字段要少,表关联不要怕多,有二级缓存撑腰 =====================Hibernate笔试题========================== (1)一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选) A)表对应类 B)记录对应对象 C)表的字段对应类的属性 D)表之间的参考关系对应类之间的依赖关系 (2)以下关于SessionFactory的说法哪些正确? (多选) A)对于每个数据库事务,应该创建一个SessionFactory对象 B)一个SessionFactory对象对应一个数据库存储源。 C)SessionFactory是重量级的对象,不应该随意创建。 如果系统中只有一个数据库存储源,只需要创建一个。 D)SessionFactory的load()方法用于加载持久化对象 (3)Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪个元素映射orders属性? A) (4) (单选) A)none B)save C)delete D)save-update (5)以下哪些属于Session的方法? A)load() B)save() C)delete() D)update() E)open() F)close() (6)以下程序的打印结果是什么? (单选) tx=session.beginTransaction(); Customerc1=(Customer)session.load(Customer.class,newLong (1)); Customerc2=(Customer)session.load(Customer.class,newLong (1)); System.out.println(c1==c2); mit(); session.close(); A)运行出错,抛出异常 B)打印false C)打印true (7)以下程序代码对Customer的name属性修改了两次: tx=session.beginTransaction(); Customercustomer=(Customer)session.load(Customer.class, newLong (1)); customer.setName(\"Jack\"); customer.setName(\"Mike\"); mit(); 执行以上程序,Hibernate需要向数据库提交几条update语句? (单选) A)0B)1C)2D)3 (8)在持久化层,对象分为哪些状态? (多选) A)临时状态 B)独立状态 C)游离状态 D)持久化状态 (9)对于以下程序,Customer对象在第几行变为持久化状态? (单选) Customercustomer=newCustomer();//line1 customer.setName(\"Tom\");//line2 Sessionsession1=sessionFactory.openSession();//line3 Transactiontx1=session1.beginTransaction();//line4 session1.save(customer);//line4 mit();//line5 session1.close();//line6 A)line1B)line2C)line3D)line4E)line5F)line6 (10)对于以下程序,Customer对象在第几行变为游离状态? (单选) Customercustomer=newCustomer();//line1 customer.setName(\"Tom\");//line2 Sessionsession1=sessionFactory.openSession();//line3 Transactiontx1=session1.beginTransaction();//line4 session1.save(customer);//line4 mit();//line5 session1.close();//line6 A)line1B)line2C)line3D)line4E)line5F)line6 (11)以下哪一种检索策略利用了外连结查询? (单选) A)立即检索B)延迟检索C)迫切左外连结检索 (12)假设对Customer类的orders集合采用延迟检索策略,编译或运行以下程序,会出现什么情况(单选) Sessionsession=sessionFactory.openSession(); tx=session.beginTransaction(); Customercustomer=(Customer)session.get(Customer.class,newLong (1)); mit(); session.close(); IteratororderIterator=customer.getOrders().iterator(); A)编译出错B)编译通过,并正常运行C)编译通过,但运行时抛出异常 (13)关于HQL与SQL,以下哪些说法正确? (多选) A)HQL与SQL没什么差别 B)HQL面向对象,而SQL操纵关系数据库 C)在HQL与SQL中,都包含select,insert,update,delete语句 D)HQL仅用于查询数据,不支持insert,update和delete语句 (14)事务隔离级别是由谁实现的? (单选) A)Java应用程序B)HibernateC)数据库系统D)JDBC驱动程序 (15)悲观锁与乐观锁,哪个具有较好的并发性能? (单选) A)悲观锁B)乐观锁 答案: (1)A,B,C (2)B,C(3)A(4)D(5)A,B,C,D,F(6)C(7)B(8)A,C,D(9)D(10)F(11)C(12)C(13)B,D(14)C(15)B spring 一、spring工作原理: 1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。 二、为什么要用spring: AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。 使用AOP后,公共服务(比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。 IOC允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。 正如单词倒置所表明的,IOC就像反过来的JNDI。 没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straightconstruction),每一个对象都是用其协作对象构造的。 因此是由容器管理协作对象(collaborator)。 Spring即使一个AOP框架,也是一IOC容器。 Spring最好的地方是它有助于您替换对象。 有了Spring,只要用JavaBean属性和配置文件加入依赖性(协作对象)。 然后可以很容易地在需要时替换具有类似接口的协作对象。 三、请你谈谈SSH整合: SSH: Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts: Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。 在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。 (View: 沿用JSP,HTTP,Form,Tag,Resourse;Controller: ActionServlet,struts-config.xml,Action) Hibernate: Hibernate是一个持久层框架,它只负责与关系数据库的操作。 Spring: Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。 四、介绍一下Spring的事务管理: 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。 这样可以防止出现脏数据,防止数据库数据出现问题。 开发中为了避免这种情况一般都会进行事务管理。 Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。 spring提供了几个关于事务处理的类: TransactionDefinition//事务属性定义 TranscationStatus//代表了当前的事务,可以提交,回滚。 PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。 一般事务定义步骤: TransactionDefinitiontd=newTransactionDefinition(); TransactionStatusts=transactionManager.getTransaction(td); try {//dosth transactionMmit(ts); } catch(Exceptione){transactionManager.rollback(ts);} spring提供的事务管理可以分为两类: 编程式的和声明式的。 编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。 编程式主要使用transactionTemplate。 省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象. voidadd(){ transactionTemplate.execute(newTransactionCallback(){ pulicObjectdoInTransaction(TransactionStatusts) {//dosth} } } 声明式: 使用TransactionProxyFactoryBean: PROPAGATION_REQUIREDPROPAGATION_REQUIREDPROPAGATION_REQUIRED,readOnly 围绕Poxy的动态代理能够自动的提交和回滚事务 org.springframework.transaction.interceptor.TransactionProxyFactoryBean PROPAGATION
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts 复习