Struts2的基本流程Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。2.核心控制器: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方法来处理用户请求。显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。图3.19显示了这种处理模型。图3.19Struts2的拦截器和Action从图3.19中可以看出,用户实现的Action类仅仅是Struts2的Action代理的代理目标。用户实现的业务控制器(Action)则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest对象里,而用户的Action类无需访问HttpServletRequest对象。拦截器负责将HttpServletRequest里的请求数据解析出来,并传给业务逻辑组件Action实例。3.业务控制器正如从图3.19所看到的,业务控制器组件就是用户实现Action类的实例,Action类里通常包含了一个execute方法,该方法返回一个字符串——该字符串就是一个逻辑视图名,当业务控制器处理完用户请求后,根据处理结果不同,execute方法返回不同字符串——每个字符串对应一个视图名。程序员开发出系统所需要的业务控制器后,还需要配置Struts2的Action,即需要配置Action的如下三个部分定义:—Action所处理的URL。—Action组件所对应的实现类。—Action里包含的逻辑视图和物理资源之间的对应关系。每个Action都要处理一个用户请求,而用户请求总是包含了指定URL。当FilterDispatcher拦截到用户请求后,根据请求的URL和Action处理URL之间的对应关系来处理转发。在action元素的name属性中可以使用*通配符,它可以匹配除了/以外的多个连续字符,在action元素的class和method属性以及result元素中可以引用*通配符在访问期间实际匹配的内容,例如:方式1:actionname=view6*class=cn.itcast.struts2demo.HelloWorldActionmethod={1}result/WEB-INF/page/{1}.jsp/result/action方式2:actionname=view7_*class=cn.itcast.struts2demo.HelloWorldActionmethod={1}result/WEB-INF/page/{1}.jsp/result/action如果*匹配的内容为空,则调用execute方法;对于采用下划线连接*的方式,如果访问路径中没有为*部分指定内容,那么在访问路径中还可以省略下划线。使用*通配符可能导致有多个action元素与一个访问路径匹配,这时候以排在配置文件中最后的配置项为准,所以更具体的模式应在更不具体的模式之后进行配置。请描述actionname=“*”result/WEB-INF/{1}.jsp/result/action的含义。struts2的配置文件配置文件可以分为三部分:1.web.xml用于配置FilterDispatcherfilterfilter-nameaction2/filter-namefilter-classorg.apache.struts2.dispatcher.FilterDispatcher/filter-class/filterfilter-mappingfilter-nameaction2/filter-nameurl-pattern/*/url-pattern/filter-mapping2.struts.properties配置web应用程序的执行环境该配置文件了一种改变框架默认行为的途径,通常你不需要去修改它。这个文件中包含的所有属性都可以在web.xml中的init-param中进行配置,或者在struts.xml中用constant标签进行配置。有关这个文件配置项的最新信息可以见默认的配置文件为default.properties被包含在struts2的核心jar包中发布。为了修改这个默认的文件配置,你可以在你工程的classpath中加入一个struts.properties文件在其中添加配置项,那么就会覆盖默认配置文件的设置。有如下一些配置项可能被常用:struts.i18n.reload=true–使能重新加载国际化文件struts.devMode=true–设置为开发模式便于输出更多便于理解的调试信息struts.configuration.xml.reload=true–当改变Action的配置时能够自动重新加载配置,而不用重启整个服务器struts.url.http.port=8080–设置服务器的工作端口,保证自动生成的url是正确的。3.struts.xml配置web应用程序中的组件struts.xml可以从应用中完全移除,其中的配置项可以通常别的方法去完成设置。例如方法的annotation、web.xml的启动参数、可变的url映射计划。而必须在struts.xml中完成的配置有全局results、异常处理、知定义interceptorstacks.该配置文件的基本形式:?xmlversion=1.0encoding=UTF-8?!DOCTYPEstrutsPUBLIC-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN=struts2extends=struts-defaultnamespace=/struts2…/package/strutsinclude标签用来包含其它与Struts.xml结构相同的配置文件。它只有一个file属性。注意应该先包含再引用。以上是显示包含文件的方式,而有一些文件是隐式包含的,例如struts-default.xml(包含struts2的核心设置)和struts-plugin.xml(每一个插件的jar中都包含一个,在启动时自动加载)Package标签用于组织配置项以达到共享公共的属性的目的。标签的属性:name–一个唯一的包名extends–继承的包名,其中父包所有的配置项(包含action的配置)都在子包中有效namespace–提供url到package的映射。例如两个不同的包,用namespace属性定义为“package1”和“package2”,请求时应用以下格式“/myWebApp/package1/my.action”和/myWebApp/package2/my.action”abstract–如果取值为true,通常用作配置组,而且Action的配置不能通过包名来访问要选择正确的包去继承,这样可以重复使用其中的配置,通常情况下是struts-default.xml中的struts-default包。而如果你要使用插件那么它就会有所不同,你需要查看在插件jar中的说明Action这是一个可工作的基本单元,它通常与来自一个用户的请求相关。Action可以用以下的方式进行使用:单个结果classMyAction{publicStringexecute()throwsException{returnsuccess;}}该类是一个POJO类,该类有一个execute方法,你可以配置文件中说明这样就可以用其它的方法名。不论这个方法名叫什么,它都必须返回一个String,这个String表示一个呈现结果的页面路由。一个最简单的配置如下:actionname=myclass=com.fdar.infoq.MyActionresultview.jsp/result/action根据name属性,确定请求这个Action的URL为/my.action,而扩展名.action是在struts.properties配置文件中设定的。根据class属性确定要执行的Action的完整类名。多种结果一个复杂的用法是返回多个结果。classMyAction{publicvoidStringexecute()throwsException{if(myLogicWorked()){returnsuccess;}else{returnerror;}}}actionname=myclass=com.fdar.infoq.MyActionresultview.jsp/resultresultname=errorerror.jsp/result/action其中在result的节点中有一个name属性,它总是存在的,如果用户没有指定,则默认取值为success.插件可以自动完成“/adduser.action”andtheactionreturned“success”,then“/adduser-success.jsp”wouldberendered.在Action中可以使用@Results和@Resultannotations。Action可以直接返回一个Result实例,而不返回一个String。Result的类型success结果会返回到一个页面。error结果会返回一个http头到浏览器。result的类型在result节点中用type属性进行配置,这个属性有一个默认值为dispatcher,它表示用jsp进行显示结果。请求与表单数据struts2用Action来封装请求数据,要求提供相应的setter和getter方法。home.action?framework=struts&version=2则相应的Action要提供相应的setFramework(StringframeworkName)和setVersion(intversion)注意setter并不总是需要String类型的参数,struts2中可以在Action中做相应的类型转换。它能够自动完成基本类型和基本java对象的转换。也可以自定义转换器。如果有一个请求为person.address.home.postcode=2它能够自动在对象图中做导航例:“per