Struts2权威指南笔记html
一、mvc特色包括:java
① 多个视图能够对应一个模型web
② 模型返回的数据与显示逻辑分离spring
③ 应用层被分隔为三层,下降了各层之间的耦合,提供了应用的可扩展性数据库
④ 控制层的概念也颇有效,因为它把不通的模型和不一样的视图组合在一块儿,完成不一样的请求apache
⑤ Mvc更符合软件工程化管理的精神编程
二、Struts2框架的大体处理流程:api
① 浏览器发送请求,如请求/mypage.action浏览器
② 核心控制器FilterDispatcher根据请求决定调用合适的Action缓存
③ Webwork的拦截器链自动对请求应用通用功能,例如workflow、alidation或文件上传等功能
④ 回调Action的execute方法,该execute方法先获取用户请求参数,而后执行某种数据库操做,如查询、保存数据等。实际上,由于Action只是一个控制器,它会调用业务逻辑组件来处理用户请求
⑤ Action的execute方法处理结果信息将被输出到浏览器中
三、Struts2的配置文件,Struts2的配置文件有2份,配置Action的struts.xml和配置Struts全局属性的struts.properties文件
四、Struts2的控制器由两个部分组成:FilterDispatcher和业务控制器Action,实际上,Struts2应用中起做用的业务控制器不是用户定义的Action,而是系统可以生成的Action代理,但该Action代理以用户定义的Action为目标
五、Action类特色
① Action类彻底是一个pojo,所以具备很好的代码复用性
② Action类无需与servlet API耦合,所以进行单元测试很是简单
③ Action类的execute方法仅返回一个字符串做为处理结果,该处理结果可映射到任何的视图,甚至是另外一个Action
六、配置过程
① 引入jar,例如struts2-core-2.3.15.1.jar,xwork-core-2.3.15.1.jar,ognl-3.0.6.jar
② web.xml配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>
<!--org.apache.struts2.dispatcher.FilterDispatcher不推荐使用-->
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里要注意FilterDispatcher在2.1.3以后就不推荐使用了,应该使用
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter替代
③ 1234
七、获取session,Struts2提供了ActionContext类,该类提供了getSession的方法,可是返回类型是map,不是HttpSession,由Struts2的系列拦截器负责该session与HttpSession之间的转换。ActionContext.getContext().getSession()
八、Action中的成员属性,并不必定用于封装用户的请求参数,也多是封装了Action须要传入下一个页面显示的值。实际上,这些值将被封装在ValueStack对象中。Struts2将这些属性值所有封装在一个叫作struts.valueStack的请求属性中,可使用
request.getAttribute(“truts.valueStack”)获取该对象
九、几个经常使用标签if/else/iterator/property
<s:iterator value="books" status="index">
<s:if test="#index.odd==true">
<tr style="background-color: #cccccc">
</s:if>
<s:else>
<tr>
</s:else>
<td>书名:</td>
<td><s:property /></td>
</tr>
</s:iterator>
十、使用native2asciic处理资源文件,Struts2默认加载WEB-INF/classes下的资源文件,若是资源文件在包路径下则要指定到包。
struts.custom.i18n.resources=messageResource
struts.custom.i18n.resources=com.test.messageResource
输出国际化信息:<s:text name=”messageKey”/>或者<s:property value=”%{getText(“messageKey”)}”/>
十一、ActionSupport实现了Action接口和Validateable接口,提供了数据校验功能,validate方法会在执行系统的execute方法以前执行,若是fieldErrors中已经包含了数据校验错误,请求将被转发到input逻辑视图处。若是使用配置文件校验,则配置文件与Action位于同一个文件夹中,且命名格式为:ActionName-alidation.xml
十二、Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和业务逻辑组件。Struts2框架提供了核心控制器FilterDispatcher,而用户须要实现业务控制器和业务逻辑组件
Struts2用于处理用户请求的Action实例,并非用户实现的业务控制器,而是Action代理-由于用户实现的业务控制器并无与servlet api耦合,没法处理用户请求,而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求,是典型的AOP处理方式。
1三、业务控制器组件就是用户实现Action类的实例,须要配置Action3个部分定义:①Action处理的URL②Action对应的实现类③Action里包含的逻辑视图与物理资源之间的对应关系。
1四、业务控制器不会对用户请求进行任何实际处理,用户请求最终由业务逻辑组件负责处理。业务控制器只是中间负责调度的调度器,这也是称Action为控制器的缘由。当控制器须要得到业务逻辑组件实例时,一般并不会直接获取业务逻辑组件实例,而是经过工厂模式来得到业务逻辑组件的实例;或者利用其余IoC容器(如spring容器)来管理业务逻辑组件的实例
1五、全部的MVC框架都须要web应用加载一个核心控制器,对于Struts2框架而言,须要加载FilterDispatcher,只要web应用负责加载FilterDispatcher,FilterDispatcher会加载应用的Struts2框架
1六、Struts2核心配置文件struts.xml,默认放在WEB-INF/classes路径下,可用于模块化配置
<struts>
<!--经过include元素导入其余配置文件-->
<include file=”struts-part1.xml”>
...
</struts>
struts.xml中能够包含的元素:include/constant/bean/package
1七、有效的Struts2属性
struts.configuration:该属性指定加载Struts2配置文件的配置文件管理器
struts.locale:指定web应用的默认local
struts.i18n.encoding:指定web应用的默认编码集
struts.objectFactory:指定Struts2默认的objectFactory bean,默认spring
struts.objectFactory.spring.autoWire:指定spring框架的自动装配模式,默认name
struts.objectFactory.spring.useClassCache:指定整合spring时是否缓存bean实例,默认true
struts.objectTypeDeterminer:指定Struts2的类型检测机制,一般支持tiger和notiger两个
struts.multipart.parser:指定处理文件上传请求框架,支持cos、pell和jakarta等属性值
struts.multipart.saveDir:指定上传文件的临时保存路径,默认javax.servlet.context.tempdir
struts.multipart.maxSize:指定上传文件最大字节数
struts.custom.properties:指定Struts2加载用户自定义的属性文件,可多个,用”,”分隔
struts.mapper.class:指定将http请求映射到指定Action的映射器,默认映射器根据请求前缀与Action的name属性完成映射
struts.action.extension:指定须要处理的请求后缀,默认action,多个用”,”分隔
struts.serve.static:设置是否经过jar文件提供静态内容服务,默认true
struts.serve.static.browserCache:设置浏览器是否缓存静态内容。开发时可设为false
struts.enable.DynamicMethodInvocation:设置是否支持动态方法调用,默认true
struts.enable.SlashesInActionNames:设置是否容许在Action名中使用斜线,默认false
struts.tag.altSyntax:指定是否容许在标签中使用表达式语法,一般为true
struts.devMode:设置应用是否使用开发模式,true时显示更多、更友好出错提示
struts.i18n.reload:设置是否每次http请求到达时,系统都从新加载资源文件。开发阶段可为true,发布时应设置为false
struts.ui.theme:指定视图标签默认的视图主题,默认xhtml
struts.ui.templateDir:指定视图主题所需模版文件的位置,默认template,即默认加载template下的模版文件
struts.ui.templateSuffix:指定模版文件后缀,默认值ftl,还容许ftl、vm或jsp
struts.configuration.xml.reload:设置当struts.xml文件改变后,系统是否自动从新加载该文件,默认false
Struts.velocity.configfile:该属性指定velocity框架所需的velocity.properties文件位置,默认velocity.properties
struts.velocity.contexts:指定velocity框架的context位置,多个可用”,”分隔
struts.velocity.toolboxlocation:该属性指定velocity框架的toolbox的位置
struts.url.http.port:该属性指定web应用所在的监听端口。只有当须要生成url时,采提供wen应用默认端口
struts.url.https.port:相似struts.url.http.port做用,只是加密服务端口
struts.url.includeParams:指定生成url时是否包含请求参数,可选none、get、all
struts.custom.i18n.resources:指定国际化资源文件名,多个以”,”分隔
struts.dispatcher.parametersWorkaround:对于某些javaEE服务器(weblogic/orion/oc4j),不支持HttpServletRequest调用getParameterMap()方法,此时设置该属性为true解决该问题,默认为false
struts.freemarker.manager.classname:指定使用FreeMarker管理器
struts.freemarker.wrapper.altMap:默认true,一般无需修改
struts.xslt.nocache:指定XSLT Result是否使用样式表缓存。开发阶段可设为true
struts.configuration.files:指定框架默认加载的配置文件,若须要加载多个用”,”分隔,该属性默认值为struts-default.xml,struts-plugin.xml,struts.xml
1八、在struts.xml中定义bean时,有两个做用:①建立该bean的实例,将该实例做为Struts2框架的核心组件使用②bean包含的静态方法须要一个值注入
在第一种用法,由于bean实例每每是做为一个核心组件使用的,所以须要告诉Struts2容器该实例的做用-就是实现了那个接口(通常用于覆盖Struts2默认提供的方法)
第二种用法能够很方便地云逊不建立某个类的实例,却能够接收框架常量。一般要设置static=”true”
对于绝大部分应用而言,无需从新定义Struts2框架的核心组件,也就无需在struts.xml中定义bean。Bean元素有一下几个属性:①class②type③name④scope⑤static⑥optional
1九、Struts2配置文件中的常量便可在struts.xml中,也可在struts.properties中配置,加载顺序:struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml,后一个文件中的配置会覆盖前一个配置值。常量包含两个属性:name,value。若在wen.xml中配置,则可在filter中增长<init-param>,通常常量配置都在struts.xml中配置
20、Struts2框架核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等,每一个包就是多个Action、多个拦截器引用的集合。Package元素用于定义包配置,有如下几个属性:①name,必填②extends,可选③namespace,可选④abstract,可选,抽象包中不能包含Action定义。注意Struts2的配置文件是从上到下处理的,因此父包要在子包以前定义。
2一、当某个包指定了命名空间后,该包下全部的Action处理的url是命名空间+Action,例如:http://localhost:8080/app/namespace/action.action,还能够显示指定根命名空间,经过设置某个包的namespace=”/”来指定根命名空间
2二、一般将Struts2的全部配置文件都放在web应用的WEB-INF/classes路径下,struts.xml文件包含了其余的配置文件,Struts2框架自动加载struts.xml文件时,从而完成加载全部配置信息
2三、拦截器容许在Action处理以前,或者Action处理结束以后,插入开发者自定义的代码。拦截器能够完成:①进行权限控制②跟踪日志③跟踪系统的性能瓶颈
Struts2容许将多个拦截器组合在一块儿,造成一个拦截器栈,一个拦截器栈能够包含多个拦截器,拦截器栈对外也表现成一个拦截器。拦截器和拦截器栈都放在<interceptors>中定义
<interceptors>
<interceptor name="authority" class=""></interceptor>
<interceptor name="log" class=""></interceptor>
<interceptor-stack name="authandlog">
<interceptor-ref name="authority"></interceptor-ref>
<interceptor-ref name="log"></interceptor-ref>
</interceptor-stack>
</interceptors>
使用拦截器/拦截器栈
<action name="myAction" class="">
<result name="success">...</result>
<interceptor-ref name="authority"></interceptor-ref>
</action>
注意:package里面的元素顺序是有要求的,分别是
①result-types
②interceprots
③default-action-ref
④default-class-ref
⑤global-result
⑥global-exception-mappings
⑦action(即全部action要放到最后)
2四、Struts2一般直接使用Action来封装http请求参数,所以,Action类里还应该包含与请求参数对应的属性,而且为该属性提供对应的setter和getter方法,重要的不是属性而是get/set方法,可在页面使用Struts2标签输出<s:property value=”username”>,系统不会严格区分Action里哪一个属性是用于封装请求参数的属性,哪一个属性是封装处理结果的属性。
2五、Struts2框架提供了ActionContext、ServletContextAware、ServletRequestAware、ServletResponseAware、ServletActionContext类用于访问servlet api
2六、必须指出,虽然能够在Action类中获取HttpservletResponse,但若是但愿经过HttpServletResponse来生成服务器响应是不可能的,由于Action只是控制器,机若是在Action中写response.getWriter().println(“Hello World”);上面代码在标准servlet中会生成对客户端的输出,但在Struts2的Action中没有任何意义。即不要尝试直接在Action中生成对客户端的输出。
2七、Action的name对应url中的前半部分,若是不指定class,则使用系统默认的actionSupport类处理
2八、动态方法调用是指表单元素的action并非直接等于某个Action的名字,而是以以下形式来指定Form的action属性
<!--action属性为actionName!methodName的形式-->
action=”ActionName!methodName.action”
对于使用动态方法调用的方法,该方法声明与系统默认的execute方法的声明只有方法名不一样,其余的如方法参数、返回值类型都应该绝对相同。动态方法调用经过设置struts.enable.DynamicMethodInvocation常量完成
2九、经过指定method属性,能够将一个Action类定义成多个逻辑Action,Action类的每一个处理方法被映射成一个逻辑Action。
30、action定义中的通配符
<action name=”*Action” class=”” method=”{1}”>
Method属性使用了一个表达式{1},该表达式的值就是name属性值中的第一个*的值
<action name=”*Action” class=”com.test.{1}Action”>
表达式也能够出如今class属性中,即Struts2容许将一系列的Action配置成一个<action../>元素
<action name=”*_*” method=”{2}” class=”com.test.{1}Action”>
Struts2容许在class属性和method属性中同时使用表达式
<action name=”*”>
<retult>/{1}.jsp</result>
</action>
Struts2还能够在<result .../>子元素中使用表达式
3一、除非请求的url与Action的name属性绝对相同,不然将按前后顺序来决定由那个Action来处理用户请求,所以,应将名为*的Action配置在最后,不然Struts2将使用该Action来处理全部但愿使用模式匹配的请求。
3二、对于只是简单的超连接的请求,能够经过定义name为*的Action(该Action应该放在最后定义)实现。除此以外,Struts2还容许在容器中定义一个默认的Action,当用户请求的URL在容器中找不到对应的Action时,系统将使用默认的Action来处理用户请求。
配置默认Action经过<default-action-ref.../>元素完成
3三、若是配置<result .../>元素时没有指定location参数,系统将会把<result ...>...</result>中间的字符串当成实际视图资源;若是没有指定name属性,则name属性采用默认值:success;若是没有指定type属性,则采用Struts2的默认结果类型(dispatcher)
3四、Struts2支持的结果类型在struts-default.xml中定义,经常使用的结果类型有:dispatcher、redirect、redirect-action、chain、xslt、velocity、freemarker、stream、plaintext等,结果类型要实现com.opensymphony.xwork.Result
3五、设置结果类型为plaintext时,能够配置参数”charSet”
设置为redirect时重定向都新的页面,会丢失全部的请求参数、属性和处理结果
设置为redirect-action时,能够配置参数”actionName”,”namespace”
3六、使用请求参数决定结果类型,可使用彻底的ognl表达式:${属性名.属性名.属性名}
<action name=”” class=””>
<result name=”input”>/input.jsp</result>
<result type=”redirect”>/edit.action?name=${current.name}</result>
</action>
3七、全局结果对包内全部action都有效,当action中含有匹配的结果时,将覆盖全局结果
3八、使用模型驱动的action多实现一个ModelDriven的接口,实现该接口并要求实现getModel()方法—该方法用于关联Action和Model之间的关系
3九、Struts2的异常处理机制是经过在struts.xml文件中配置<exception-mapping.../>元素完成的,配置该元素时,须要指定两个属性:exception,result
局部异常映射:将<exception-mapping.../>元素做为<action.../>元素的子元素配置
全局异常映射:将<exception-mapping.../>元素做为<global-exception-mappings>元素的子元素
若是局部异常映射和全局异常映射配置了同一个异常类型,在该Action内,局部异常会覆盖全局异常映射
当定义异常映射时,一般:全局异常映射的result属性值一般不要使用局部结果,局部异常映射的result属性值既可使用全局结果,也可使用局部结果
输出异常信息:
<s:property value=”exception”/>输出异常对象自己
<s:property value=”exception.message”/>
<s:property value=”exceptionStack”/>输出异常堆栈信息
40、Struts提供了很是强大的类型转换机制,Struts2的类型转换是基于OGNL表达式的,只要咱们把html输入项(表单元素和其余GET/POST的参数)命名为合法的OGNL表达式,就能够充分利用Struts2的类型转换机制。
4一、Struts2的类型转换器其实是基于OGNL实现的,在OGNL项目中有一个TypeConverter接口,这个接口就是实现类型转换器必须实现的接口。不过接口里的方法太过复杂,OGNL项目还提供一个该接口的实现类:DefaultTypeConverter,经过继承该类来实现本身的类型转换器,重写convertValue方法
4二、文件上传框架须要完成的逻辑:经过分析HttpServletRequest的二进制流,解析出二进制流中所包含的所有表单域,分析出每一个表单域的类型(是文件域或者普通表单域),并容许开发者以简单的方式来取得文件域的内容字节、文件名和文件内容等信息,也能够取得其余表单域的值
Struts2默认使用jakarta的common-fileupload的文件上传,也可使用cos、pell的文件上传支持,对于开发组而言,使用那种文件上传支持,几乎没有任何区别—只需修改struts.multipart/parser常量,并在web应用中增长相应上传项目的类库便可
4三、Struts2文件上传Action中,若是表单中包含一个name属性为xxx的文件域,则对应的Action须要使用3个属性来封装该文件域的信息:
类型为File的xxx属性封装了该文件域对应的文件内容
类型为String的xxxFileName属性封装了该文件域对应的文件的文件类型
类型为String的xxxContectType属性封装了该文件域对应的文件的文件类型
除此以外,还能够配置savePath属性,经过配置文件设置该属性的值—这也是典型的依赖注入
<action name=”upload” class=””>
<param name=”savePath”>/upload</param>
<result>/succ.jsp</result>
</action>
4四、Struts2中文件上传拦截器是fileUpload,为了让该拦截器起做用,只须要在该Action中配置该拦截器的引用便可。
配置fileUpload拦截器时,能够为其指定两个参数:allowedTypes,maximumSize
当配置fileUpload拦截器时,还必须显示地为该Action配置defaultStack的拦截器引用
若是为了不文件上传时使用Tomcat的工做 路径做为临时路径,则应该设置struts.multipart.saveDir属性,struts.multipart.maxSize该属性设置整个表单请求内容的最大字节数
4五、配置下载的Action时,须要在配置普通Action的基础上,再加上额外的download的拦截器引用。除此以外,须要配置一个类型为stream的结果,配置时须要指定4个属性:contentType,inputName,contentDisposition,bufferSize,由于stream结果类型的逻辑视图是返回给客户端一个输入流,所以无需指定location属性。
4六、从代码角度看,拦截器就是一个类,这个类也包含方法,只是这个方法是个特殊的方法,它会在目标方法调用以前”自动”执行。
4七、AOP的编程方式中,有三个重要概念:目标对象、被插入的处理方法、代理对象
定义拦截器使用<intercepter .../>元素来定义,最简单格式以下:
<intercepter name=”” class=”” />若是还须要在传入参数,则使用子元素<param .../>
系统为拦截器指定参数有两个时机:①定义拦截器是指定参数值,这种参数值是拦截器这个参数的默认参数值②使用拦截器时指定参数值,这种参数值是当在Action中使用该拦截器时动态分配的参数值
一旦定义了拦截器和拦截器栈后,就可使用这个拦截器或拦截器栈来拦截Action了,拦截行为将会在Action的execute方法执行前被执行
默认拦截器只有在Action中没有显示指定拦截器是才会起做用,每一个包只能指定一个默认拦截器
自定义拦截器需实现Interceptor接口,重写intercept(ActionInvocation invocation)方法,该方法得到ActionInvocation参数,这个参数有能够得到被拦截的Action实例,一旦取得了Action实例,几乎得到了所有的控制权
若是只须要拦截某些方法,则可使用Struts2拦截器的方法过滤,继承MethodFilterInterceptor类,若是用户须要实现本身的拦截逻辑,则应该重写doIntercept(ActionInvocation invocation)方法
配置在前面的拦截器,在被拦截方法以前的拦截动做,将会先对用户请求起做用;若是是在被拦截方法以后的拦截动做,则会后对用户请求起做用
4八、为了精肯定义在execute方法执行结束后,在处理Result执行的的动做,Struts2提供了用于拦截结果的监听器,这个监听器是经过手动注册在拦截器内部的,实现拦截结果的监听器必须实现PreResultListener接口。注意不要在PreResultListener监听器的beforeResult方法中经过ActionInvocation参数调用invoke方法,否则会陷入死循环。
4九、若是须要在引用拦截器栈时直接覆盖栈内某个拦截器的属性值,则在指定须要被覆盖的属性时,不能只指定该属性的属性名,必须加上该属性属于的拦截器名。即
<l拦截器名>.<参数名>
<interceptor-ref name=””>
<param name=”拦截器名1.name”>更名后的拦截器</param>
</interceptor-ref>
50、Struts2内建拦截器,若是咱们定义的package继承了Struts2的默认struts-default包,则能够自由使用下面定义的拦截器,不然必须本身定义这些拦截器
alias:实如今不一样请求中类似参数别名的转换
autowiring:自动装配拦截器,主要用于当Struts2和Spring整合时,Struts2可使用自动装配的方式来访问Spring容器中的bean
chain:构建一个Action链,使当前Action能够访问前一个Action的属性,通常和<result type=”chain” .../>一块儿使用
conversionError:负责处理类型转换错误的拦截器,将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误
createSession:负责建立一个HttpSession对象,主要用于那些须要有HttpSession对象才能正常工做的拦截器中
debuggding:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息
execAndWait:后台执行Action,负责将等待画面发送给用户
exception:负责处理异常,将异常映射为结果
fileUpload:主要用于文件上传,负责解析表单中文件域的内容
i18n:负责把所选的语言、区域放入用户Session中
logger:负责日志记录,主要是输出Action的名字
model-driven:用于模型驱动的拦截器,当摸个Action类实现了ModelDriven接口时,负责把getModel()方法的结果堆入ValueStack中
scoped-model-driven:若是一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围找出指定的Model,并将经过setModel方法将该Model传给Action实例
params:这是一个最基本拦截器,负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值
prepare:若是Action实现了Preparable接口,将会调用该拦截器的prepare()方法
static-params:负责将xml中<action>标签下<param>标签中的参数传入Action
scope:范围转换拦截器,能够将Action状态信息保存到HttpSession范围,或者ServletContext范围
servlet-config:若是某个Action须要直接访问Servlet API,经过这个拦截器实现
roles:一个JAAS拦截器,只有当浏览者取得合适的受权后,才能够调用被该拦截器拦截的Action
timer:负责输出Action的执行时间,在分析该Action的性能瓶颈时比较有用
token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止屡次提交
token-session:做用与token拦截器相似,区别是它把token保存在HttpSession中
validation:经过执行在xxxAction-validation.xml中定义的校验器,完成数据校验
workflow:负责调用Action类中的validate方法,若是校验失败,则返回input的逻辑视图
大部分时候,开发者无需手动控制这些拦截器,只要咱们定义的包继承了struts-default包,既能够直接使用这些拦截器
5一、由于Struts2的struts-default包中指定defaultStarck拦截器栈是默认的拦截器栈,所以若是用户定义的包继承了struts-default包,则也会将defaultStack拦截器栈做为默认的拦截器栈。这意味着:若是系统中的Action配置没有指定拦截器引用,系统会将defaultStack拦截器栈自动做用于该Action。
5二、Struts2的标签库大大简化了数据的输出,也提供了大量标签来生成页面效果
Struts2能够将全部标签分红3类:
UI标签:主要用于生成HTML元素的标签
非UI标签:主要用于数据访问、逻辑控制等的标签
Ajax标签:用于Ajax支持的标签
UI标签又能够分为两类:
表单标签:表单标签主要用于生成HTML页面的form元素,以及普通表单元素的标签
非表单标签:非表单标签主要用于生成页面上的树、Tab页等标签
非UI标签,也能够分为两类:
流程控制标签:主要包含用于实现分支、循环等流程控制的标签
数据访问标签:主要包含用于输出ValueStack中的值,完成国际化等功能的标签
5三、导入Struts2标签库
<%@taglib prefix=”s” uri=”/struts-tags”%>
5四、OGNL中,若是须要访问的属性属于根对象,则能够直接访问该属性;不然必须使用一个命名空间,如#bar
在Struts2中,系统的ValueStack是OGNL的第一个根对象,若是最近的Action存在,则Action上下文是第二个根对象
Struts2不仅根据表达式从ValueStack中取得对象,还能够直接从对象中获取属性。Struts2提供了一个特殊的OGNL PropertyAccessory(属性访问器),它能够自动搜寻栈内的全部实体(从上到下),直到找到与求值表达式匹配的属性
Struts2使用标准的Context来进行OGNL表达式求值,OGNL处理的顶级对象是一个Context,这个Context对象就是一个Map类型实例。在该OGNL的Context中,有一个根对象,这个根对象就是OGNL ValueStack,若是须要访问ValueStack里的属性,直接经过以下方式
#取得ValueStack中的bar属性
${bar}
此外,Struts2还提供了一些命名对象,这些命名对象与根对象无关,它们只是存在于Stack Context中,因此,访问这些对象时须要使用#前缀来指明。
①parametersr,如#parameters[‘foo’]或#parameters.foo②request,如#request[‘foo’]或#request.foo③session,如#session[‘foo’]或#session.foo④application,如#application[‘foo’]或#application.foo⑤attr,如过能够访问到,则访问PageContext,不然将依次搜索request->session->servletCOntext
5五、OGNL中的集合操做
直接生成List类型集合的语法为:{e1,e2,e3}
直接生成Map类型集合的语法为:#{key1:value1,key2:value2,key3:value3}
OGNL提供两个元素符:in和not in判断某个元素是否在指定集合中
<s:if test=”’foo’ in {‘foo’,’bar’}”>包含</s:if>
<s:else>不包含</s:else>
此外,OGNL还容许经过某个规则取得集合的子集,有3个操做符支持
①?:取出全部符合条件的元素②^:取出符合条件的第一个元素③$:取出符合条件的最后一个元素
Person.relatives.{? #this.gender == ‘mail’}
直接在集合后紧跟.{}运算符代表用于取出该集合的子集,在{}内使用?代表取出全部符合选择条件的元素,#this表明集合里的元素
5六、OGNL支持基本的Lambda表达式,经过这种表达式语法,能够在OGNL中使用一些简单的函数
5七、Struts2的非UI标签包括控制标签和数据标签,主要用于完成流程控制,以及对ValueStack的控制。
if:用于控制选择输出的标签
elseIf/elseif:与if标签结合使用,用于控制选择输出的标签
else:与if标签结合使用,用于控制选择输出的标签
append:用于将多个集合拼接成一个新的集合
generator:字符串解析器,用于将一个字符串解析成一个集合
iterator:迭代器,用于将集合迭代输出
merge:将多个集合拼接成一个新的集合,但与append的拼接方式有所不一样
sort:用于对集合进行排序
subset:用于截取集合的部分元素,造成新的子集合
5八、<s:iterator .../>标签对集合进行迭代输出时,能够指定3个属性:
value:可选,指定被迭代的集合,若是未指定,则使用ValueStack栈顶的集合
id:可选,指定集合里元素的ID
status:可选,指定迭代时IteratorStatus实例,经过该实例便可判断当前迭代元素的属性。例如是不是最后一个,以及当前迭代元素的索引等
5九、Sort标签用于对指定的集合元素进行排序,进行排序时,必须提供本身的排序规则,即实现本身的Comparator,本身的Comparator须要实现java.util.COmparator接口,使用时可指定如下属性
①comparator:必填属性,指定进行排序的Comparator实例②source:可选,指定被排序的集合,若是不指定,则对ValueStack栈顶的集合进行排序
60、数据标签主要用于提供各类数据访问相关的功能,包含显示一个Action里的属性,以及生成国际化输出等功能,主要包括以下几个:
action:用于在JSP页面直接调用一个Action,经过指定executeResult参数还可将该Action的处理结果包含到页面中
bean:用于建立一个JavaBean实例。若是指定id属性,则能够将建立的JavaBean实例放入Stack Context中
date:用于格式化输出一个日期,计算指定日期和当前时刻之间的时差
debug:用于在页面省生成一个调试连接,当单击该连接时,能够看到当前ValueStack和Stack Context中的内容
i18n:指定国际化资源文件的baseName
include:在页面中包含其余的jsp或Servlet资源
param:设置参数,一般用做bean、url标签的子标签
push:将某个值放入ValueStack栈顶
set:用于设置一个新变量,并能够将新变量放入指定的范围内
text:用于输出国际化信息
url:用于生成一个URL地址
property:用于生成输出某个值,包括输出ValueStack、Stack Context 和Action Context中值
6一、Struts2提供了两种基本的整合策略:一种是将Action实例交给Spring容器来负责生成、管理;另一种策略是利用Spring插件的自动装配方式,当Spring插件建立Action实例后,当即将Spring容器中对应的业务逻辑组件注入Action实例。
6二、Spring为企业应用的开发提供一个轻量级解决方案,该解决方案包括:基于依赖注入的核心机制,基于AOP的声明式事物管理,与多种持久层技术的整合,以及优秀的Web MVC框架等
6三、在依赖注入的模式下,建立被调用者的工做再也不由调用者来完成,所以称为控制反转;建立被调用者实例的工做一般由Spring容器来完成,而后注入调用者,所以也称为依赖注入
6四、每一个Struts2的插件jar文件都必须包含一个名为struts-plugin.xml的配置文件,struts-plugin.xml文件的内容与普通的struts.xml文件的内容彻底相同
6五、Struts2包含3中类型的配置文件,加载顺序为:struts-default.xml->struts-plugin.xml->struts.xml,应用相关的配置文件老是最后才加载的,由于应用能够依赖于插件,每一个差价均可以依赖于Struts2的核心,但插件之间不可相互依赖
6六、Spring容器初始化
一、利用ContextLoaderListener,要求在WEB-INF路径下有Spring配置文件applicationContext.xml,而且在web.xml中增长以下listener
<listener>
<listener-class>ora.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
若是有多个配置文件须要载入,则应该使用<context-param>元素来肯定配置文件的文件名。ContextLoaderListener加载时,会查找名为”contextConfigLocation”的参数,所以,配置context-param时参数名字应该是”contextConfigLocation”,若是应用中的Spring配置文件有多个,则采用以下配置方式
<context-param>
<param-name>contextConfigLoaction</param-name>
<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml<param-value>
</context-param>
<listener>
<listener-class>ora.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
若是没有contextConfigLocation指定配置文件,Spring自动查找WEBB-INF下的applicationContext.xml,若是有contextConfigLocation,则利用该参数指定的配置文件来建立Spring容器,若是没法找到合适的配置文件,Spring将没法正常初始化
二、采用load-on-startup Servlet建立ApplicationContext
Spring提供了一个特殊的servlet类:ContextLoaderServlet,该servlet在初始化时,会自动查找WEB-INF/下的”applicationContext.xml”文件
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework,web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
配置该servlet时,配置了load-on-startup子元素,指定该servlet会随web应用的启动而完成初始化,值余下,该servlet越早完成初始化,但无论多小,Listener都比该servlet更早启动
该servlet仅用于提供”后台”服务,负责建立Spring容器,无需响应客户请求,无需配置servlet-mapping,若是有多个配置文件,则一样要指定contextConfigLocation
6七、采用工厂模式,将控制器与业务逻辑组件的实现分离,从而提供更好的解耦
6八、控制器如何访问到Spring容器中的业务逻辑组件?为了让Action访问Spring的业务逻辑组件,有两种策略:
①Spring管理控制器,并利用依赖注入为控制器注入业务逻辑组件
②控制器定位Spring工厂,也就是Spring容器,从Spring容器中取得所需的业务逻辑组件