5 Struts2备课笔记_第1页
5 Struts2备课笔记_第2页
5 Struts2备课笔记_第3页
5 Struts2备课笔记_第4页
5 Struts2备课笔记_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

Struts2备课笔记一什么是struts2? Struts2内部MVC设计模式, 企业web开发 常用架构设计模式 ,将web应用程序进行模块划分,分为三个部分 : Model模型、 View视图、Controller控制器 将web程序分为三个部分,便于维护和扩展 MVC可以理解为就是表现层模式二Struts2快速入门(quickStart) 下载all-zip包 最新2.3.8 解压apps : 例子 docs : 文档lib : jar包src : 源码 需要的具体jar包及其各jar的作用。struts2-core-.jar:Struts 2框架的核心类库xwork-core-.jar:Command模式框架,WebWork和Struts2都基于xwork ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language), struts2框架通过其读写对象的属性freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志 包来支持Log4J和JDK 1.4+的日志记录。commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件commons-io-2.0.1.jar:传文件依赖的jar包commons-lang-2.5.jar:对java.lang包的增强 快速导入基本jar包的简便方式。我们可以直接使用struts2提供的例子(apps)里面的jar包如下图:解压apps里面的Struts2-blank.war: 目录如下: Struts.xml配置情况出现以上问题:解决方案如下:最终发现:undefined struts-default不影响程序的执行,只要联网,那么这个感叹号就会消失。出现状况的原因是:由于web服务器出现问题,由于之前采用分布式部署项目,tomcat端口改动频繁,故而出现问题。 Struts.xml配置文件不是齿轮状解决方案。在创建文件的时候引入即可。或者 new 找到xml 找到 xml(advanced Templates)点击next, 然后template to use 选择 :XML template for a struts-config.xml file 即可。自动引入的。三Struts2运行流程。1).启动服务器(tomcat)将会自动加载配置文件,加载过程如下:服务器一启动:init()方法被执行,方法如下:l 客户端初始化一个指向Servlet容器(WEB容器)的请求;l 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:(SiteMeshPlugin)。l 接着StrutsPrepareAndExecuteFilter被调用,l StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请是否需要调用某个Action。l 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。l ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类l ActionProxy创建一个ActionInvocation的实例。l ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。拦截器默认执行defaultStack里面有一些列的interceptor。l 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapperl 响应的返回是通过我们在web.xml中配置的过滤器l 如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理threadlocalActionContext;如果ActionContextCleanUp不使用,则将会去清理threadlocals。四Struts2的常用配置1、配置文件加载顺序l perties位于 struts2-core.jar org.apache.struts2 包中 配置常量 (框架内部)l struts-default.xml 位于struts2-core.jar 内部配置Bean、结果类型、拦截器(框架内部)l struts-plugin.xml 位于struts2框架 扩展插件包中 (每个插件包 plugin包中 都可以定义 )(插件内部)l struts.xml建立src下 ,用户自定义struts配置文件 ,配置action信息(用户定义)l perties 建立src下 用户自定义struts配置文件 ,主要定义常量 (用户定义 ,通常不写)l web.xml 配置核心过滤器时 标签设置struts2 常量 (通常不写)2、Action相关配置 标签 必须要配置 内部定义 结果类型 、拦截器列表 - struts-default.xml 自定义package ,通常 extends=struts-default ,自定义包要使用框架已经定义好 结果类型和拦截器 为自定义package 指定namespace , 用于区别不同package相同 Action name的访问路径 Action的访问路径 = 包名称空间 namespace + Action name属性配置Action 默认值 默认namespace=/ 可以省略 默认method=execute 自动调用 HelloAction的execute方法 默认name=success 编写name 就是success页面配置 默认class - 执行ActionSupport类 * 3、相关常量配置 配置struts2常量 struts.xml perties web.xml 主要struts.xml name就是常量名字 value 配置常量值 重要常量1) struts.i18n.encoding=UTF-8 相当于 request.setCharacterEncoding 2)struts.action.extension=action, 配置Action匹配请求路径扩展名 /hello /hello.action 3) struts.serve.static.browserCache=true 支持浏览器缓存 4) struts.configuration.xml.reload=false 改动struts.xml 不会自动加载 5) struts.devMode = false 配置为true 启动开发模式 # - struts.i18n.reload = true# - struts.configuration.xml.reload = true6) struts.ui.theme=xhtml 配置默认视图主题,在后期 生成页面代码时会使用7) #struts.objectFactory = spring 默认注释,在struts2 整合 spring框架 时 ,将Struts2 Action创建权 交给Spring8) struts.enable.DynamicMethodInvocation = true 是否支持动态方法调用 ,true支持 将struts2 配置文件 拆分为多个 五、Struts2 框架Action编写 代理模式 ,控制目标对象访问 /hello.action 请求时 StrutsPrepareAndExecuteFilter的 doFilter一定执行1) .ActionMapping mapping = prepare.findActionMapping(request, response, true); 判断配置文件中有没有对应Action 2).ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, method, extraContext, true, false); 根据配置创建代理对象 执行时:先执行interceptor 的 intercept 拦截方法, 最后指向 action 的 execute 1、 struts2 Action三种写法第一种 自定义Action 不需要实现任何接口,继承任何父类 第二种 自定义Action 实现 框架内部提供 Action接口 使用Action接口中定义逻辑视图常量 public static final String SUCCESS = success; - Action业务逻辑执行成功public static final String NONE = none; - 不需要跳转结果页面 ,手动生成结果数据 AJAX public static final String ERROR = error; - Action执行逻辑发生错误 public static final String INPUT = input; - 用户输入数据非法 public static final String LOGIN = login; - 没有权限访问 第三种 自定义Action extends ActionSupport (开发最常用 推荐)* 表单数据合法性校验* 错误信息封装* 国际化信息的读取 2、Action中方法调用 如果 配置 元素时,没有指定method属性,默认执行execute,指定method ,就会调用指定method方法 使用通配符配置Action示例 : 这里 1 就是前面匹配 * 内容* 用户所有操作,只需要配置一个 元素就可以了* 动态方法调用 语法 : xxx.action!方法名 例如: product!add.action执行 ProductAction中 add方法 * 依赖Struts2 常量 struts.enable.DynamicMethodInvocation = true 该常量决定是否允许使用动态方法调用。3、 区分 默认Action和默认处理类 的区别 1) 默认Action : 指当访问名称空间下,没有找到匹配Action元素,就会执行 默认Action- 2) 默认处理类,当配置Action时,没有配置class属性,访问Action时,默认处理类就会得到执行 4、插件 config-browser 使用 * 在运行时,帮助开发人员 查看Action 加载信息 struts2-config-browser-plugin-2.3.7.jar 将其复制 WEB-INF/lib 下访问地址 localhost:8080/struts2_day1/config-browser/index.action六 .Action中访问Servlet API 有两条路 :第一条:通过值栈对象,以解耦合方式,间接访问Servlet API struts2 的Action 没有耦合任何Servlet API , 开发简单,便于测试 ActionContext 上下文,提供对于Servlet对象访问方法 ,间接访问 getContext() 返回ActionContext实例对象get(key) 相当于 HttpServletRequest的getAttribute(String name)方法put(String,Object) 相当于HttpServletRequest的setAttribute方法getApplication() 返回一个Map对象,存取ServletContext属性getSession() 返回一个Map对象,存取HttpSession属性getParameters() 类似调用HttpServletRequest的getParameterMap()方法 setApplication(Map) 将该Map实例里key-value保存为ServletContext的属性名、属性值setSession(Map) 将该Map实例里key-value保持为HttpSession的属性名、属性值第二条:直接获得 熟悉Servlet对象,按照以前的方式进行操作 麻烦一些的做法,通过Aware接口,在构造Action时,自动注入需要操作Servlet对象 直接通过ServletActionContext 类 直接获得Servlet API (底层 ThreadLocal)七、注解开发struts2 convention 插件 struts2-convention-plugin-2.3.7.jar 注意:不使用注解开发时千万不要导入这个注解包。引用convention 支持零配置开发struts2 需要 struts2-convention-plugin-2.3.7.jar 、asm-*.jar(三个)* 学习插件,一定要查看插件包 struts-plugin.xml 包中常量:struts2框架初始化时将会加载struts-plugin.xml文件。 自动扫描四个包 下面Action类 根据约定创建Action访问规则 访问原则: 设置自动扫描包注解时:将会扫描如下包名: cn.itcast.struts2.HelloAction 映射到 /hello.action cn.itcast.actions.books.BookSearchAction 映射到 /books/book-search.action cn.itcast.struts.user.UserAction 映射到 /user/user.action cn.itcast.estore.action.test.LoginAction 映射到 /test/login.action 设置不会被扫描包 默认扫描以Action结尾的类 结果result页面存放位置 Action类文件重新自动加载Action命名驼峰规则:这就是Action命名约定,没有配置文件,也能访问成功,因为默认约定访问路径存在。cn.itcast.action.HelloAction - /hello.action cn.itcast.actions.books.BookSearchAction - /books/book-seach.action cn.itcast.estore.action.test.LoginAction - /test/login.action Result 结果页面命名约定 : actionName + resultCode + suffix cn.itcast.action.HelloAction - /hello.action return success - WEB-INF/content/hello-success.jsp* 按照约定开发,解决Action访问 ,解决result页面显示 (功能远远不够)使用注解 ,在程序 xxx 取代配置文件 xml, 注解可以覆盖约定 Action(hellotest) 配置Action名称 ,默认namespace 就是 /Result(name=success,location=/success.jsp) 配置结果页面 Actions Results 可以为一个方法配置多个Action name ,配置多个结果集Namespace(/)ParentPackage(struts-default)八、常用结果集配置 配置在两个位置 定义result 位置一: 内部 局部结果页面位置二: 内部 外部 全局结果页面 * 所有Action 都可以使用 /index.jsp 元素 两个属性 name和type ,没有写name 默认success , 没有type 默认 dispatcher (转发)* 转发时,浏览器URL 不改变 转发* 最常用 , struts2 值栈 valueStack 保存在request范围 ,值栈数据在转发时才能使用,否则将会丢失(重定向)。* 实例 /index.jsp 重定向 到jsp页面。* 登陆后 重定向到主页* 实例 /index.jsp 重定向到另一个Action * 客户管理系统,删除一个客户后,需要重定向到 查询客户 程序 * 实例hello/execute 第九Struts中Action的Model的参数封装。struts2 内部提供参数封装功能,不需要手动使用BeanUtils 进行封装 * struts2 大部分内置功能 都是拦截器实现的 ,实现参数封装的功能。1、struts2 封装参数到Action 三种写法 第一种 在Action内部提供form 对应 表单项setter方法 (主要用于属性较少的封装,如果分层 不便于将数据传递业务层)第二种 定义单独model对象,页面表单采用ognl表达式写法 页面* 一定要提供 getUser:如果没有提供getUser,那么将不会正确封装数据。具体封装流程如下:传递username,调用setUsername,把username注入User中,将会新建一个User对象,当第二个参数password传递过来时,struts框架将首先调用getUser方法询问User是否为空,如果为空,将会新建一个User,否则不会新建,直接注入值。如果只有一个Set方法,那么每set一次数据,就会新建一个User对象,那么就是把username、password封装在两个不同的User对象中了。这样封装失败。第三种 Action采用模型驱动 implements ModelDriven 提供 getModel * struts2 框架 模型驱动拦截器:复制拦截对象实例进行参数的封装。* 注意: 模型对象必须 手动实例化 User user = new User();特殊类型 对象封装 Collection 、Map Collection 集合对象封装 页面 - Action List emp;将数据封装到List集合:将数据封装到Map:第十:Struts2类型转换器Struts2内置转换器,开发者根本无需创建自己的转换器:Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 Long float 和 Float double 和 Double Date 可以接收 yyyy-MM-dd格式字符串 数组 可以将多个同名参数,转换到数组中 集合 支持将数据保存到 List 或者 Map 集合日期类型转换:在Action中执行action方法,只能对日期类型形如:2000-11-23中间以横杠的形式的日期格式进行转换。如果换成:2000/11/23这种形式,就会转换失败。这个时候就需要我们自定义类型转换器来实现我们的转换目标。struts2给我们提供了类型转换器:我需要继承这个类型转换器来扩展自己的转换功能需求。自定义类型转换:我们继承:DefaultTypeConverter。.首先自定义转换类:public class MyConverter extends DefaultTypeConverterOverride/* * value:string的形式。值:2000/11/23 * toType:值:java.util.Date类型 */public Object convertValue(Map context, Object value,Class toType) /时间类型必须与需要转换的类型匹配:2000/11/23匹配yyyy/MM/ddSimpleDateFormat format = new SimpleDateFormat(yyyy/MM/dd);/判断从前台传递过来的数据类型/如果是时间类型,那么就转换为我需要的时间格式类型。if(toType = Date.class)System.out.println(转换成时间类型。);String dateStr = (String)value)0;try /返回date类型return format.parse(dateStr); catch (ParseException e) / TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException(e);/如果是字符串类型,那么就转换为格式化为我所需要的类型else if(toType = String.class)System.out.println(转换成字符串类型。);Date date = (Date)value;/返回字符串类型return format.format(date);return super.convertValue(context, value, toType);.配置全局自定义转换类在src下面写上固定文件名:perties这个文件。内容:待转换的类型=类型转换器的全类名本例perties文件中的内容为:java.util.Date=cn.itcast.converter.MyConverter全局配置类型转换和类相关。局部转换器和变量相关。.局部类型转换器局部类型转换器必须注意:需要转换的字段必须在action里面要有set方法。即是:必须在action类里面有这个变量,并且有setCreateTime方法。这样局部配置才能生效。配置流程入下:在Action类所在的包下放置ActionClassNperties文件,ActionClassName是Action的类名,后面的-perties是固定写法,对于本例而言,文件的名称应为HelloWorldAperties 。在properties文件中的内容为:属性名称=类型转换器的全类名对于本例而言, HelloWorldAperties文件中的内容为:createtime= cn.itcast.conversion.DateConverter.类型转换中错误处理。Struts2提供了一个名为conversionError的拦截器:如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中使用类型转换中的错误处理用户定义Action必须继承ActionSupport在自定义类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入名为input的逻辑视图l 在Action所在包中,创建 ActionNperties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息在input逻辑视图所对应jsp页面中,通过 输出类型转换信息注意:当类型转换失败后,conversionError 拦截器,将fieldError 保存在request 范围中,以转发方式 跳转回 input视图 * 用户可以在 input视图中 显示 fieldError信息默认类型转换的错误信息 位于 xwork-core /com/opensymphony/xwork2/perties xwork.default.invalid.fieldvalue=Invalid field value for field 0.测试占位符实现原理:.配置局部消息文件在Action 所在包 Action类名.properties (Action范围信息文件,只对当前Action 有效)* invalid.fieldvalue.属性名= 错误信息理解:错误为什么回显?首先Struts2经过一系列的拦截器,StrutsConversionErrorInterceptor这个拦截器会自动检测错误输入,然后回显。将中文 - unicode JDK/bin/native2ascii.exe.参数的合法性校验服务器端数据校验 struts2 提供validate机制 客户端数据校验 JS实现 - JQuery validate 插件 问题:两种校验代码 是否在项目都要编写 - 是的 客户端校验,第一时间 发现用户输入错误,即时提醒用户,减少服务器端访问 (性能提高,改善用户体验)服务器校验(安全性):注意是考虑安全性,如果js客户端被屏蔽,那么校验就OVER第十一:服务器端校验的几种方案: 第一种 手动在方法中编写代码层面 校验逻辑.手动校验 编写validate() 全局性校验:当前Action类所有业务方法,都会执行这个校验 Action类必须 继承ActionSupport 覆盖validate 方法 编写校验逻辑 将校验失败后,this.addFieldError 添加错误信息, workflow拦截器 自动跳转input视图 , 在input视图显示错误信息 校验步骤:第一步:编写action代码,只需要复写validate方法业务逻辑即可,struts2后台拦截器会自动执行validate方法来进行校验。 public class CustomerAction extends ActionSupport implements ModelDrivenprivate Customer customer = new Customer();Overridepublic String execute() throws Exception / TODO Auto-generated method stubSystem.out.println(数据合法!);return super.execute();Overridepublic void validate() /对所方法执行校验if(customer.getName()=null)this.addFieldError(name, 用户名不能为空!);else if(customer.getName().trim().length()12)this.addFieldError(name, 用户名必须在3到12位之间!);public Customer getModel() / TODO Auto-generated method stubreturn customer;第二步:编写javabean类及jsp文件。第三步:编写struts配置文件,配置文件不需要任何多于的配置,和以前配置一样。成功配置:我什么都不输入结果如下: 模拟null:我不从页面访问,我直接访问action,那么在请求中就不会有name这个字段,那么在服务端这个字段就为null。 数据回显,数据(dispatcher)转发,数据还存在域里面,故而转发完毕可以继续从域里面获取数据。那么何时使用重定向?何时使用转发呢?.重定向过程:客户浏览器发送http请求-web服务器接受后发送302响应要求客户浏览器发送一个新的http请求-客户端浏览器接受此响应后在发送一个新的http请求到服务器-服务器根据此请求寻找资源并发送给客户,它可以重定向到任意URL,不能共享request范围内的数据。转发过程:客户浏览器发送http请求-web服务器接受此请求后调用内部的一个方法在容器内部完成请求处理和转发动作-将目标资源发送给客户,它只能在同一个web应用中使用,可以共享request范围内的数据。怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。想针对Action中指定方法执行校验 编写 validate方法名() 完成局部校验 - 只针对个别方法进行校验 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中 方法名为Xxx的方法。其中Xxx的第一个字母要大写。public String add() throws Exceptionreturn success;对应的验证方法public void validateAdd() /验证代码,只对action中add方法进行验证,其他方法不起作用。* 例如 校验 CustomerAction 中 delete方法 - validateDelete()在ValidationInterceptor拦截器中可以看到以validate开始的方法public class LoginAction extends ActionSupport implements ModelDrivenprivate User user = new User();public User getModel() return user;public String login()return SUCCESS;public void validateLogin() if(user.getName()=null | user.getName().length()=0)this.addFieldError(name, 用户名不能为空);else if(user.getAge()=0)this.addFieldError(age, 年龄非负);/注意:验证失败是通过workflow拦截器转向input,所以struts.xml/配置文件里面必须有的input配置/demo1/login.jsp/demo1/success.jsp第二种 配置XML文件,通过Struts2 内置校验机制进行校验ML校验文件 必须放到Action 所在包 全局校验 (对Action内所有方法 都校验) 文件名: Action类名-validation.xml 局部校验 (对Action中指定某个方法进行校验) 文件名 : Action类名-(action name 在struts.xml)-validation.xml 例如: 默认执行 execute方法:就像校验execute方法 在LoginAction 所在包 创建 LoginAction-login-validation.xml,在校验文件中引入 校验需要DTD xwork-core.jar /xwork-validator-1.0.3.dtd ,为表单中每个输入项,编写校验规则 com.opensymphony.xwork2.validator.validators下的default.xml 具体流程如下:1).准备登陆页面。2).编写Action类及javabeanpublic class LoginAction extends ActionSupport implements ModelDrivenprivate User user = new User();Overridepublic String execute() throws Exception / TODO Auto-generated method stubreturn super.execute();public User getModel(

温馨提示

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

最新文档

评论

0/150

提交评论