




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
18Struts部分:11)为什么要学习Struts框架22)为什么使用MVC?23)MVC在JavaWeb中的实现2*4) Struts2的主要工作流程23.Struts2框架的历史2*4.Struts2框架基本使用21.Struts2使用基本规则3Struts2标签+OGNL表达式42)OGNL工作原理54.OGNL在Struts2中的应用61)xwork对ognl进行扩展和改造6*2)ValueStack对象(参考valuestack.jpg)6*3)在JSP中访问ValueStack数据方法6a.使用Struts标签+OGNL表达式6b.使用EL表达式61.Struts2框架Action组件的核心应用71)Action组件基本原理7*3)Action属性注入8*4)如何利用一个Action处理多个请求81.前期课程回顾91.Result组件原理91)Result组件的作用92)Result组件实现规则9*2.常用的几种Result组件102)Action响应111.Struts2标签121)通用标签122)表单标签122.拦截器组件12*2)掌握自定义拦截器的使用13Struts部分:=Day01=1)为什么要学习Struts框架 Struts框架是MVC设计模式的实现,基于Struts开发可以简化开发难度,提高开发效率。2)为什么使用MVC? MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级。3)MVC在JavaWeb中的实现 Servlet,JSP,Filter,JDBC a.原ShoppingCart程序就是一个MVC结构实现View实现部分:采用JSP组件实现Model实现部分:采用DAO、Entity等组件实现Controller实现部分:采用ActionServlet组件实现 b.ShoppingCart程序虽然基于MVC,但结构还有一些问题: 当请求数量比较多时,需要在Servlet中编写大量的if.else分支语句,而且Servlet代码量非常多。 改造方案:为Servlet提供一个XML配置文件,用于定义请求和Action组件的对应关系。然后将if.else分支中的代码提取到对应的Action组件中。*4) Struts2的主要工作流程 a.首先客户端浏览器发送一个请求,请求到达控制器。 b.控制器根据xml配置信息调用相应的Action组件(XML配置了请求和Action对应关系) c.执行Action组件业务处理,该组件可以调用DAO,Cart,Entity等组件。 d.控制器调用JSP视图组件生成一个响应界面给浏览器5)Struts的内部原理: 编程原理: 用户发送http请求-Web服务器(tomcat)-加载 web.xml(web部署描述文件)文件-执行struts核心控制器( StrutsPrepareAndExecuteFilter或者filterDispatcher)- 加载struts.xml文件,通过请求action名字找到匹配的action -在action中调用(execute)(业务层|数据层) -执行result=“- 通过result 找到struts.xml与result名字匹配结果-转发到 页面返回给调用者 程序调用:struts内部原理图:(1)用户发送http请求-启动web服务器-加载web.xml(web部署描述文件)配置文件-执行web.xml中相应过滤器 ActionContextCleanUp:清除页面中的属性 other filter(SiteMesh:装饰过滤器) SiteMesh作用:页面布局、装饰 FilterDispatcher:struts2核心控制器 注意:(a)使用SiteMesh(装饰过滤器),struts2容器不在管理页面中属性,需要调用ActionContextCleanUp完成销毁 (b)过滤器执行是有顺序 ActionContextCleanUp-SiteMesh-FilterDispatcher (2)中央控制器FilterDistpacher询问ActionMapper是否需要请求action(3)如果需要请求action,FilterDispatcher就会调用它的代理(ActionProxy)加载配置文件(4)ActionProxy会调用Configuration Manager读取strus.xml配置文件 注意:只加载一次 (5)根据请求名字,ActionProxy(action代理)调用所有拦截器(Inertceptor),ActionProxy(action代理)创建Action Invocation,去执行所对应action类,根据Action类中名字找到匹配result页面(jsp、freeMarker、Velocity)等技术,在此执行拦截器 注意:struts2拦截器和servlet过滤器功能相同,并比filter强大 拦截器执行顺序:先进后出(6)相应给用户(HttpServletResponse)3.Struts2框架的历史 Struts2框架和Struts1没有必然联系,它是将原来的WebWork框架核心部分Xwork提取,进行封装后发布为Struts2。*4.Struts2框架基本使用 *1)Struts2使用步骤 *a.下载发布包,将核心包导入web工程 struts2-core-2.1.8.jar:Struts2核心包 xwork-core-2.1.6.jar : Xwork核心包 ognl-2.7.3.jar :OGNL技术工具包,与EL相似,但比EL强大。 freemarker-2.3.15.jar:界面模板技术,与JSP相似。 commons-fileupload-1.2.1.jar :文件上传包。 *b.配置Struts2控制器,在src下添加struts.xml、Struts2控制器采用的是StrutsPrepareAndExecuteFilter组件实现。 在web.xml文件中配置该Filter组件。 c.根据请求编写Action,DAO,Entity等组件 *2)HelloWord示例 welcome.action-struts2控制器-WelcomeAction-welcome.jsp -Struts2详细工作流程- a.浏览器发出welcome.action请求 b.请求到达Struts的Filter控制器(由于web.xml配置) c.Struts控制器判断请求类型,如果是/welcome.action或/welcome格式请求,将调用struts.xml配置,寻找对应的Action组件 d.调用Action组件的execute方法处理请求,最后返回一个String视图标识 e.Struts控制器根据视图标识寻找相应的JSP(struts.xml中result配置) f.调用JSP视图生成响应界面给浏览器显示。 =Day02=1.Struts2使用基本规则1)web.xml配置 涉及了Struts2的Filter控制器配置 a.指定正确包名.类名 b.指定/*,控制器可以识别Action组件请求2)Action编写规则 a.执行方法的定义public String XXX() 默认方法名是execute b.属性变量的定义 public class User private String username;/成员变量是username/属性是user public void setUser(String user) this.username = user; public String getUser() return username; 注意:如果action需要接收请求数据或向JSP传递数据,需要与属性名保持一致。 3)struts.xml中的Action配置 1)元素嵌套顺序- 2)元素的extends属性必须继承自struts-default 3)元素name请求名不要加.action,class指定的Action类要正确。 4)元素的name属性与Action方法返回值保持一致。2.实现一个列表显示功能 /list.action-ProjectListAction-projectlist.jsp 1)开发步骤 a.引入struts2和数据库的驱动包 b.添加struts.xml配置文件,web.xml添加了Struts控制器配置 c.添加DBUtil工具类 d.添加Entity类 e.添加DAO编写方法 f.添加Action g.添加Action配置(struts.xml) h.添加JSP,显示列表 引入jstl标签库的jar包。 在JSP页面添加标签库引入指令 使用标签limit begin,sizebegin = (page-1)*sizepage begin1 02 33 6n (n-1)*3=Struts2标签+OGNL表达式 3. OGNL表达式 1)什么是OGNL OGNL技术可以独立使用,封装在ognl.jar开发包中。Object Graphics Navigation Language 对象图导航语言。主要作用是对一些复杂对象的属性和方法进行访问。 EL表达式主要功能:用于访pageContext,request,session,application范围内存储的数据。 OGNL不仅可以访问数据,还具有访问方法,对集合进行操作等功能。 2)OGNL工作原理OGNL工具由三部分构成,分别是 a. OGNL引擎:负责解释执行OGNL表达式,按表达式区root或map区域寻找数据。 b. Root根对象区域:访问该区域数据OGNL表达式简洁方便。适合放置访问频繁的对象元素。 c. Map对象存储区 :访问该区域需要使用“#key”访问。适合放置访问不频繁的对象元素。 使用时,给OGNL引擎指定一个表达式,该引擎根据表达式去Root区或Map区访问对象的属性或方法。*3)OGNL表达式语法 a.访问Root对象某个简单属性 表达式: 属性名 b.访问Root对象某个数组或者List集合 表达式:属性名0 c.访问Root对象某个Map集合 表达式:属性名.key或者属性名key d.访问Root对象某个复合类型属性address 表达式: address.子属性 e.访问Root对象某个复杂属性 List addresses 表达式:addresses0.子属性 f.访问Root对象的某个属性的方法 表达式:属性名.方法() g.支持Java中的表达式和运算符 h.定义一个List常量 表达式:A,B,C i.定义一个Map常量 表达式:#key1:value1,key2:value2 j.访问静态常量或方法 表达式:包名.类型常量名或方法 上述语法如果访问Map区域一样使用,只要注意追加#key.OGNL分析学习OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。OGNL相对其它表达式语言具有下面几大优势: 1、支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式: 类全名(包括包路径)方法名 | 值名,例如: java.lang.Stringformat(foo %s, bar) 或tutorial.MyConstantAPP_NAME; 3、支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80; 4、访问OGNL上下文(OGNL context)和ActionContext; 5、操作集合对象。 Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现 了java.utils.Map的接口.理解Struts2中的 ValueStackValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础 ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前Action 对象和其他相关对象.Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性request中。在 ValueStack 对象的内部有两个逻辑部分:ObjectStack: Struts把动作和相关对象压入 ObjectStack 中-ListContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中Struts 会把下面这些映射压入 ContextMap 中parameters: 该 Map 中包含当前请求的请求参数request: 该 Map 中包含当前 request 对象中的所有属性session: 该 Map 中包含当前 session 对象中的所有属性application:该 Map 中包含当前 application 对象中的所有属性attr: 该 Map 按如下顺序来检索某个属性: request, session, application理解OGNL ContextOgnlValueStack 类包含两个重要的属性 一个root和一个context。 * 其中root本质上是一个ArrayList. * 而context 是一个Map(更确切的说是一个OgnlContext对象)在这个OgnlContext对象(context)中,有一个默认的顶层对象 _root,OGNL访问context中这个默认顶层对象中的元素时,是不需要#号的,直接通过元素的名称来进行访问,而访问其他对象时,如 request、session、attr等,则需要#号引用。 注:Struts2将OgnlValueStack的root对象赋值给了OgnlContext 中的_root对象,在OgnlValueStack的root对象中,保存着调用Action的实例,因此,在页面上通过Struts2标签访问Action 的属性时,就不需要通过#号来引用 总结:ognl Context包含 ObjectStack属性和ContextMap属性 4.OGNL在Struts2中的应用1)xwork对ognl进行扩展和改造 xwork对OGNL原有的Root区域进行了改造,将其扩建成了一个栈结构。可以存储多个目标对象。当输入id表达式时,首先去栈顶对象寻找id属性值,没有再去次栈顶,依次向下寻找,找到返回。*2)ValueStack对象(参考valuestack.jpg) Struts2将扩展之后的OGNL封装成了ValueStack对象,利用该对象存储当前请求相关的所有数据。例如action,request,session,application等。 root栈:存储了action对象 context(map)区:存储了request,session,application等对象引用。*3)在JSP中访问ValueStack数据方法 a.使用Struts标签+OGNL表达式:可以显示当前状态的ValueStack信息 :显示ValueStack数据。使用value属性指定OGNL表达式 :将ValueStack的日期类型数据格式化后显示。使用 name属性指定OGNL表达式,format属性指定格式化模板。 :将ValueStack的集合属性迭代循环。使用value属性指定OGNL表达式。 .:分支判断。使用test属性指定一个OGNL判断表达式 b.使用EL表达式 EL表达式可以从pageContext,request,session,application范围获取数据,显示到页面。但是在Struts2中利用EL表达式可以访问到ValueStack中的数据。 *在Struts2中EL表达式依次访问pageContext,request,valuestack,session,application范围的数据。 =原因如下=JSP-$user -request.getAttribute(user);在Struts2中,将原有的Request对象封装成StrutsRequestWrapper,并重写它的getAttribute()方法。public class StrutsRequestWrapper extends HttpServletRequestWrapper /覆盖原request的getAttribute public Object getAttribute(String name) /去原有的request对象中查找信息 Object val = super.getAttribute(name); /如果原有的request找不到 if(val = null) /去valuestack查找 vs.findValue(name);/-Ognl.getValue(name,ctx,root) return val; $user-request.getAttribute(user)-Ognl.getValue(user,ctx,root)=Day03=1.Struts2框架Action组件的核心应用 1)Action组件基本原理 a.当浏览器发送一个请求给Struts2控制器 b.控制器要创建一个ValueStack对象,将其存储在request中,使用struts.valueStack当做key。 c.控制器创建一个Action对象,并Action对象添加到ValueStack对象栈顶位置。 d.控制器将request封装之后,再将request,session,application等对象添加到ValueStack的context(Map)区域。 e.控制器调用Action对象的业务方法,处理请求。默认调用execute f.控制器根据execute返回结果,调用result视图响应上述过程:Action对象在请求处理完毕后销毁,因此与request对象生命周期相同。 *2)如何在Action中使用request,session,application等对象 a.采用Aware接口方式注入到Action中(推荐在Action中使用) 如果获取Map结构的可以使用RequestAware,SessionAware,ApplicationAware接口。如果获取Servlet类型的可以使用ServletRequestAware,ServletResponseAware,ServletContextAwareb.采用ActionContext工具类方式使用(推荐在Action之外使用) ActionContext方法获取Map结构的ServletActionContext方法获取Servlet应用类型的=如何将request封装成Map结构=public class RequestMap extends AbstractMap private HttpServletRequest request; public RequestMap(HttpServletRequest request)this.request = request; /重写抽象Map的方法 public void put(Object key,Object value)request.setAttribute(key.toString(),value); public Object get(Object key)Object val = request.getAttribute(key.toString();return val; 同理,SessionMap,ApplicationMap都做过类似封装=*3)Action属性注入 指的是在action配置时,为Action对象的属性指定值。 属性值 在action对象创建完毕后,会自动调用属性的setter方法设置值。*4)如何利用一个Action处理多个请求 a.在action配置时使用通配符* 在元素的name属性中可以使用若干个*号,然后在其他属性中可以使用1,2格式引用第1个、第2个*号所代表的字符串信息 *b.使用动态方法调用(推荐) 可以在发请求时,指定action方法名。 请求格式:请求名!方法名.action=作业:扩展Project列表显示功能 添加任务,删除任务,更新任务,查看任务1.前期课程回顾 1)MVC结构,优势,工作流 2)Struts2的MVC实现和基本使用 C部分:StrutsPrepareAndExecuteFilter、Action V部分:主要由JSP实现,当然也可以是图形、报表、流当响应。 (Struts2标签+OGNL表达式)Result组件。 M部分:业务逻辑模型(DAO,Service),数据模型(实体对象、Action属性)ValueStack组件 3)Struts2的工作流程= 4)OGNL语法 5)ValueStack结构和数据 6)掌握几个常规标签 7)EL在Struts2中的访问范围 pageContext,request,valuestack(action),session,application= 8)Action如何使用request,session,application 9)Action属性注入 10)Action封装多个请求处理 通配*号的使用 动态方法调用方式使用- Day04-1.Result组件原理 1)Result组件的作用 负责调用视图组件,生成响应内容。Struts2提供了各种类型的响应Result组件,用于JSP页面、流、JSON、图形、报表等响应类型。 2)Result组件实现规则 a.Result组件实现类 必须实现Result接口,实现接口约定execute()方法。 b.Result组件的声明定义 在struts的XML配置中,使用如下格式: . . *c.Result组件的使用 首先元素所在的package必须能找它的定义。 利用元素的type属性指定使用的Result类型,默认值为 dispatcher。=public class RedirectResult implement Result private String location;/接收注入的URL地址 /setter和getter public void execute() /重定向 HttpServletResponse res = ServletActionContext.getRequest(); res.sendRedirect(location); /login.jsp = *2.常用的几种Result组件 1)JSP响应 dispatcher :采用请求转发方式调用JSP组件响应。 redirect:采用请求重定向方式调用JSP组件响应。(在重定向后,原request和action都被销毁掉,因此在JSP获取不到值) 使用格式如下: /msg.jsp 或者使用简写 /msg.jsp 2)Action响应 delete.action?id=1-DeleteAction-ListAction-list.jsp redirectAction:采用重定向方式发出一个*.action请求 chain:采用转发方式发出一个*.action请求 使用格式如下: 调用不同命名空间的action时: 请求名 命名空间 调用相同命名空间的action时: 请求名 -*.action-Action1-chain-Action2-chain-Action3 3)流响应 典型功能:验证码和下载。 stream:可以将Action中的一个InputStream类型属性以流方式响应输出。 使用格式如下: Action属性 4)JSON响应 负责对Ajax请求进行数据响应。 json:可以将Action中的一个属性或多个属性以json格式响应输出使用格式如下: 如果需要返回一个属性值 Action属性 如果需要返回多个属性值 Action属性1,Action属性2 如果需要返回所有属性值 注意:使用前需要引入struts-json-plugin.jar,然后将元素的extends设置成json-default=作业=完成验证码和ajax校验案例完成任务列表的增加,删除,修改,查看,分页显示=Day05 =1.Struts2标签 主要用于简化JSP代码,用于显示模型中的数据。1)通用标签 property,date,iterator,if.else.2)表单标签 textfield,password,hidden,textarea,checkbox,radio,select a. textfield,password,hidden,textarea 利用name属性指定ognl表达式 b.checkbox 利用name属性指定ognl表达式,该属性值用boolean。 c. radio,checkboxlist,select 利用list属性指定ognl表达式,指定一个集合。标签可以根据该集合动态生成元素。listKey指定的属性值为不可见value;listValue指定的属性值为用户可见; 利用name属性指定值,控制哪些元素选中。示例:form.action-FormAction-form.jsp=上午标签案例练习:20分钟=2.拦截器组件 1)拦截器组件规则 add.action(表单数据)-params *a.拦截器组件的作用(工作流) -客户端发送请求,请求到达Filter控制器 -控制器根据请求信息创建ValueStack对象并实例化 -控制器调用一系列的Interceptor拦截器前期处理(defaultStack) invocation.invoke(); -控制器调用Action组件,执行execute方法 -控制器调用Result组件,解释JSP标签 -控制器调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地铁工程宣传方案(3篇)
- 安全教育课件培训学时
- 学习任务群在高中语文课堂中的应用
- 农业无人机租赁服务平台在2025年的市场定位与品牌建设策略
- 猎人笔记课件
- 地下管廊工程方案(3篇)
- 犬咬伤的护理
- 安全教育培训馆课件
- 矿业会计面试题及答案
- 口腔考编面试题库及答案
- 画法几何及工程制图完整课件
- 变压器试验收费标准
- 竣 工 验 收 证 书(施管表2)
- 整理黑龙江基准地价与标定地价早
- CPK工具表的模板
- 中国画发展史
- 客户基本信息调查表实用文档
- 19-雾在哪里ppt市公开课金奖市赛课一等奖课件
- 城镇道路工程施工与质量验收规范
- GB/T 11270.2-2002超硬磨料制品金刚石圆锯片第2部分:烧结锯片
- 金融统计分析教材课件
评论
0/150
提交评论