1 OGNL表达式有哪些用法,你熟悉其中哪几种

参考答案

OGNL有8种用法,其中常用的有2种,不太常用的有6种。

我熟悉这2种常用的用法,其作用是

  1. 可以给基本属性注入值
  2. 可以给实体对象注入值

另外6种用法也有所了解,作用是

  1. 可以访问数组或集合
  2. 可以访问Map
  3. 可以在访问时进行一些基本的运算
  4. 可以在访问时调用返回对象的方法
  5. 可以直接创建一个临时的集合
  6. 可以直接创建一个临时的Map

2 请简述Struts2中ValueStack组件运行原理

参考答案

在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标签就可以将数据输出在页面相应的位置了。

3 请简述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。