第8章--Struts基本方法和关键技术课件

上传人:沈*** 文档编号:241647712 上传时间:2024-07-12 格式:PPT 页数:31 大小:919KB
返回 下载 相关 举报
第8章--Struts基本方法和关键技术课件_第1页
第1页 / 共31页
第8章--Struts基本方法和关键技术课件_第2页
第2页 / 共31页
第8章--Struts基本方法和关键技术课件_第3页
第3页 / 共31页
点击查看更多>>
资源描述
新企学.IT企业直通车第8章 Struts基本方法和关键技术第8章 Struts基本方法和关键技术8.1 Struts数据校验8.2 Struts2框架国际化的方法8.3 Struts拦截器8.4 自定义拦截器8.5 本章小结8.1.1 基本类型转换8.1.2 Action中的validate()校验方法8.1.3 XWork校验框架8.1 Struts数据校验8.1 Struts数据校验数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证。客户端校验指的是通过JavaScript代码检验用户的输入是否正确;服务器端校验指的是在服务器端的程序通过检查HTTP请求信息以校验输入是否正确。客户端校验只能简单的过滤用户输入,而大量的数据校验一般都是在服务器端校验时来完成。服务器端数据验证主要特点服务器端数据验证主要特点:数据提交后在服务器端验证防止绕过客户端验证提交的非法数据可以在服务器端处理数据前保证数据的合法性 Struts2中有两种实现服务器端验证的方式,分别是通过Action中的validate方法实现和使用XWork校验框架实现。Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说服务器接收到的来自用户的数据只能是字符串或者是字符数组,而在Web应用的对象中,往往使用了多种不同的类型,如整数(int)、浮点数(float)、日期(Date)或者是自定义数据类型等。因此在服务器端必须将字符串转换成合适的数据类型。Struts 2框架提供了一系列默认的基本类型转换器,可以在字符串类型和其他类型之间互相转换。这些类型转换器包括:String和boolean、Boolean:完成字符串与布尔值之间的转换String和char、Character:往常字符串与字符之间的转换String和int、Integer:完成字符串与整型之间的转换String和long、Long:完成字符串与长整型值之间的转换String和double、Double:完成字符串与双精度浮点值的转换String和float、Float:完成字符串和单精度浮点之间的转换String和Date:完成字符串和日期类型之间的转换,可以接收yyyy-MM-dd格式字符串String和数组:可以将多个同名参数,转换到数组中String和Map、List:支持将数据保存到List或者Map集合8.1.1 基本类型转换8.1.2 Action中的validate()校验方法 Struts2提供了一个Validateable接口,这个接口中只存在validate()方法,实现这个接口的类可直接被Struts2调用,ActionSupport类就实现了Vadidateable接口,但他的validate()方法是一个空方法,需要我们来重写。validate()方法会在execute()方法执行前执行,仅当数据校验正确,才执行execute()方法,如错误则将错误添加到fieldErrors域中,如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑需要不同的校验规则,这种情况下validate()会对所有处理逻辑使用相同的校验规则,为了实现不同的校验逻辑,需要通过validateX()方法,其中X表示处理逻辑的方法名。使用validate方法校验时,虽然实现思路清晰易懂,但是如果Web应用中存在大量Action就需要多次重写validate方法,将导致代码非常繁琐。Struts 2的校验框架本质上是基于XWork的validator框架,因此可以使用XWork的validator框架来对Struts 2进行数据校验,以减少代码量。在com.action包下创建验证文件LoginAction-validation.xml,注:当一个Action中有多个业务处理方法是,命名规则为:actionName-methodName-validation.xml,其中actionName为Action类名,methodName为Action中某个业务处理方法的方法名,并且文件的搜索顺序与方式与validate()和validateX()一样。8.1.3 XWork校验框架Struts2常用校验器:8.1.3 XWork校验框架8.2.1 编写国际化资源文件8.2.2 访问国际化资源文件8.2.3 资源文件加载过程8.2 Struts2框架国际化的方法 Struts 2框架实现国际化的方式是使用国际化资源文件,对于一个复杂的系统往往会有大量的内容需要实现国际化,为了解决仅有一个国际化资源文件导致处理过程效率低下的问题,国际化资源文件分为几种,包括包范围资源文件、类范围资源文件、全局资源文件才及临时指定资源文件。国际化资源文件的后缀都是properties,它们的内容格式都是key-value形式,在需要使用这些信息时,可以通过key值得到value值。一个中文的国际化资源文件格式如下:login=登录error=错误uccess=成功8.2.1 编写国际化资源文件8.2.1 编写国际化资源文件 1、包范围资源文件 该资源文件只允许包下的Action访问,且被放在包的根路经下,文件名的格式为package_language_country.properties。其中package固定不变,language和country表示语言和国家,例如:中文国际化资源就是package_zh_CN.properties。2、类范围资源文件 该资源文件能被指定类所对应的Action访问,通常被放到Action类所在的路径下,其命名格式 是ActionName_language_country.properties。其中ActionName指的是Action类名。8.2.1 编写国际化资源文件 3、全局范围资源文件 该资源文件能被所有的Action、JSP访问,一般被放到工程的src目录下,其命名格式为name.properties,其中name表示文件名。命名通常采用BaseName_language_country.properties。其中BaseName自定义。全局范围资源文件的加载不是自动的,必须在Struts2配置文件中加以指定,并在常量struts.custom.i18n.resources中进行配置,而该常量的值即为合局范围资源文件的BaseName。系统要加载的全局范围资源文件为globalMessage.properties或globalMessage_en_US.properties,可以在struts.xml文件中添加如下指定代码:也可以在struts.properties文件中添加如下代码:struts.custom.i18n.resources=globalMessage配置如struts.custom.i18n.resources常量后,应用软件自动加载全局资源文件。这样struts2框架就可以直接取出这些国际化资源中的信息了。8.2.1 编写国际化资源文件 4、临时指定资源文件 临时资原文件通常只对应一个JSP,该文件的使用需在JSP文件中指定,即只有在JSP文件中通过struts2标签指定该文件后,才能使用该文件信息。标签的name属性指定临时的国际化资源文件8.2.2 访问国际化资源文件Struts 2框架提供4种方式来访问国际化资源文件:(1)在Action类中使用ActionSupport类的getText方法要访问国际化消息。(2)在JSP页面中使用Struts 2框架的标签来访问。(3)在JSP页面中的表单元素中指定一个key属性,对应着国际化资源文件中的key值,依据key值最终就能得到对应value值。(4)在验证框架xml配置文件的国际化:RegisterAction-validation.xml文件。8.2.3 资源文件加载过程 Struts 2框架提供了多种方式来加载国际化资源文件,下面这些国际化资源文件在不同情况下的加载顺序。Action中加载资源文件,假设我们在某个ChildAction中调用了getText(user.title),Struts 2.0的将会执行以下的操作:(1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。(2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且 baseName为ParentAction的系列资源文件。(3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且 baseName为IChildAction的系列资源文件。(4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象,重新执行第(1)步操作。(5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。(6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。(7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。(8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。8.2.3 资源文件加载过程 对于在JSP中访问国际化消息,则简单的多,他们又可以分为两种形式:(1)对于使用标签作为父标签的标签、表单标签的形式:a、将从标签指定的国际化资源文件中加载指定key对应的消息。b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。c、如果经过上面步骤一直找不到该key对应的消息,将直接输出该key的字符串值。(2)如果标签、表单标签没有使用标签作为父标签:直接加载struts.custom.i18n.resources常量指定baseName的系列资源文件。如果找不到该key对应的消息,将直接输出该key的字符串值。8.3.1 Struts拦截器原理8.3.2 Struts 2内置拦截器8.3 Struts拦截器 拦截器是Struts2的核心组件,Struts2为了支持数据校验、国际化、文件上传和下载等功能,提供了一个强在的拦截器策略,拦截的主要机制就是定义一个功能模块。该模块用于在一个Action执行的前后来进行一些处理或阻止其执行。同时它还提供了一种将通用代码模块化的方式。通过该方式,可以把多个Action中都需要重复指定的代码提取出来,统一放在拦截器里进行定义,从而更好地实现了代码重用。8.3.1 Struts拦截器原理拦截器与Action之间的关系,具体流程如下:1.初始化一个指向servlet容器的HttpServletRequest(如Tomcat)请求,这个请求经过一系列的过滤器(Filter);2.接着FilterDispatecher被调用,它会访问ActionMapper,来决定这个请求是否要调用某个Action,如果需要FilterDispatecher把请求的处理权交给ActionProxy;3.ActionProxy将会通过ConfigurationManager来查找框架的配置文件struts.xml,找到要调用的Action,创建一个ActionInvocation的实例,使用命令模式来调用Action类(涉及到一些拦截器的调用,Interceptor框架在调用action之前执行),Interceptor做一些拦截或者初始的工作;4.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果,Result类型可以是jsp或者Html、FreeMarker的模版等;5.这些请求的结果和ActionMapper一起以HttpServletResponse的形式返回给请求的url(注意拦截器的执行顺序)8.3.1 Struts拦截器原理拦截器与过滤器的区别:1、拦截器是基于Java反射机制的,而过滤器是基于函数回调的。2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。8.3.1 Struts拦截器原理Struts 2中内置了许多拦截器,它们提供了Struts 2的许多核心功能和可选的高级特性。Struts 2中每个拦截器都实现了某一种特定功能,可将它们灵活组合使用。Struts 2框架中的内置拦截器通常定义在struts-default.xml文件中,它们以name-class的方式配置,name表示该拦截器的名称,class表示该拦截器对应的处理类。开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。8.3.2 Struts 2内置拦截器8.3.2 Struts 2内置拦截器alias:实现在不同请求中相似参数别名的转换。autowiring:这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的 Bean。chain:构建一个Action链,使当前Action可以访问前一个Action的属性,一般和一起使用。conversionError:这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误。createSession:该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。debugging:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。execAndWait:后台执行Action,负责将等待画面发送给用户。exception:这个拦截器负责处理异常,它将异常映射为结果。:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。logger:这是一个负责日志记录的拦截器,主要是输出Action的名字。model-driven:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果堆入ValueStack中。scoped-model-driven:如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例。params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。8.3.2 Struts 2内置拦截器prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。static-params:这个拦截器负责将xml中标签下标签中的参数传入action。scope:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。servlet-config:如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合。roles:这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action。timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。token-session:这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中。validation:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。workflow:这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图。8.4.1 创建自定义拦截器8.4.2 配置自定义拦截器8.4.3 拦截器执行顺序分析8.4.4 创建和配置方法过滤拦截器8.4 自定义拦截器Struts 2框架提供了非常丰富的拦截器。Struts 2还提供了创建自定义拦截器的功能,在Struts 2中自定义拦截器非常简单。用户在定义自己的拦截器类时,需要实现com.opensymphony.xwork2.interceptor.Interceptor接口。Interceptor接口中只定义了三个方法,前两个方法分别用来初始化和清除必要的资源。三个方法都只给出声明而未进行定义,因此,直接实现该接口的类必须实现这三个方法。它们的作用如下:init():主要用于初始化系统资源。对于一个拦截器而言,init方法只会被调用一次。在拦截器执行之前调用init()方法,destroy():在拦截器实例被销毁之前,系统将会调用该方法来释放和拦截器相关的资源。intercept():该方法是用来添加真正执行拦截工作的代码,实现具体的拦截操作。它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的页面。其中ActionInvocation参数包含了被拦截的Action的引用,可以通过该参数的invoke()方法,将控制权转给下一个拦截器或者转给Action的execute()方法。8.4.1 创建自定义拦截器自定义拦截器的配置方法是,只需要在的class属性中指定自定义的拦截器类就可以,假设有一个自定义的拦截器类为LoggerInterceptor,其路径为com.interceptor.LoggerInterceptor,则其配置方式如下。上面代码配置了一个名为logger的拦截器,其实现通过LoggerInterceptor拦截器类来完成。在定义完拦截器后就可以配置其使用了,这和配置内置拦截器的方法是一样的。8.4.2 配置自定义拦截器Struts2的拦截器机制采用了嵌套调用拦截器的方式,每一个拦截器都有一个在ActionInvocation接口中包含的invoke()方法,当在某一个拦截器方法中调用invoke()方法时,就会调用下一个拦截器方法,如此嵌套调用下去。如果当前拦截器是最后一个拦截器,则会调用Action的execute()方法。Action执行完后,按照与原来相反的顺序返回执行拦截器中剩余代码,即最后一个拦截器继续执行其剩余代码,然后返回倒数第二个拦截器继续执行其剩余代码,以此类推直到返回到第一个拦截器,最后才回到结果页面。invoke()方法的用来判断是否还有下一个拦截器,若有,则调用下一个拦截器,否则,直接跳到Action的execute()方法去执行。8.4.3 拦截器执行顺序分析Action中使用的拦截器默认情况下都是针对Action中的所有方法进行拦截的,但是有时候只需要拦截Action中某个或某些指定的方法,而不希望拦截整个Action,方法过滤就是Struts 2框架为这种需求提供了解决方法。Struts 2框架提供了一个抽象类MethodFilterInterceptor,该类本身也是一个拦截器类。如果要实现方法过滤的功能只需继承该类即可。MethodFilterInterceptor抽象类定义了一个doIntercept()方法,继承MethodFilterInterceptor类的子类必须实现doIntercept()方法,用来实现真正的拦截逻辑。方法过滤拦截器的逻辑实际上和普通的拦截器逻辑是相似的,区别主要是普通的拦截器需要重写intercept()方法,而方法过滤拦截器要重写的是doIntercept()方法。配置方法过滤拦截器和配置普通拦截器的方式也是类似的,区别在于方法过滤器的配置中可以加上两个参数excludeMethods(不被拦截的方法)和includeMethods(需要被了拦截的方法)。8.4.4 创建和配置方法过滤拦截器 本章主要介绍了Struts基础方法和关键技术。包括类型转换数据校验和国际化,拦截器和过滤器等内容。8.5 本章小结p经常不断地学习,你就什么都知道。你知道得越多,你就越有力量pStudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe学习总结结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best,Failure Is Great,So DonT Give Up,Stick To The End演讲人:XXXXXX 时 间:XX年XX月XX日
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!