Struts复习
struts概要技术知识

一Struts 基本概念1. MVC结构介绍Struts 是MVC的一种实现,它将Servlet和JSP 标记(属于J2EE 规范)用作实现的一部分。
Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。
MVC即Model-View-Controller的缩写,是一种常用的设计模式。
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。
控制:XML文件Struts-config.xml,与之相关联的是Controller,在Struts 中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。
ActionServlet是一个通用的控制组件。
这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。
它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。
另外控制组件也负责用相应的请求参数填充Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。
动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。
最后动作类把控制权传给后续的JSP 文件,后者生成视图。
所有这些控制逻辑利用Struts-config.xml文件来配置。
视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库:Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
模型:模型以一个或多个java bean的形式存在。
这些bean分为三类:Action Form、Action、JavaBean or EJB。
Action Form通常称之为FormBean,封装了来自于Client的用户请求信息(set/get方法,并包含有重置、validate错误验证等),如表单信息。
Action通常称之为ActionBean,获取从ActionSevlet 传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
struts题库

1)下面语句中,正确的是(C)。
A. public class AddAction implements Action {... extends ActionB. mapping.findForward("/ch01/result.jsp"); findForward(“name”),new ActionForward(“/ch0 1/result.jsp”)C. <form method="get" action="add.do">D. <action name="addAction" path="/add" type="y2ssh.sg.web.action.AddAction">Name指form的名字2)下面关于DispatchAction的说法正确的是(B)。
A、实现DispatchAction Bean需要实现org.apache.struts.actions.DispatchAction接口。
DispatchAction不是接口B、DispatchAction Bean中不需要定义execute方法。
C、配置DispatchAction Bean与配置普通Action Bean没有区别。
parameter=”method” aa.do?method=xxxD、可通过http://localhost:8080/app/da.do直接访问DispatchAction。
没有参数就找不到对应的而方法3)下面关于使用动态Form的描述中正确的是(D)。
A、使用动态Form要首先要定义一个同名的Form Bean,不需添加任何属性。
不需要创建FormBeanB、在配置动态Form时type属性指定为自己定义的Form Bean的类名。
不需要创建FormBean,type属性可以随意ng.String,ng.String[]erC、通过myForm.getUserName()从动态Form中获得userName的值。
struts复习模拟题

填空:1.Struts 2以__过滤器__为核心,采用__拦截器__的机制来处理用户的请求。
2.构建Struts 2应用的最基础的几个类库是_struts2-core__、_commons-logging_、_xwork-core_、__freamarker___以及_ognl_。
3.Struts 2中的控制器类是一个普通的_POJO_。
4.如果要在JSP页面中使用Struts 2提供的标签库,首先必须在页面中使用taglib编译指令导入标签库,其中taglib编译指令为_____<%@ taglib prefix=”s”uri=”strut-tags”%>______。
5.在Struts 2表单标签库中,表单标签为_____<s:form/>_____。
6.ActionSupport类实现了__action_________接口和___validateable________等接口。
7.通过控制器类中的____validate()_______方法来输出校验错误信息。
8. 在Hibernate XML影射文件中描述主键生成机制,其属性描述了主键的生成策略,至少写出三种策略名increment 、native 、uuid 。
9. 在Hibernate中级联操作的属性值至少写出三个____none_______ 、_____save-update______、____all_______。
10 Hibernate的会话接口是______Session接口_____,它由接口__SessionFactory接口__创建;Hibernate处理事务的接口是____Transaction接口_______;封装HQL的接口是_____Criteria接口______ 。
11.Struts2框架由_____ Struts ______和______ WebWork _____框架发展而来。
j2ee框架Struts2HibernateSpring考试复习题库

1.Eclipse是IMB公司向开放源代码社区捐献的Java程序开发平台,是一个成熟的、可扩展的体系结构。
2.Eclipse主要包含3个子项目:平台子项目,Java开发工具子项目,插件开发环境子项目。
3.MVC是Model(模型)业务逻辑层,View(试图)表述层,Controller(控制)控制层。
4.Struts是Apache Jakarta项目于2001年推出的一个开元的Java Web框架,通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面上联系较少,耦合度较低,提高了应用程序的可维护性和扩展性。
5. Struts框架有两种发行包:源代码(source)和二进制(binary)。
6. Struts框架大约由300个Java类组成,可分为8个核心包:config,action,actions,tiles,upload,taglib,util,validator。
7. Struts的核心API包括ActionServlet,ActionForm,Action,ActionMapping及ActionForward,它们构成了Struts框架中的控制器组件,视图组件,模型组件8.Hibernate是对象/关系映射(ORM)的解决方案,就是将Java对象与对象关系映射成关系数据库中表格与表格之间的关系。
9. Cache就是缓存,它往往是提高系统性能的在最重要手段,对数据起到一个蓄水池和缓冲的作用。
10. Session实现了第一级Cache,它属于事务级数据缓冲,二级Cache是SessionFactory范围内的缓冲,所有的Session共享同一个二级Cache。
11.设置Hibernate的二级Cache需要分两部进行:首先确认使用什么数据并发策略,然后设置缓存过期时间和设置Cache提供器。
12.Spring是指一个用于构造Java应用程序的轻量级框架。
13.IoC是一种将组件依赖关系的创建和管理置于程序外部的技术。
Struts知识点

Struts笔记1.Hibernate和struts整合 (2)2.ResultType (2)3.OGNL (3)4.拦截器 (4)5.Action和result (5)6.i18n国际化 (7)7.Struts标签 (8)8.类型转换类的三种配置形式: (9)9.struts2中方法验证的三种形式 (10)10.MVC思想及其优势 (11)1.Hibernate和struts整合1.Hibernate的作用是针对数据表的操作,对JDBC进行封装。
一张表就是一个对象,存进表的数据就是一个一个的对象。
2.核心配置文件Hibernate.cfg.xml3.struts2 他是比较标准的MVC模式:分别只带的是模型视图控制器hibernate和struts在一起写一个增删查改的操作1.创建工程2.导入hibernate Jar包Struts Jar包3.核心配置文件Hibernate.cfg.xml的核心文件和数据库连接上4.创建POJO 创建POJO.hbm.xml 映射到核心的配置文件中5.通过创建一个创表的类把表创建出来6.创建客户端的JSP页面7.配置web.xml 创建Action 创建struts.xml8.在Tomcate上发布在运行2.ResultType如果一个或者多个action 中有同样的结果,可以配置全局结果集,减少重复代码3.OGNL访问Action值栈中的普通属性:<s:property value="dog"/><br>获取值栈中对象的属性:<s:property value="dog.people.pname"/><br>调用对象中的普通方法:<s:property value="dog.people.getMsg()"/><br>访问action中的方法:<s:property value="show()"/><br>访问action中的静态方法:<s:propertyvalue="@com.softeem.action.ActionDemo@getMsg()"/><br/>Math类的中方法:<s:property value="@@max(6,7)"/><br>访问普通类中的构造器:<s:property value="new com.softeem.pojo.People()"/><hr/><br>访问list集合长度:<s:property value="list.size()"/><br>访问list集合中对象的属性:<s:property value="list.get(0)"/>|<s:propertyvalue="list.{pname}[0]"/><br>访问set集合:<s:iterator value="set" var="dog"><s:property value="#dog.dname"/></s:iterator><br>访问map集合:<s:property value="map"/><br>获取map集合中所有的键:<s:property value="map.keys"/><br>获取map集合中所有的值:<s:property value="map.values"/><br>访问map集合中指定对象:<s:property value="map.get('来福')"/>|<s:propertyvalue="map[\"来福\"].dcolor"/><br><hr><br>获取值栈中的普通属性:<s:property value="dog"/><br>获取值栈中对象的属性:<s:property value=""/><br>调用对象中的普通方法:<s:property value="dog.p.getMsg()"/><br>访问action中的方法:<s:property value="show()"/><br>访问action中的静态方法:<s:property value="@com.softeem.action.OgnlAction@getMsg()"/><br/>Math类的中方法:<s:property value="@@max(6,7)"/><br>访问普通类中的构造器:<s:property value="new com.softeem.action.People()"/><hr/><br>访问list集合:<s:property value="list.size()"/><br>访问list集合中对象的属性:<s:property value="list.get(0)"/>|<s:property value="list.{name}[0]"/><br>访问set集合:<s:iterator value="set" var="dog"><s:property value="#"/></s:iterator><br>访问map集合:<s:property value="map"/><br>获取map集合中所有的键:<s:property value="map.keys"/><br>获取map集合中所有的值:<s:property value="map.values"/><br>访问map集合中指定对象:<s:property value="map.get('小黑')"/>|<s:property value="map[\"小黑\"].color"/><br><hr><br>投影(过滤):<br>取出age>18所有对象<s:property value="list.{?#this.age>18}"/><br>取出所有age>18的对象的第一个<s:property value="list.{^#this.age>18}"/><br>取出所有age>18的对象的最后一个<s:property value="list.{$#this.age>18}"/><br>取出所有名字为'来福'的狗<s:property value="list.{?#=='来福'}"/><br>取出值栈中的对象:<s:property value="[0]"/><s:debug></s:debug>4.拦截器自定义一个拦截器<interceptors><interceptorname="proInterceptor"class="com.softeem.intercepter.ProInterceptor" ></interceptor>配置拦截器栈<interceptor-stack name="myStack"><interceptor-ref name="proInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors>拦截器和过滤器的区别:①过滤器在首次请求的时候就会执行,拦截器在任意时候都可以执行②过滤器对所有的请求(servlet/jsp)都会过滤,拦截器可以精确的拦截任何一个action<action name="testAction" class="com.softeem.action.TestAction"><result>/main.jsp</result>引入指定拦截器:配置其他拦截器之前,需要引入struts2提供的默认拦截器defaultStack,否则当前拦截器会将默认拦截器覆盖<interceptor-ref name="defaultStack"></interceptor-ref>自定义拦截器:使用自定义拦截器,需要现在当前包中配置拦截器<interceptor-ref name="myInterceptor"></interceptor-ref></action>创建拦截器的步骤:1:创建一个类实现Interceptor接口,实现三个方法(destory、init、intercept) 2:在struts.xml中进行配置,声明当前过滤器声明拦截器:当一个拦截器声明之后,可以被多个action使用<interceptors><interceptorname="interceptor01"class="com.softeem.type.intercept ors.MyInterceptor"></interceptor><interceptorname="interceptor02"class="com.softeem.type.intercept ors.MySecondInterceptor"></interceptor>我们可以将多个拦截器定义成一个“拦截器组”,可以通过引用这个拦截器组从而达到引用这个组中所有的拦截器的目的<interceptor-stack name="stack1"><interceptor-ref name="interceptor01"></interceptor-ref><interceptor-ref name="interceptor02"></interceptor-ref></interceptor-stack>我们同样可以将多个拦截器和已经存在“拦截器组”放在一起生成一个新的“拦截器组”<interceptor-stack name="stack2"><interceptor-ref name="stack1"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><action name="user" class="erAction"> <result name="index">/index.jsp</result>如果当前action没有手动的引用其他的拦截器,则默认引用了Struts2的defaultStack 拦截器一旦我们手动引用了拦截器,则defaultStack拦截器组就不被自动引用,我们需要手动引用拦截器的执行顺序和被引用的顺序一致<interceptor-ref name="stack2"></interceptor-ref></action>5.Action和result1,Struts2配置文件中的模块包含将另外一个xml配置文件作为struts.xml文件的一部分引入到struts.xml<include file="name.xml"/>意义在于项目开发时的并行开发(版本控制工具同步管理)2,struts2的默认Action:当用户访问的页面不存在的时候跳转到默认action页面访问index.actionstruts.xml配置文件<default-action-ref name="index"></default-action-ref><action name="index"><result>/error.jsp</result></action>3,Action总结:action类三种方式DMI动态调用方法!通配符配置*-*jsp页面值传递到action中的接收三种方式简单的参数验证访问web元素包含文件配置默认action处理4,struts.xml中的result的类型配置<result type=""></result>默认类型dispatcher,运用服务器跳转(视图页面)5,全局的result配置(GlobalResult)package标签下<global-results><result name=""></result></global-results>思考:如果一个package要使用另一个package中的result?6,结果集:result的类型(主要两种)全局结果集动态结果传递参数7,struts2的动态结果集在配置文件中:<result name="">${attrName}</result>$可以在配置文件中从action中取值在action添加attrName属性,并赋值8,带参数的结果集在rusult中使用$取到action中的值传递到action跳转的页面<result type="redirect">/xxx.jsp?abc=${attrName}</result>6.i18n国际化国际化的解释ResourceBandle实例Struts实例native2ascii 源文件名目标文件名properties级别问题action:文件名要和Action的类名一致package:名字必须是package_..._....propertiesapplication:名字可以随意,但是需要配置struts.custom.i18n.resoutces 处理资源文件中的参数 login.message=welcome:{0}<s:text value="login.message"><param value="username"></param></s:text>国际化语言动态切换request_locale=en_US/zh_CN<a href="language?request_locale=en_US">EN</a><a href="language?request_locale=zh_CN">CN</a>---------------------------------------------------------1,i18n的原理:根据参数不同的值,根据相同的key在不同的文件中取到不同的value2,实例运行3,properties文件的级别action级别:配置文件的前缀名必须和类名保持一致,只在访问这一个action的时候加载package级别:配置文件的前缀名必须是package,在访问当前包下面的action都会加载application:配置文件的前缀名没有要求,需要在struts.xml中进行配置,在服务器启动时加载4,使用国际化步骤:①创建全局的properties资源文件(注意命名)②在struts.xml中加载properties资源文件③在页面使7.Struts标签1,struts标签分为:通用标签控制标签UI标签(展现)2,通用标签:propertyproperty标签中的value属性默认是一个object<s:propertyvalue="username"/>表示根据在值栈中根据username取到一个对象显示property取值为字符串<s:property value="'哈哈'"/>表示直接显示一个"哈哈"字符串,直接显示的字符串要加上单引号property的默认值:<s:property value="admin" default="管理员"/>如果根据admin在值栈中取值没有取到,则显示默认值property设定HTML:<s:property value="'<hr/>'" escape="true"/> 如果没有加上escape="true",表示直接显示字符串set在request或者ActionContext中存入信息:<s:set var="user" value="Obj"/> 默认存放在request和ActionContext中,value值为对象从request中取值:<s:property value="#er"/>从ActionContext中取值:<s:property value="#user"/>默认取值空间为ActionContext范围的设置:<s:set name="key" value="password" scope="page"/>beanbean 定义bean,使用param来设定新的属性值<s:bean name="er" var="user1"><s:param name="username" value="'张三'"></s:param></s:bean>var表示新创建的对象的名字,如果没有var属性就不能在Context stack中找到s:param给新创建的对象属性赋值,注意valueinclude(解决中文问题很麻烦)包含静态文件:<s:include value="/test.jsp"></s:include>用%包含文件:<s:set var="incPage" value="'/test.jsp''}"/><s:include value="incPage"></s:include><s:include value="#incPage"></s:include><s:include value="%{#incPage}"></s:include>paramdebug3,控制标签:if elseif elseiteratorsubset(截取集合的一部分)4,UI标签:theme(主题)struts.xml中控制theme,默认为xhtml,可以设置为simple/css_htm/ajax <constant name="struts.ui.theme" value="css_htm"/>5,$#%的区别$用于i18n和struts的配置文件中#用于取ActionContext的值%将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用8.类型转换类的三种配置形式:actin级别:配置文件的名字:action-conversion.properties内部配置:ation对应的属性名=转换类的路径配置文件的存放位置:和action位置相同说明:当用户访问这个action中这个属性的时候才调用类型转换类pojo级别:配置文件的名字:pojo-conversion.properties配置文件的存放位置:和pojo的位置相同内部配置:pojo对应的属性名=类型转换类的路径说明:当用户访问任何action,只要提交了这个pojo中的这个属性的时候就会调用类型转换类src级别:配置文件的名字:xwork-conversion.properties配置文件的存放位置:直接存放在src下内部配置:属性类型(+包名)=类型转换类的路径说明:用户访问任何action,只要提交了对应类型的属性的时候就会调用类型转换类当我们转换类继承的是StrutsTypeConverter,需要重写两个方法:convertFromString(在用户向action提交数据的时候调用)convertToString,将指定类型的数据转换成String类型(在action向页面跳转的时候调用)struts2数据校验分为手工验证和自动验证手工验证:指的是在对应的action里面通过validate方法对这个action里面的属性进行校验validate方法是重写,它是在ValidateAble接口中定义的所以我们这个action要实现ValidateAble接口才能完成校验但是ActionSupport已经实现了ValidateAble接口,所以我们创建的action只要继承了ActionSupport,就可以重写validate自动验证:使用xwork里面提供的验证,通过配置文件对action的属性进行验证9.struts2中方法验证的三种形式1,采用注解annotation形式:在不需要验证的方法前加上@SkipValidation2,正对每一个需要验证的方法单独生成一个配置文件,例如在UserAction中有两个方法add()和delete()并且我们假设只对add()方法进行校验,配置如下:-----------------struts.xml------------------------------------- <!-- 需要对add()方法单独添加一个配置,并且要以这个action标签的那么属性“user_add”作为alias添加一个验证配置文件,如下: --><action name="user_add" class="erAction" method="add"><result>/success.jsp</result><result name="input">/index.jsp</result></action><!-- 配置这个action主要是为了让其他的请求能进入其他的方法 --><action name="user_*" class="erAction" method="{1}"><result>/success.jsp</result><result name="input">/index.jsp</result></action>---------------------------------------------------------------- 新创建一个validation.xml配置文件,命名为【UserAction-user_add-valication.xml】3,采用拦截器形式(验证框架的配置文件UserAction-validation.xml):即,给默认拦截器配置拦截参数,配置如下:<action name="user_*" class="erAction" method="{1}"><result>/success.jsp</result><result name="input">/index.jsp</result><interceptor-ref name="defaultStack"><param name="validation.excludeMethods">*</param><param name="validation.includeMethods">delete</param> </interceptor-ref></action>在<param name="validation.includeMethods"></param>标签里面写出需要验证的方法名字如果有多个方法,方法名以“,”隔开,例如要验证add和delete方法:<param name="validation.includeMethods">add,delete</param> 10.MVC思想及其优势MVC并不是Java语言所特有的设计思想,也并不是Web应用所特有的思想,它是所有面向对象程序设计语言都应该遵守的规范。
Struts2复习

1、MVC设计模式是指Model 我们编写的javabean,包括dao,DBManagerView jsp页面Controller 在Struts2中指的是Action控制器注意:struts2是不是在struts1基础之上发展起来,而是在webwork框架上发展而来。
2、MVC的优势1)可为一个模型建立多种不同视图,随意切换2)视图和控制器的可接插性3)模型的可移植性3、Struts2和Struts1相比优势1)测试更方便,控制器没有和系统的类有太多耦合2)Struts2的Action是一个完全的POJO类。
无任何依赖关系注意:一般我们为了规范Action的开发,会让Action去实现一个接口:Action接口,或者继承一个方法。
ActionSupport类4、Struts2的体系结构a)核心控制器:StrutsPrepareAndExecuteFilter 接收请求并分发到相应action中b)业务控制器:就是我们自己编写的Action类5、Struts2的配置文件1)Struts.xml2)Struts.properties注意复习配置文件中的每一项分别表示什么如:<constant name="struts.ui.theme" value="simple" / > 配置系统属性常量(简单主题显示)//注意:包必须继承自struts-default 包,否则报错<package name="default" extends="struts-default" namespace="/"><action name="xxx" class="com.scme.action.XXXX"> 这里是Action的配置<result name="名字">/xx.jsp</result> 这里是定义视图转向的配置</action></package>6、Sturts2运行流程:a)客户端发送请求b)核心控制器StrutsPrepareAndExecuteFilter 接收请求,并找到相应的Action处理c)Action默认执行execute()方法,如果设置了则执行相应的方法,处理完毕,转发到相应的视图(根据配置中的result进行)7、Struts2的核心控制器是一个过滤器,需要在web.xml中进行配置。
Struts复习资料

1.Struts的标签库包括HTML、Bean、Logic、Template和Nested2.什么是国际化?"struts国际化"就是不同的客户访问,就会显示不同的语言版本。
3.什么是资源文件?ActionForm的功能?能实现字段采集,数据缓冲、类型转换、传输对象、数据检验forward与redirect之区?forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。
当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。
forward 会将request state , bean 等等信息带往下一个jspredirect 是送到client 端后再一次request , 所以资料不被保留.使用forward 你就可以用getAttribute() 来取的前一个jsp 所放入的bean 等等资料Struts界面控制层技术1、请说出struts框架的几大组件?1、MVC2、标签库3、校验框架4、国际化5、tiles3、struts的核心类有那些,在MVC模式中其对应的关系是什么?ControlActionServlet RequestProcessor Action actionMapping(struts-config.xml)actionFormardViewActionForm JspModelDao Manager(facade)4、Struts的处理请求的全过程是什么?url-> ActionServlet(process)-> RequestProcessor(process)->实例化form ->填充form值->进行校验->实例化action->调用execute5、在struts中如何通过一个url找到一个action,它的核心配置文件是什么?配置文件是struts-config.xml6、为什么使用MVC,其主要目的是什么?让v与M强制解耦,提高可重用性(旅馆的服务员(C))7、对于MVC在action中对应有类有几种,各有什么作用?Action:1) 基本的DispatchAction:2) 存在多个方法,根据页面传入的表单域的值调用不同的方法,表单域的名称在<action param=””/>标记中进行配置LookupDispatchAction3) 多个按钮用同一个action的不同方法。
struts复习

struts是依靠xml的配置来完成各层之间的流转Struts体系结构MVC:Model(模型)-View(视图)-Controller(控制器)Struts概述struts实际上就是在jsp Model2的基础上实现的一个mvc框架。
在struts框架中,模型由实现业务逻辑的javabean 或ejb组件构成,控制器由actionservlet和action来实现,视图有一组jsp文件构成。
Struts与MVC (帮助MVC了解)视图(View):在使用Struts框架的web应用程序中,JSP以及相关的技术(如Taglib)等共同组成视图层,这一层的主要职责是显示用户界面。
Struts提供了很多机制让我们能更加轻松地创建视图控制器(Controller):Struts中,ActionServlet是控制器层组件模型(Model):模型包括:系统的内部状态以及改变系统状态的动作; Struts中的Action和ActionForm是模型的一部分; Struts 建议把”做什么”(Action)和”如何做”(业务逻辑)相分离ActionServlet类是struts框架中的核心组件。
他继承了javax.servlet.http.HttpServlet类。
ActionServlet主要负责接收http请求信息,根据配置文件struts-config.xml的配置信息,把请求转发给适当的Action对象。
如果该Action对象不存在,ActionServlet会先创建这个Action对象。
Action对象负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。
对于小型简单的应用,Action类本身也可以完成一些实际的业务逻辑。
对于大型应用,Action类充当用户请求和业务逻辑处理之间的适配器,其功能就是将请求与业务逻辑分开,Action根据用户请求调用相关的业务逻辑组件。
Action类侧重于控制应用程序的流程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 标签的嵌套使用的能力< Html:form>, < html:submit>, < Html:button>, <Html:text>,<Html:select><logic:iterate>, <logic:forward>, <logic:redirect>, <logic:iterate>, <logic:present>, <logic:empty> ... 参考:struts Logic标签说明<bean:write>, <bean:message>, <bean:parameter>, <bean:size>4. Tiles框架是什么?Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。
5.你对MVC的理解,MVC有什么优缺点?结合Struts,说明在一个Web应用如何去使用?MVC设计模式(应用观察者模式的框架模式)M: Model(Business process layer),模型,操作数据的业务处理层,并独立于表现层(Independent of presentation)。
V: View(Presentation layer),视图,通过客户端数据类型显示数据,并回显模型层的执行结果。
C: Controller(Control layer),控制器,也就是视图层和模型层桥梁,控制数据的流向,接受视图层发出的事件,并重绘视图MVC框架的一种实现模型模型二(Servlet-centric):JSP+Servlet+JavaBean,以控制为核心,JSP只负责显示和收集数据,Sevlet,连接视图和模型,将视图层数据,发送给模型层,JavaBean,分为业务类和数据实体,业务类处理业务数据,数据实体,承载数据,基本上大多数的项目都是使用这种MVC的实现模式。
StrutsMVC框架(Web application frameworks)Struts是使用MVC的实现模式二来实现的,也就是以控制器为核心。
Struts提供了一些组件使用MVC开发应用程序:Model:Struts 没有提供model 类。
这个商业逻辑必须由Web 应用程序的开发者以JavaBean或EJB的形式提供View:Struts提供了action form创建form bean, 用于在controller和view间传输数据。
此外,Struts提供了自定义JSP标签库,辅助开发者用JSP创建交互式的以表单为基础的应用程序,应用程序资源文件保留了一些文本常量和错误消息,可转变为其它语言,可用于JSP中。
Controller:Struts提供了一个核心的控制器ActionServlet,通过这个核心的控制器来调用其他用户注册了的自定义的控制器Action,自定义Action需要符合Struts的自定义Action规范,还需要在struts-config.xml的特定配置文件中进行配置,接收JSP输入字段形成Action form,然后调用一个Action控制器。
Action控制器中提供了model的逻辑接口。
hibernate题1.Hibernate有哪几种查询数据的方式(1)导航对象图查询(2)OID查询(3)HQL(4)QBC(5)本地SQL2.load()和get()的区别load加载方法:Java代码Users user = (Users)session.load(Users.class, userId);get加载方法:Java代码Users user = (Users)session.get(Users.class, userId);Users user = (Users)session.get(Users.class, userId);两加载方法区别:区别1:如果数据库中,没有userId的对象。
如果通过get方法加载,则返回的是一个null;如果通过load 加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;区别2:load支持延迟加载,get不支持延迟加载。
也就是说:Java代码Users user = (Users)session.load(Users.class, userId);Users user = (Users)session.load(Users.class, userId);这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。
而:Java代码Users user = (Users)session.get(Users.class, userId);Users user = (Users)session.get(Users.class, userId);则立即去执行数据库查询。
所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。
注意:Java代码Users user = (Users)session.load(Users.class, userId);System.out.println(user.getId());System.out.println(user.getId());上面这2句代码,不会去执行数据库操作。
因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。
所以不会报任何错。
不会执行任何数据库操作。
3. Hibernate工作原理及为什么要用?原理:1. 读取并解析配置文件2. 读取并解析映射信息,创建SessionFactory3. 打开Sesssion4. 创建事务Transation5. 持久化操作6. 提交事务7. 关闭Session8. 关闭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,object comptositionHql:1、属性查询2、参数查询、命名参数查询3、关联查询4、分页查询5、统计函数7.如何优化Hibernate?1. 使用双向一对多关联,不使用单向一对多2. 灵活使用单向一对多关联3. 不用一对一,用多对一取代4. 配置对象缓存,不使用集合缓存5. 一对多集合使用Bag,多对多集合使用Set6. 继承类使用显式多态7. 表字段要少,表关联不要怕多,有二级缓存撑腰=====================Hibernate笔试题==========================(1)一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选)A)表对应类B)记录对应对象C)表的字段对应类的属性D)表之间的参考关系对应类之间的依赖关系(2)以下关于SessionFactory的说法哪些正确?(多选)A)对于每个数据库事务,应该创建一个SessionFactory对象B)一个SessionFactory对象对应一个数据库存储源。