资源预览内容
第1页 / 共194页
第2页 / 共194页
第3页 / 共194页
第4页 / 共194页
第5页 / 共194页
第6页 / 共194页
第7页 / 共194页
第8页 / 共194页
第9页 / 共194页
第10页 / 共194页
亲,该文档总共194页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2讲师:冯威讲师:冯威高级软件人才实作培训专家高级软件人才实作培训专家! !Struts2 概述Struts2是一个用来开发MVC应用程序的框架.它提供了提供了Web应用程应用程序开发过程中的一些常见问题的解决方案序开发过程中的一些常见问题的解决方案:对页面导航页面导航活动进行管理对来自用户的输入数据进行合法性验证输入数据进行合法性验证统一的布局统一的布局可扩展性可扩展性国际化和本地化国际化和本地化支持Ajax表单的重复提交表单的重复提交高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2的优点和和struts1struts1一样,一样, Struts2 Struts2也都是属于也都是属于MVCMVC框架。不过有一点大家需要注意的是:虽然框架。不过有一点大家需要注意的是:虽然Struts2Struts2和和struts1struts1在名字上差别不大,但在名字上差别不大,但Struts2Struts2编码模式与编码模式与struts1struts1几乎可以说是不几乎可以说是不一样的。那么既然有了一样的。那么既然有了struts1struts1,为何还要推出,为何还要推出struts2struts2。主要是因为。主要是因为struts2struts2有以下有以下优点:优点:1 在软件设计上Struts2没有像struts1那样跟Servlet API和struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。public class OrderListAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception 2 Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。3 Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。4 Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等5 Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。6 提供了全局范围、包范围和Action范围的国际化资源文件管理实现高级软件人才实作培训专家高级软件人才实作培训专家! !从 Struts1 升级到 Struts2lStruts2从本质上讲已不是从不是从Struts1扩展而来扩展而来的,说它是一个换换了品牌标签的了品牌标签的WebWork更合适l从Struts1升级到Struts2:Struts1里使用ActionServlet作为控制器;Struts2使用了一个过滤使用了一个过滤器作为控制器器作为控制器Struts1中每个HTML表单都对应一个ActionForm实例.Struts2中中,HTML表单将被直接映射到一个表单将被直接映射到一个POJO.Struts1的验证逻辑编写在ActionForm中;Struts2中的验证逻辑中的验证逻辑编写在编写在Action中中.Struts1中,Action类必须继承org.apache.struts.action.Action类;Struts2中任何一个中任何一个POJO都可以是一个都可以是一个Action类类.Struts2在页面里使用在页面里使用OGNL来显示各种对象模型来显示各种对象模型,可以不再使用EL和JSTL高级软件人才实作培训专家高级软件人才实作培训专家! !Struts2入门入门高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn搭建Struts2开发环境的步骤搭建Struts2环境时,我们一般需要做以下几个步骤的工作:1创建javaweb工程2找到开发Struts2应用需要使用到的jar文件.3创建jsp文件.4创建action文件5编写Struts2的配置文件6在web.xml中加入Struts2MVC框架启动配置高级软件人才实作培训专家高级软件人才实作培训专家! !1 创建javaweb工程创建struts2test工程高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn2 开发Struts2需要的jar文件到http:/struts.apache.org/download.cgi#struts2014下载struts-2.x.x-all.zip,目前最新版为2.1.8。下载完后解压文件,开发struts2应用需要依赖的jar文件在解压目录的lib文件夹下。不同的应用需要的JAR包是不同的。下面给出了开发Struts2程序最少需要的JAR。struts2-core-2.1.8.1.jar:Struts2框架的核心类库xwork-core-2.1.6.jar:XWork类库,Struts2在其上构建ognl-2.7.3.jar:对象图导航语言(ObjectGraphNavigationLanguage),struts2框架通过其读写对象的属性freemarker-2.3.15.jar:Struts2的UI标签的模板使用FreeMarker编写commons-logging-1.1.x.jar:ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK1.4+的日志记录。commons-fileupload-1.2.1.jar文件上传组件,2.1.6版本后需要加入此文件commons-io-1.3.2.jar,上传文件依赖的jar包高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn3 创建jsp文件定义test.jsp文件增加如下连接:helloworld高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn4 创建action文件importcom.opensymphony.xwork2.Action;publicclassHelloWorldActionimplementsActionpublicStringexecute()throwsExceptionSystem.out.println(helloWorld);/转到成功页面returnsuccess;注:struts2中action要实现action的接口高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn5 编写Struts2的配置文件Struts2默认的配置文件为struts.xml,该文件需要存放在WEB-INF/classes下,也就是当前工程的src下,该文件的配置模版如下:配置package元素Struts2 把各种 Action 分门别类地组织成不同的包. 可以把包想象为一个模块. 一个典型的 struts.xml 文件可以有一个或多个包每个 package 元素都必须有一个 name 属性namespace 属性是可选的, 如果它没有给出, 则以 “/” 为默认值. 若 namespace 有一个非默认值, 则要想调用这个包里的Action, 就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里package 元素通常要对 struts-default.xml 文件里定义的 struts-default 包进行扩展. 这么做了以后, 包里的所有动作就可以使用在 struts-default.xml 文件里的结果类型和拦截器了. 高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn5 编写Struts2的配置文件配置action元素action 元素嵌套在 package 元素内部, 它表示一个 Struts请求. 每个 action 都必须有一个 name 属性, 该属性和用户请求 servletPath 之间存在着一一对应关系action 元素的 class 属性是可选的. 如果没有配置 class 属性, Struts 将把 com.opensymphony.xwork2.ActionSupport 作为其默认值. 如果配置了 class 属性, 还可以使用 method 属性配置该类的一个动作方法. method 属性的默认值为 execute 高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn5 编写Struts2的配置文件配置result元素result 元素: 的一个子元素, 它告诉 struts 在完成动作后把控制权转交到哪里. result 元素(的name 属性)对应着 Action 方法的返回值. 因为动作方法在不同情况下可能返回不同的值, 所以同一个 action 元素可能会有多个 result 元素result 元素的 name 属性建立 和 Action 方法返回值之间的映射关系。name 属性的默认值为 “success”result 元素的 type 属性负责指定结果类型. type 属性的值必须是在包含当前包或者是当前包的父包里注册过的结果类型. type 属性的默认值为 dispatcher高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn5 编写Struts2的配置文件在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用,注意:name名称是唯一 。包的namespace属性用于定义该包的命名空间。该属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“/”通常每个包都应该继承struts-default包, struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。而Struts2很多核心的功能都是通过这些内置的拦截器实现。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn6 Struts2的启动配置在struts1.x中,struts框架是通过Servlet启动的.在struts2中,struts框架是通过Filter启动的。在web.xml中的配置如下:StrutsPrepareAndExecuteFilterorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter!-自从Struts2.1.3以后,下面的FilterDispatcher已经标注为过时org.apache.struts2.dispatcher.FilterDispatcher-StrutsPrepareAndExecuteFilter/*在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。注意:struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件高级软件人才实作培训专家高级软件人才实作培训专家! !6 Struts2的启动配置(底层代码)以上方法在org.apache.struts2.dispatcher.Dispatcher类中高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2的处理流程StrutsPrepareAndExecuteFilterInterceptorActionResultJsp/html用户请求Struts2内置的一些拦截器或用户自定义拦截器用户编写的action类,类似struts1中的Action类似struts1中的forward响应高级软件人才实作培训专家高级软件人才实作培训专家! !拦截器概述(struts-default.xml)高级软件人才实作培训专家高级软件人才实作培训专家! !拦截器概述(演示过滤器和拦截器的执行顺序)使用如下三个拦截器演示struts的执行流程(断点演示)默认的是defaultStack在栈中的顺序如下在栈中的顺序如下:高级软件人才实作培训专家高级软件人才实作培训专家! !Struts基本配置基本配置高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn访问HelloWorld应用的路径的设置在struts1中,通过节点的path属性指定访问该action的URL路径。在struts2中,访问struts2中action的URL路径由两部份组成:包的命名空间包的命名空间+action的名称的名称例如:访问本例子HelloWorldAction的URL路径为:/primer/helloWorldAction.action(注意:完整路径为:http:/localhost:端口/内容路径/primer/helloWorldAction.action)。另外我们也可以加上.action后缀访问此Action。/success.jsp高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnAction名称的搜索顺序1获得请求路径的URI,例如url是:http:/server/struts2/path1/path2/path3/test.action2首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package则转步骤3;3寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package,则转步骤4;4寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,就去默认的namaspace的package下面去找名字为test的action(默认的命名空间为空字符串“/”),如果还是找不到,页面提示找不到action。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnAction配置中的各项默认值问题问题:如果没有为如果没有为action指定指定class,默认是,默认是com.opensymphony.xwork2.ActionSupport执行执行ActionSupport中的中的execute方法方法由由struts-default.xml文件文件决定决定/success.jsp/success.jsp1如果没有为action指定class,默认是ActionSupport。2如果没有为action指定method,默认执行action中的execute()方法。ActionSupport的execute方法里面就一句话returnsuccess;3如果没有指定result的name属性,默认值为success。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnAction配置中的各项默认值问题问题:如果请求的路径查找不到如果请求的路径查找不到action的情况下的情况下,程序运行会抛出异常程序运行会抛出异常,可以通过配置当找不到可以通过配置当找不到action的情况下的情况下,会执行默认的会执行默认的action/success.jsp/success.jsp高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnActionSupportl类是默认的Action类.在编写Action类时,通常会对这个类进行扩展高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts 2处理的请求后缀StrutsPrepareAndExecuteFilter是Struts2框架的核心控制器,它负责拦截由/*指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入Struts2框架处理,否则Struts2框架将略过该请求的处理。根据配置文件根据配置文件:struts2-core-2.1.8.1.jar包下的包下的org.apache.struts2/default.properties文件定义的常量决定文件定义的常量决定struts.action.extension=action,默认处理的后缀是可以通过常量”struts.action.extension“进行修改的,如下面配置Struts2只处理以.do为后缀的请求路径:如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn细说常量定义常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下:在在struts.xml文件中配置常量文件中配置常量在在struts.properties中配置常量中配置常量,(struts.properties文件放置在文件放置在src下下)struts.action.extension=do因为常量可以在多个配置文件中进行定义,所以我们需要了解下struts2加载常量的搜索顺序:1struts-default.xml2struts-plugin.xml3struts.xml4struts.properties5web.xml如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn常用的常量介绍指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker、velocity的输出该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开开发模式下使用,这样可以打印出更详细的错误信息默认的视图主题与spring集成时,指定由spring负责action对象的创建该属性设置Struts2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false上传文件的大小限制高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn指定多个struts配置文件在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过元素指定多个配置文件:通过这种方式,我们就可以将Struts2的Action按模块添加在多个配置文件中。高级软件人才实作培训专家高级软件人才实作培训专家! !Struts结果类型结果类型高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnresultl每个action方法都将返回一个String类型的值,Struts将根据这个值来决定响应什么结果.l每个Action声明都必须包含有数量足够多的result元素,每个result元素分别对应着action方法的一个返回值.lresult元素可以有下面两个属性name:结果的名字,必须与Action方法的返回值相匹配,默认值为successtype:响应结果的类型.默认值为dispatcher高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn结果类型高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn结果类型: dispatcherldispatcher结果类型是最常用的结果类型最常用的结果类型,也是struts框架默认的结果类型l该结果类型有一个location参数,它是一个默认参数ldispatcher结果类型将把控制权转发转发给应用程序里的某个资源.ldispatcher结果类型不能把控制权转发转发给一个外部资源.若需要把控制权重定向到一个外部资源,应该使用redirect结果类型等同高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn结果类型: redirectlredirect结果类型将把响应重定向重定向到另一个资源,而不是转发给该资源.lredirect结果类型接受下面这些参数:location:用来给出重定向的目的地param:用来表明是否把location参数的值视为一个OGNL表达式来解释.默认值为truelredirect结果类型可以把响应重定向到一个外部资源等同高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn结果类型: redirectActionlredirectAction结果类型把响应重定向到另一个ActionlredirectAction结果类型接受下面这些参数:actionName:指定“目的地”动作的名字.它是默认属性namespace:用来指定“目的地”动作的命名空间.如果没有配置该参数,Struts会把当前Action所在的命名空间作为“目的地”的命名空间高级软件人才实作培训专家高级软件人才实作培训专家! !通配符和动态方法调用通配符和动态方法调用高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn通配符映射l一个Web应用可能有成百上千个action声明.可以利用struts提供的通通配符映射机制配符映射机制把多个彼此相似的映射关系简化为一个映射关系l通配符映射规则若找到多个匹配,没有通配符的那个将胜出没有通配符的那个将胜出若指定的动作不存在若指定的动作不存在,Struts将会尝试把这个URI与任何一个包含着通配符*的动作名及进行匹配若Struts找到的带有通配符的匹配不止一个,最后一个匹配将胜出最后一个匹配将胜出被通配符匹配到的被通配符匹配到的URI字符串的子串可以用字符串的子串可以用1,2来引用来引用.1匹配第一个子串,2匹配第二个子串0匹配整个URI*可以匹配零个或多个字符,但不包括/字符.如果想把/字符包括在内,需要使用*.如果需要对某个字符进行转义,需要使用.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn通配符映射示例(1)包声明包声明:上面的包声明可以由正确的命名空间和_add组成的URI来调用高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn通配符映射示例(2)包声明包声明:上面的包可改写为上面的包可改写为:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn通配符映射示例(3)包声明包声明:上面的包可改写为上面的包可改写为:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn动态方法调用动态方法调用动态方法调用:通过通过url动态调用动态调用Action中的方法中的方法如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法默认情况下默认情况下,Struts的动态方法调用处于激活状态的动态方法调用处于激活状态,若想禁用该功能若想禁用该功能,则可以在则可以在struts.xml文件中添加如下文件中添加如下constant元素元素:Action的配置的配置:Jsp页面的代码页面的代码:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn使用通配符定义actionAction的配置的配置:Jsp页面的代码页面的代码:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn全局结果当多个action中都使用到了相同result,这时我们应该把result定义为全局结果。struts1中提供了全局forward,struts2中也提供了相似功能:/message.jsp注:局部的会覆盖全局Struts1中应用范围内中应用范围内action的实例的实例action是单实例是单实例(执行时执行时,现在缓存中查找现在缓存中查找实例实例,有用,没有创建新的实例有用,没有创建新的实例)Struts2中中应用范围内应用范围内action的实例的实例,每个请求都会创建一个每个请求都会创建一个action实例实例高级软件人才实作培训专家高级软件人才实作培训专家! !类型转换类型转换高级软件人才实作培训专家高级软件人才实作培训专家! !概述l从一个HTML表单到一个Action对象,类型转换是从字符类型转换是从字符串到非字符串串到非字符串.HTTP没有“类型”的概念.每一项表单输入只可能是一个字符串或一个字符串数组.在服务器端,必须把String转换为特定的数据类型l在struts2中,把请求参数映射到action属性的工作由Parameters拦截器负责,它是默认的defaultStack拦截器中的一员.Parameters拦截器可以自动完成字符串和基本数据类型之间转换.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn接收请求参数采用基本类型接收请求参数采用基本类型接收请求参数在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。publicclassUserActionextendsActionSupportprivateIntegerid;privateStringuserName/struts2通过反射技术调用与请求参数同名的属性的setter方法来获取请求参数值publicvoidsetId(Integerid)this.id=id;publicIntegergetId()returnid;高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn接收请求参数java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值。但如果我们需要接收格式为20091221的请求参数,我们必须定义类型转换器,否则struts2无法自动完成类型转换。publicclassUserActionextendsActionSupportprivateIntegerid;privateStringuserName;privatejava.util.DatecreateTime;publicjava.util.DategetCreateTime()returncreateTime;publicvoidsetCreateTime(java.util.DatecreateTime)this.createTime=createTime;publicStringsave()System.out.println(id+id);System.out.println(userName+userName);System.out.println(createTime+createTime);returnsave;高级软件人才实作培训专家高级软件人才实作培训专家! !定制类型转换器l自定义类型转化器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn配置自定义的类型转换器在应用程序里使用一个自定义的类型转换器之前,必须先对它进行配置.这种配置既可以基于字段既可以基于字段,也可以基于类也可以基于类基于字段配置(局部):可以为某个动作的各个属性分别制定一个自定义的转换器为某个动作的各个属性分别制定一个自定义的转换器.1.创建一个属性文件:ActionClassName-conversion.properties,该文件需和相对应的动作类(Action)放在同一个目录下,ActionClassName是Action的类名,后面的-conversion.properties是固定写法.在properties文件中的内容为:属性名称=类型转换器的全类名对于本例而言,文件的名称应为UserAction-conversion.properties2.编辑属性文件:createTime=cn.itcast.converter.DateConverter高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn配置自定义的类型转换器基于类配置(全局):在WEB-INF/classes/目录下创建xwork-conversion.properties文件.在properties文件中的内容为:待转换的类型=类型转换器的全类名对于本例而言,xwork-conversion.properties文件中的内容为:java.util.Date=cn.itcast.converter.DateConverter高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn类型转换与复杂对象配合使用很多时候,需要把表单字段映射到多个对象的不同属性上form标签可以被映射到一个属性的属性被映射到一个属性的属性.Struts2首先通过反射技术调用Edu的默认构造器创建edu对象,然后再通过反射技术调用edu中与请求参数同名的属性的setter方法来获取请求参数值。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn类型转换与Collection配合使用Struts还允许填充Collection里的对象,这常见于需要快速录入批量数据的场合高级软件人才实作培训专家高级软件人才实作培训专家! !与ServletAPI解耦高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn与Servlet API解耦的访问方式为了避免与ServletAPI耦合在一起,方便Action做单元测试单元测试,Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了3个Map对象来替代这3个对象,在Action中可以直接使用HttpServletRequest,HttpSession,ServletContext对应的Map对象来保存和读取数据.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn访问request/session/application对象方法一方法一:通过通过ServletActionContext类直接获取类直接获取lActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象所有对象,包括parameters,request,session,application等.l获取HttpServletRequest对应的Map对象:publicObjectget(Objectkey):ActionContext类中没有提供类似getRequest()这样的方法来获取HttpServletRequest对应的Map对象.要得到HttpServletRequest对应的Map对象,可以通过为通过为get()方法传递方法传递“request”参数实现参数实现l获取HttpSession对应的Map对象:publicMapgetSession()l获取ServletContext对应的Map对象:publicMapgetApplication()高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn访问request/session/application对象publicStringtest()HttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();HttpSessionsession=request.getSession();ServletContextservletContext=ServletActionContext.getServletContext();returnsuccess;如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn访问request/session/application对象方法二方法二:实现指定接口,由实现指定接口,由struts框架运行时注入:框架运行时注入:Action类通过可以实现某些特定的接口,让Struts2框架在运行时向Action实例注入注入parameters,request,session和application对应的Map对象:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn访问request/session/application对象publicclassContextAction02extendsActionSupportimplementsServletRequestAware,ServletResponseAware,ServletContextAware,SessionAwareprivateHttpServletRequestrequest;privateServletContextservletContext;privateHttpServletResponseresponse;privateMapsession;publicStringtest()System.out.println(request+request);System.out.println(servletContext+servletContext);System.out.println(response+response);System.out.println(session+session);returnsuccess;publicvoidsetServletRequest(HttpServletRequestrequest)this.request=request;publicvoidsetServletResponse(HttpServletResponseresponse)this.response=response;publicvoidsetServletContext(ServletContextcontext)this.servletContext=context;publicvoidsetSession(Mapsession)this.session=session;高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn访问request/session/application对象中的属性Action中中publicclassContextActionAttrextendsActionSupportpublicStringtest()ServletActionContext.getServletContext().setAttribute(username,username_servletContext);ServletActionContext.getRequest().setAttribute(username,username_requst);ServletActionContext.getContext().getSession().put(username,username_sesson);returnattr;JSP页面页面:$applicationScope.username$sessionScope.username$requestScope.username高级软件人才实作培训专家高级软件人才实作培训专家! !文件上传高级软件人才实作培训专家高级软件人才实作培训专家! !文件上传概述l要想使用HTML表单上传一个或多个文件,必须把HTML表单的enctype属性设置为multipart/form-data,把它的method属性设置为postl为了让用户能够选择一个文件进行上传,程序员必须提供一个字段.高级软件人才实作培训专家高级软件人才实作培训专家! !Struts 对文件上传的支持l在Struts应用程序里,FileUpload拦截器和JakartaCommonsFileUpload组件可以完成文件的上传.l步骤:1.在Jsp页面的文件上传表单里使用file标签.如果需要一次上传多个文件,就必须使用多个file标签,但它们的名字必须是相同的但它们的名字必须是相同的2.在Action中新添加3个和文件上传相关的属性.这3个属性的名字必须是以下格式uploadImage是jsp页面上的file标签的名字.上传文件:如果是上传单个文件,uploadImage属性的类型就是java.io.File,它代表被上传的文件,第二个和第三个属性的类型是String,它们分别代表上传文件的文件名和文件类型定义方式是分别是jsp页面file组件的名称+ContentType,jsp页面file组件的名称+FileName如果上上传多个文件,可以使用数组或ListprivateFileuploadImage;/上传的文件privateStringuploadImageContentType;/上传的文件的类型privateStringuploadImageFileName;/上传文件的名称高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn单文件上传代码如下单文件上传代码如下第一步:在第一步:在WEB-INF/lib下加入下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从。这两个文件可以从http:/commons.apache.org/下载。下载。第二步:把第二步:把form表的表的enctype设置为:设置为:“multipart/form-data“,如下:如下:上传文件名称:第三步:在第三步:在Action类中添加以下属性,类中添加以下属性,属性红色部分对应于表单中文件字段的名称属性红色部分对应于表单中文件字段的名称:publicclassHelloWorldActionprivateFileuploadImage;/得到上传的文件privateStringuploadImageContentType;/得到文件的类型privateStringuploadImageFileName;/得到文件的名称/这里略省了属性的getter/setter方法publicStringsaveFile()throwsExceptionStringrealpath=ServletActionContext.getServletContext().getRealPath(/images);Filefile=newFile(realpath);if(!file.exists()file.mkdirs();FileUtils.copyFile(uploadImage,newFile(file,uploadImageFileName);returnsuccess;高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn单文件上传代码如下单文件上传代码如下第四步:在第四步:在struts.xml文件中增加如下配置文件中增加如下配置/upload/success.jsp/upload/error.jsp高级软件人才实作培训专家高级软件人才实作培训专家! !File Upload 拦截器lFileUpload拦截器负责处理文件的上传操作,它是默认的defaultStack拦截器栈的一员.lFileUpload拦截器有3个属性可以设置.maximumSize:上传文件的最大长度(以字节为单位),默认值为2MBallowedTypes:允许上传文件的类型,各类型之间以逗号分隔allowedExtensions:允许上传文件扩展名,各扩展名之间以逗号分隔可以在可以在struts.xml文件中覆盖这文件中覆盖这3个属性个属性l若用户上传的文件大小大于给定的最大长度或其内容类型没有被列在allowedTypes,allowedExtensions参数里,将会显示一条出错消息.与文件上传有关的出错消息在struts-messages.properties文件里预定义文件里预定义.(org.apache.struts2包下包下)l可以在文件上传Action相对应的资源文件中重新定义错误消息,但需要在struts.xml文件中配置使用action的消息:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn在在jsp页面显示错误信息页面显示错误信息在struts.xml文件中根据/upload/error.jsp中所指向的error.jsp页面可以使用显示错误信息高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn查看查看struts-messages.properties文件文件配置如下配置如下:struts.messages.error.uploading=Erroruploading:0struts.messages.error.file.too.large=Filetoolarge:0123struts.messages.error.content.type.not.allowed=Content-Typenotallowed:0123struts.messages.error.file.extension.not.allowed=Fileextensionnotallowed:01230:中name属性的值1:上传文件的名称2:上传文件保存到临时目录的名称3:上传文件的类型(对struts.messages.error.file.too.large是上传文件的大小)高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn修改显示错误的资源文件的信息修改显示错误的资源文件的信息第一步:创建新的资源文件例如fileuploadmessage.properties,放置在src下在该资源文件中增加如下信息struts.messages.error.uploading=上传错误:0struts.messages.error.file.too.large=上传文件太大:0123struts.messages.error.content.type.not.allowed=上传文件的类型不允许:0123struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许:0123第二步:在struts.xml文件加载该资源文件高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn多文件上传代码第一步:在第一步:在WEB-INF/lib下加入下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从。这两个文件可以从http:/commons.apache.org/下载。下载。第二步:把第二步:把form表的表的enctype设置为:设置为:“multipart/form-data“,如下:如下:第三步:在第三步:在Action类中添加以下属性,类中添加以下属性,属性红色部分对应于表单中文件字段的名称属性红色部分对应于表单中文件字段的名称:publicclassuploadActionprivateFileuploadImages;/得到上传的文件privateStringuploadImagesContentType;/得到文件的类型privateStringuploadImagesFileName;/得到文件的名称/这里略省了属性的getter/setter方法publicStringsaveFiles()throwsExceptionStringrealpath=ServletActionContext.getServletContext().getRealPath(/images);Filefile=newFile(realpath);if(!file.exists()file.mkdirs();for(inti=0;iuploadImages.length;i+)FileuploadImage=uploadImagesi;FileUtils.copyFile(uploadImage,newFile(file,uploadImagesFileNamei);returnsuccess;高级软件人才实作培训专家高级软件人才实作培训专家! !拦截器高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2 拦截器Struts2拦截器在访问某个Action方法之前或之后实施拦截,Struts2拦截器是可插拔的,拦截器是AOP的一种实现拦截器栈(InterceptorStack):将拦截器按一定的顺序联结成一条链.在访问被拦截的方法时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnInterceptor 接口l每个拦截器都是实现了com.opensymphony.xwork2.interceptor.Interceptor接口的Java类:init:该方法将在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次.可以在该方法中对相关资源进行必要的初始化interecept:每拦截一个动作请求,该方法就会被调用一次.destroy:该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnInterceptor 接口lStruts会依次调用程序员为某个Action而注册的每一个拦截器的interecept方法.l每次调用interecept方法时,Struts会传递一个ActionInvocation接口的实例.lActionInvocation:代表一个给定动作的执行状态,拦截器可以从该类的对象里获得与该动作相关联的Action对象和Result对象.在完成拦截器自己的任务之后,拦截器将调用ActionInvocation对象的invoke方法前进到Action处理流程的下一个环节.l还可以调用ActionInvocation对象的addPreResultListener方法给ActionInvocation对象“挂”上一个或多个PreResultListener监听器.该监听器对象可以在动作执行完毕之后,开始执行动作结果之前做些事情lAbstractInterceptor类实现了Interceptor接口.并为init,destroy提供了一个空白的实现高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2 自带的拦截器(1)拦截器拦截器名字名字说明说明AliasInterceptoralias在不同请求之间将请求参数在不同名字件转换,请求内容不变ChainingInterceptorchain让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。CheckboxInterceptorcheckbox添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。CookiesInterceptorcookies使用配置的name,value来是指cookiesConversionErrorInterceptorconversionError将错误从ActionContext中添加到Action的属性字段中。CreateSessionInterceptorcreateSession自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。DebuggingInterceptordebugging提供不同的调试用的页面来展现内部的数据状况。ExecuteandWaitInterceptorexecAndWait在后台执行Action,同时将用户带到一个中间的等待页面。ExceptionInterceptorexception将异常定位到一个画面FileUploadInterceptorfileUpload提供文件上传功能I18nInterceptori18n记录用户选择的localeLoggerInterceptorlogger输出Action的名字MessageStoreInterceptorstore存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2 自带的拦截器(2)拦截器拦截器名字名字说明说明ModelDrivenInterceptormodel-driven如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中。ScopedModelDrivenscoped-model-driven如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。ParametersInterceptorparams将请求中的参数设置到Action中去。PrepareInterceptorprepare如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。ScopeInterceptorscope将Action状态存入session和application的简单方法。ServletConfigInterceptorservletConfig提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。StaticParametersInterceptorstaticParams从struts.xml文件中将中的中的内容设置到对应的Action中。RolesInterceptorroles确定用户是否具有JAAS指定的Role,否则不予执行。TimerInterceptortimer输出Action执行的时间TokenInterceptortoken通过Token来避免双击TokenSessionInterceptortokenSession和TokenInterceptor一样,不过双击的时候把请求的数据存储在Session中ValidationInterceptorvalidation使用action-validation.xml文件中定义的内容校验提交的数据。WorkflowInterceptorworkflow调用调用Action的的validate方法,一旦有错误返回,重新定位到方法,一旦有错误返回,重新定位到INPUT画面画面ParameterFilterInterceptorN/A从参数列表中删除不必要的参数ProfilingInterceptorprofiling通过参数激活profile高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn自定义拦截器l定义自定义拦截器的步骤自定义拦截器在struts.xml文件中配置自定义的拦截器高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn自定义拦截器要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:publicclassPermissionInterceptorimplementsInterceptorpublicvoidinit()publicStringintercept(ActionInvocationinvocation)throwsExceptionObjecto=ActionContext.getContext().getSession().get(user);if(o!=null)/调用action中的方法returninvocation.invoke();returnerror;publicvoiddestroy()高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn在 struts.xml 文件中配置自定义的拦截器/aop/error.jsp/aop/success.jsp!只对当前的action有效因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。如果希望包下的所有action都使用自定义的拦截器,可以通过把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。高级软件人才实作培训专家高级软件人才实作培训专家! !Struts2验证高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn校验struts2校验有两种实现方法:1.手工编写代码实现(基本验证)2.基于XML配置方式实现(验证框架)高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基本验证(对action的所有方法进行校验)Jsp页面页面:*用户名不能为null,*密码不能为null,并且密码的长度6-12之间Action中中*要继承要继承ActionSupport*重写重写Validateable接口中的接口中的validate()方法方法,在该方法中完成验证在该方法中完成验证*步骤如下:*validate()方法在其他的业务方法之前执行方法在其他的业务方法之前执行*验证出错转向的页面验证出错转向的页面struts.xml配置/validate/login.jsp其中input转向是在action中已经定义好的.publicstaticfinalStringINPUT=input;*什么时候表示验证出错什么时候表示验证出错(转向转向input所指向的页面所指向的页面)*this.addFieldError(sss,错误信息);方法指向的是一个集合*当集合不为空时,转向错误页面.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基本验证(对action的所有方法进行校验)显示错误Jsp页面:使用显示错误消息高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基本验证(对action的指定方法进行校验)* * validate()方法会校验方法会校验action中所有与中所有与execute方法签名相同的方法。方法签名相同的方法。* * 要校验指定的方法通过重写要校验指定的方法通过重写validateXxxvalidateXxx()()方法实现,方法实现, validateXxxvalidateXxx()()只会校验只会校验actionaction中中 方法名为方法名为XxxXxx的方法。其中的方法。其中XxxXxx的第一个字母要大写。的第一个字母要大写。* * 当某个数据校验失败时,调用当某个数据校验失败时,调用addFieldErroraddFieldError()()方法往系统的方法往系统的fieldErrorsfieldErrors添加校验失败添加校验失败 信息(为了使用信息(为了使用addFieldErroraddFieldError()()方法,方法,actionaction可以继承可以继承ActionSupportActionSupport ),如果系统),如果系统 的的fieldErrorsfieldErrors包含失败信息,包含失败信息,struts2struts2会将请求转发到名为会将请求转发到名为inputinput的的resultresult。* * 在在inputinput视图中可以通过视图中可以通过 /显示失败信息。显示失败信息。validateXxxvalidateXxx()()方法使用例子:方法使用例子:public String addadd() throws Exceptionreturn success;对应的验证方法public void validatevalidateAddAdd() /验证代码在ValidationInterceptor拦截器中可以看到以validate开始的方法高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn底层代码底层代码(ValidationInterceptor拦截器)高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn输入校验的流程1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。4。调用action中的validate()方法。5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML配置方式实现输入校验1、建立、建立Jsp页面页面,定义需求*用户名不能为null,*密码不能为null,并且密码的长度6-12之间高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML配置方式实现输入校验2、定义、定义Action*要继承要继承ActionSupport或者实现或者实现Validateable接口接口:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML配置方式实现输入校验3、配置、配置struts_validate.xml文件文件*验证出错转向的页面验证出错转向的页面struts.xml配置配置/validate/login.jsp其中其中input转向是在转向是在action中已经定义好的中已经定义好的.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML配置方式实现输入校验4、配置验证的、配置验证的xml文件文件*验证的验证的xml文件的规范在文件的规范在xwork-core-2.1.6.jar包下的包下的:xwork-validator-1.0.3.dtd*验证文件的命名验证文件的命名*在这个校验文件中,对在这个校验文件中,对action中字符串类型的中字符串类型的username属性进行验证,属性进行验证,首先要求调用首先要求调用trim()方法去掉空格,然后判断用户名是否为空。方法去掉空格,然后判断用户名是否为空。*该文件需要和该文件需要和action类放在同一个包下,文件的取名应遵守类放在同一个包下,文件的取名应遵守ActionClassName-validation.xml规则,其中规则,其中ActionClassName为为action的简单类名,的简单类名,-validation为固定写法。为固定写法。*例如例如:如果如果Action类为类为cn.itcast.validate.ValidateXmlAction.那么该文件那么该文件的取名应为:的取名应为:ValidateXmlAction-validation.xml*ValidateXmlAction-validation.xml为文件的配置如下为文件的配置如下高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML配置方式实现输入校验:根元素根元素:指定指定action中要校验的属性中要校验的属性,name属性指定将被验证的表单字段的名字属性指定将被验证的表单字段的名字:指定校验器,指定校验器,type指定验证规则指定验证规则上面指定的校验器上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在的校验器,这些校验器的定义可以在xwork-2.x.jar中的中的com.opensymphony.xwork2.validator.validators下的下的default.xml中找到中找到。:子元素可以向验证程序传递参数子元素可以向验证程序传递参数:子元素子元素为校验失败后的提示信息为校验失败后的提示信息,如果需要国际化,可以为如果需要国际化,可以为message指定指定key属性属性,key的值为属性文件中的的值为属性文件中的key。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2 内建的验证程序lrequired:确保某给定字段的值不是空值nulllrequiredstring:确保某给定字段的值既不是空值null,也不是空白也不是空白.trim参数.默认为true,表示struts在验证该字段值之前先剔除前后空格.lstringlength:验证一个非空的字段值是不是有足够的长度.minLength:相关字段的最小长度.若没有给出这个参数,该字段将没有最小长度限制maxLength:相关字段的最大长度.若没有给出这个参数,该字段将没有最大长度限制trim:在验证之前是否去除前后空格lint:检查给定字段的值是否可以被转换为一个整数min:相关字段的最小值.若没给出这个参数,该字段将没有最小值限制max:相关字段的最大值.若没给出这个参数,该字段将没有最大值限制高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2 内建的验证程序ldate:确保某给定日期字段的值落在一个给定的范围内落在一个给定的范围内max:相关字段的最大值.若没给出这个参数,该字段将没有最大值限制min:相关字段的最小值.若没给出这个参数,该字段将没有最小值限制lemail:检查给定String值是否是一个合法的emaillurl:检查给定String值是否是一个合法的urllregex:检查某给定字段的值是否与一个给定的正则表达式模式相匹配.expresssion*:用来匹配的正则表达式caseSensitive:是否区分字母的大小写.默认为truetrim:是否去除前后空格.默认为true高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2 内建的验证程序lconversion(转换校验器,指定在类型转换失败时,提示的错误信息)lvisitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)lexpression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)ldouble(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn校验器案例required必填校验器性别不能为空!requiredstring必填字符串校验器true用户名不能为空!stringlength:字符串长度校验器102true高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn校验器案例int:整数校验器1150年龄必须在1-150之间字段OGNL表达式校验器!CDATAimagefile.length()文件不能为空高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn校验器案例email:邮件地址校验器电子邮件地址无效regex:正则表达式校验器手机号格式不正确!高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML配置方式对指定action方法实现输入校验当校验文件的取名为ActionClassName-validation.xml时,会对action中的所有处理方法实施输入验证。如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。例如:在实际应用中,常有以下配置:/WEB-INF/page/message.jsp/WEB-INF/page/addUser.jspUserAction中有以下两个处理方法:publicStringadd()throwsException.publicStringupdate()throwsException.要对add()方法实施验证,校验文件的取名为:UserAction-user_add-validation.xml要对update()方法实施验证,校验文件的取名为:UserAction-user_update-validation.xml高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn基于XML校验的一些特点当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:1。AconClassName-validation.xml2。ActionClassName-ActionName-validation.xml系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于处理方法的校验。如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。当action继承了另一个action,父类action的校验文件会先被搜索到。假设UserAction继承BaseAction,UserAction在struts.xml的配置如下:.访问上面名为user的action,系统先搜索到BaseAction-validation.xml,BaseAction-user-validation.xml,接着搜索到UserAction-validation.xml,UserAction-user-validation.xml。校验规则是这四个文件的总和。高级软件人才实作培训专家高级软件人才实作培训专家! !自定义验证规则l自定义验证程序必须实现Validator接口.lValidation拦截器负责加载和执行各种验证程序.在加载了一个验证程序之后,这个拦截器将调用那个验证程序的setValidatorContext方法,把当前的ValidatorContext对象传递给它,这使程序员可以访问当前Action.接下来,Validation拦截器将调用validate方法并把需要验证的对象传递给它.validate方法是编写一个自定义的验证程序时需要覆盖的方法.lValidatorSupport和FieldValidatorSupport实现了Validator接口若需要普通的验证程序,可以继承ValidatorSupport类若需要字段验证程序,可以继承FieldValidatorSupport类若验证程序需要接受一个输入参数,需要为这个参数增加一个相应的属性l注册验证程序:自定义验证器需要在类路径里的某个validators.xml文件里注册:验证框架首先在根目录下找validators.xml文件,没找到validators.xml文件,验证框架将调用默认的验证设置,即default.xml里面的配置信息.l位于com.opensymphony.xwork2.validator包下高级软件人才实作培训专家高级软件人才实作培训专家! !自定义验证规则需求需求:自定义一个自定义一个age的验证器的验证器,使使age不能小于不能小于01、在在jsp页面增加一个组件页面增加一个组件2、在action中增加privateIntegerage属性高级软件人才实作培训专家高级软件人才实作培训专家! !自定义验证规则3、自定义验证规则、自定义验证规则publicclassAgeValidateextendsFieldValidatorSupport/*object表示当前执行的action对象*objectcn.itcast.validate.ValidateXmlAction12dcb8c*/publicvoidvalidate(Objectobject)throwsValidationExceptionSystem.out.println(object+object);/获取字段的名称ageStringfieldName=this.getFieldName();/获取字段的值ObjectfieldValue=this.getFieldValue(fieldName,object);System.out.println(fieldName+fieldValue);if(fieldValueinstanceofInteger)Integerage=(Integer)fieldValue;if(age0)this.addFieldError(fieldName,object);高级软件人才实作培训专家高级软件人才实作培训专家! !自定义验证规则4、在工程的、在工程的src下新建下新建validators.xml文件文件,在文件中增加如下内容在文件中增加如下内容该该xml文件采用的规范在文件采用的规范在xwork-core-2.1.6.jar包下的包下的xwork-validator-config-1.0.dtd高级软件人才实作培训专家高级软件人才实作培训专家! !自定义验证规则5、在、在ValidateXmlAction-validation.xml文件中增加如下内容文件中增加如下内容高级软件人才实作培训专家高级软件人才实作培训专家! !国际化高级软件人才实作培训专家高级软件人才实作培训专家! !应用程序国际化应用程序国际化 l软件的本地化软件的本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯。l软件的国际化软件的国际化:软件开发时,让它能支持多个国家和地区的让它能支持多个国家和地区的本地化应用本地化应用。使得应用软件能够适应多个地区的语言和文化风俗习惯。高级软件人才实作培训专家高级软件人才实作培训专家! !应用程序国际化应用程序国际化l资源文件和资源包资源文件和资源包要用Struts实现国际化和本地化,首先要定义资源文件的名称,这个文件会包含用默认语言编写的会在程序中出现的所有消息。这些消息以”键值“对的形式存储,如下:error.validation.localtion=Theenteredlocationisinvalid当对一个应用程序进行国际化处理时,所要用的各种语言版本的”标签“信息应该存放在不同的属性文件中,每一个这样的文件对应一种语言版本。所有属性文件合在一起称为资源包(ResourceBundle)。属性文件的命名格式可分为以下两种:a)文件名前缀.propertiesb)文件名前缀_语言种类.properties文件名后缀必须是properties,前缀可自由书写,其中语言种类字段必须是有效的ISO语言代码。l文件名前缀.properties默认的形式,当其他属性文件找不到时,会默认的寻找此属性文件。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn配置全局资源与输出国际化信息1、准备资源文件2、在struts.xml中使用struts.custom.i18n.resources常量即可加载全局资源文件resource为资源文件的基本名。3、在jsp页面获取国际化的资源文件的信息方法一方法一:使用使用text标签标签:用来显示一条国际化消息的数据标签.相当于从property标签调用getText方法.该标签包含如下属性:*name:用来检索消息的键*var:用来引用压入ContextMap栈的值的变量名*可以通过param子标签向text标签传递参数高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn配置全局资源与输出国际化信息方法二方法二:使用使用ognl表达式表达式可以使用property标签或是使用某个表单标签的label属性,来显示一条调用getText()方法而得到的本地消息:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn全局资源文件中含有占位符使用使用text标签传递参数标签传递参数:资源文件的信息item.test=0,欢迎来到传智播客1jsp页面用户名0密码1输出结果:用户名,欢迎来到传智播客密码高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn在action中获取资源文件的信息lActionSupport类实现了TextProvider接口,该接口负责提供对各种资源包和它们的底层文本消息的访问机制.l当调用getText()方法时,它将按以下顺序搜索相关的属性文件.Action类的属性文件类的属性文件:该文件的名字与相关的动作类的名字一样,并且和那个动作类存放在同一个目录下动作类所实现的各个接口的属性文件动作类的各个父类的属性文件动作类的各个父类所实现的各个接口的属性文件如果动作类实现了ModelDriven接口,Struts将调用getModel()方法并从模型对象的类开始沿着类的继承关系进行一次上溯搜索默认的包的属性文件继承关系中的下个父包里的资源包高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn国际化JSP中直接访问某个资源文件i18n标签标签:用来加载一个自定义的用来加载一个自定义的ResourceBundle.不用做任何配置不用做任何配置name:将被加载的资源集的将被加载的资源集的java完全限定名完全限定名resource为类路径下资源文件的基本名。如果要访问的资源文件在类路径的某个包下,可以这样访问:小张上面访问cn.itcast.i18n包下基本名为resource的资源文件。高级软件人才实作培训专家高级软件人才实作培训专家! !使用 native2ascii 程序转换字符编码lJDK中提供了一个native2ascii工具程序,它可以将某种本地字符集编码的字符转换成Unicode转义序列的形式lDOS下进入test_cn_backup.properties文件所在目录,运行下面的命令后将在当前目录下生成一个名为test_zh_CN.properites文件:native2ascii-encodinggb2312源文件源文件目标文件.properitesnative2ascii-encodinggb2312test_cn_backup.propertiestest_zh_CN.properites高级软件人才实作培训专家高级软件人才实作培训专家! !OGNL高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言介绍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的接口.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn理解Struts2中的 ValueStack ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础ValueStack(值栈值栈): 贯穿整个贯穿整个 Action 的生命周期的生命周期(每个每个 Action 类的对象实例都拥有一个类的对象实例都拥有一个 ValueStack 对象对象). 相当于一个数据的中转站相当于一个数据的中转站. 在其中保存当前在其中保存当前 Action 对象和其他相关对象对象和其他相关对象.Struts 框架把框架把 ValueStack 对象保存在名为对象保存在名为 “struts.valueStack” 的请求属性中的请求属性中,request中中l在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高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn理解Struts2中的ValueStack 断点执行如下代码:Objectctx=ServletActionContext.getRequest().getAttribute(struts.valueStack);高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn理解Struts2中的ValueStack publicclassOgnlValueStackimplementsValueStackMapcontext;CompoundRootroot;publicclassOgnlContextimplementsMapprivateObject_root;privateMap_values=newHashMap(23);publicclassCompoundRootextendsArrayListObjectStack: Struts 把动作和相关对象压入把动作和相关对象压入 ObjectStack 中中ContextMap: Struts 把各种各样的映射关系把各种各样的映射关系(一些一些 Map 类型的对象类型的对象) 压入压入ContextMap 中中. Struts 会把下面这些映射压入会把下面这些映射压入 ContextMap 中中parameters: 该 Map 中包含当前请求的请求参数request: 该 Map 中包含当前 request 对象中的所有属性session: 该 Map 中包含当前 session 对象中的所有属性application:该 Map 中包含当前 application 对象中的所有属性attr: 该 Map 按如下顺序来检索某个属性: request, session, application高级软件人才实作培训专家高级软件人才实作培训专家! !lOgnlValueStack类包含两个重要的属性类包含两个重要的属性一个一个root和一个和一个context。*其中其中root本质上是一个本质上是一个ArrayList.*而而context是一个是一个Map(更确切的说是一个(更确切的说是一个OgnlContext对象对象)l在这个在这个OgnlContext对象(对象(context)中,有一个默认的顶层对象)中,有一个默认的顶层对象_root,OGNL访问访问context中中这个默认顶层对象中的元素时,是不需要这个默认顶层对象中的元素时,是不需要#号的,直接通过元素的名称来进行访问,号的,直接通过元素的名称来进行访问,l而访问其他对象时,如而访问其他对象时,如request、session、attr等,则需要等,则需要#号引用。号引用。注注:Struts2将将OgnlValueStack的的root对象赋值给了对象赋值给了OgnlContext中的中的_root对象,在对象,在OgnlValueStack的的root对象中,保存着调用对象中,保存着调用Action的实例,因此,在页面上通过的实例,因此,在页面上通过Struts2标签访标签访问问Action的属性时,就不需要通过的属性时,就不需要通过#号来引用号来引用总结总结:ognlContext包含包含ObjectStack属性和属性和ContextMap属性属性 理解OGNL ContextObjectStack(root 属性属性) list集合集合Object1Object2.ContextMap(context属性属性)Map集合集合RequestSessionApplicationAttparameters构成OGNLContext高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn 理解OGNL ContextOGNLContext是struts2的数据中心结构示意图如下:valuestack(OgnlValueStack的root属性(List)OGNLContextparametersrequestsessionapplicationattr当当Struts2接受一个请求时,会迅速创建接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后。然后把把action存放进存放进ValueStack,所以,所以action的实例变量可以被的实例变量可以被OGNL访问。访问。注意:注意:Struts2中,中,OGNL表达式需要配合表达式需要配合Struts标签才可以使用。如:标签才可以使用。如:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn 理解ActionContextActionContext提供了对提供了对ognl上下文对象中数据操作的方法上下文对象中数据操作的方法.ServletActionContext.getRequest().setAttribute(username,username_request);ServletActionContext.getServletContext().setAttribute(username,username_application);ServletActionContext.getContext().getSession().put(username,username_session);ValueStackvalueStack=ServletActionContext.getContext().getValueStack();System.out.println(valueStack+valueStack);valueStack.set(username,username_valueStack);高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)用法用法1:访问访问OGNL上下文和上下文和Action上下文,上下文,#相当相当ActionContext.getContext()1、如果访问其他如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,中的对象,由于他们不是根对象,所以在访问时,需要添加需要添加#前缀。前缀。也可写为#requestuserName或#sessionuserName或#applictionuserName高级软件人才实作培训专家高级软件人才实作培训专家! !OGNL表达式语言(#号的用法号的用法)Action中代码中代码:ServletActionContext.getRequest().setAttribute(username,username_request);ServletActionContext.getServletContext().setAttribute(username,username_application);ServletActionContext.getContext().getSession().put(username,username_session);ValueStackvalueStack=ServletActionContext.getContext().getValueStack();valueStack.set(username,username_valueStack);Jsp页面页面:使用使用ognl表达式取值表达式取值*request:session:application:attr:valueStack:parameters:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)2、OGNL会设定一个根对象(会设定一个根对象(root对象),在对象),在Struts2中根对象就是中根对象就是ValueStack(值栈)(值栈)。如果要访问根对象(即。如果要访问根对象(即ValueStack)中对象的属性,则可以省略)中对象的属性,则可以省略#命名对象,直接访问该对象的属性即可命名对象,直接访问该对象的属性即可。用法用法1:访问访问OGNL上下文和上下文和Action上下文,上下文,#相当相当ActionContext.getContext()Action中代码中代码:ValueStackvalueStack=ServletActionContext.getContext().getValueStack();valueStack.set(username,username_valueStack);Jsp页面页面:valueStack:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)深入理解值栈中的深入理解值栈中的ObjectStackObjectStack(root 属性属性)object1object2.在OgnlValueStack类里有一个List类型的root变量,他存放了一组对象处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。高级软件人才实作培训专家高级软件人才实作培训专家! !OGNL表达式语言(#号的用法号的用法)Action中代码中代码:ValueStackvalueStack=ServletActionContext.getContext().getValueStack();/set方法放置对象到方法放置对象到map中中,map再放入到栈再放入到栈(List集合集合)上上valueStack.set(student,newStudent();valueStack.set(employee,newEmployee();/直接放置对象到栈直接放置对象到栈(List集合集合)上上valueStack.getRoot().add(0,newStudent();valueStack.getRoot().add(1,newEmployee();Jsp页面页面:name:age:number:salary:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)用法用法2:集合的投影(过滤)集合的投影(过滤)1、集合的投影、集合的投影(只输出部分属性只输出部分属性)collectionName.expression 高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)用法用法2:集合的投影(过滤)集合的投影(过滤)2、集合的过滤集合的过滤1)集合的过滤有以下三种方式:集合的过滤有以下三种方式:a.“?#”:过滤所有符合条件的集合,如:users.?#this.age19;b.“#”:过滤第一个符合条件的元素,如:users.#this.age19;c.“$#”:过滤最后一个符合条件的元素,如:users.$#this.age19。.2)this表示集合中的元素;表示集合中的元素;25var=personxxxxxx高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)用法用法2:集合的投影(过滤)集合的投影(过滤)3、集合的投影和过滤集合的投影和过滤投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素,如:元素,如:users.?#this.age19025.namevar=person250var=person高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)用法用法3:构造构造Map,如,如#foo1:bar1,foo2:bar2。这种方式常用在给这种方式常用在给radio或或select、checkbox等标签赋值上等标签赋值上Action中的代码中的代码:Mapmap=newHashMap();map.put(male,男男);map.put(female,女女);ServletActionContext.getRequest().setAttribute(map,map);jsp页面页面:运行结果是运行结果是男女jsp页面页面:运行结果是运行结果是男男女女高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(#号的用法号的用法)Action中的代码中的代码:Mapmap=newHashMap();map.put(male,男男);map.put(female,女女);ServletActionContext.getRequest().setAttribute(map,map);jsp页面页面:运行结果是运行结果是女女男男用法用法3:构造构造Map,如,如#foo1:bar1,foo2:bar2。这种方式常用在给这种方式常用在给radio或或select、checkbox等标签赋值上等标签赋值上高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言(%用法用法)“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境环境%里的是里的是OGNL表达式。表达式。形式一形式一:中中ognl表达式表达式Action中的代码中的代码:ServletActionContext.getRequest().setAttribute(username,username_request);jsp页面页面:运行结果是运行结果是username_request:形式二形式二:中值用中值用引起来引起来,这是不再是这是不再是ogle表达式表达式,而是普通的字符串而是普通的字符串jsp页面页面:运行结果是运行结果是foo:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言($用法用法)“$”有两个主要的用途有两个主要的用途*用于在国际化资源文件中,引用用于在国际化资源文件中,引用OGNL表达式表达式*在在Struts2配置文件中,引用配置文件中,引用OGNL表达式表达式在在struts2配置文件中引用配置文件中引用ognl表达式表达式,引用引用request等作用域中的值等作用域中的值Action中的代码中的代码:ServletActionContext.getRequest().setAttribute(msgxx,msg_request);struts.xml文件中文件中/ognl/ongl.jsp?msg=$#request.msgxxjsp页面页面:parametersMsg:运行结果是运行结果是msg_request高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言($用法用法)在在struts2配置文件中引用配置文件中引用ognl表达式表达式,引用值栈的值引用值栈的值Action中的代码中的代码:valueStack.set(msgxx,msg_valueStack);struts.xml文件中文件中/ognl/ongl.jsp?msg=$msgxxjsp页面页面:parametersMsg:运行结果是运行结果是msg_valueStack高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言对于集合类型,OGNL表达式可以使用in和notin两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;notin判断某个元素是否不在指定的集合对象中,如下所示。in表达式:表达式:在不在notin表达式:表达式:不在在高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnOGNL表达式语言除了in和notin之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。?:获得所有符合逻辑的元素。:获得符合逻辑的第一个元素。$:获得符合逻辑的最后一个元素。例如代码:35-$在上面代码中,直接在集合后紧跟.运算符表明用于取出该集合的子集,内的表达式用于获取符合条件的元素,本例的表达式用于获取集合中价格大于35的书集合。publicclassBookActionextendsActionSupportprivateListbooks;.OverridepublicStringexecute()books=newLinkedList();books.add(newBook(A735619678,spring,67);books.add(newBook(B435555322,ejb3.0,15);高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn property标签property标签用于输出指定值:标签用于输出指定值:*default:可选属性,:可选属性,如果需要输出的属性值为如果需要输出的属性值为null,则显示该属性指定的值,则显示该属性指定的值*escape:可选属性,指定是否格式化:可选属性,指定是否格式化HTML代码。代码。*value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出出ValueStack栈顶的值。栈顶的值。例子例子:输出栈顶的值输出栈顶的值输出输出:username=username_valueStack,msgxx=msg_valueStacks:propertyvalue=%hr的使用的使用escape=false/输出输出:hr的使用的使用注注:escape=“false”时时,hr作为作为html标签使用标签使用高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn set标签set标签用于将某个值放入指定范围。标签用于将某个值放入指定范围。var:变量的名字变量的名字,name,id和和var表达的含义是一样的表达的含义是一样的,name,id被被var替代替代scope:指定变量被放置的范围,该属性可以接受:指定变量被放置的范围,该属性可以接受application、session、request、page或或action。如果没有设置该属性,则默认放置在。如果没有设置该属性,则默认放置在action中。中。value:赋给变量的值赋给变量的值.如果没有设置该属性如果没有设置该属性,则将则将ValueStack栈顶的值赋给变量。栈顶的值赋给变量。例子例子:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn push标签push:将对象放入栈顶将对象放入栈顶,不能放入其他范围不能放入其他范围,当标签结束当标签结束,会从栈顶删除。会从栈顶删除。value:要要push到堆栈中的值到堆栈中的值。例子例子:测试删除测试删除:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn bean标签bean标签标签:实例化一个符合实例化一个符合JavaBeans规范的规范的class,标签体内可以包含几个标签体内可以包含几个Param元素元素,用于调用用于调用setter方法给此方法给此class的属性赋值的属性赋值.name:要被实例化的要被实例化的class名字名字(必须符合必须符合JavaBeans规范规范)var:赋给变量的值赋给变量的值.放置在放置在request作用域中作用域中如果没有设置该属性如果没有设置该属性,则对象被放置到栈顶则对象被放置到栈顶例子例子:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn action标签Action:通过指定命名空间和通过指定命名空间和action名称名称,该标签允许在该标签允许在jsp页面直接调用页面直接调用Actionname:action名字名字(不包括后缀不包括后缀,如如.action)namespace:action所在命名空间所在命名空间executeResult:Action的的result是否需要被执行是否需要被执行,默认值是默认值是false不执行不执行例子例子:/ognl/ongl.jsp?msg=$msgxx高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn iterator标签Iterator:标签用于对集合进行迭代,这里的集合包含标签用于对集合进行迭代,这里的集合包含List、Set和数组。和数组。value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。栈顶的集合。var:可选属性,引用变量的名称可选属性,引用变量的名称.status:可选属性,该属性指定迭代时的:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:实例。该实例包含如下几个方法:intgetCount(),返回当前迭代了几个元素。,返回当前迭代了几个元素。intgetIndex(),返回当前迭代元素的索引。返回当前迭代元素的索引。booleanisEven(),返回当前被迭代元素的索引是否是偶数,返回当前被迭代元素的索引是否是偶数booleanisOdd(),返回当前被迭代元素的索引是否是奇数,返回当前被迭代元素的索引是否是奇数booleanisFirst(),返回当前被迭代元素是否是第一个元素。,返回当前被迭代元素是否是第一个元素。booleanisLast(),返回当前被迭代元素是否是最后一个元素。,返回当前被迭代元素是否是最后一个元素。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn iterator标签st.getCount(): st.getIndex(): st.isEven(): st.isOdd(): st.isFirst: st.isLast():trstyletype=text/css.oddbackground-color:red;.evenbackground-color:blue;高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn if/elseif/else标签if/elseif/else基本的流程控制基本的流程控制.If标签可单独使用也可以和标签可单独使用也可以和ElseIf标签和标签和(或或)一个多个一个多个Else一起使用一起使用2321都不等都不等s:iftest=#person.age少年少年s:elseiftest=#person.age中年中年老年老年高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn url标签url:该标签用于创建该标签用于创建url,可以通过可以通过param标签提供标签提供request参数参数.value:如果不提供就用当前如果不提供就用当前action,使用使用value后缀必须加后缀必须加.actionaction:用来生成用来生成url的的action,如果没有则使用如果没有则使用valuenamespace:命名空间命名空间var:引用变量的名称引用变量的名称.使用使用actionahref=xxxxahref=xxxx使用使用valueahref=xxxx高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnognl操作集合使用使用ognl操作操作list和数组和数组.Action中中:privateListallList=newArrayList();Jsp:集合的长度集合的长度:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnognl操作集合使用使用ognl操作操作list和数组和数组.ognl也可直接创建集合对象.利用下拉列表框:Jsp:高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnognl操作集合使用使用ognl操作操作mapognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.创建map与创建list语法很相似,不同的是map前需要加#号.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnognl操作集合使用使用ognl操作操作mapognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.创建map与创建list语法很相似,不同的是map前需要加#号.key=value=key=value=高级软件人才实作培训专家高级软件人才实作培训专家! !UI高级软件人才实作培训专家高级软件人才实作培训专家! !概述l表单标签将在HTML文档里被呈现为一个表单元素l使用表单标签的优点:表单回显表单回显对页面进行布局和排版l标签的属性可以被赋值为一个静态的值或一个一个OGNL表达表达式式.如果在赋值时使用了一个OGNL表达式并把它用%括起来,这个表达式将会被求值.高级软件人才实作培训专家高级软件人才实作培训专家! !表单标签的共同属性*该属性只在没有使用simple主题时才可以使用.*高级软件人才实作培训专家高级软件人才实作培训专家! !form 标签form标签用来呈现HTML语言中的表单元素默认情况下,form标签将被呈现为一个表格表格形式的HTML表单.嵌套在form标签里的输入字段将被呈现为一个表格行.每个表格行由两个字段组成,一个对应着行标,一个对应着输入元素.提交按钮将被呈现为一个横跨两列单元格的行高级软件人才实作培训专家高级软件人才实作培训专家! !textfield, password, hidden 标签textfield标签将被呈现为一个输入文本字段,password标签将被呈现为一个口令字段,hidden标签将被呈现为一个不可见字段.password标签扩展自textfield标签,多了一个showPassword属性.该属性是布尔型.默认值为false,它决定着在表单回显时是否显示输入的密码.true显示密码高级软件人才实作培训专家高级软件人才实作培训专家! !submit 标签lsubmit标签将呈现为一个提交按钮.根据其type属性的值.这个标签可以提供3种呈现效果:input:button:image:高级软件人才实作培训专家高级软件人才实作培训专家! !reset 标签reset标签将呈现为一个重置按钮.根据其type属性的值.这个标签可以提供2种呈现效果:input:button:高级软件人才实作培训专家高级软件人才实作培训专家! !label 标签label标签将呈现一个HTML行标元素:高级软件人才实作培训专家高级软件人才实作培训专家! !textarea 标签textarea标签将呈现为一个HTML文本域元素高级软件人才实作培训专家高级软件人才实作培训专家! !*checkbox 标签lcheckbox标签将呈现为一个HTML复选框元素.l与其他HTML输入元素类似,当包含着一个单选框的表单被提交时,这个单选框按钮在HTTP请求里增加一个请求参数.如果某个单选框被选中了,它的值将为true,但如果该单选框未如果该单选框未被选中被选中,在请求中就不会增加一个请求参数在请求中就不会增加一个请求参数.checkbox标签解决了这个局限性,它采取的办法是为单选框元素创建一个配对的不可见字段高级软件人才实作培训专家高级软件人才实作培训专家! !*checkbox 标签checkbox标签有一个fieldValue属性,该属性指定的值将在用户提交表单时作为被选中的单选框的实际值发送到服务器.如果没有使用fieldValue属性,单选框的值将为true或false.高级软件人才实作培训专家高级软件人才实作培训专家! !checkboxlist 标签checkboxlist标签将呈现一组多选框.checkbox标签被映射到一个字符串数组或是一个基本类型的数组标签被映射到一个字符串数组或是一个基本类型的数组.若它提供若它提供的多选框一个也没有被选中的多选框一个也没有被选中,相应的属性将被赋值为一个空数组而不是空值相应的属性将被赋值为一个空数组而不是空值.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cncheckboxlist 标签如果集合为如果集合为list生成如下html代码:Java.NetRoRPHP如果集合为如果集合为MAP生成如下html代码:瑜珈用品户外用品球类自行车高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cncheckboxlist 标签如果集合里存放的是如果集合里存放的是javabean%Personperson1=newPerson(1,第一个);Personperson2=newPerson(2,第二个);Listlist=newArrayList();list.add(person1);list.add(person2);request.setAttribute(persons,list);%id和和name为为Person的属性的属性生成如下html代码:第一个第二个高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnradio 标签radio标签将呈现为一组单选按钮,单选按钮的个数与程序员通过该标签的list属性提供的选项的个数相同.一般地,使用使用radio标签实现标签实现“多选一多选一”,对于对于“真真/假假”则该使用则该使用checkbox标签标签.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnradio 标签该标签的使用和checkboxlist复选框相同。如果集合里存放的是javabean(id和name为Person的属性)生成如下html代码:第一个第二个如果集合为MAP生成如下html代码:瑜珈用品户外用品球类自行车如果集合为list生成如下html代码:Java.Net高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnselect 标签select标签将呈现一个select元素高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnselect 标签如果集合为list生成如下html代码:Java.Net如果集合里存放的是javabean(id和name为Person的属性)生成如下html代码:第一个第二个高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnselect 标签如果集合为MAP生成如下html代码:瑜珈用品户外用品球类自行车高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn主题主题主题:为了让所有的UI标签能够产生同样的视觉效果而归集到一起的一组模板.即风格相近的模板被打包为一个主题风格相近的模板被打包为一个主题1、simple:把UI标签翻译成最简单的HTML对应元素,而且会忽视行标属性2、xhtml:xhtml是默认的主题.这个主题的模板通过使用一个布局表格提供了一种自动化的排版机制.3、css_xhtml:这个主题里的模板与xhtml主题里的模板很相似,但它们将使用css来进行布局和排版4、ajax:这个主题里的模板以xhtml主题里德模板为基础,但增加了一些Ajax功能.高级软件人才实作培训专家高级软件人才实作培训专家! !主题l修改主题修改主题:A、通过、通过UI标签的标签的theme属性属性(只适用于当前的标签只适用于当前的标签)B、在一个表单里、在一个表单里,若没有给出某个若没有给出某个UI标签的标签的theme属性属性,它将使用这个表单的主题它将使用这个表单的主题(适用于整个form标签)C、修改、修改struts.properties文件中的文件中的struts.ui.theme属性属性.(适用整个环境)优先级:ABC高级软件人才实作培训专家高级软件人才实作培训专家! !ModelDriven高级软件人才实作培训专家高级软件人才实作培训专家! !把动作和模型隔开l在使用Struts作为前端的企业级应用程序时把动作和模型清晰地隔离开是有必要的:有些动作类不代表任何模型对象,它们的功能仅限于提供图文显示服务高级软件人才实作培训专家高级软件人才实作培训专家! !ModelDriven 拦截器l情景:有一个用来处理客户的CustomerAction类,该动作类实现了ModelDriven接口.l当用户触发CustomerAction动作时,ModelDriven拦截器将调用相关CustomerAction对象的getModel()方法,并把返回的模型(Customer实例)压入到ValueStack栈.接下来Parameters拦截拦截器将把表单字段映射到器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中栈的栈顶对象的各个属性中.因为此时ValueStack栈的栈顶元素是刚被压入的模型(Product)对象,所以该模型将被填充.如果某个字段在模型里没有匹配的属性,Param拦截器将尝试ValueStack栈中的下一个对象.l一个模型类必须有一个不带任何参数的构造器.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn 标签防止重复提交标签防止重复提交,用法如下:第一步:在表单中加入第二步:save/WEB-INF/page/message.jsp以上配置加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn 标签防止重复提交在debug状态,控制台出现下面信息,是因为Action中并没有struts.token和struts.token.name属性,我们不用关心这个错误:严重:ParametersInterceptor-setParameters:UnexpectedExceptioncaughtsettingstruts.tokenonclassxxx:Errorsettingexpressionstruts.tokenwithvalueLjava.lang.String;39f16f严重:ParametersInterceptor-setParameters:UnexpectedExceptioncaughtsettingstruts.token.name高级软件人才实作培训专家高级软件人才实作培训专家! !S2SH整合高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cn Struts2+Spring2.5+Hibernate3.5整合开发整合开发时Struts2、Hibernate、Spring需要的JAR。struts2-core-2.x.x.jar:Struts2框架的核心类库xwork-2.x.x.jar:XWork类库,Struts2在其上构建ognl-2.7.x.jar:对象图导航语言(ObjectGraphNavigationLanguage),struts2框架通过其读写对象的属性freemarker-2.3.x.jar:Struts2的UI标签的模板使用FreeMarker编写commons-fileupload-1.2.x.jar文件上传组件,2.1.6版本后需要加入此文件commons-io-1.3.2.jar上传的依赖jar包struts2-spring-plugin-2.x.x.jar:用于struts2集成Spring的插件hibernate核心安装包下的核心安装包下的(下载路径:http:/www.hibernate.org/,点击“HibernateCore”右边的“Downloads”):hibernate3.jarlibbytecodecglibcglib-2.2.jarlibrequired*.jarlibtestslf4j-log4j12.jarhibernate注解安装包下的注解安装包下的(下载路径:www.hibernate.org,点击“HibernateAnnotations”右边的“Downloads”):hibernate-annotations.jarlibhibernate-commons-annotations.jarSpring安装包下的安装包下的distspring.jarlibc3p0c3p0-0.9.1.2.jarlibaspectjaspectjweaver.jar、aspectjrt.jarlibcglibcglib-nodep-2.1_3.jarlibj2eecommon-annotations.jarliblog4jlog4j-1.2.15.jarlibjakarta-commonscommons-logging.jarMYSQL数据库驱动jar高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发实体实体bean的映射文件的映射文件person.hbm.xmlauto_increment实体实体bean的代码的代码Person.javapublicclassPersonimplementsjava.io.SerializableprivatestaticfinallongserialVersionUID=1L;privateIntegerid;privateStringname;.表结构如下表结构如下createtableperson(idintnotnullauto_incrementprimarykey,namevarchar(255)高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发Dao层代码层代码publicclassPersonDaoImplimplementsPersonDaoprivateHibernateTemplatehibernateTemplate;publicvoidsavePerson(Personperson)throwsExceptionhibernateTemplate.save(person);.service层的代码层的代码publicclassPersonServiceImplimplementsPersonServiceprivatePersonDaopersonDao;publicvoidsavePerson(Personperson)throwsExceptionpersonDao.savePerson(person);.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发hibernate.cfg.xml配置文件配置文件jdbc:mysql:/localhost:3306/itcastdbrootrootcom.mysql.jdbc.Driverorg.hibernate.dialect.MySQLDialecttrueupdatetrue高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发beans.xml配置文件配置文件高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发beans.xml配置文件配置文件classpath:hibernate.cfg.xml高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发beans.xml配置文件配置文件高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发beans.xml配置文件配置文件高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发在在web容器中实例化容器中实例化spring容器容器contextConfigLocation/WEB-INF/classes/beans.xml或classpath:beans.xml/如有多个spring配置文件用逗号隔开加载方法一加载方法一(只能使用监听加载只能使用监听加载)org.springframework.web.context.ContextLoaderListener加载方法二加载方法二(不能使用不能使用)contextLoaderorg.springframework.web.context.ContextLoaderServlet2高级软件人才实作培训专家高级软件人才实作培训专家! !Spring2.5+Hibernate3.5整合开发l测试spring和hibernate的整合高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发1、定义jsp页面高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发2、定义Action高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发3、在spring的beans.xml文件中增加高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发4、增加struts.xml文件放置到src下高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发为了能从spring容器中寻找到Actionbean,要求action配置的class属性值和spring中bean的名称相同。如下:.高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发5、在web.xml文件中启动struts高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnStruts2+Spring2.5整合开发6、整体测试高级软件人才实作培训专家高级软件人才实作培训专家! !北京传智播客教育www.itcast.cnSpring2.5+Hibernate3.5整合开发(注解方式)beans.xml配置文件配置文件classpath:hibernate.cfg.xml高级软件人才实作培训专家高级软件人才实作培训专家! !在在struts配置文件中增加补全功能配置文件中增加补全功能
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号