参考答案
OGNL有8种用法,其中常用的有2种,不太常用的有6种。
我熟悉这2种常用的用法,其作用是
另外6种用法也有所了解,作用是
参考答案
在Struts2中,使用OGNL表达式访问Action的数据,实际上是通过ValueStack进行访问的,ValueStack中封装了Action对象以及程序上下文相关的数据。
我们写在Struts2标签中的OGNL表达式,会通过标签解析组件发送给ValueStack,而ValueStack会用其内部的OGNL引擎来解析表达式,从而进行取值。
ValueStack中包含2个取值对象,一个是栈,一个是Map。
其中栈中封装了最常用的数据(Action),默认情况下OGNL表达式都是访问栈中的数据。访问的规则是从栈顶向下,依次以栈中对象为root进行取值。实际上,一般情况下,栈顶就是Action对象。
Map对象中封装了程序上下文所需的全部数据,也包含Action。访问Action需要在OGNL表达式前面追加#。
OGNL引擎根据OGNL表达式从栈或Map中取值以后,会将结果返回给调用方,这样Struts2标签就可以将数据输出在页面相应的位置了。
参考答案
Struts2有6大核心组件,分别为前端控制器filter、业务控制器Action、值对象ValueStack、拦截器Interceptor、输出组件Result、Struts2标签。
他们的调用顺序是,请求提交给前端控制器filter,它会根据struts.xml中的配置找到对应的业务控制器Action,然后实例化值对象ValueStack并实例化Action放于ValueStack的栈顶,再调用Action的业务方法,在调用过程中会被拦截器组件所拦截。最终根据Action方法的返回值,filter从struts.xml中可以找到对应的Result,于是使用这个Result向页面输出内容。
当然,最常见的输出实际上是将请求转发给一个JSP。那么在容器解析JSP生成HTML的过程中,Struts2标签将被解析。此时标签中的OGNL表达式会发送给ValueStack取值,返回的结果被写入最终生成的HTML。