@[類全名(包括包路徑)]@[方法名 | 值名],例如: @java.lang.String@format('foo %s', 'bar') 或@tutorial.MyConstant@APP_NAME; 設置 struts.ognl.allowStaticMethodAccess=true
Struts2默認的表達式語言是OGNL
@Test // OGNL調用對象的方法: public void demo1()throws OgnlException { OgnlContext context = new OgnlContext(); Object obj = Ognl.getValue(“'helloworld'.length()”,context,context.getRoot()); System.out.println(obj); } @Test // OGNL獲取數據: public void demo3()throws OgnlException { OgnlContext context = new OgnlContext(); //獲取OgnlContext中的數據: / * context.put(“name”,“張三”); String name =(String)Ognl.getValue(“name”,context,context.getRoot()); System.out.println(name); * / //獲得Root中的數據User user = new User(); user.setName(“李四”); context.setRoot(用戶); String name =(String)Ognl.getValue(“name”,context,context.getRoot()); }
值棧結構代碼:
值為結構圖:
Context:即OgnlContext上下文,它是一個map結構,上下文中存儲了一些引用,參數,請求,會話,應用等,上下文的Root為CompoundRoot.
OgnlContext 中的一些引用:
parameters:該Map中包含當前請求的請求參數 request:該地圖中包含當前請求對象中的所有屬性 session:該地圖中包含當前session對象中的所有屬性 application:該地圖中包含當前應用程序對象中的所有屬性 attr:該地圖按照如下順序來檢索某個屬性:request,session,application
CompoundRoot :存儲了action實例,它作為OgnlContext的根對象.
CompoundRoot繼承的ArrayList實現壓棧和出棧功能, 擁有棧的特點,先進后出,后進先出,后進先出,最后壓棧棧的數據在棧頂。 我們把它稱為對象棧.struts2 對原OGNL作出的改進就是根使用COMPOUNDROOT(自定義 棧), 使用OnglValueStack的findValue方法可以在COMPOUNDROOT中從棧頂向下發現查找的對象的屬性值. CompoundRoot作為OgnlContext的根對象,並且在COMPOUNDROOT中操作實例位於棧頂, 當讀取操作的屬性值時會先從棧頂對象中找對應的屬性,如果找不到則繼續找棧中的其它對象,如果找到則停止查找。
通過ActionContext對象獲取值棧。
ValueStack stack1 = ActionContext.getContext()。getValueStack();
通過request域獲取值棧。
ValueStack stack2 =(ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
1.對於Action的屬性提供get方法的方式
因為Action本身在值棧中,Action中的屬性也就默認在值棧中了,所以我們可以通過對Action的屬性提供get方法的方式來操作值棧。
2.手動操作值棧
調用值棧的push和set方法對值棧進行操作(push是壓入對象到根棧頂,set是壓入map集合到root棧頂)
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。