Struts2 学习指南(V1.0)


Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 回顾 MVC  模型-----------Model  接收视图请求数据,进行业务处理,返回处理结果  数据访问层、业务逻辑层、模型层  视图-----------View  交互界面,负责数据采集和处理、用户的请求  jsp、html  控制器--------Controller  接收用户端请求,将模型和视图联系在一起,实现用户请求的功能  承上启下的枢纽  servlet 如下图:  MVC 编程思路  模型开发  视图  控制器 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 一、Struts2 框架  资料获取地址:http://struts.apache.org/  Struts2 目录结构  apps:struts2 示例应用程序  docs:struts2 指南、向导、API 文档  lib:Struts2 发行包及其依赖包  src:struts2 项目源代码  HelloWorld 示例  准备必须加载的 5 个.jar 文件  struts2-core-2.x.jar:Struts2 框架的核心类库  xwork-2.x.jar:XWork 类库,Struts2 的构建基础  ognl-2.x.jar:Struts2 使用的一种表达式语言类库  freemarket-2.x.jar:Struts2 的标签模板使用类库  commons-fileupload-1.x.jar:Struts2 文件上传依赖包  配置 web.xml struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*  开发视图层 helloworld.jsp  开发控制层 HelloWorldAction  配置 Struts2 配置文件(struts.xml)  struts2 运行流程  请求规则:/项目名称/package 的 namespace 属性值/action 的 name 属性值 二、Action  Action 形式  普通 Java 类  实现 Action 接口  继承 ActionSupport 类:被推荐的  获取请求参数  action 的属性  DomainModel  ModelDriven:Action 的类实现 ModelDriven 接口  三种访问 Action 方式  正常方式访问:namescape/actionName Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  DMI 动态方法方式访问:namescape/actionName!methodName  通配符方式访问:*_*  获取 Servlet API 对象  与 Servlet API 解耦方式(request、session、servletContext) 1) Map request = (Map)ActionContext.getContext().get("request"); Map session = ActionContext.getContext().getSession(); Map application = ActionContext.getContext().getApplication(); 2) 实现 RequestAware, SessionAware, ApplicationAware 三个接口(被推荐)  与 Servlet API 耦合方式(HttpRequest、HttpSession、HttpServletContext) 1) HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); ServletContext application = session.getServletContext(); 2) 实现 ServletRequestAware 接口 HttpSession session = request.getSession(); HttpServletContext application = session.getServletContext();  数据校验  字段验证  后台 Action:super.addFieldError("fieldName","errorMsg" );  前台页面:   action 验证  后台 Action:super. addActionError("errorMsg" );  前台页面: 三、Struts2 配置  struts.xml  struts2 的核心配置文件,主要负责管理 action  需要放置在/WEB-INF/classes 下,该目录下的 struts.xml 文件可以被自动加载  constant 元素  配置常量,可以改变 struts2 框架的一些行为  name 属性表示常量名称,value 属性表示常量值 设置编码: 设置主题: 设置为开发模式: 设置重新加载类:  package 元素  通过对已定义的继承可以简化维护工作,提高重用性  name 属性必须唯一、指定包名 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  extends 属性指定要扩展的包名  namescape 属性定义该包中 action 的命名空间,可选  Result  调度视图以哪种形式体现给客户端(Action 处理结束后,系统下一步要做什么)  name 属性表示 result 的逻辑名  result 元素的值指定对应的物理资源位置  type 属性指定资源类型  Dispatcher(默认):使用 request.getRequestDispatcher().forward()转发到另一个页面  Redirect:response.sendRedirect()跳转到另一个页面  Chain:使用 forward 转发到另一个 action  RedirectAction:使用 sendRedirect 跳转到另一个 action  FreeMarker  HttpHander  Stream  Velocity  XSL  PlainText:源码输出跳转的页面  Tiles  动态结果 ${next} 要求:在当前 action 中必须存在一个 getNext()方法  全局 Result 位于 package 元素下,表示多个 Action 共有的 Result /error.jsp  exception-mapping、global-exception-mappings  exception-mapping:某个 action 出现异常的处理方式,位于 action 元素下  global-exception-mappings:多个 Action 出现异常时统一处理方式,位于 package 元素下 ---------- exception-mapping -------- ---------- global-exception-mappings -------- /error.jsp  default-action-ref  如果没有一个 Action 匹配请求,默认 Action 将被执行 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 error.jsp  include  引用外部模块  interceptors、interceptor-ref  interceptors 用于声明一个拦截器组件,位于 package 元素下  interceptor 用于将一个拦截器注册到当前 Action 中,位于 action 元素下  interceptor-stack  将多个拦截器放入一个栈中,位于 package 元素下  其它  struts-default.xml  Struts 2 默认配置文件,会自动加载  struts-default 包在 struts-default.xml 文件中定义  struts-plugin.xml  Struts 2 插件使用的配置文件  如果不开发插件,不需要编写该配置文件  加载顺序  struts-default.xml—>struts-plugin.xml—>struts.xml —>web.xml 四、OGNL 表达式(对象图导航语言)  OGNL  Object Graph Navigation Language  开源项目,取代页面中 Java 脚本,简化数据访问  和 EL 同属于表达式语言,但功能更为强大  OGNL 上下文 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  OGNL 表达式的计算围绕 OgnlContext(OGNL 上下文)进行  由 ognl.OgnlContext 类表示,实现了 Map 接口  OGNL 上下文中以键值对的形式包含多个对象,可以将其中一个指定为根对象(ValueStack)  访问根对象,直接书写对象的属性  访问其他对象必须使用“#key”前缀  访问 Action 中对象的属性、方法 访问值栈中的 action 的普通属性:username= 访问值栈中对象的普通属性(get set 方法):book.name= 访问值栈中对象的普通属性(get set 方法):book.category.name= 访问值栈中对象的普通方法:book.name.length(): 访问值栈中 action 的普通方法:  访问静态属性和方法  设置 struts.xml 访问静态方法: 访问静态属性: 访问 Math 类的静态方法:  访问普通类的构造方法  访问 List、Set 和 Map 访问 List: 访问 List 中某个元素: 访问 List 中元素某个属性的集合: 访问 List 中元素某个属性的集合中的特定值: 访问 Set: 访问 Set 中某个元素: 访问 Map: 访问 Map 中某个元素: | 访问 Map 中所有的 key: 访问 Map 中所有的 value: 访问容器的大小:  投影 投影(过滤): 投影(过滤): 投影(过滤): Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 投影(过滤):  值栈(ValueStack)-----------课外掌握  定义  类似于正常的栈,符合后进先出的特点  ValueStack 是 struts2 的核心概念,可以在值栈中放入、删除和查询对象  ValueStack 是一个接口,OgnlValueStack 类是其在 Struts2 中的缺省实现  ValueStack 实际上就是对 OGNL 的封装和扩充,Struts2 将值栈作为 OGNL 的根对象  Action 与 ValueStack 的关系  Struts2 总是把 Action 实例放置在值栈栈顶  引用 Action 的属性可省略”#”标记,直接进行访问  如果访问 ActionContext 中的其他对象,则必须使用”#”标记  常用方法  void set(String key,Object o):按照指定 key 将对象放入值栈  void setValue( String expr, Object value ):将某个对象按照 OGNL 表达式放入值栈  void push( Object o ):将对象置于值栈的栈顶  Object findValue( String expr):按照指定的 OGNL 表达式在值栈中查询数据  代码示例 <% Person person = new Person(); person.setUserName("Tom"); person.setAge(50); ValueStack vs = ActionContext.getContext().getValueStack(); vs.set("person",person); String name=(String)vs.findValue("person.userName"); out.print("
使用 set 将 person 对象放入栈顶后姓名是:"+name); vs.setValue("person.userName","John"); name=(String)vs.findValue("person.userName"); out.print("
使用 setValue 为 userName 重新赋值后姓名是:"+name); %>  从值栈中获取值  使用[N]语法获取属性  从值栈中第 N 个元素开始查找  N 从 0 开始 左侧为获取值的方式 ,右侧为值栈中对象的分布  使用 top 和[N]语法获取对象 获取“name1”---->name 获取“20”---->age 获取“男”---->sex 获取“name2”---->[1].name 获取“name3”---->[2].name 获取“30”---->[1].age 或者[2].age 值 栈 Student1 name:”name1” age:”20” Student2 name:”name2” sex:”男” Student3 name:”name3” age:”30” Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  top 表示栈顶元素 五、Struts2 标签  property property: property 取值为字符串: property 设定为默认值: property 设定 HTML:  set set 设定 adminName 值(默认为 request 和 ActionContext): set 从 request 取值: set 从 ActionContext 取值: set 设定 page 作用域: 从 page 作用域相应取值:<%= pageContext.getAttribute("pass") %> set 设定 ActionContext 作用域: set 使用#取值:  bean  include  include1.jsp 包含静态英文文件  include2.jsp 包含静态中文文件  include2.jsp 包含静态英文文件  if elseif else  iterator  遍历集合 |  自定义变量 | 获取 Student1---->top 获取 Student2---->[1].top 获取 Student3---->[2].top Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  status | 遍历过的元素总数: 遍历过的元素索引: 当前行是否是偶数行: 当前行是否是奇数行: 当前元素是否是第一个: 当前元素是否是最后一个:
 map 遍历
|
 map 自定义变量
|
六、深入 Struts2  Struts2 执行流程 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  客户端向 Servlet 容器(如 Tomcat)提交一个请求  请求经过一系列过滤器(如 ActionContextCleanUp 过滤器等)  核心控制器被调用,询问 ActionMapper 来决定请求是否需要调用某个 Action  如果 ActionMapper 决定需要调用某个 Action,核心控制器把控制权委派给 ActionProxy  ActionProxy 通过 Configuration Manager 询问框架的配置文件(struts.xml),找到需调用的 Action 类  ActionProxy 创建一个 ActionInvocation 的实例  ActionInvocation 负责调用 Action,在此之前会依次调用所有配置的拦截器  Action 执行完毕,ActionInvocation 负责根据结果码字符串在 struts.xml 的配置中找到对应 的返回结果  拦截器被再次执行 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  过滤器被再次执行  Struts2 核心接口和类  ActionMapper:根据请求的 URL 查找是否存在对应的 Action 调用  ActionMapping:保存调用 Action 的映射信息,如 namescape、name 等  ActionProxy:在 XWork 和真正的 Action 之间充当代理  ActionInvocation:表示 Action 的执行状态,保存拦截器、Action 实例  Inteceptor:可以在请求处理之前或之后执行的 Struts2 组件,struts2 绝大多数功能通过拦 截器完成  Struts 执行流程简图  拦截器  早期 MVC 框架将一些通用操作写死在控制器中,致使框架灵活性不足、可扩展性降低  Struts2 将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性, 有利于系统的解耦  为 Action 提供附加功能时,无需修改 Action 代码,使用拦截器来提供  拦截器方法在 Action 执行之前或者之后执行  拦截器栈 1) 从结构上看,拦截器栈相当于多个拦截器的组合 2) 在功能上看,拦截器栈也是拦截器  struts-default.xml 中定义一个 defaultStack 拦截器栈,并将其指定为默认拦截器  只要在定义包的过程中继承 struts-default 包,那么 defaultStack 将是默认的拦截器  自定义拦截器 1) 实现自定义 Interceptor 类  实现 Interceptor 接口  void init():初始化拦截器所需资源  void destroy():释放在 init()中分配的资源  String intercept(ActionInvocation ai) throws Exception  实现拦截器功能  利用 ActionInvocation 参数获取 Action 状态 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  返回结果码(result)字符串  继承 AbstractInterceptor 类  提供了 init()和 destroy()方法的空实现  只需要实现 intercept 方法即可  推荐使用 2) 注册自定义 Interceptor 3) 如果注册了自定义的 Interceptor,需要手动加上 七、Validation----验证框架  用于验证 Action 的属性  需要使用 Struts 的标签  完成 Action----UserAction public class UserAction extends ActionSupport { private User user; private String repassword; //...(略) }  完成 struts.xml(略)  完成验证规则配置文件 UserAction-validation.xml  命名要求:XXX-validation.xml,XXX 必须与要验证的 Action 的类名相同  验证示例 true 用户名丌能为空 ! 10 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 6 用户名长度必须在${minLength}和${maxLength}之间 true 密码丌能为空! 6 密码长度必须${minLength}位或以上 true 确认密码丌能为空! user.password==repassword 两次密码必须输入一致! true 电话丌能为空! ^(\d{3,4}-){0,1}(\d{7,8})$ 电话号码格式丌正确!  自定义验证规则类  完成验证规则类:  继承自 FieldValidatorSupport 并且重写 validate 方法  完成验证规则类的配置  命名:validators.xml  位置:必须放在根目录下 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 八、国际化  Java 实现国际化的思路  将程序中的提示信息、错误信息等放在资源文件中,为不同国家/语言编写对应资源文件  资源文件由很多 key-value 对组成,key 保持不变,value 随国家/语言不同而不同  这些资源文件使用共同的基名,通过在基名后面添加语言代码、国家和地区代码来进行区分 ApplicationResources.properties:默认资源文件,如果请求资源文件不存在,将调用它的资源进行显示 ApplicationResources_en.properties:所有英文语言的资源 ApplicationResources_zh.properties:所有的中文语言的资源 ApplicationResources_zh_CN.properties:针对中国大陆的、中文语言的资源  转换文件中内容为 ascii 码:  native2scii [源文件名] [目标文件名]  Struts2 实现国际化三种方式  Action 级的国际化  创建国际化资源文件  文件位置:与 Action 类在同一包下  资源文件命名:XXX_en_US、XXX_zh_CN 等中的 XXX 必须与 action 的类名相同  前台获取资源   后台 action 获取资源  String name = getText("login.username" );  包级的国际化  创建国际化资源文件  文件位置:与 Action 类在同一包下  资源文件命名:package_en_US、package_zh_CN 等  获取资源:同上  应用程序级国际  创建国际化资源文件  文件位置:存放在 src 或 classes 根目录下  资源文件命名:XXX_en_US、XXX_zh_CN 等,其中 XXX 为项目名称  获取资源:同上  在 struts.xml 中指定资源文件的基名及存储路径  在页面上直接切换语言 english Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 九、类型转换器  默认转换器  Struts 2 提供了强大的数据转移和类型转换功能,由框架自动完成,这些是由 OGNL 完成  在基于 HTTP 协议的 Web 应用中  客户端请求的所有内容都以文本编码方式传输到服务器端  服务器端的编程语言却有着丰富的数据类型  Struts2 内置类型转换器 String:将 int、long、double、boolean、String 类型的数组或者 java.util.Date 类型转换为字符串 boolean/Boolean:在字符串和布尔值之间进行转换 char/Character:在字符串和字符之间进行转换 int/Integer : float/Float : long/Long : double/Double : date:在字符串和日期类型之间进行转换。具体输入输出格式与当前的 Locale 相关 数组和集合:在字符串数组和数组对象、集合对象间进行转换  创建自定义类型转换器  继承 StrutsTypeConverter  public Object convertFromString(Map context, String[] val, Class toType) 将一个或多个字符串值转换为指定的类型  将指定对象转化为字符串 public String convertToString(Map context, Object object)  注册自定义类型转换器  局部:XXX-conversion.properties 在字符串和数值型数据之间进行转换 Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日  与用到转换器的 Action 在同包上  XXX 为用到转换器的 Action 的类名  properties 文件中的键为 Action 中需要转换的属性名 birthday = convertor.customer.MyDateConverter  全局:xwork-conversion.properties  放在 src 或 classes 根目录下  properties 文件中的键为需要转换的类型的完全限定名 java.util.Date = convertor.customer.MyDateConverter  对象传参: point=3,4 或 point.x=3&point.y=4  List 方式传参: pointList[0].x=10&pointList[0].y=20&pointList[1].x=100&pointList[1].y=200  Map 方式传参: pointMap['a'].x=10& pointMap ['a'].y=20 & pointMap ['b'].x=100& pointMap ['b'].y=200 十、实用技术  上传/下载  Struts2 的上传组件是一个拦截器(这个拦截器不用配置,是自动装载的)。  Struts2 为了获得一些上传文件的信息,如上传文件名、上传文件类型以及上传文件的 Stream 对象, 就需要按着一定规则来为 Action 类增加一些 getter 和 setter 方法。  Struts2 中,用于获得和设置 java.io.File 对象(Struts2 将文件上传到临时路径,并使用 java.io.File 打开 这个临时文件)的方法是 getUpload 和 setUpload。获得和设置文件名的方法是 getUploadFileName 和 setUploadFileName ,获得和设置上传文件内容类型的方法是 getUploadContentType 和 setUploadContentType。 public class UploadAction extends ActionSupport { private File upload; private String uploadFileName; private String uploadContentType; //getter and setter..... public String execute() throws Exception { InputStream is = new FileInputStream(upload); OutputStream os = new FileOutputStream("d:\\upload\\" + uploadFileName); byte buffer[] = new byte[8192]; int count = 0; while((count = is.read(buffer)) > 0) { os.write(buffer, 0, count); } os.close(); is.close(); return SUCCESS; Struts2 学习指南(V1.0)----------------朱飞 2011 年 8 月 16 日 } }  命名要求: private File file; private String fileFileName; private String fileContentType; 即:上传接收文件的属性名(file)+其它属性名(fileName),拼接后注意命名规范  execute 方法只是从临时文件复制到指定的路径(在这里是 d:\upload)中。上传文件的临时目录的默 认值是 javax.servlet.context.tempdir 的值,但可以通过 struts.properties(和 struts.xml 在同一个目录下) 的 struts.multipart.saveDir 属性设置。Struts2 上传文件的默认大小限制是 2M(2097152 字节),也可以 通过 struts.properties 文件中的 struts.multipart.maxSize 修改,如 struts.multipart.maxSize=2048 表示一 次上传文件的总大小不能超过 2K 字节。  十一、Struts2-Ajax  Struts 2 对 Ajax 提供了很好的支持  提供了基于 Dojo 的 Ajax 标签,对 Ajax 操作进行了封装,可以更快捷容易的使用 Ajax  使用 Struts 2 的 Ajax 标签前必须进行如下操作  将 struts2-dojo-plugin-2.1.x.x.jar 复制到 WEB-INF\lib 目录  在 JSP 页面中导入 Ajax 标签  在 JSP 页面中加入 head 标签,负责页面上导入 Dojo 所需要的 CSS 库和 JavaScript 库  Struts2 的 Ajax 标签  :创建一个 div 区域,可以通过 Ajax 向其中加载内容,以实现局部刷新  :通过 Ajax 来更新某个元素的内容或提交表单  :通过 Ajax 来更新某个元素的内容或提交表单  :创建一个标签面板,由来提供内容  :根据用户输入提供输入建议,或者帮助用户自动完成输入  :创建一个支持 Ajax 的树形组件 十二、FreeMarker
还剩16页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

lbsg323

贡献于2012-06-11

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf