《springstruts2hibernate三大框架知识要点.doc》由会员分享,可在线阅读,更多相关《springstruts2hibernate三大框架知识要点.doc(26页珍藏版)》请在三一办公上搜索。
1、Struts2 day01序1)为什么需要Struts框架 企业需求,利用Struts框架可以简化开发2)如何学习Struts 先学习如何使用,有余力再了解一些实现原理.1.MVC设计思想在JavaWeb开发当中的使用 1)什么是MVC? 是一种设计思想,非常优秀的设计思想.根据职责不同将应用程序的组件分成三部分. Model模型:负责业务数据和业务处理. View视图:负责显示和接收用户输入. Controller控制器:协调模型和视图 2)MVC在JavaWeb中的体现 Model:DAO,Entity,Util View:JSP Controller:Servlet 示例程序:Shopp
2、ingCart,控制器过于复杂,包含大量的if.else,不适合大型复杂程序的开发. 采用XML+Servlet+Action结构改造控制实现 *3)MVC工作的基本流程 a.客户端发请求,请求交给前端控制器处理 b.前端控制器维护一个XML配置文件 (XML定义了请求和Action之间的对应关系) c.前端控制根据请求调用相应的Action组件,执行请求处理 d.Action处理完毕,可以将处理结果存放到Request e.控制器调用相应的视图JSP,进行响应处理 4)Struts框架封装了上述主要流程和结构2.Struts2入门示例 HelloWorld 1)Struts2发展史 Stru
3、ts1.2 WebWork-xwork(命令模式实现) Struts2 2)入门示例 a.引入框架开发包(5个核心包) 2.1.8版本 struts2-core-2.1.8.jar xwork-core-2.1.6.jar commons-fileupload-1.2.1.jar freemarker-2.3.15.jar(模板视图技术,等价于JSP功能) ognl-2.7.3.jar(与EL相似,但是功能强大) b.在web.xml中添加控制器配置 strutsfilter org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExe
4、cuteFilter strutsfilter /* c.创建Action 创建WelcomeAction类,添加默认execute方法 d.添加XML配置,在src下添加struts.xml文件 /welcome.jsp 执行流程如下:welcome.action-web.xml(filter控制器)-struts.xml(Action配置)-WelcomeAction-execute-success-struts.xml(result配置) 3)action配置 a.元素:作用是将Action分组管理,内部可以定义多个Action. *name属性:包名称. *extends属性:继承哪个
5、package,一般情况下继承自struts-default. namespace属性:用于限定action请求名,默认值是/ 当namespace=/时,当前package中的所有action对应的请求格式: http:/localhost:8080/struts2/action请求名.action 如果namespace=/day01时,action对应的请求格式: http:/localhost:8080/struts2/day01/action请求名.action b.元素:作用是定义请求和Action组件之间的对应关系 *name属性:action组件对应的请求名 *class属性:
6、指定action组件的实现类,包名.类名格式 method属性:指定要调用action类中哪个方法.默认值是execute c.元素:作用是定义响应视图 *name属性:响应视图标识符,该标识符与action组件方法返回值对应. type属性:指定响应视图类型,默认值是dispatcher,请求转发 -练习-完成Hello示例完成列表显示示例(尝试下)扩展功能:实现分页显示1.练习问题 1)Action中利用DAO可以获取出数据库数据,但是JSP获取不到. 原因:1.检查Action属性及getter方法 2.检查struts.xml中元素的配置,不能使用type=redirect 3.检查e
7、xecute中接收集合的变量是否为局部变量 2) 工程启动出现错误 由于web.xml或struts.xml配置有误.可以根据异常信息寻找.2.补充问题 1)Action属性及setter和getter方法的问题 Action属性在接收和传出数据时,setter和getter方法是关键. a.接收时,表单组件name=user ,action要有setUser方法才可以接收. b.传出数据时,JSP使用$user,action要有getUser方法对应才可以获取. public class Action private String name;/成员变量name /有一个属性,名字是user
8、public String getUser() return name; public void setUser(String user)name = user; 3.OGNL技术 Object Graphics Navigation Language(对象图导航语言) OGNL是一种表达式语言技术,封装在ognl.jar开发包中.可以很方便的对对象的属性进行获取和设置. 1)什么是EL,有什么用 属于表达式语言,可以访pageContext,request,session,application存储范围的数据.可以简化JSP程序. 2)OGNL表达式,有什么用 属于表达式语言,需要ognl.
9、jar提供支持.可以完成以下操作 a.可以访问对象属性(获取和设置) 基本类型属性:id,name 数组类型属性:love0,love1 List类型属性:city0,city1 Map类型属性:books.key,bookskey b.可以访问对象的方法 city.size(),name.toUpperCase() c.可以访问静态常量和方法 java.lang.MathPI d.可以访问集合中的数据,进行集合过滤等操作 persons.?#this.age20 : 返回persons集合中,满足age20的所有元素. ?指的是返回所有满足条件的元素 指的是返回第一满足条件的元素 $指的是最
10、后一个满足条件的元素 e.支持Java中的运算符和表达式 name+name,id+10 f.定义一个List和Map类型的常量 List常量:1,2,3 Map常量:#age:20,name:tom 3)OGNL标准结构 OGNL有3个重要组成部分,一个OGNL引擎,一个是root对象,另一个是context对象. 访问context区域需要使用#key格式. 没有#,例如name,意思是访问root对象的name属性4.OGNL技术在Struts2中应用 1)OGNL在xwork中进行了改造 xwork将OGNL中的root对象进行了改造,将其改造成了一个栈结构,类型是CompountRo
11、ot继承自ArrayList.在访问root属性时,从栈顶对象向下依次查找,找到属性值返回. 2)ValueStack结构 ValueStack是Struts2中非常重要的数据对象,当客户发送一个请求后,控制器会根据当前请求创建一个ValueStack,并将请求处理相关的数据进行填充. root栈:存放当前请求对应的Action对象(栈顶) context(Map):存放request,session,application,parameters等信息 3)JSP获取业务数据,需要使用Struts标签+OGNL表达式技术组合-练习:课上示例总体要求:了解ValueStack内部结构,了解OGN
12、L表达式语法 学会标签+OGNL表达式基本使用1.课程回顾(理解) 1)ValueStack结构和数据存储状态 ValueStack包含3个组成 a. OGNL引擎:负责解析OGNL表达式 b. root对象:CompountRoot(栈结构) 存放了当前请求的Action对象(处于栈顶位置) c. context对象:Map结构 存放了其他象. request:Object session:Object application:Object 2) ValueStack原理 a.当客户发送一个请求后,控制器会创建一个ValueStack对象 b.控制器创建请求对应的Action对象,并压入到V
13、alueStack的root栈中 c.将request,session等对象的引用,存入到ValueStack的context中 d.将ValueStack再存入到request对象中,struts.valueStack e.客户再发新请求,重复以上操作.*2.重构列表显示示例3.EL表达式在Struts2中的使用(理解) EL为什么可以获取Action对象的属性? 可以访问pageContext,request,action,session,application范围数据 在原有的JavaWeb程序中,JSP如果使用$username,会调用如下方法查找. HttpServletReques
14、t接口 request.getAttribute(username) session.getAttribute(username) application.getAttribute(username) 在Struts2中,将request对象进行了封装,类型为StrutsRequestWapper. public class StrutsRequestWapperextends HttpServletRequestWrapper /重写了getAttribute public Object getAttribute(String expression)/首先去原始的request中查找Obje
15、ct val = super.getAttribute(expression);/如果找不到,去valuestack查找 if(val = null) val = ValueStack.findValue(expression); return val; JSP使用 $username -先去原有request中查找 找不到调用ValueStack.findValue(username); 触发Ognl.getValue(username)/获取root中栈顶action的username属性4. Struts2中Action组件的核心应用 1)Action组件原理 a.当客户发生一个请求,控
16、制器会创建一个Action对象 不必担心线程并发,不安全问题. b.Action对象创建后会放入ValueStack中,当root对象的栈顶 c.Action对象提供一个业务方法,默认是execute d.Action对象在请求处理完毕后销毁 2)Action如何使用request,session,application a.利用工具类ActionContext,ServletActionContext 如何将HttpServletRequest,HttpSession等对象转换成Map结构 public class SessionMap extends AbstractMap private
17、 HttpSession session; public SessionMap(HttpSession session)this.session = session; public void put(Object key,Object value)session.setAttribute(key.toString(),value);public Object get(Object key)return session.getAttribute(key.toString(); b.要Action实现以下Aware接口,利用接口约定的方法注入.(推荐) 原因:减少了Struts2框架API对Act
18、ion类的侵入,提高Action的灵活性. RequestAware SessionAware ApplicationAware ServletRequestAware ServletResponseAware ServletContextAware 3)Action属性注入技术 Action类中定义的属性,可以通过配置注入数据. 3 4)在配置Action时,通配符*的使用 在元素的name属性中可以使用*号,可以使用若干个.可以在method,class,引用*号所代表的信息.引用方式1,2,3 5)动态方法调用 可以在发送请求时,指定要执行的Action的业务方法名. 请求格式: 请求名
19、!方法名.action 6)在配置中可以使用EL表达式获取Action属性值 /$viewName.jsp -练习-1.课上示例2.把任务列表显示示例扩展,实现添加,删除,更新,查看功能-第一天-1.熟悉Struts2工作的主要流程2.熟悉Struts2开发步骤-第二天-1.Struts标签+OGNL表达式 a.了解OGNL作用及其语法 b.了解ValueStack结构和数据存储 c.,2.EL在Struts2环境中的使用 pageContext,request,action,session,application-第三天-1.Struts2中Action组件的核心应用 a.Action如何使
20、用request,session,application对象 b.Action属性注入技术 c.如何用一个Action处理多个请求 方法一:元素配置时,利用通配符* 方法二:利用动态方法调用 d.result元素配置,使用EL获取Action属性 /$viewName.jsp /a.jsp?id=$id-第四天-1.综合案例的实现 课后练习(必须完成)2.Struts2中Result组件的使用 Result组件主要是负责生成响应视图.响应结果有多种类型,比如jsp,stream,json,freemarker等.Struts2这对这些视图,提供了相应Result组件. 1)了解Result规则
21、 a.Result组件必须实现Result接口,实现execute()方法. 在execute方法中,实现生成响应视图的逻辑. b.Result配置声明 c.如何使用result 注意:type引用的result类型,可以从当前package或父package中找到定义 2)常用类型的result -JSP响应: dispatcher:以请求转发方式调用JSP响应 redirect:以请求重定向方式调用JSP响应 使用示例: JSP的URL JSP的URL -Action响应: redirectAction:以请求重定向方式调用一个Action chain:以请求转发方式调用一个Action.
22、 如果下一个Action需要获取前面请求的数据,需要使用chain;不需要则使用redirectAction 使用示例: a.调用同一个package中的另一个Action 的name名 b.调用不同package,不同namespace下的Action action元素的name名 package元素的namespace值 -stream响应: stream:将Action某个InputStream属性为客户端输出 使用示例: action属性 -json响应: json:需要引入扩展包,可以将Action属性以JSON格式输出 struts2-json-plugin-2.1.8.jar,
23、ok 1.Struts2 UI标签 *form *textfield password hidden textarea *checkbox checkboxlist radio *select-option2.Intercetpor拦截器组件的使用 Struts框架提供很多的内置拦截器,开发者也可以自定义. 拦截器封装的功能具有:通用性强,可以多次重复利用. params:将请求携带的数据给Action属性设置 fileUpload:调用commons-fileupload.jar组件将客户端文件上传到服务器 1)了解拦截器组件的规范 拦截器组件实现类必须实现Interceptor接口,实现i
24、nterceptor方法 2)拦截器组件的声明配置 3)拦截器组件的使用 a.为Action显示引用 b.为Action设置默认引用,(如果没有给action指定拦截器,调用默认) 如果元素继承struts-default,默认调用defaultStack 注意:defaultStack是在元素没有指定拦截器的情况下执行,如果为元素指定了拦截器,defaultStack不再执行. 4)拦截器使用示例 a.自定义一个登录检查的拦截器 1.编写LoginInterceptor拦截器组件 2.在声明LoginInterceptor组件 3.在元素中使用 b.利用内置的fileUpload拦截器实现文
25、件上传 -fileUpload拦截器实现的主要逻辑如下- fileUpload首先调用commons-fileupload.jar组件,将文件上传到服务器临时目录下.然后将临时文件给Action的属性赋值. 接着通过ActionInvocation.invoke()调用UploadAction的execute方法,Result组件方法 最后fileUpload将临时文件清除. 1.引入commons-io.jar,添加upload.jsp页面 2.编写UploadAction,根据需要可以添加3个属性. File xxx;/获取临时文件对象 String xxxFileName;/获取原文件名
26、 String xxxContentType;/获取原文件类型 注意:xxx是jsp表单中file组件的name属性 3.在UploadAction的execute方法中,将xxx临时文件复制到目标目录中. 4.添加元素配置 5.测试1.Hibernate框架的特性 1)一级缓存(默认启用) session对象级别的缓存,利用该session取出的对象会放到缓存中.在后续查询时,首先去缓存中寻找,没有再去数据库寻找. session缓存区在session关闭后销毁.session复杂维护缓存区中对象的状态. 在使用时,为了更好发挥一级缓存,需要保障同一个线程处理中,使用同一个Session对象
27、. a.使用ThreadLocal对SessionUtil进行改造,将Session对象与ThreadLocal绑定. b.Hibernate3之后的新版本,可以使用以下方法 首先在hibernate.cfg.xml中添加配置 thread 之后使用sessionFactory.getCurrentSession()方法获取Session 注意:在使用此session时,必须将session操作封装在一个transaction 一级缓存的管理: session.evict(obj);将obj对象从当前session的一级缓存中清除. session.clear():清除当前session的一级
28、缓存. 2)延迟加载 当获取一个实体对象后,实体对象并没有立刻发送SQL语句,去数据库加载数据.而是在调用对象的getXXX()方法时采取加载数据. 支持延迟加载的方法:session.load(),query.iterator().延迟加载方法返回的对象类型,是动态代理类型. session.get()和session.load()方法功能是按主键做条件查询数据,区别如下: a.get()方法不支持延迟加载,load()方法支持 b.如果数据表中没有符合的记录,get()方法返回null,load()抛异常 c.如果数据表中有符合的记录,get()返回的是实体类型对象,load()返回的是动
29、态代理类型对象. 在使用时,需要注意以下事项: a.使用延迟加载的API后,避免过早的关闭Session.LazyInitializationException: could not initialize proxy - no Session b.根据需要选择延迟加载和非延迟加载API-了解- Hibernate延迟加载机制:利用动态生成代理类型机制生成一个动态代理类,并重写对象的getXXX()方法,当调用get方法时,触发SQL查询,去数据库加载数据. Hibernate动态生成代理类型机制: 以前编写程序: a.编写一个类源码 b.调用编译器将源码编译成class字节码 c.类加载器将字
30、节码文件载入虚拟机内容 d.虚拟机调用字节码文件的方法,解释运行 Session.load()等延迟方法返回的类型是Foo$Enhancer$CGLIB.,这些类型是Hibernate框架利用程序在内容中动态生成并编译的类型.上述功能,是Hibernate调用asm.jar,cglib-2.1.3.jar工具包完成的. asm.jar主要用于在内存中动态和编译生成一个类 cglib.jar是基于asm.jar,对其扩展,在内存中生成一个代理类型.该代理类是原类型的一个子类. 3)Hibernate中对象的状态 在Hibernate使用中,对象的状态有以下三种 a.临时对象 : 在程序中使用ne
31、w方式创建的对象 b.持久对象 : 在程序中与session对象关联,由session负责管理的对象. 处于session缓存中的对象都是持久对象 对象的持久性:指的是对象的数据状态在事务提交时可 以与数据库保持同步更新. session.flush();/将持久对象与数据库同步 mit();/事务提交,提交前默认也调用session.flush() c.托管对象 : 在程序中如果session.close()后,session负责管理的持久 对象将成为托管对象. 垃圾回收器负责回收临时和托管状态,持久状态不能回收._1.在映射对象之间建立一对多关系one-to-many 1)在一的一方的类中
32、添加集合属性Set 2)在一的一方的映射文件中添加映射 3)使用时,通过对象的getXXX方法获取2.在映射对象之间建立多对一关系many-to-one 1)在多的一方的类中添加一方类型的属性 去掉关联字段的属性 2)在多的一方的映射文件中添加映射 去掉原有关联字段的映射!- - 3)使用时,通过对象的getXXX方法获取3.关系使用时的技巧 1)在hbm.xml中利用fetch属性指定抓取方式 a.fetch=join 采用join表连接方式抓取相关对象. b.fetch=select(默认) 采用单独发送一个SQL语句的方式查询相关对象. 注意:在实际开发中,不推荐在hbm.xml中利用fetch属性控制.推荐