02-Struts2的工作流程及配置文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2的工作流程及配置文件--- ---
Struts2.0的流程图
从图中看到Struts2的工作流程如下:
1.服务器接收到的请求首先经过一组过滤器链(实际中的其他过滤器可能还包括诸如Spring 的字符过滤器CharactorEncodingFilter、V elocity的过滤器等,一般FilterDispatcher位于过滤器的最后一个执行),过滤器链按照你在web.xml中的配置顺序在接收客户请求时顺序执行,在向客户发送响应时反序执行,Struts2的核心FilterDispatcher在web.xml中的配置如下:<filter>
<filter-name>setCharactor</filter-name>
<!-- 配置字符过滤-->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter>
<filter-name>struts2</filter-name>
<!-- 配置Struts2过滤器-->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter>
<filter-mapping>
<filter-name>setCharactor</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:如果你使用的是W ebLogic6.1作为应用服务器,需要使用FilterDispatcherCompatW eblogic61替代FilterDispatcher。
2.请求被送到FilterDispatcher之后,FilterDispatcher会通过其私有静态的属性ActionMapper 询问这个请求是否需要调用Action处理,如果需要调用Action,FilterDispatcher会把请求委托给ActionProxy,ActionProxy调用ActionInvocation查找配置文件中该Action的所有信息,并以这个Action为目标创建代理对象(因为Struts2中的Action由于XWork的设计理念,并没有与Servlet的API被调用,所以如果直接调用Action的实例,那么显然基于HTTP 的请求都将无法传入Action。
Struts2通过创建Action的代理对象,并使用拦截器将HTTP 的请求信息传入代理对象,这是典型的AOP处理方式,这也实现了控制器与Servlet的API 的分离,这是Struts1.x所欠缺的优秀的设计方式),然后执行该Action之前的所配置的所有拦截器,与过滤器相同,在接受请求时,会顺序执行你在配置文件中为该Action配置的拦截器顺序;
3.在穿越拦截器之后,就会执行Action,当Action执行完毕,ActionInvocation就要使用result
加载结果(可以是JSP、PDF、XML、V elocity、EXCEL、Action等,Struts2为我们提供了丰富的视图模板可以调用),加载完结果之后会再次反向穿越拦截器和过滤器链,将响应结果发送给客户;
从上面不难看出,拦截器(Interceptor)是Struts2中非常重要的组成部分,在Struts2中绝大多数功能都是通过配置拦截器实现的,例如防止表单的重复提交、文件上传等等。
在上图中的action与Struts1有很大的不同,Struts1在接收到第一个请求时,会创建Action 实例,将其放到HashMap中,以后的请求会直接返回这个实例,也就是说一个Action的实例是多线程共享的,这样虽然节省了资源,但在Action中应谨慎使用全局变量,因为全局变量是多线程共享的,所以Struts1+Hibernate3+Spring2整合的时候,其中一种方式是把Struts1的Action交给Spring容器管理,我们在Spring的XML文件中用<bean>元素配置Action的时候,Spring建议我们设置singleton=”false”(Spring2.0之后改为scope=”prototype”),也就是一个请求产生一个Action实例!
在Struts2中的Action是线程安全的,因为Struts2会为每个请求创建一个Action实例,所以我们可以大胆的使用全局变量。
另外,Struts2的POJO并不要求继承任何类或实现任何接口,Action也不要求继承任何类或实现任何接口,不像Struts1那样要求POJO继承ActionForm或其子类,Action要求继承Action 或其子类。
Struts2都是通过配置文件和拦截器与POJO、Action建立关联,实现了非侵入性,这是优越于Struts1的重要优势!另外要注意的是,最好对Action中的POJO进行初始化,防止空指针异常。
但实际上Struts2建议取消类似于FormBean这样的累赘对象,主张使用POJO代替Action和FormBean,这点和JSF是一致的,在JSF中也是用一个普通的POJO 完成接受表单数据并处理请求的目的。
_______________________________________________________________________________ Struts2的API为两个部分:Struts2 core和Xwork,两个部分分工协作。
Struts2在接受到用户请求时会遍历HttpSession等对象,将所有值装入Action Context Map对象(请求参数会装入值栈ValueStack中的根对象),在Xwork中(也就是Action)操作经过包装的对象,而不是直接操作Servlet的API,这实现了Xwork与Servlet API的分离,大大降低了系统的耦合度,使得逻辑层不依赖于表现层(Web层),因为XWork并不是专为Servlet容器设计的。
注意:关于OGNL的具体部分请参看本教程第四篇的内容。
XWork的API提供了两种访问Servlet的API的方式供我们选择:
1.IOC方式,也就是通过setXXX()方法进行依赖注入,这要求我们的Action实现ServletRequestAware、SerlvetResponseAware、SessionAware接口,通过实现接口中的setXXX()方法传递Servlet的API,这是由struts-default.xml的默认拦截器栈中的”servlet-config”拦截器提供的,如下图所示:
Struts2默认地会为每个Action配置defaultSatck(因为我们自己定义的package一般都会使用extends=”struts-default”继承struts-default.xml中的name属性为”struts-default”的<package>,这个文件在struts-core-2.0.6,jar的根目录中,大家可以参看API很好的了解这个文件里的东东都是做什么的。
),这是Struts2的默认拦截器栈,里面包含了一组拦截器,通常我们不需要再为Action配置拦截器,因为这些默认的已经足够了!
2.非IOC方式,因为每个请求都有一个Action的上下文,所以我们可以使用com.opensymphony.xwork2.ActionContext访问session对象,方法:ActionContext.getContext.getSession().put(“”,””),或者使用ActionContext的子类org.apache.struts2.ServletActionContext的静态方法访问请求、响应等对象,方法:ServletActionContext.getRequest()、ServletActionContext.getResponse()、ServletActionContext.getPageContext(),但一般建议能使用ActionContext完成的功能,尽量不要使用ServlvetActionContext,从包名上就能看出来,ActionContext是XWork是的API,使用装饰过后的Map对象,而ServletActionContext是Struts2的API,使用ServletActionContext无疑是把Servlet的API引入了XWork中。
有人可能会问,那ActionContext使用请求和响应对象不是很方便哦,这很简单,因为你在实际开发中很少在Action中使用request和response对象,使用response无非是利用它的重定向功能,但这个功能使用<result name=”success” type=”redirect”>JSP文件</result>就可以解决了;使用request无非是在请求中设置参数,利用request.setAttribute(“”,””),这个功能完全可以交给POJO哦!你可以在POJO中定义一个变量,向里面传递值,JSP页面上直接取POJO的值就可以了。
3.Struts2的Action是控制器,并不是标准的Servlet,如果我们想在Action结束的时候向客户端输出,我们可以获取HttpServletResponse对象,调用其输出字符流或者字节流的方法,最后加上return null;即可完成。
你也可以使用result的type=stream向客户端写入流,这个会在文件上传和下载中看到!
4.当然,我们也可以完全不接触Servlet的API进行操作,而是直接利用ActionContext对象,例如:
在JSP中我们可以利用EL表达式进行输出这些值,如下图所示:
从上面的图我们可以看出EL表达式可以独立使用,也可以配合JSTL的c:out标签进行输出。
输出的结果如下图所示:
大家要注意jar包冲突的问题,我在做这个测试程序的时候使用的是JA V A EE5(JSF 1.2)作为支持,而应用程序的lib目录下放了Servlet-2.4.jar和JSP-api-2.0.jar(因为我在Eclipse里建了个包含所有Struts2、Hibernate3、Spring2的jar文件的库,其中也包含了J2EE1.4的jar 文件),导致了EL表达式原样输出,这是因为JA V AEE5使用的是最新的Servlet 2.5和JSP 2.1规范,两个版本的jar包产生了冲突,这个问题很隐蔽,我搞了半天才发现的,一开始以为Struts2不能在最新的JA V A EE5环境下工作呢!
_______________________________________________________________________________
4.Struts2的配置文件:
①Struts2的配置文件默认都在类路径下(除各Action对应的验证框架配置文件),struts.xml是必须的配置文件,该文件的结构如下所示:
①include元素:Struts2允许类似于Spring的分散配置的概念,允许将struts.xml拆分为多个XML文件,分散配置的XML文件使用的<include file=”” />元素配置到struts.xml中,这样非常有利于团队开发,大家可以各自配置自己的XML文件,然后通过include配置到struts.xml中。
分散配置的XML文件可以分散到类路径下的任意位置,例如:你开发的模块是在线音乐,在类路径(/WEB-INF/classes/)下的net.ilkj.music包(本教程包名使用的域名反缀是net.ilkj,也就是所有包都在/WEB-INF/classes/net/ilkj/目录下)是在线音乐模块所有类,那么你可以在music目录下建立struts-music.xml文件,然后在类路径下的struts.xml中使用<include file=”net/ilkj/music/struts-music.xml” />(注意:include定位XML文件使用类路径为根目录,如果未写/ 表示以XML文件所在目录为参考,如果以/ 开头表示以类路径为参考)将你的配置文件配置进来。
________________________________________
②package元素:该元素用于定义逻辑意义上的组的概念,它可以把一组相关的Action 放在一起,便于管理。
1.package中的name属性指定这一组Action的名字,注意这个属性不能重复,该属性为必添属性;
2.namespace属性,用来定义名称空间,该属性应该以/开头,不同的package可以有相同的namespace属性,但不建议配置相同名字的namespace如果未配置该属性,则表示该package为默认的名称空间。
Struts2会首先到指定的名称空间查找Action,如果未找到,会到默认空间查找,名称空间只有一个层次,例如:/ilkj/test/HelloWorld.action会首先到名称空间为/ilkj/test的package中查找,未找到会直接到默认的名称空间查找,不会像目录那样再到上一层目录/ilkj查找,所以
不要配置多个默认的名称空间;
3.extend属性,可以继承使用其他package中的配置,通常该属性为struts-default,表示继承struts-default.xml中name属性为struts-default的package的配置(拦截器栈等)。
4.abstarct属性,表示该package是抽象的,不能有Action定义,只能用来继承;
5.externalReferenceResolver属性:外部引用分析器,一般用于整合Spring框架使用,现在整合Spring已经不用这个属性了,估计这个是从Webwork里带过来的哦!
________________________________________
③package的子元素:
1.result-types元素
<result-types>
<result-type name=”” class=”” />//name是结果的名称,class是处理这个结果的类
</result-types>
定义Action的结果类型,如果一个package中没有指定这个元素,那么它将使用父包中的<result-types>,因为我们自己定义的package大都继承struts-default包,struts-default包中定义了如下的<result-types>,所以通常这个属性我们是不去定义,因为父包中提供的已经足够用了;
________________________________________
2.interceptors元素
<interceptors>
<interceptor name=”” class=”” />//拦截器的名字和处理类,通常自己的拦截器
<interceptor-stack name=””>//定义拦截器栈的名称,其下通常包含一组拦截器<interceptor-ref name=”” />//引用拦截器的名称,譬如上面的自己定义的拦截器的名字,这里也可以引用一个拦截器栈,因为拦截器栈就是一组拦截器的集合
... ...
</interceptor-stack>
</interceptors>
________________________________________
3.default-interceptor-ref元素
<default-interceptor-ref name=”” />,定义这个package默认所有Action都要使用的拦截器或者拦截器栈,我们来看一下struts-default的这个属性是怎么定义的,如下图所示:
看到了吗?默认的拦截器栈是defaultStack,还记得上面的Action使用IOC方式访问Servlet 的API时的defaultSatck的图吗?因为我们自己定义的Action大都继承struts-default,而我们在给自己的包定义拦截器栈的时候,就都会使用父包中的<default-interceptor-ref>元素指定的拦截器栈,defaultStack定义了如拦截表单数据、文件上传、验证框架等拦截器,所以我们的表单数据可以直接由Action接收到。
________________________________________
4.default-action-ref元素
<default-action-ref name=”” />默认的Action,用于找不到匹配的Action就会调用这个配置,与Struts1中的Action属性中unknown="true"作用相同,因为如果用户乱输入一个*.action会抛出500错误,设置这个元素就可以让所有找不到的Action交给它处理;
________________________________________
5.global-results元素
<global-results>
<result name=”success” type=”dispatcher”>结果位置</result>
</global-results>
全局结果,如果Action定义了<result>元素,将覆盖全局结果,这和Struts1中的<global-forwards>元素是一样的!
________________________________________
6.<global-exception-mappings>元素
<global-exception-mappings>
<exception-mapping result=”” exception=””></exception-mapping>
</global-exception-mappings>
全局异常处理,如果 Action定义了<exception-mapping result=””exception=””/>将会覆盖全局异常,exception指定异常的完整类名,例如:.SocketException,result指定result 的名字,例如:error,该元素应该配合拦截器<interceptor-ref name=”exception”/>才能起作用,建议把exception拦截器放在拦截器栈的顶端,以便拦截所有的异常,在默认的拦截器栈default-stack中的第一个拦截器就是exception,所以我们没有覆盖默认拦截器栈的时候,直接可以使用Struts2的异常处理机制,在Struts2中,很多功能都配合拦截器使用,如果你发现哪些功能没有起作用,可能是你没有配合相应的拦截器使用;
6-1.Struts2的异常处理机制
查看Struts2的Action接口的execute()方法,我们可以看到如下定义:
public String execute() throws Exception;
因此我们在覆盖这个方法时,不需要做任何异常的捕获,而是直接抛给Struts2框架,然后我们使用<global-exception-mappings>或者<exception-mapping>的exception给指定的异常显示在不同的页面上。
要注意,全局异常的result要使用全局的result,而局部的异常既可以使用全局的result,也可以使用Action元素内的局部的result。
我们可以在视图资源中使用如下两种方式输出异常信息:
输出异常的对象:<s:property value=”exception”/>
输出异常对象信息:<s:property value=”exception.message”/>
输出异常堆栈的信息:<s:property value=”exceptionStack”/>
例如下面的程序:
Action
这里我判断了User对象的name属性为空的时候就抛出空指针异常,其中的new NullPointerException("空指针异常");就是exception.message的值。
配置文件:`
exception.jsp
输出结果
________________________________________
7.action元素
Name属性指定该Action的名字,必添项,因为有namespace属性,所以不同的package中可以有相同name属性的Action,但在同一个package中也可以有重名的Action,一般不建议在一个package中使用相同name属性的Action,否则匹配将会混乱,该属性为必添属性;class属性指定该Action的完整类名,如果未指定,会默认使用ActionSupport类;method属性指定调用该Action中的哪个方法(Action的这个方法必须是public并且没有参数,返回值为String类型),请求中使用! 连接action的name属性和method属性;
Action元素的子元素:
<result name=”” type=””>
<param name=””>
文件
</param>
</result>
(1)result元素指定了Action执行完毕之后转向的状态和方式,result的name属性表明了
Action的执行状态,可选值为success(默认)、error、input(验证框架失败转向的页面)、login、wait、none,通常我们使用Action接口中定义的这几个常量就可以了,但也可以使用自己定义的名字;type表明了以何种方式转向,可选值有dispatcher(默认)、redirect、redirect-action、veloc ity、xslt、chain、freemaker、chain,这些都是在struts-default.xml 中定义的result-types,注意:对于JSP来说,如果以/ 为开头,表示以项目为根目录参考,如果不以/ 开头表示以当前名称空间为参考,通常<global-results>要使用/ 为开头的名称,所以通常命名空间按照模块JSP所在的文件夹命名,这样result的JSP 就可以简单的写为相对路径了哦!
________________________________________
(2)param元素指定转向时的参数,
<result name=”success” type=”chain”>
<param name=”actionName”>转向下一个Action的name属性</param>
<param name=”namespace”>如果新的Action在另一个名称空间,需要指定该属性</param>
</result>
这些属性不需要记忆,我们拿<result name=”success”type=”chain”></result>元素来说,type 属性为chain,我们可以在struts-default.xml中找到这个result类型的定义:<result-type name=”chain” class=” com.opensymphony.xwork2.A ctionChainResult” />,我们打开Struts2的API,找到这个类,如下图所示:
我们可以看到类中有对各个属性详细的说明,而且下面还有例子,再向下翻看,可以看到这些属性都是通过setXXX()传递进去的,因为要注意大小写;
简单说明一下result的name属性:
SUCCESS:Action正确的执行完成,返回相应的视图,success是name属性的默认值;NONE:表示Action正确的执行完成,但并不返回任何视图;
ERROR:表示Action执行失败,返回到错误处理视图;
INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图;LOGIN:Action因为用户没有登陆的原因没有正确执行,将返回该登陆视图,要求用户进行登陆验证。
当然上面这些是预定义的,如果你非要用ERROR表示成功,也没人管你,这个只是规范性的问题,但要注意INPUT表示的是验证失败的流转页面,这个是必须的!
________________________________________
简单说明一下result的type属性:
dispatcher:请求转发,底层调用RequestDispatcher的forward()或include()方法,dispatcher
是type属性的默认值,通常用于转向一个JSP,localtion指定JSP的位置,parse如果为false 表示location的值不会被当作OGNL解析,默认为true,例如:
redirect:重定向到其他的URL,新页面无法显示Action中的数据,因为底层调用response.sendRedirect("")方法,无法共享请求范围内的数据,参数与dispatcher用法相同,例如:
chain:将action的带着原来的状态请求转发到新的action,两个action共享一个ActionContext,actionName指定转向的新的Action的名字,method指定转向哪个方法,namespace指定新的Action的名称空间,不写表示与原Action在相同的名称空间;skipActions 指定一个使用,连接的Action的name组成的集合,一般不建议使用这种类型的结果。
redirectAction:重定向到另一个Action,参数与chain用法相同,允许将原Action中的属性指定新名称带入新Action中,可以在Result标签中添加<param name=”b”>${a}</param>,这表示原Action中的变量a的值被转给b,下一个Action可以在值栈中使用b来操作,注意如果值是中文,需要做一些编码处理,因为Tomcat默认是不支持URL直接传递中文的!例如:
如果你不在Tomcat中做中文处理,那么可以像上图中所示,在第一个参数中增加encode,表示对传递的参数进行编码,这样我们在下一个Action中可以使用URLDecoder.decode(name,”UTF-8”);进行还原。
另外,上图中的method属性也可以不写,把actionName改为myAction2!login,效果是一样的,当然如果进一步简化,那么参数的传递也可以直接写在actionName中,例如上面的如果省去<param name=”name”>${name}</param>,那么可以这样写:
<param name=”actionName”>myAction2!login?name=${name}</param>,也是可以的,但是这样会有一个问题,那就是如果${name}是中文,那么encode=true将不起作用,也就是依然传递的是乱码,所以不建议将参数在actionName中书写。
velocity:使用veloc ity模板输出结果,location指定模板的位置(*.vm),parse如果为false,location不被OGNL解析,默认为true,这个类型在V elocity模板引擎一章中讨论。
xslt:使用XSLT将结果转换为xml输出,location指定*.xslt文件的位置,parse如果为false,location不被OGNL解析,默认为true,matchingPattern指定想要的元素模式,excludePattern 指定拒绝的元素模式,支持正则表达式,默认为接受所有元素。
httpheader:根据值栈返回自定义的HttpHeader,status指定响应状态(内部调用response.sendError(int i)重定向到500等服务器的状态页),parse如果为false,header的值不会被OGNL解析,headers指加入到header中的值,例如:<param name=”headers.a”>HelloWorld</param>,可以加多个,这些键-值组成HashMap,内部调用response.addHeader(“key”,”value”);。
这个类型主要用于转向特定的状态页,例如,未经过验证的用户访问受保护的资源,你可以设置<param name=”status”></param>,这样就会被定向到404的页面,而你可以在web.xml 指定error-code设置你自己的404页面,而不是服务器默认的页面。
实际上也就是Struts2为我们做的封装,这样我们就可以不需要在Action中调用Servlet的API进行操作。
例如:
这个结果类型中调用的是addHeader(key,value)方法,实际上response还有setHeader(key,value)方法,add和set方法之间的区别并不是很明显的,实际包含的区别在于http头部可能有超过一个的同一个name关键字的入口,这里的add方法她能创建一个新的name/value对,他们可能会额外的增加到原先已经存在的同一个name关键字中去,而这里的set方法她会覆盖掉原先所存在的同一个name关键字所对应的这个值。
freemaker:用freemaker模板引擎呈现视图,location指定模板(*.ftl)的位置,parse如果为false,location的值不会被OGNL解析,contentType指定以何中类型解析,默认为text/html,这个类型在Freemarker模板引擎一章中讨论。
stream:直接向响应中发送原始数据,通常在用户下载时使用,contentType指定流的类型,默认为text/plain,contentLength以byte计算流的长度,contentDisposition指定文件的位置,
通常为filename=”文件的位置”,input指定InputStream的名字,例如:imageStream,bufferSize 指定缓冲区大小,默认为1024字节,这个我们将在文件上传与下载的地方讲解。
plaintext:以原始文本显示JSP或者HTML,location指定文件的位置,charSet指定字符集;即显示实际视图资源的源代码。
例如:
注意:使用plaintext的时候,视图资源必须使用绝对路径,至少在Struts2.0.9的是这样的。
如果你不指定charSet,那么中文将产生乱码,输出结果如下图所示:
以下四种type类型需要加入相应的插件jar文件,才可以使用!
chart:用于整合JFreeChart的结果类型
jasper:用于整合JasperReports的结果类型
jsf:用于整合JSF的结果类型
tiles:用于整合Tiles框架的结果类型
________________________________________
(3)<interceptor-ref name=”” />可以定义这个Action引用的拦截器或者拦截器栈,要注意这样会覆盖掉从父包继承而来的拦截器或拦截器栈,如果想使用自己的,而又不想覆盖掉父包的interceptor,请显示调用父包的拦截器或拦截器栈;
________________________________________
(4)<exception-mapping name=””exception=””/>定义该Action的异常处理,exception 指定异常的完整类名,例如:.SocketException,result指定result的名字,例如:error;________________________________________
(5)Struts2的动态导航:在Struts2中允许使用通配符进行配置文件的配置,例如:
上面出现了三个*,{1}表示第一个*,{2}表示第二个*,{3}表示第三个*,那么{0}呢?它表示的是!之前的所有字符,例如:MyAction2!login,那么{0}就是MyAction2。
如果我们的请求是:
http://localhost:8080/struts2/pages/MyAction2!login.do?name=123
MyAction2!login恰好符合*Action*!*的模式,这样就找到了匹配的Action!通过这种方式动态匹配,我们可以减少Action的重复书写,把一类的使用通配符的方式,配置一个Action 元素就OK了哦!
大家注意观察下面的配置文件:
如果我们的请求是:
http://localhost:8080/struts2/pages/MyAction2!login.do?name=123
那么将会使用哪个进行匹配呢?经过测试,我们可以得出结论:首先它会寻找最精确匹配,也就是第一个Action元素,如果这个不存在,那么将寻找匹配通配符的方式的Action元素,如果有多个Action通配符元素匹配,那么哪个在最前面,就匹配哪个Action元素,并不是哪个长得最像,就找哪个!
但一般不建议用通配符,因为Struts2的其他文件命名都会和Action的名字、别名关联,通配符会让这些文件的命名很麻烦,例如Struts2的验证框架的ActionClassName-AliasName-validation.xml这种命名规则。
_______________________________________________________________________________
Bean的配置:
Struts2有很强的扩展性,大家可以打开struts-default.xml,在上面有很多bean元素的定义,这里配置了Struts2的核心组件,我们可以通过定制的类取代这些原有的bean,当然在实际开发中,我们基本上是不需要这么做的,因为这些核心组件比较麻烦哦!
例如:
<bean type =”com.opensymphony.xwork2.ObjectFactory” name=”myObjectFactory”
class=”net.ilkj.util.MyObjectFactory”/>
我们可以通过上面的配置,改变Strus2默认的对象工厂BEAN。
class:指定Bean的实现类,也就是我们自己写的类
type:指定这个实现类实现的Struts2中的哪个规范,通常该属性被指定,则表示这是一个核心组件
name:指定Bean实例的名字,如果type相同,则需要指定这个属性加以区分
scope:这个Bean的作用范围,可选值为default、singleton、request、session、thread static:是否使用静态注入,例如FilterDispatcher就是静态注入
optional:指定该Bean是否为可选Bean
上面这些东东都是Struts2官方文档上的,知道怎么回事就可以!我们开发中基本不会用到这些东东的哦!就像Struts1.x的RequestProcessor和ActionServlet也都允许扩展,但实际上我们是基本上不需要扩展这些核心组件的哦。
一般扩展是第三方框架提供的支持,例如Spring提供的整合Struts1的一种最为简便的方式就是扩展了RequestProcessor的DelegatingRequestProcessor类,当然这种整合方式被认为是强内聚,有些人不喜欢使用!
_______________________________________________________________________________
5.struts.properties文件:
我们知道在struts-core.2.0.6.jar中的org.apache.struts2包中有一个外部资源文件default.properties,里面定义了一些Struts2启动时的配置信息,如果你在类路下建立struts.properties会覆盖掉default.properties里的配置,这个文件在每个属性设置的上方都有很详细的说明,通常我们只需要改动如下几个地方就可以了,这里我们只是简单地介绍一些常用的,其他的大家可以参照上面的英文注释,都比较容易懂的哦!
struts.configuration=org.apache.Struts2.config.DefaultConfiguration
//默认配置文件管理器
struts.objectFactory=spring
//指定Struts2的默认对象工厂BEAN
eClassCache=true
//指定整合Spring时,是否允许缓存BEAN的实例,最好不要修改默认值
struts.objectTypeDeterminer=tiger
//指定Struts2的类型检测机制,可选值为tiger和notiger,即是否按JDK1.5进行类型检测,因为SUN在开发JDK1.5时的代码为“猛虎”。
struts.action.extension=action
//默认的Action会被映射成*.action,可以通过它修改成为你想要的名字
struts.enable.DynamicMethodInvocation = true
//是否允许动态方法调用,也就是在配置action的name、class、method以及result的location属性值的时候,是否允许使用通配符!
struts.local=en_US
//默认的Local属性
struts.i18n.encoding=UTF-8
//默认的国际化编码
struts.multipart.parser=jakarta
//指定Struts2的文件上传机制,cos表示使用cos文件上传框架,pell表示使用pell文件上传框架,jakarta表示使用Apache的common-fileupload文件上传框架,默认为jakarta。
struts.mutipart.saveDir=javax.servlet.context.tempdir
//默认使用文件上传时临时保存的目录,通常我们不去修改这个选项,该属性的默认值是javax.servlet.context.tempdir
对于Tomcat也就是它的/work/Catalina/localhost目录。
struts.mutipart.maxSize=2097152
//整个表单请求内容的最大字节数
struts.tag.alterSyntax=true
//在标签的大多数地方,对%{}中的EL进行求值
struts.dispatcher.parametersWorkaround=false
//在使用WebLogic等不能处理request.getParameterMap()的应用服务器时设置为true
struts.devMode=false
//是否在开发模式下工作
struts.i18n.reload=true----------------------1
//对于每次请求都重新加载国际化资源文件
struts.configuration.xml.reload=true---------2
//对于每次请求都重新加载配置文件
注:如果1、2的属性设置为true,那么在开发过程中修改XML和Properties文件之后将不需要重新启动服务器。
struts.custom.i18n.resources=defaultMessage
//指定类路径下全局外部资源文件的名称,可以用 , 分隔使用多个
struts.objectFactory.spring.autoWire=name
//使用Spring做为IOC容器的时候,装配的策略,还可以选择按type、auto、constructor 装配策略
struts.objectFactory=spring
//整合Spring框架的时候表示把Action交给Spring容器管理,这个是默认的属性值,所以大家在单独使用Struts2的时候需要把这个属性制定为
com.opensymphony.xwork2.ObjectFactory,否则启动Struts2的应用,它会提示需要配置Spring的上下文监听,实际上该属性设置为Spring的时候,使用的类也是ObjectFactory 的子类,我们也可以使用自己的对象工厂进行对Action的管理,当然你写的这个类也要继承ObjectFactory。
struts.mapper.class=org.apache.Struts2.dispatcher.mapper.DefaultMapper
//默认ActionMapper,这个映射器将按Action的name属性完成映射,你也可以自定义这个类,按照自己的映射规则进行匹配
struts.serve.static=true
//是否通过jar文件提供静态服务内容
struts.serve.static.browserCache=true
//是否让浏览器缓存静态服务内容,开发阶段可以设为false,默认为true
struts.enable.SlashesInActionNames=false
//设置Action的name属性是否可以含有斜线,Struts1的path就是以/开头定义。
struts.ui.theme=xhtml
//指定视图使用的默认主题,可选值是simple、xhtml、ajax,当然你也可以定制自己的主题。