java三大框架之struts-2总结_第1页
java三大框架之struts-2总结_第2页
java三大框架之struts-2总结_第3页
java三大框架之struts-2总结_第4页
java三大框架之struts-2总结_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一:入门1Struts2 是一款优秀MVC框架,MVC:是一种思想,将软件分为 Model模型、View视图、Controller控制器(StrutsPrepareAndExecuteFilter : 控制器)(JSP : 视图)(Action : 可以作为模型,也可以是控制器)2Struts2 内核 webwork Xwork提供了很多核心功能:前端拦截器(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL the Object Graph Navigation Language),IoC(Inversion of Control反转控制)容器等 3导入jar

2、包到开发工程 只需要导入 apps/struts2-blank.war 中所有jar包 - 12 个jar包在web.xml 配置struts2 前端控制器 (Filter)在src下创建struts.xml!- 访问struts2入门 - /index.jsp 4执行目标Action中execute方法 (默认执行execute()方法,如果不是execute方法,就要配置中的method属性)。在Action的execute方法中返回 字符串,在struts.xml中配置字符串与页面对应关系/demo1/success.jsp 完成结果页面跳转二:struts-2运行流程1流程请求 - S

3、trutsPrepareAndExecuteFilter 核心控制器 - Interceptors 拦截器(实现代码功能,只访问action时执行 ) - Action 的execuute - 结果页面 Result* 拦截器 在 struts-default.xml定义 struts-core-xxx.jar中* 执行拦截器 是 defaultStack 中引用拦截器2配置struts.xml 提示问题如果安装Aptana编辑器 ,请不要用Aptana自带xml编辑器 编写struts2配置文件 struts.xml提示来自于 DTD约束, 如果可以上网,自动缓存dtd,提供提示功能如果不能

4、上网,也可以配置本地DTD提示struts-2.3.20-allstruts-2.3.20srccoresrcmainresources * 导入DTD时,应该和配置DTD版本一致三:配置1 struts.xml的Action相关配置元素必须配置元素配置package 三个常用属性 name 包名称,不能重复 ,name并不是真正包名,只是为了管理Action namespace 和 的name属性,决定 Action的访问路径 (namespace默认以/开始 ) 如namespace=usermanager action 的name属性为hello 那么访问action的路径 : /use

5、rmanager/hello.action/demo1/1.jsp2 元素配置默认值 的namespace 默认值 / 的class 默认值 ActionSupport 类 的 name 默认值 successStruts-2配置文件加载顺序:1struts-default.xml:在struts-core.jar2.struts-plugin.xml:在struts-Xperties5web.xml后加载文件中struts2 常量会覆盖之前加载文件 常量内容四.Action如何接受请求参数1 struts2 Action 接受请求参数

6、:属性驱动 和 模型驱动第一种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )第二种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)第三种 :使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) - 主流页面:用户名 Action :public class RegistAction3 extends ActionSupport implements ModelDriven private User user = new User(); / 必须手动实例化public User getModel() return user;2

7、封装复杂类型参数(集合类型 Collection 、 Map)3参数封装过程中,数据类型转换问题 struts2 内部提供大量类型转换器,用来完成数据类型转换问题 boolean 和 Booleanchar和 Characterint 和 Integerlong 和 Longfloat 和 Floatdouble 和 DoubleDate 可以接收 yyyy-MM-dd格式字符串数组 可以将多个同名参数,转换到数组中集合 支持将数据保存到 List 或者 Map 集合4注册类型转换器 局部注册 : 只对当前Action有效 (针对属性) 全局注册 : 针对所有Action的日期类型有效 (针对

8、类型 )局部注册 : 在Action类所在包 创建 Action类名-perties , 格式 : 属性名称=类型转换器的全类名 全局注册 : 在src下创建 perties ,格式 : 待转换的类型=类型转换器的全类名五请求数据有效性校验(略)1如何对指定的方法校验 ? 格式 Action类名-ActionName(元素name属性)-validation.xml2手工校验 (代码校验)步骤一: 封装数据 步骤二: 实现校验Action ,必须继承ActionSupport 类 步骤三: 覆盖validate方法,完成对Ac

9、tion的业务方法 数据校验 通过代码逻辑判断参数是否有效,如果参数非法 , this.addFieldError (ActionSupport提供)workflow拦截器 跳转回 input页面步骤四: 在jsp中 通过 显示错误信息 * validate方法会对Action中所有业务方法进行校验,如果只想校验某一个方法 : validate方法名()3案例required 必填校验器 性别不能为空!requiredstring 必填字符串校验器 true 用户名不能为空!stringlength:字符串长度校验器102true 4required 必填校验器requiredstring 必

10、填字符串校验器stringlength:字符串长度校验器int:整数校验器date: 日期校验器url: 网络路径校验器email:邮件地址校验器regex:正则表达式校验器fieldexpression : 字段表达式校验六自定义拦截 器1、 struts2 所有拦截器 都必须实现 Interceptor 接口 2、 AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现所有实际开发中,自定义拦截器 只需要 继承 AbstractInterceptor类, 提供 intercept 方法实现3常用struts2

11、 拦截器 模型驱动 文件上传 参数解析封装 类型转换错误 请求参数校验 拦截跳转 input 视图七Struts-2上传1) 文件上传 enctype=multipart/form-data 是 MIME协议定义多部分请求体 (消息体)2) 上传页面编写存在 上传项,必须提供name属性表单提交方式 必须 post 提交表单编码类型 enctype=multipart/form-data 3) Struts2 对文件上传的支持提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截器 默认在 default

12、Stack 栈中, 默认会执行的在Action需要对上传文件内容进行接收页面:Action:public class UploadAction extends ActionSupport / 接收上传内容/ private File upload; / 这里变量名 和 页面表单元素 name 属性一致private String uploadContentType;private String uploadFileName; * 格式 : 上传表单项name属性 + ContentType 、 上传表单项name属性 + FileName* 为三个对象 提供 setter 方法通过FileUt

13、ils 提供 copyFile 进行文件复制,将上传文件 保存到服务器端通过 struts.multipart.maxSize 常量设置文件上传总大小限制 * struts.multipart.maxSize= 默认上传文件总大小 2MB * 超过文件总大小,跳转input 视图, 通过 回显错误信息 在struts.xml 设置上传总大小八struts2 文件下载1文件下载原理: 服务器读取下载文件内容,通过Response响应流写回, 设置 ContentType、 ContentDisposition 头信息2protected String contentType = text/pla

14、in; / contentType头信息 (下载文件对应 MIME协议规定类型 )* html - text/html . txt- text/plain protected String contentDisposition = inline; / ContentDisposition头信息 (下载文件打开方式 inline浏览器内部打开, attachment 以附件形式打开)protected String inputName = inputStream; / 需要Action中 提供 getInputStream 方法 返回 InputStream 提供下载文件 内容九扩展自定义的结果

15、类型1.开发一个直接或间接实现com.opensymphony.xwork2.Result接口十OGNL表示式使用 和 值栈OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。* xwork 提供 OGNL表达式 * ognl-3.0.5.jarOGNL 是一种比EL 强大很多倍的语言 OGNL 提供五大类功能 1、支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问 3、访问OGNL上下文(OGNL context)和Actio

16、nContext; (重点 操作ValueStack值栈 ) 4、支持赋值操作和表达式串联 5、操作集合对象。1、 使用OGNL访问 对象方法 和 静态方法 * OGNL 在jsp 结合 struts2 标签库 使用 , 执行 ognl表达式 调用 实例方法 : 对象.方法() - 调用 静态方法 : 类全名(包括包路径)方法名 - * 使用 静态方法调用 必须 设置 struts.ognl.allowStaticMethodAccess=true2、 访问OGNL上下文(OGNL context)和ActionContextOGNL上下文(OGNL context) 对象 - 值栈 Valu

17、eStackOGNL表达式 常见使用 #、 % 、$ 符号使用 1) # 的 使用 用法一 # 代表 ActionContext.getContext() 上下文上下文可以看作是一个容器(容器就是一个Map) - ActionContext().getContext().getRequest().getAttribute(name); #request #session #application #attr #parameters 用法二 : 不写# 默认在 值栈中root中进行查找 在root中查找name属性 * 查询元素时,从root的栈顶元素 开始查找, 如果访问指定栈中元素 访问栈中

18、第二个元素name属性 * 访问第二个元素对象 用法三 :进行投影映射 (结合复杂对象遍历 ) s:iterator标签在进行遍历时,会将var中保存的这个对象,在root中,和context中都放一份 所以在 value属性加不加#都可以访问 1)集合的投影(只输出部分属性 遍历集合只要name属性 2)遍历时,对数据设置条件 遍历集合只要price大于1500商品1500 var=product - 3)综合 只显示价格大于1500 商品名称1500.name var=pname 用法四: 使用#构造map集合 经常结合 struts2 标签用来生成 select、checkbox、rad

19、io使用#构造map集合 遍历key : , value: 2) %的使用 用法一: 结合struts2 表单表单使用, 通过%通知struts, %中内容是一个OGNL表达式,进行解析 用法二: 设置ognl表达式不解析 % ognl表达式 3)$的使用 用法一 :用于在国际化资源文件中,引用OGNL表达式 在properties文件 msg=欢迎您, $#request.username在页面 * 自动将值栈的username 结合国际化配置信息显示 用法二 :在Struts 2配置文件中,引用OGNL表达式$contentType * $contentType 读取值栈中contentT

20、ype数据,在Action提供 getContentType 因为Action对象会被压入值栈, contentType是Action属性,从值栈获得结论: #用于写ognl表达式获取数据,% 控制ognl表达式是否解析 ,$ 用于配置文件获取值栈的数据十一.值栈(重点 : 理解值栈 存储原理)1什么是值栈 ValueStack ? ValueStack 是 struts2 提供一个接口,实现类 OgnlValueStack - 值栈对象 (OGNL是从值栈中获取数据的 )每个Action实例都有一个ValueStack对象 (一个请求 对应 一个ValueStack对象 )在其中保存当前Ac

21、tion 对象和其他相关对象 (值栈中 是有Action 引用的 )Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中 (值栈对象 是 request一个属性)valueStack vs = request.getAttribute(struts.valueStack);2值栈的内部结构 ? 值栈由两部分组成 ObjectStack (root): Struts 把动作和相关对象压入 ObjectStack 中-ListContextMap (context): Struts 把各种各样的映射关系(一些 Map 类

22、型的对象) 压入 ContextMap 中Struts 会把下面这些映射压入 ContextMap 中parameters: 该 Map 中包含当前请求的请求参数 ?name=xxxrequest: 该 Map 中包含当前 request 对象中的所有属性session: 该 Map 中包含当前 session 对象中的所有属性application:该 Map 中包含当前 application 对象中的所有属性attr: 该 Map 按如下顺序来检索某个属性: request, session, applicationValueStack中 存在root属性 (CompoundRoot)

23、、 context 属性 (OgnlContext )* CompoundRoot 就是ArrayList* OgnlContext 就是 Mapcontext 对应Map 引入 root对象 * context中还存在 request、 session、application、 attr、 parameters 对象引用 * OGNL表达式,访问root中数据时 不需要 #, 访问 request、 session、application、 attr、 parameters 对象数据 必须写 # * 操作值栈 默认指 操作 root 元素 3值栈对象的创建 ,ValueStack 和 Act

24、ionContext 是什么关系 ?值栈对象 是请求时 创建的 doFilter中 prepare.createActionContext(request, response); * 创建ActionContext 对象过程中,创建 值栈对象ValueStack * ActionContext对象 对 ValueStack对象 有引用的 (在程序中 通过 ActionContext 获得 值栈对象 ) Dispatcher类 serviceAction 方法中 将值栈对象保存到 request范围request.setAttribute(ServletActionContext.STRUTS_

25、VALUESTACK_KEY, proxy.getInvocation().getStack();4如何获得值栈对象获得值栈对象 有两种方法ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);ValueStack valueStack2 = ActionContext.getContext().getValueStack();5向值栈保存数据 (主要针对 root)两种方式 / 将数据保存ro

26、ot的索引0位置,放置到第一个元素 ArrayList add(0,element);valueStack.push(itcast);/ 在值栈创建参数map, 将数据保存到map中valueStack.set(company, 传智播客);在jsp中 通过 查看值栈的内容 6在JSP中获取值栈的数据 访问root中数据 不需要# (自己理解访问” 根“不用#) 访问 其它对象数据 加 #通过下标获取root中对象 /取值栈顶对象直接在root中查找对象属性 (自上而下自动查找) valueStack:在OgnlContext中获取数据request:session:application:a

27、ttr:parameters:=小结= valueStack对象 保存在request范围, 值栈生命周期 就是 request的生命周期 ,值栈的内部结构(root、ognlContext)、获取值栈对象、向值栈保存数据、在JSP显示值栈的内容 3、 值栈在开发中应用 主流应用 : 值栈 解决 Action 向 JSP 传递 数据问题 Action 向JSP 传递数据处理结果 ,结果数据有两种形式 1) 消息 String类型数据this.addFieldError(msg, 字段错误信息);this.addActionError(Action全局错误信息);this.addActionMe

28、ssage(Action的消息信息);* fieldError 针对某一个字段错误信息 (常用于表单校验)、actionError (普通错误信息,不针对某一个字段 登陆失败)、 actionMessage 通用消息 在jsp中使用 struts2提供标签 显示消息信息2) 数据 (复杂类型数据)使用值栈 valueStack.push(products);哪些数据默认会放入到值栈 ? 1)每次请求,访问Action对象 会被压入值栈 - DefaultActionInvocation 的 init方法 stack.push(action);* Action如果想传递数据给 JSP,只有将数据

29、保存到成员变量,并且提供get方法就可以了 2)ModelDriven 接口 有一个单独拦截器 在拦截器中 ,将model对象 压入了 值栈 stack.push(model);* 如果Action 实现ModelDriven接口,值栈默认栈顶对象 就是model对象 4、 值栈的数据 通过EL访问 7为啥EL也能访问值栈中的数据 StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(request); * 对Request对象进行了包装 ,StrutsRequestWrapper * 重写reques

30、t的 getAttribute Object attribute = super.getAttribute(s);if (attribute = null) attribute = stack.findValue(s); 访问request范围的数据时,如果数据找不到,去值栈中找 * request对象 具备访问值栈数据的能力 (查找root的数据)十二。struts2 标签库1引入标签库 (个人写的:jsp页面要加上 )1、 通用标签库 的学习 解析ognl表达式,设置默认值,设置内容是否HTML转义 对比c:set向四个数据范围保存数据 遍历值栈中数据 进行条件判断 - elseif 可以

31、有多个 进行URL重写(追踪Session ) ,结合s:param 进行参数编码 * 对一个链接 进行参数编码 * 下载MIME协议简介.txt 2OGNL 了解部分 : 支持赋值操作和表达式串联 、 操作集合对象 1) 在值栈中保存一个对象product (name,price) 自动查找值栈中 price 和 name 属性 为其赋值 2) ognl操作集合 访问集合第一个元素name属性 访问map中key为name的值 直接构造List 元素、 # 直接构造 Map元素 2、 UI标签库的学习 (Form标签)3使用struts2 form标签好处 : 支持数据回显 , 布局排版(基于Freemarker 模板定义 )struts2 表单标签 val

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论