您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > structs2知识点
Struts2原理上图来源于Struts2官方站点,是Struts2的整体结构。Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。(1)核心控制器:FilterDispatcherFilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts2调用名为login的Action来处理该请求。Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与ServletAPI耦合,显然无法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求。(2)一个请求在Struts2框架中的处理大概分为以下几个步骤1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求,即HttpServletRequest请求。2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin)3.接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4.如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5.ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类6.ActionProxy创建一个ActionInvocation的实例。7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。8.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。struts2有哪些优点?1)在软件设计上Struts2的应用可以不依赖于ServletAPI和strutsAPI。Struts2的这种设计属于无侵入式设计;2)拦截器,实现如参数拦截注入等功能;3)类型转换器,可以把特殊的请求参数转换成需要的类型;4)多种表现层技术,如:JSP、freeMarker、Velocity等;5)Struts2的输入校验可以对指定某个方法进行校验;6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现struts2是如何启动的?struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件struts2框架的核心控制器是什么?它有什么作用?1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2)作用:负责拦截由url-pattern/*/url-pattern指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。可以通过常量struts.action.extension修改action的后缀,如:strutsconstantname=struts.action.extensionvalue=do//struts如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:constantname=struts.action.extensionvalue=do,go/struts2配置文件的加载顺序?struts.xml——struts.properties常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.struts.xml文件的作用:通知Struts2框架加载对应的Action资源struts2常量的修改方式?常量可以在struts.xml或struts.properties中配置,两种配置方式如下:1)在struts.xml文件中配置常量strutsconstantname=struts.action.extensionvalue=do//struts2)在struts.properties中配置常量(struts.properties文件放置在src下):struts.action.extension=dostruts2如何访问HttpServletRequest,HttpSession和ServletContext三个域对象?方案一:HttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();HttpSessionsession=request.getSession();ServletContextservletContext=ServletActionContext.getServletContext();方案二:类implementsServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware注意:框架自动传入对应的域对象struts2是如何管理action的?这种管理方式有什么好处?struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。struts2中的默认包struts-default有什么作用?1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载struts-default.xml文件。3)通常每个包都应该继承struts-default包struts2的工作流程?用户请求——StrutsPrepareAndExecuteFilter——Interceptor——Action——Result——Jsp/html——响应struts2的action的URL访问路径由什么构成?由两部分组成:包的命名空间+action的名称[+action的后缀],即:package.namespace+action.name在struts.xml中可以不为action指定class属性吗?struts2中有哪些默认的属性?可以,如果没有为action指定class,默认是com.opensymphony.xwork2.ActionSupport默认属性:如果没有为action指定classActionSupport如果没有为action指定methodexecute()注意:ActionSupport的execute方法里面就一句话returnsuccess;如果没有指定result的namesuccess如果没有指定result的typedispatcheraction中默认都有一个拦截器的引用,即:interceptor-refname=defaultStack;注意:1)一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用,所以此时要显式的引进默认的拦截器;2)每个包只能指定一个默认拦截器,每个默认拦截器只针对当前包下有效。struts2如何对指定的方法进行验证?1)validate()方法会校验action中所有与execute方法签名相同的方法;2)要校验指定的方法通过重写validateXxx()方法实现,validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写;3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result;4)在input视图中可以通过s:fielderror/显示失败信息。5)先执行validateXxxx()-validate()-如果出错了,会转发resultname=input/所指定的页面,如果不出错,会直接进行Action::execute()方法struts2默认能解决get和post提交方式的乱码问题吗?不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。struts2如何完成文件的上传?1、JSP页面:1)JSP页面的上传文件的组件:s:filename=”upload”/,如果需要一次上传多个文件,就必须使用多个file标签,但它们的名字必须是相同的,即:name=“xxx”的值必须一样;2)必须把表单的enctype属性设置为:multipart/form-data;3)表单的方法必须为post,因为post提交的数据在消息体中,而无大小限制。2、对应的action:1)在Action中新添加3个和文件上传相关的属性
本文标题:structs2知识点
链接地址:https://www.777doc.com/doc-3304282 .html