




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 示例程序:shoppingcart,控制器过于复杂,包含大量的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发展史 struts1.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.strutsprepareandexecutefilter 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属性:继承哪个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属性:指定action组件的实现类,包名.类名格式 method属性:指定要调用action类中哪个方法.默认值是execute c.元素:作用是定义响应视图 *name属性:响应视图标识符,该标识符与action组件方法返回值对应. type属性:指定响应视图类型,默认值是dispatcher,请求转发 -练习-完成hello示例完成列表显示示例(尝试下)扩展功能:实现分页显示1.练习问题 1)action中利用dao可以获取出数据库数据,但是jsp获取不到. 原因:1.检查action属性及getter方法 2.检查struts.xml中元素的配置,不能使用type=redirect 3.检查execute中接收集合的变量是否为局部变量 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 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.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的所有元素. ?指的是返回所有满足条件的元素 指的是返回第一满足条件的元素 $指的是最后一个满足条件的元素 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对象进行了改造,将其改造成了一个栈结构,类型是compountroot继承自arraylist.在访问root属性时,从栈顶对象向下依次查找,找到属性值返回. 2)valuestack结构 valuestack是struts2中非常重要的数据对象,当客户发送一个请求后,控制器会根据当前请求创建一个valuestack,并将请求处理相关的数据进行填充. root栈:存放当前请求对应的action对象(栈顶) context(map):存放request,session,application,parameters等信息 3)jsp获取业务数据,需要使用struts标签+ognl表达式技术组合-练习:课上示例总体要求:了解valuestack内部结构,了解ognl表达式语法 学会标签+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对象,并压入到valuestack的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,会调用如下方法查找. httpservletrequest接口 request.getattribute(username) session.getattribute(username) application.getattribute(username) 在struts2中,将request对象进行了封装,类型为strutsrequestwapper. public class strutsrequestwapperextends httpservletrequestwrapper /重写了getattribute public object getattribute(string expression)/首先去原始的request中查找object 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.当客户发生一个请求,控制器会创建一个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 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对action类的侵入,提高action的灵活性. requestaware sessionaware applicationaware servletrequestaware servletresponseaware servletcontextaware 3)action属性注入技术 action类中定义的属性,可以通过配置注入数据. 3 4)在配置action时,通配符*的使用 在元素的name属性中可以使用*号,可以使用若干个.可以在method,class,引用*号所代表的信息.引用方式1,2,3 5)动态方法调用 可以在发送请求时,指定要执行的action的业务方法名. 请求格式: 请求名!方法名.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如何使用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规则 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. 如果下一个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, ok 1.struts2 ui标签 *form *textfield password hidden textarea *checkbox checkboxlist radio *select-option2.intercetpor拦截器组件的使用 struts框架提供很多的内置拦截器,开发者也可以自定义. 拦截器封装的功能具有:通用性强,可以多次重复利用. params:将请求携带的数据给action属性设置 fileupload:调用commons-fileupload.jar组件将客户端文件上传到服务器 1)了解拦截器组件的规范 拦截器组件实现类必须实现interceptor接口,实现interceptor方法 2)拦截器组件的声明配置 3)拦截器组件的使用 a.为action显示引用 b.为action设置默认引用,(如果没有给action指定拦截器,调用默认) 如果元素继承struts-default,默认调用defaultstack 注意:defaultstack是在元素没有指定拦截器的情况下执行,如果为元素指定了拦截器,defaultstack不再执行. 4)拦截器使用示例 a.自定义一个登录检查的拦截器 1.编写logininterceptor拦截器组件 2.在声明logininterceptor组件 3.在元素中使用 b.利用内置的fileupload拦截器实现文件上传 -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;/获取原文件名 string xxxcontenttype;/获取原文件类型 注意:xxx是jsp表单中file组件的name属性 3.在uploadaction的execute方法中,将xxx临时文件复制到目标目录中. 4.添加元素配置 5.测试1.hibernate框架的特性 1)一级缓存(默认启用) session对象级别的缓存,利用该session取出的对象会放到缓存中.在后续查询时,首先去缓存中寻找,没有再去数据库寻找. session缓存区在session关闭后销毁.session复杂维护缓存区中对象的状态. 在使用时,为了更好发挥一级缓存,需要保障同一个线程处理中,使用同一个session对象. 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的一级缓存. 2)延迟加载 当获取一个实体对象后,实体对象并没有立刻发送sql语句,去数据库加载数据.而是在调用对象的getxxx()方法时采取加载数据. 支持延迟加载的方法:session.load(),query.iterator().延迟加载方法返回的对象类型,是动态代理类型. session.get()和session.load()方法功能是按主键做条件查询数据,区别如下: a.get()方法不支持延迟加载,load()方法支持 b.如果数据表中没有符合的记录,get()方法返回null,load()抛异常 c.如果数据表中有符合的记录,get()返回的是实体类型对象,load()返回的是动态代理类型对象. 在使用时,需要注意以下事项: a.使用延迟加载的api后,避免过早的关闭session.lazyinitializationexception: could not initialize proxy - no session b.根据需要选择延迟加载和非延迟加载api-了解- hibernate延迟加载机制:利用动态生成代理类型机制生成一个动态代理类,并重写对象的getxxx()方法,当调用get方法时,触发sql查询,去数据库加载数据. hibernate动态生成代理类型机制: 以前编写程序: a.编写一个类源码 b.调用编译器将源码编译成class字节码 c.类加载器将字节码文件载入虚拟机内容 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.临时对象 : 在程序中使用new方式创建的对象 b.持久对象 : 在程序中与session对象关联,由session负责管理的对象. 处于session缓存中的对象都是持久对象 对象的持久性:指的是对象的数据状态在事务提交时可 以与数据库保持同步更新. session.flush();/将持久对象与数据库同步 mit();/事务提交,提交前默认也调用session.flush() c.托管对象 : 在程序中如果session.close()后,session负责管理的持久 对象将成为托管对象. 垃圾回收器负责回收临时和托管状态,持久状态不能回收._1.在映射对象之间建立一对多关系one-to-many 1)在一的一方的类中添加集合属性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属性控制.推荐使用hql+join fetch方式.参考testaddress.java的testfetch()方法 2)cascade级联操作 对主对象操作时,相关联的对象属性也执行相同操作. 在hbm.xml中为关联属性添加cascade,可以指定 cascade=save-update:当对主对象执行save和update操作时,相关联的对象属性也执行save和update操作 cascade=delete:当对主对象删除时,相关联的对象属性也执行删除 cascade=all:对save,update,delete操作都支持 注意:级联删除执行的是n+1个delete语句,如果遇到n比较大时,不推荐使用级联,推荐使用删除的hql. delete from address where userid=30 3)inverse关系控制 inverse主要用于指定两个对象的关系由哪一方来负责维护.其实就是使用update语句更新user_id字段的值.默认情况下,hibernate认为关系维护双方负责. 为了程序效率,将关系维护工作交给多的一方处理.即在元素中添加inverse=true 4)formula子查询映射将一个子查询结果,映射到一个属性上.参考user.hbm.xml1.如何使用myeclipse生成entity类和hbm.xml映射文件 1)先进入db browser创建一个dangdang数据库连接 2)工程右键,选myeclipse-add hibernate capabilitity添加hibernate框架jar包,hibernate.cfg.xml,hibernatesessionfactory 3)创建一个com.tarena.entity包,用于存放实体类和映射文件 4)进入db browser选中数据表,右键选择hibernate reverse engineeing创建hbm.xml和pojo(实体类),选择type映射类型,设置映射实体类名和主键生成方式等.2.多对多关系 3.继承映射 1)修改实体类,将book继承product 2)在product.hbm.xml中添加定义 ./id主键映射,父类其他属性的映射 ./子类其他属性的映射 -继承关系的操作- a.添加book对象 向d_book表和d_product表写入记录 b.删除book对象 从d_book表和d_product表删除记录 c.查询book对象 session.load(book.class,1) 将d_book和d_product表连接查询,获取book信息 d.查询product对象 session.load(product.class,1) 将d_book和d_product表连接查询子类对象 e.只查询d_product表 select pro.id,ductname,ductpic from product pro 注意上面语句执行后,返回时是使用object格式封装一条记录 select new product(pro.id,ductname,ductpic) from product pro 注意上面语句执行后,返回时是使用product对象封装一条记录,product需要提供相应的构造方法. f.执行from book 查询所有的book图书信息,从d_product和d_book联合查询 g.执行from product 查询所有子类对象信息.将d_product与d_book,d_computer联合取出boo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 怀化2025年怀化会同县招聘7名事业单位工作人员笔试历年参考题库附带答案详解
- 2025年互联网+教育平台建设资金申请创新机制与实施趋势报告
- 2025云南广电传媒集团招聘16人笔试参考题库附带答案详解
- 2025年文旅地产项目开发与旅游产业政策影响评估研究报告
- 行政管理心理学策略性考试题及答案
- 市政工程问题解析试题及答案指导
- 水利水电工程人力资源管理试题及答案
- 创新药品生产基地项目实施方案(范文模板)
- 充电桩建设与运营的创新路径
- 2025年交通基础设施建设投融资模式创新与交通基础设施建设投资案例分析报告
- 化工设计知到智慧树章节测试课后答案2024年秋浙江大学
- 《建筑构造与识图》课程标准
- 2025年保健食品从业人员培训考试试题
- 2025年贵州盘江精煤股份有限公司招聘笔试参考题库含答案解析
- 2024年中考数学复习:中点模型专项练习
- 旅行社企业章程范本
- 2025年宁波余姚市直属企业招招聘笔试参考题库含答案解析
- 《心理健康测试》课件
- 输变电工程监督检查标准化清单-质监站检查
- GB/T 26718-2024城市轨道交通安全防范系统技术要求
- 《心房颤动》课件
评论
0/150
提交评论