全稱:Object Graphic Navigation Language(對象圖導航語言)是一個開源項目,是Struts2框架的默認表達式語言。
相對于EL表達式,它提供了平時我們需要的一些功能,如:
?支持對象方法調用,如method.sayHello();
?支持類靜態方法調用和值訪問,表達式的格式為@[類全名(包括路徑)]@[方法名|值名],例如:@java.lang.String@format(‘foo %s’,’bar’)或
@cn.itcast.Constant@APP_NAME;
?操作集合對象
Ognl有一個上下文(Context)概念,用來實現java.utils.Map接口,在Struts2中上下文(Context)的實現為ActionContext。
下面為ActionContext包含的對象:
?ValueStack(值棧,它是跟對象)
?parameters
?request
?session
?application
?attr
當Struts2接受一個請求時,會迅速創建ActionContext,ValueStack,action然后把action存放入ValueStack中,所以action的實例變量可以被OGNL訪問。
訪問上下文(Context)中的對象需要使用#符號標注命名空間,如:#application、#session,另外OGNL會設定一個根對象(root對象),在Struts2中根對象就是ValueStack(值棧),如果要訪問根對象的屬性,則可以省略#命名空間,直接訪問該對象的屬性。
在Struts2中,根對象ValueStack的實現類為OgnlValueStack,該對象存放一組對象,在OgnlValueStack類里面有一個List類型的root變量,就是使用它存放一組對象。
在root變量中處于第一位的對象叫做棧頂對象,通常我們在OGNL表達式里直接寫上屬性的名稱即可訪問root變量對象的屬性,搜索順序是從棧頂對象開始尋找,如果棧頂對象不存在該屬性,就會從第二個對象尋找,如果沒有就繼續依次往下訪問,直至找到為止。
注意:Struts2中,OGNL表達式需要配合Struts標簽才能使用,如:<s:property value=”name”/>
由于ValueStack是struts2中OGNL的根對象,如果用戶需要訪問值棧中的對象,在JSP頁面可以直接通過下面的EL表達式訪問ValueStack中的屬性:
${propertise }//獲得值棧中某個對象的properties屬性
如果訪問其它Context中的對象,由于不是根對象,所以在訪問時需要添加#前綴:
?application對象:用于訪問ServletContext方法:#application.userName或#application[‘userName’]
相當于調用ServletContext的 getAttribute(“userName”)。
?session對象:用于訪問HttpSession方法:#session.userName或#session[‘userName’]
相當于調用session.getAttribute(“userName”)。
?request對象:用于訪問HttpServletrequest屬性的Map方法:#request.userName或#request[‘userName’]
相當于調用request.getAttribute(“userName”)。
?parameters對象:用于訪問Http的請求參數方法:#parameters.userName或#parameters[‘userName’]
相當于調用request.getparameter(“userName”)。
?attr對象:用于按page->request->session->application順序訪問起屬性。
property標簽:
property標簽用于輸出指定值:
default:可選屬性,如果需要輸出屬性的值為null,則顯示該屬性的值
escape:可選屬性,指定是否格式化HTML代碼
value:可選屬性,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸出 ValueStack棧頂的值
id:可選屬性,指定該元素的標識
iterate標簽:
iterate標簽用于對集合進行迭代,這里的集合包含List、Set和數組。
value:可選屬性,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸出 ValueStack棧頂的值
status:可選屬性,該屬性指定迭代時的iterateStatus實例,
該方法有如下幾個方法:
int getCount(),返回當前迭代了幾個元素
int getIndex(),返回當前迭代元素的索引
boolean isEven(),返回當前被迭代的元素的索引是否是偶數
boolean isOdd(),返回當前被迭代的元素的索引是否是奇數
boolean isFirst(),返回當前被迭代的元素是否為第一個元素
boolean isLast(),返回當前被迭代的元素是否為最后一個
if/elseif/else標簽:
url標簽:
輸出為:/Ognl/test/hello.action?personId=33
當標簽的屬性值為字符串類型處理時,”%”符號的用途是計算OGNL表達式的值。
輸出為:http://www.hao123.com
表單標簽checkBoxList復選框:
如果集合為list:
防止表單的重復提交:
1)登錄界面index.jsp中的代碼:
2)struts.xml文件中的代碼:
3)personAction中的代碼:
4)顯示層show.jsp中的代碼:
注意:以上配置了“token”攔截器和“invalid.token”結果,因為“token”攔截器在會話的token與請求的token不一致時,將會直接返回“invalid.token”結果。