还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
基础Action欢迎参加基础课程是现代应用程序开发中不可或缺的组Action Action Web成部分,它负责处理用户请求并返回适当的响应本课程将深入探讨的核心概念、实现方法以及最佳实践Action通过系统学习,您将掌握如何设计和实现高效、安全、可维护的组Action件,为构建企业级应用程序打下坚实基础无论您是初学者还是有经Web验的开发人员,本课程都将为您提供宝贵的知识和技能课程概述学习目标课程内容12通过本课程的学习,您将能够本课程涵盖的定义、生命Action理解的基本概念和工作原周期、配置方式、参数传递、Action理,掌握的配置和使用方结果处理等基础知识,同时也Action法,学会处理各种常见的包括与的集成、Web Spring RESTful开发场景,如表单提交、文件实现、安全性考虑等高级主题上传下载等最终,您将能够通过理论讲解和实际案例相结独立设计和实现符合企业级应合的方式,全面系统地介绍用要求的组件的各个方面Action Action学习方法3建议您在学习过程中结合实际动手练习,将所学知识应用到小型项目中每个主题学习后尝试编写相关代码,并思考如何将其应用到实际项目中积极参与讨论,与其他学习者交流经验也是提高学习效果的重要方法什么是Action的定义在架构中的角色Action Action MVC是应用程序中处理用户请求的核心组件,它封装了在(模型视图控制器)架构中,属于控制器ActionWebMVC--Action应用程序的业务逻辑从技术角度看,是一个普通的层它接收来自用户的请求,调用模型层完成业务Action Controller类,但它遵循特定的规范和约定,使框架能够识别和调处理,然后选择适当的视图呈现结果作为控制器的具Java Action用它每个类通常对应一个或一组相关的用户请求,如体实现,负责协调模型和视图之间的交互,是架构中不ActionMVC表单提交、数据查询等可或缺的组成部分的作用Action处理用户请求Action是用户请求的入口点,负责接收和解析用户提交的数据它将HTTP请求中的参数映射到Java对象,便于后续处理无论是简单的表单提交还是复杂的AJAX请求,Action都能以统一的方式进行处理,简化了Web开发的复杂性封装业务逻辑Action封装了应用程序的业务逻辑,或者作为业务逻辑的调用入口它可以直接包含简单的业务处理代码,或者调用专门的业务服务组件这种封装使得业务逻辑与表示层分离,提高了代码的可维护性和可测试性返回处理结果Action完成请求处理后,需要返回适当的结果这包括选择正确的视图(如JSP页面)、准备视图所需的数据,以及设置响应的状态和头信息通过返回不同的结果,Action可以实现灵活的页面流转和状态管理的生命周期Action创建1当用户发送请求时,框架首先根据URL映射规则找到对应的Action类,然后实例化该类创建Action对象通常情况下,每个请求都会创建一个新的执行Action实例,这确保了请求之间的隔离性在创建过程中,框架可能会注2入依赖的服务或组件Action实例创建后,框架会调用其执行方法(通常是execute方法或指定的其他方法)在执行阶段,Action会处理请求参数、调用业务逻辑、准备响应数据等这是Action生命周期中最核心的阶段,也是开发者需要重销毁3点关注的部分当Action完成请求处理并返回结果后,该Action实例通常会被销毁或放回对象池中在销毁前,可能会执行一些清理操作,如释放资源、关闭连接等由于大多数Action是无状态的,所以通常不需要特别的销毁逻辑类的基本结构Action继承关系虽然Action类不必继承特定的基类,但通常会继承自ActionSupport类或实现Action接口ActionSupport提供了许多有用的功能,如国际化支持、数据验证等继承此类可以简化开发,避免重复编写常见功能的代码•Action接口定义了execute方法和返回值常量•ActionSupport类是Action接口的通用实现•可以创建自定义的抽象Action基类常用方法Action类通常包含多种类型的方法,用于完成不同的功能除了核心的execute方法外,还可能包括getter/setter方法、输入验证方法、初始化方法等按照约定,这些方法需要遵循特定的命名规则,以便框架能够正确识别和调用•execute核心请求处理方法•validate输入数据验证•input验证失败后的处理•getter/setter属性访问方法方法execute返回值类型方法的返回值是一个字符串,用execute于指示处理结果和后续流程常见的返回值包括、、等,对作用success errorinput2应不同的结果处理逻辑框架会根据返回方法是类的核心方法,负execute Action值选择适当的视图(如页面)进行渲染JSP责处理用户请求并执行业务逻辑当框架1接收到用户请求并创建实例后,会Action自动调用该方法开发者需要在此方法中示例代码实现具体的业务处理逻辑,完成从请求到一个典型的方法实现可能包括参execute响应的全过程数检查、业务逻辑处理、结果准备等步骤3方法应处理可能出现的异常,并根据不同情况返回相应的结果字符串,确保用户请求能够得到正确处理的配置方式Action配置注解配置XML配置是传统的配置方式,注解配置是更现代的方式,通过在XML Action通过在或其他配置文件中类上添加特定注解来声明配struts.xml Action声明映射这种方式将配置置信息这种方式将配置信息与代Action与代码分离,便于集中管理和修改码放在一起,减少了配置文件的复在文件中,可以为每个杂度,提高了开发效率常用的注XML Action指定名称、类、方法、结果等信息,解包括、、@Action@Result灵活性较高等@Namespace在中定义、使用、等注•struts.xml package•@Action@Results和解action result支持分模块配置和文件引入减少配置的复杂度••XML配置更改通常需要重启应用代码与配置紧密结合••配置文件struts.xml基本结构struts.xml是Struts2框架的主要配置文件,它定义了Action映射、拦截器、结果类型等核心组件该文件采用XML格式,具有层次化的结构,便于组织和管理大型应用的配置顶层元素是struts,包含一个或多个package元素常用元素struts.xml中包含多种配置元素,用于指定框架的不同方面除了核心的action元素外,还有interceptor、result-type、constant等元素,用于定义拦截器、结果类型和全局常量理解这些元素的作用和用法是有效配置Struts2应用的基础包含和继承为了便于管理大型应用的配置,struts.xml支持配置文件包含和包继承机制通过include元素可以包含其他配置文件,通过package的extends属性可以继承其他包的配置这些机制有助于模块化配置,避免配置文件过于庞大和复杂标签详解action属性说明示例name Action的名称,用于在URL name=login中引用class Action类的完全限定名class=com.example.LoginActionmethod要调用的Action方法method=executeconverter类型转换器类名converter=com.example.MyConverterparams Action参数设置params={key1,value1,key2,value2}在action标签中,name属性是必需的,它定义了Action的标识符,用于在URL中访问该Actionclass属性指定了Action类的完全限定名,如果省略,则使用默认的ActionSupport类method属性指定要调用的方法名,默认为execute方法action标签内部可以包含result、interceptor-ref、param等子标签,用于定义结果映射、应用的拦截器和参数设置了解这些标签的用法对于正确配置Action至关重要命名空间namespace组织结构化URL便于理解和维护1分离不同模块的Action2避免名称冲突简化拦截器和结果配置3模块级别的默认设置提供基础的路径URL4所有Action的共同前缀命名空间是Struts2中组织和管理Action的重要机制它通过在URL路径中添加前缀的方式,将Action划分为不同的逻辑组例如,有两个同名的Action login,如果分别放在/admin和/user命名空间下,它们的访问URL会是/admin/login和/user/login,从而避免了冲突命名空间通过package标签的namespace属性进行配置package name=adminModule namespace=/admin extends=struts-default良好的命名空间设计对于构建可维护的大型应用至关重要,建议按照功能模块或业务领域来组织命名空间,遵循一致的命名规则动态方法调用传统方式1为每个方法配置单独的Action动态方法调用2使用action!method.do格式通配符映射3使用{1}、{2}等通配符变量动态方法调用是一种允许在不添加额外配置的情况下调用Action类中不同方法的技术在传统方式中,如果要调用Action类的不同方法,需要为每个方法配置单独的action标签而使用动态方法调用,可以通过特殊的URL格式(如action!method.do)直接调用指定方法启用动态方法调用需要设置常量constant name=struts.enable.DynamicMethodInvocation value=true/但需要注意的是,出于安全考虑,最新版本的Struts2默认禁用了这一功能通常推荐使用通配符映射代替动态方法调用,如action name=user_*method={1}class=com.example.UserAction,这样既灵活又安全的返回结果Action全局结果全局结果是在级别定义的结果配package置,适用于该下的所有常package Action见的全局结果包括、等通用的字符串常量error login处理情况全局结果使用global-results方法通常返回字符串常量,如Action2标签定义,避免了在每个中重复配Action、、等这SUCCESS ERRORINPUT置常见结果些常量在接口中定义,分别对Action1应不同的处理结果框架会根据返回局部结果的字符串选择相应的结果配置,如选局部结果是在特定中定义的结果配Action择不同的视图页面或执行不同的重定3置,只适用于该局部结果使用Action向操作标签定义,位于标签内部result action当局部结果和全局结果有同名的情况下,局部结果会覆盖全局结果,允许针对特定自定义处理逻辑Action结果类型1dispatcher2redirectdispatcher是默认的结果类型,用于转发请求到JSP或其他资源它在redirect结果类型会向浏览器发送重定向响应(HTTP302),触发新的同一请求中继续处理,保留请求属性和参数配置示例result请求这会创建新的请求上下文,丢失原请求的属性配置示例type=dispatcher/WEB-INF/pages/success.jsp/resultdispatcher result type=redirect/login.action/resultredirect适用于后重定通常用于显示处理结果的页面向前PRG模式,避免表单重复提交其他类型3chain4chain结果类型用于将控制权转移到另一个Action,保留当前的请求上Struts2还提供了其他结果类型,如redirectAction(重定向到另一个下文和值栈配置示例resulttype=chainnextAction/result使Action)、stream(返回二进制数据流)、plainText(返回纯文本)、用chain时需谨慎,因为它可能导致Action之间紧密耦合,使应用程序json(返回JSON数据)等这些结果类型满足了不同的响应需求,使结构复杂化框架能够适应各种Web应用场景参数传递属性驱动模型驱动接口驱动属性驱动是最基本的参数传递方式Action类定模型驱动通过实现ModelDriven接口,将请求参接口驱动是一种更灵活的参数传递方式,通过义与请求参数同名的属性和对应的getter/setter数直接映射到模型对象Action类需要重写实现特定接口(如ParameterAware、方法,框架自动将请求参数值设置到这些属性getModel方法返回模型实例这种方式将数据ServletRequestAware等)来获取原始参数这中这种方式简单直接,但当参数较多时会导封装在独立的模型类中,减少了Action类的复杂种方式允许Action直接访问底层的参数、请求对致Action类臃肿,且需要手动处理类型转换度,更符合面向对象设计原则象或会话对象,适用于需要精细控制参数处理的情况表达式OGNL基本语法在中的应用ActionOGNL(对象图导航语言)是一种功OGNL在Struts2中有广泛应用,包能强大的表达式语言,用于获取和设括访问值栈中的数据、设置标签属性、置Java对象的属性OGNL表达式由执行条件判断等通过OGNL,可以对象引用、属性访问和方法调用组成,轻松实现表单数据绑定、集合数据遍如user.address.city或历和复杂对象图导航OGNL的灵活user.getFullName在Struts2中,性使得视图层和控制器层之间的数据OGNL表达式通常放在%{...}中,如交互变得简单高效s:property value=%{user.name}/安全考虑OGNL的强大功能也带来了安全风险,如可能导致远程代码执行漏洞为减少风险,建议限制OGNL表达式的使用范围,禁用不必要的OGNL功能,升级到最新版本的Struts2,并对用户输入进行严格验证(值栈)ValueStack值栈的访问通过OGNL或API获取数据1数据存储与检索2push、pop、set等操作值栈的组成结构3CompoundRoot和Context值栈的基本概念4数据容器和OGNL上下文值栈是Struts2框架的核心组件,它是一个数据存储区域,用于在Action执行过程中传递数据值栈由两部分组成CompoundRoot(存储对象)和Context(存储命名对象)Action对象通常位于CompoundRoot的顶部,使其属性可以直接访问在实际开发中,值栈用于将Action中的数据传递到视图层,也用于拦截器之间的数据共享通过OGNL表达式可以轻松访问值栈中的数据,如s:propertyvalue=name/会查找值栈中的name属性了解值栈的工作原理对于有效使用Struts2标签和调试数据传递问题至关重要国际化()i18n配置方法资源文件在中使用Action的国际化基于的资源文件是包含键值对的属性文件,键在中可以通过方法(由Struts2Java ActiongetText机制首先需要创建是标识符,值是对应语言的文本例如,接口提供)获取国际化消ResourceBundle TextProvider不同语言的属性文件,如欢迎使用我们的系息例如,welcome.message=String message=、统(中文文件)和在messages_zh_CN.properties getTextwelcome.message JSP然后在页面中,可以使用标签显示国messages_en_US.properties welcome.message=Welcome toour s:text中配置资源包(英文文件)资源文件应放在际化消息struts.xml constantsystem s:text类路径下,按照特定的命名规则(基名还可以name=struts.custom.i18n.resources name=welcome.message/这样框架就能根语言国家)命名在消息中使用参数,实现动态内容的国value=messages/__.properties据用户的语言设置自动选择适当的资源际化文件类型转换内置转换器1Struts2提供了多种内置类型转换器,能够自动处理常见的类型转换需求例如,字符串到基本类型(整数、布尔值等)的转换,字符串到日期的转换,以及集合类型的转换这些内置转换器覆盖了大多数常见场景,使开发者不必手动处理类型转换问题自定义转换器2当内置转换器无法满足需求时,可以创建自定义类型转换器自定义转换器需要实现StrutsTypeConverter接口,重写convertFromString和convertToString方法通过自定义转换器,可以处理特殊格式的数据,如货币金额、复杂对象编码等全局局部转换器vs3类型转换器可以在全局范围或局部范围注册全局转换器通过xwork-conversion.properties文件注册,适用于整个应用局部转换器通过ActionClassName-conversion.properties文件注册,只适用于特定Action通过合理配置全局和局部转换器,可以灵活处理不同场景的类型转换需求数据验证数据验证是确保用户输入符合业务规则的重要机制提供了多种验证方法,适应不同的开发风格和需求最基本的方法是重写Struts2类的方法,在其中编写验证逻辑,发现错误时调用方法这种方法灵活但代码量大Action validateaddFieldError验证是一种声明式方法,通过创建文件定义验证规则这种方法将验证逻辑与业务代码分离,便于管XML ActionClassName-validation.xml理和修改注解验证是更现代的方法,使用、等注解直接在属性上定义验证规则,代码更简洁@Validate@RequiredFieldValidator Action无论使用哪种方法,验证失败后框架都会自动返回结果,通常显示一个带有错误消息的表单页面input拦截器常用拦截器Struts2提供了丰富的内置拦截器,如paramsPrepareParamsStack(处理参数)、validationWorkflowStack(执行验证)、概念fileUpload(处理文件上传)等这些拦截器通2常组织为拦截器栈,以特定顺序执行默认的拦截器是Struts2框架的核心机制,用于在拦截器栈是defaultStack,包含了最常用的拦截Action执行前后处理横切关注点拦截器可以器1拦截请求,执行预处理或后处理操作,如参数处理、验证、文件上传等拦截器实现了面向自定义拦截器切面编程AOP的思想,使得横切关注点与业当内置拦截器无法满足需求时,可以创建自定务逻辑分离义拦截器自定义拦截器需要实现Interceptor接3口或继承AbstractInterceptor类,重写intercept方法在这个方法中,可以执行自定义的预处理和后处理逻辑,如权限检查、日志记录、性能监控等中的依赖注入Action构造器注入注入接口注入Setter构造器注入是通过注入是最常用的依接口注入是通过实现特Setter类的构造函数接赖注入方式,通过定接口来接收依赖对象Action收依赖对象这种方式类的方法接在中,常见的是Action setterStruts2确保在创建时就收依赖对象这种方式实现接口,如Action Aware获得所有必要的依赖,灵活、直观,与、ServletContextAware有助于实现不变性构规范一致等这种JavaBean SessionAware造器注入的缺点是当依注入的缺点是无法方式明确表达了Setter Action赖较多时,构造函数参保证所有必要的依赖都对特定对象的依赖示数列表会变得冗长示被设置示例例public publicclass例public voidLoginAction implementsLoginActionUserServicsetUserServiceUserSe ServletContextAwareeuserService,rvice userService{...}LogService logService{this.userService={...}userService;}与集成Action Spring配置方法集成Spring和Struts2需要几个步骤首先添加struts2-spring-plugin依赖;然后配置ContextLoaderListener在web.xml中加载Spring上下文;最后修改struts.xml,使用Spring的bean名称作为Action类这样,Struts2将从Spring容器获取Action实例,而不是自己创建优势集成Spring带来多项优势利用Spring强大的依赖注入管理Action的依赖;使用Spring的事务管理、AOP等功能;简化Action的配置和管理;实现更好的关注点分离这种集成使得应用程序更加模块化,提高了代码的可测试性和可维护性注意事项集成过程中需要注意确保Spring bean的作用域配置正确(通常为prototype);处理好Action的线程安全问题;避免循环依赖;适当利用Spring的功能但不过度依赖,保持适当的解耦正确处理这些问题,才能充分发挥两个框架的优势文件上传配置Struts2支持文件上传功能,需要进行一些配置确保fileUpload拦截器包含在拦截器栈中;设置上传文件的大小限制(struts.multipart.maxSize);配置允许的文件类型(struts.multipart.allowedTypes)等这些配置可以在struts.xml全局设置,也可以针对特定Action进行设置在中处理Action在Action类中处理文件上传需要定义三个属性File类型的属性存储上传的文件内容;String类型的属性存储文件名;String类型的属性存储文件MIME类型然后在execute方法中编写文件处理逻辑,如保存到磁盘、处理文件内容等多文件上传要支持多文件上传,将上述三个属性改为数组或List类型即可例如,privateListFile uploads;private ListStringuploadsFileName;privateListString uploadsContentType;处理逻辑需要遍历这些集合,依次处理每个上传的文件文件下载实现方法设置响应头文件流处理文件下载在中通常通过结果正确设置响应头对于成功的文件下载文件流处理需要注意资源管理和性能优化Struts2stream HTTP类型实现方法准备要下载的文件内至关重要主要的响应头包括应使用缓冲区提高传输效率;正确关闭输入Action Content-容,返回,然后配置一个(指定类型)、输出流避免资源泄漏;对于大文件应考虑分success streamType MIMEContent-类型的结果,将文件内容作为流发送给客户(指定文件名和处理方式)、块传输;处理好异常情况,如文件不存在或Disposition端这种方式可以处理各种类型的文件,如(指定文件大小)等这些无法访问等良好的文件流处理是实现可靠Content-Length文档、图片、视频等响应头告诉浏览器如何处理接收到的数据,文件下载的基础如直接显示或保存到本地与交互Ajax Action支持返回数据处理请求JSON JSONAjax通过插件提要返回数据,首先在类中处理请求的与普通基Struts2struts2-json-plugin JSON Action AjaxAction Action供支持添加此插件后,可以使定义要序列化的属性及其方法;本相同,主要区别在于结果处理JSON getterAjax用结果类型,将的属性自动然后配置一个类型的结果请求通常不需要返回完整页面,json Actionjson resultHTML转换为格式结果类型会设如果需要更精细的控制,而是返回或格式的数据在JSON jsontype=json/JSON XML置正确的可以使用注解标记特定属性,方法中,需要准备好要返回的数Content-Type@JSONAction(),并处理字符编码或者在结果配置中使用参数指定包含据对象,设置必要的状态信息(如成功application/json/问题通过和排除的属性完整配置示例失败标志、错误消息等),然后返回includeProperties result/参数,可以控制哪些对应的结果名excludeProperties type=jsonparam属性包含在响应中JSON name=rootdataObject/param/resultRESTful Action概念配置方法RESTREST(表述性状态转移)是一种架构风在Struts2中实现RESTful Action需要添格,强调通过HTTP方法(GET、POST、加struts2-rest-plugin插件然后配置PUT、DELETE等)对资源进行操作rest-default包作为父包,并使用特定的RESTful API使用URI标识资源,使用命名规则定义Action类例如,HTTP方法表示操作,使用HTTP状态码UserController类会自动映射/users/路径,表示结果这种设计使API更简洁、更符其中的index方法处理GET请求,合HTTP协议的本意,也更容易被客户端create方法处理POST请求,update理解和使用方法处理PUT请求,destroy方法处理DELETE请求实现示例一个典型的RESTful Action类会包含多个方法,对应不同的HTTP方法和路径例如,index方法返回资源集合,show方法返回单个资源,create方法创建新资源,update方法更新资源,destroy方法删除资源每个方法返回适当的模型数据和HTTP状态码,支持JSON、XML等多种表示格式异常处理全局异常处理1全局异常处理为整个应用定义统一的异常处理机制在struts.xml中使用global-exception-mappings标签,为不同类型的异常配置不同的结果级别异常处理例如exception-mapping exception=java.lang.Exception2Actionresult=error/全局异常处理确保即使没有为特定Action配置异常映射,Action级别异常处理在特定Action内定义异常映射,覆盖全局配置在异常也能得到适当处理action标签内使用exception-mapping标签配置这种方式允许为不同的Action定制异常处理逻辑,适应不同的业务需求Action级别的异常映射优先级高于全局异常映射自定义异常3自定义异常是处理特定业务错误的有效方式创建继承自Exception的自定义类,添加必要的属性和方法表示错误状态在Action中抛出这些自定义异常,然后配置相应的异常映射处理它们自定义异常使得错误处理更具针对性,也使代码更加语义化的线程安全Action潜在问题最佳实践12Action通常不是线程安全的,因为同确保Action线程安全的最佳实践包括一个Action实例可能被多个线程同时使用原型作用域(每请求创建一个新访问,导致数据一致性问题典型场实例);避免静态成员变量存储状态景包括多个用户同时访问同一个信息;不要在Action中缓存用户特定Action实例;使用单例作用域的的数据;谨慎使用实例变量,优先使Action(如在Spring中配置为用局部变量;如果必须共享数据,使singleton);包含静态成员变量的用线程安全的集合类或同步机制Action类这些情况都可能导致数据混乱或意外行为线程本地存储3对于需要在请求处理过程中跨多个方法共享数据的情况,可以使用ThreadLocal提供线程本地存储ThreadLocal为每个线程创建单独的变量副本,避免了线程间的数据干扰使用ThreadLocal时需要注意内存泄漏风险,确保在请求结束后清理存储的数据的单元测试Action测试框架选择模拟测试用例编写HttpServletRequest测试通常使用作为基础测试测试时,通常需要模拟请编写测试用例时,应关注几个关Action JUnitAction HTTPAction框架,结合或等模拟求和响应对象可以使用键方面测试方法的返回值是否Mockito EasyMockAction框架还提供了专门的测试支和符合预期;测试执行后的状态变Struts2MockHttpServletRequest Action持类,如,简化,设置请求化(如属性值);测试异常处理逻辑;StrutsTestCase ActionMockHttpServletResponse测试这些框架和工具使得在不启动完参数、请求路径、会话属性等测试模型数据的正确性;测试验证逻辑Struts整容器的情况下测试成为可的测试支持类也提供了便捷方法如的有效性全面的测试覆盖这些方面,Web Action2能,提高了测试的效率和可控性,自动处理请求创建和能够确保的正确行为executeAction Action参数设置,简化测试代码性能优化Action避免重复创建对象使用缓存异步处理在中应避免不必对于计算密集型操作或对于耗时操作,考虑使Action要的对象创建,特别是频繁访问的数据,应考用异步处理模式可以在循环或频繁调用的方虑使用缓存可以使用将操作提交到线程池执法中可以采用对象池、内存缓存(如、行,而不是在方Ehcache Action缓存、或懒加载等技术)或分布式缓存法中同步等待结果Caffeine减少对象创建对于不(如、提供了异步Redis Struts2变的数据结构,考虑使)在支持,或者可以Memcached Action用不可变对象或单例模中,可以缓存查使用的Action Java式这些措施可以显著询结果、配置信息、或、CompletableFuture减少垃圾收集压力,提预计算的值合理的缓的等机制Spring@Async高应用性能存策略可以显著减少数异步处理可以提高响应据库访问和计算开销性和资源利用率设计模式Action命令模式策略模式模板方法模式本质上是命令模式的实现,它将请求策略模式在中的应用体现为不同的处模板方法模式通过在抽象基类中定义算法骨Action Action封装为一个对象(),使不同的请求理策略可以互相替换例如,可以定义一个架,将部分步骤的实现延迟到子类这在Action可以以不同的方式处理命令模式使请求发共同的接口或抽象类,然后实现多种不同的继承结构中非常有用,可以创建基础Action送者与接收者解耦,提高了系统的灵活性处理策略类通过依赖注入或工厂方子类,定义通用的处理流程,Action ActionSupport在中,每个类代表一个命令,法获取特定的策略实现,根据条件决定使用然后让具体的类继承并重写特定步骤Struts2Action Action框架根据决定执行哪个命令,并将结果哪种策略,使系统更具扩展性这种方式促进了代码重用和流程一致性URL返回给用户复合Action实现方法实现复合有几种方式使用动态方法Action调用(如);使用通配符action!method.do映射(如配置);使用插action_*RESTful概念件的约定(基于方法和路径)无论HTTP2使用哪种方式,都需要为每个方法配置适当复合是一种将多个相关操作组合在Action的结果,并确保方法之间的逻辑隔离,避免一个类中的设计不同于传统的一Action状态混淆个负责一个操作的方式,复合Action Action1通过多个方法处理不同的操作,但这些操使用场景作在逻辑上属于同一个功能模块例如,一个可能包含、、UserAction loginregister复合适用于紧密相关的功能集合,如Action等方法updateProfile用户管理、订单处理等这种设计有助于减3少类的数量,便于管理相关功能和共享数据但如果方法之间关联性不强,或类变Action得过于庞大,应考虑拆分为多个专注于单一职责的类Action的继承与多态Action多态应用根据需求动态选择具体实现1方法重写2定制特定行为共享字段和方法3减少代码重复抽象类Action4提供通用功能骨架Action的继承是一种强大的代码复用机制通过创建抽象基类,可以封装通用功能,如用户认证、日志记录、权限检查等具体的Action类继承这些基类,获得共享功能,同时可以重写方法自定义行为例如,可以创建AbstractUserAction基类,然后让UserProfileAction、UserSettingsAction等继承它多态在Action设计中也很有用通过依赖注入和接口编程,可以使Action类在运行时根据配置或条件使用不同的行为实现例如,PaymentAction可以根据用户选择的支付方式,使用不同的支付处理器实现这种灵活性使系统能够适应变化的需求,同时保持代码的清晰和可维护无状态有状态vs Action区别使用场景实现方法无状态不在请求之间保留状态信无状态适用于大多数应用场实现无状态只需遵循标准的Action ActionWeb Action息,每次请求都使用新的实例,景,特别是处理独立的用户请求,如表开发方式,确保不依赖实例变量Action Action实例变量仅在单个请求期间有效有状单提交、数据查询等有状态适在请求之间保持值实现有状态Action Action态在请求之间保留状态,通常作用于需要在请求之间共享数据的场景,需要特别配置,如在中将作Action Springbean为单例使用,实例变量会被多个请求共如多步骤向导、应用级缓存等但即使用域设为,并添加适当的同步singleton享无状态设计简化了并发处理,而有在这些场景下,通常也可以使用会话存机制保证线程安全通常推荐无状态设状态设计可能需要额外的同步机制储或外部缓存代替有状态计,除非有特别的性能或功能需求Action中的事务管理Action事务概念事务是一组操作的执行单元,具有原子性(全部成功或全部失败)、一致性(保持数据一致性)、隔离性(事务间互不干扰)和持久性(结果永久保存)特性在Web应用中,事务通常涉及多个数据库操作,确保这些操作作为一个整体执行,任何一步失败都会导致整体回滚配置方法在Action中实现事务管理通常依赖外部框架,如Spring步骤包括配置事务管理器(如DataSourceTransactionManager);定义事务属性(如传播行为、隔离级别);应用事务配置到服务方法(通过注解或XML)Action方法调用这些事务性服务方法,而不是直接处理事务最佳实践事务管理的最佳实践包括将事务控制放在服务层而非Action层;避免长事务影响性能;正确处理异常防止事务泄露;使用适当的隔离级别平衡一致性和并发性;考虑使用分布式事务处理跨数据源操作遵循这些实践可以确保数据完整性和应用可靠性安全性考虑输入验证防护CSRF输入验证是防止注入攻击的第一道防跨站请求伪造CSRF是常见的Web线应对所有用户输入进行验证,包安全威胁防护措施包括使用括表单字段、URL参数、Cookie等token验证(在表单中包含随机生成验证应包括类型检查、长度限制、格的token,并在服务器验证);检查式验证和内容过滤对于特殊字符,Referer头(确保请求来自预期的站应进行适当转义使用白名单方法点);使用SameSite cookie属性限(只允许已知安全的输入)通常比黑制跨站点请求Struts2提供了内置名单方法更安全的token拦截器简化CSRF防护权限控制权限控制确保用户只能访问其有权限的资源和功能实现方式包括角色基础访问控制(RBAC);资源级别的权限检查;URL级别的访问限制;方法级别的权限注解通常结合拦截器或过滤器实现,在Action执行前进行权限检查,未授权的请求将被拒绝或重定向到登录页日志记录日志框架选择配置方法最佳实践选择合适的日志框架对于日志配置通常包括定义日日志最佳实践包括使用有效的日志记录至关重要志级别(DEBUG、INFO、适当的日志级别,避免过常用选择包括Log4j
2、WARN、ERROR等)、多DEBUG日志影响性能;Logback和SLF4J输出目标(控制台、文件、包含足够上下文信息(如SLF4J作为门面模式实现,数据库等)和格式模式用户ID、请求URL、操作提供统一的日志接口,而配置可以通过XML、类型);记录异常的完整底层可以灵活切换具体实YAML或属性文件完成堆栈信息;使用结构化日现Log4j2和Logback提对于分布式应用,可能还志格式便于解析和查询;供了高性能、灵活配置的需配置集中式日志收集,实现日志轮转防止文件过日志功能,包括异步日志、使用工具如ELK大;定期审查和归档日志;自动滚动等特性(Elasticsearch、考虑隐私和合规要求,避Logstash、Kibana)将多免记录敏感信息服务器日志聚合分析与缓存Action页面缓存页面缓存存储完整的页面输出,适用于变化不频繁的内容实现方式包括Servlet过滤器缓存(如OSCache);反向代理缓存(如Nginx、Varnish);浏览器缓存(通过HTTP缓存头控制)Action可以通过设置适当的HTTP头(如Cache-Control、ETag)控制缓存行为,或使用专门的缓存拦截器数据缓存数据缓存存储查询结果或计算结果,减少数据库访问或重复计算实现方式包括本地内存缓存(如Ehcache、Caffeine);分布式缓存(如Redis、Memcached);二级缓存(如Hibernate缓存)Action可以直接使用缓存API,或通过缓存注解简化缓存操作缓存策略有效的缓存策略需要根据数据特性和业务需求制定考虑因素包括缓存粒度(整页缓存还是部分内容);缓存更新策略(定时更新、事件触发更新、手动刷新);缓存过期策略(基于时间、基于容量);缓存一致性保障(如分布式锁);监控和调优机制(命中率、内存使用等)大型应用中的组织Action命名规范一致的命名规范是大型项目的关键Action类名通常使用动作名+Action格式,如UserLoginAction、ProductSearchAction命名空间通常反映模块结构,模块化如/admin、/user、/product方法名应表明其功能,如list、save、delete这些命名约定使代码更2大型应用应采用模块化结构,将Action按照业务功容易理解和维护能划分为多个模块每个模块可以有自己的包结构、配置文件和资源Struts2支持通过include元素合1并多个配置文件,每个模块可以有独立的struts-目录结构module.xml,然后在主配置文件中引入这种方式合理的目录结构有助于组织和管理代码典型结构使开发团队能够并行工作于不同模块包括src/main/java下按模块和层次组织Java类;3src/main/resources下存放配置文件和资源;src/main/webapp下组织Web资源在大型应用中,可能还需要多项目结构,如核心库项目、Web项目、API项目等,通过Maven或Gradle管理依赖关系与微服务Action微服务架构1将系统拆分为独立的小型服务服务间通信2使用API网关和消息队列的新角色Action3专注于UI与API服务的集成微服务架构将传统的单体应用拆分为多个小型、独立的服务,每个服务负责特定的业务功能在这种架构下,Action的角色发生了变化传统上,Action直接与业务逻辑和数据访问层交互,而在微服务环境中,Action更多地充当API消费者,通过HTTP、gRPC或消息队列与后端微服务通信实现这种转变的方案包括将Action改造为API客户端,使用RestTemplate、Feign或WebClient调用微服务;引入服务发现机制(如Eureka、Consul)实现动态服务定位;使用断路器模式(如Hystrix、Resilience4j)处理服务不可用情况;考虑使用BFF(Backend ForFrontend)模式,为前端专门提供聚合API这种架构使系统更加灵活可扩展,但也增加了分布式系统的复杂性与前端框架集成Action跨域问题处理前后端分离1RESTful API23现代前端框架(如React、Vue、当前端和后端部署在不同域时,会面临在前后端分离架构中,前端和后端是独Angular)通常通过RESTful API与后端跨域资源共享CORS问题解决方法立的应用,通过API通信这种架构的交互在这种模式下,Action主要负责包括配置CORS过滤器允许特定来源优势包括技术栈选择的灵活性;开发提供API端点,接收请求并返回JSON或的请求;在Action中添加适当的CORS团队的独立工作;更容易实现持续部署;XML格式的数据,而不是渲染HTML页响应头;使用代理服务器中转请求;采更好的性能和可扩展性实现这种架构面Struts2的json-plugin提供了便捷的用JSONP技术(虽然有安全限制)正需要明确的API契约、完善的文档和强JSON支持,可以轻松将Action属性序确的CORS配置对于前后端分离架构至大的自动化测试列化为JSON响应关重要最佳实践Action开发的命名规范是保持代码一致性的关键类名应使用名词动词格式,如;方法名应使用动词开Action Action++Action UserLoginAction头,如、;属性名应使用驼峰命名法,如、包名应反映模块和层次,如saveUser listOrdersuserName orderCount这些命名约定使代码更易读、更易理解com.company.module.web.action代码组织方面,应遵循单一职责原则,让每个专注于一个功能点将业务逻辑委托给服务层,保持层轻量使用基类或公共Action Action方法封装重复代码注释规范要求为每个类和方法提供注释,说明其用途、参数、返回值和可能的异常注释应及时更新,Action JavaDoc保持与代码同步这些实践有助于构建可维护、可扩展的应用程序常见问题与解决方案参数绑定问题1参数绑定问题常见于复杂对象或集合的绑定解决方案包括确保属性名与请求参数名匹配;对于嵌套对象,使用正确的OGNL表达式格式;检查类型转换器配置;对于集合,使用索引符号如list
[0].name;对于Map,使用键名如map[key].value调试时,可以启用参数拦截器的调试输出,查看绑定过程的详细日志返回值处理2返回值处理问题包括结果未找到、视图渲染错误等解决方案包括检查Action方法返回的字符串是否正确;确认对应的result配置存在;检查视图路径是否正确;对于特殊结果类型(如redirect、stream),确保配置了所有必要的参数使用默认结果类型和全局结果配置可以减少常见错误循环依赖3循环依赖是指两个或多个组件相互依赖,常见于Service和Action相互注入的情况解决方案包括重构代码消除循环依赖;使用接口而非具体类;使用setter注入代替构造器注入;使用依赖容器(如Spring)的延迟注入功能;在必要时使用事件机制代替直接调用,解耦组件关系性能监控Action100ms500响应时间每秒请求数用户请求处理的平均响应时间系统能够处理的并发请求数
99.9%2GB可用性内存占用系统正常运行的时间比例Action处理请求的平均内存消耗监控Action性能的关键指标包括响应时间、吞吐量、错误率、资源利用率等工具选择方面,可以使用应用性能监控APM工具如New Relic、Dynatrace、AppDynamics;开源解决方案如Prometheus+Grafana;日志分析工具如ELK栈;或自定义监控系统这些工具可以收集详细的性能数据,提供实时监控和历史趋势分析基于监控数据的优化方法包括识别并优化慢查询和热点方法;调整缓存策略提高命中率;优化数据库访问模式;实现请求级别的超时控制;使用异步处理分担负载;增加资源垂直或水平扩展;实施限流保护系统;优化JVM参数如堆大小、垃圾回收策略持续监控和优化是保持系统高性能的关键版本升级与迁移Action版本差异Struts2的不同版本之间存在显著差异,特别是在安全修复、API变更和功能增强方面主要差异点包括配置文件格式的变化;默认拦截器和结果类型的变更;新增或废弃的API;安全机制的增强;性能优化等升级前应仔细阅读版本说明和迁移指南,了解这些差异对现有代码的影响升级步骤升级Action涉及多个步骤首先进行完整备份;更新依赖库版本(pom.xml或build.gradle);调整配置文件适应新版本要求;修改代码解决不兼容问题;更新安全设置,特别是禁用不安全的功能;运行全面的测试确保功能正常;准备回滚计划应对意外问题;分阶段部署减少风险兼容性处理处理兼容性问题的方法包括使用适配器模式封装版本差异;实现自定义拦截器替代废弃功能;使用条件编译或配置标志支持多版本;利用依赖注入实现运行时策略选择;编写全面的测试确保行为一致性;在关键节点添加日志和监控;保持文档更新,记录迁移决策和变更替代方案Action其他框架SpringMVC JAX-RS Web是开发的主流框架,是的标准规范,实除了和,还有许多现代SpringMVC JavaWeb JAX-RS JavaREST API SpringMVC JAX-RS采用基于注解的控制器模型与相现包括、等它专注于构框架可供选择提供自动Struts2Jersey RESTEasyWeb SpringBoot比,它集成了生态系统,配置更简洁,建服务,使用、、配置和内嵌容器,简化开发和部署;SpringRESTful@Path@GET启动更快,安全性更高使用、等注解定义资源和方法与和专注于微服务和云原生@Controller@POST ActionMicronaut Quarkus等注解定义控制器和请相比,更轻量,更适合构建微服务应用,提供快速启动和低内存占用;@RequestMapping JAX-RS Play求映射,返回值处理更灵活,支持和它的优势在于标准化、可移植性以采用响应式编程模型,适合高并RESTful APIFramework风格对于新项目,通常是及与处理的原生集成对于发场景;提供事件驱动的非阻塞,APISpringMVCJSON/XML APIVert.x API比更推荐的选择优先的项目,是很好的选择支持多语言开发Struts2JAX-RS案例研究订单处理Action需求分析订单处理系统需要支持订单创建、确认、支付、取消、查询等功能用户需要能够添加商品到购物车,提交订单,选择支付方式,查看订单状态和历史系统需要处理各种异常情况,如库存不足、支付失败等,并提供适当的用户反馈安全性和性能是关键要求,尤其是在高峰期的并发处理能力设计思路设计采用分层架构,包括表示层(Action)、业务层(Service)和数据访问层(DAO)将订单处理拆分为多个Action类,如CartAction、OrderAction、PaymentAction等,每个类专注于特定功能使用命令模式处理不同的操作,策略模式处理不同的支付方式,观察者模式通知相关系统(如库存、客户通知)代码实现实现使用Struts2结合Spring和Hibernate关键Action包括OrderAction(处理订单CRUD)、PaymentAction(处理支付流程)和OrderQueryAction(处理订单查询)使用拦截器实现身份验证、授权和输入验证实现RESTful API支持移动端和第三方集成采用缓存优化热点数据访问,使用异步处理处理非即时操作如通知和统计案例研究用户管理Action数据模型核心数据模型包括User实体(基本用户信息,如用户名、密码、邮箱等);Profile实体(扩展用户信息,如地址、电话、偏好设置等);Role实体(角色定义,如管理员、普通用户等);Permission实体(具体权功能模块限定义);UserRole和RolePermission关联实体2用户管理系统包含多个功能模块用户注册(收集(实现多对多关系)采用JPA注解定义实体类和关系用户信息,验证有效性,创建账户);用户登录/登出(身份验证,会话管理,安全控制);个人资料实现细节1管理(查看和更新个人信息,修改密码);权限管理(角色分配,权限设置,访问控制);用户搜索实现采用模块化设计,将用户管理分为多个Action类和管理(管理员功能,包括用户查询、禁用/启用账RegisterAction(处理用户注册流程);LoginAction户等)(处理身份验证和会话创建);ProfileAction(处理3个人信息管理);UserAdminAction(处理管理员的用户管理功能)使用拦截器实现权限检查、输入验证和防CSRF攻击采用面向接口编程,便于单元测试和模块替换总结与展望课程回顾的未来发展12Action本课程全面介绍了Action的基础知识随着技术的发展,Action的角色和实和高级应用我们从Action的定义和现方式也在不断演变未来的趋势包作用开始,系统学习了Action的生命括更无缝的云原生支持;更好的响周期、配置方式、参数处理、结果返应式编程和非阻塞IO集成;更轻量的回等基础知识然后深入探讨了与微服务架构适应;更强大的安全机制Spring集成、RESTful实现、安全性应对不断变化的威胁;更智能的开发考虑等高级主题通过案例研究,我工具提高生产力;更广泛的框架互操们看到了如何将这些知识应用到实际作性和标准化;更便捷的测试和调试项目中,解决具体的业务问题支持学习建议3要成为Action开发专家,建议深入理解底层原理,而不仅仅是API用法;保持对最新安全公告的关注,及时应用补丁;学习设计模式和架构原则,提高代码质量;参与开源社区,阅读和贡献代码;尝试不同的框架和技术,拓宽视野;定期重构和优化旧代码,应用新知识;持续学习和实践,跟上技术发展步伐。
个人认证
优秀文档
获得点赞 0