1.首先struts2為我們定義了幾個(gè)可以在ftl中使用的變量,都放在了org.apache.struts2.views.util.ContextUtil里面,具體怎么做的,還沒(méi)有看。
- public static final String REQUEST = "request";
- public static final String REQUEST2 = "request";
- public static final String RESPONSE = "response";
- public static final String RESPONSE2 = "response";
- public static final String SESSION = "session";
- public static final String BASE = "base";
- public static final String STACK = "stack";
- public static final String OGNL = "ognl";
- public static final String STRUTS = "struts";
- public static final String ACTION = "action";
復(fù)制代碼這里定義了我們常用的${base}、${stack}等。
注意:這里面定義都是對(duì)應(yīng)的類。例如stack對(duì)應(yīng)的就是ValueStack,所以我們?cè)陧?yè)面可以使用
${stack.findValue('@com.Blog@PERMIT_COMMENT_BY_NONE')}.這就是方法問(wèn)ValueStack的findValue方法。我們還可以使用
${request}來(lái)使用HttpServletRequest類,(只能)然后調(diào)用里面的方法。例如${request.getAttribute("aaa")}等。
2.通過(guò)使用struts2我們知道,頁(yè)面?zhèn)鬟f過(guò)來(lái)的值都是保存在ActionContext中的值棧里面的,其中這個(gè)值棧是ActionContext 的根,因此可以不用加“#”訪問(wèn)。而在ActionContext中還封存了其他的東西,比如request,session、parameters 等。。但是一定要注意。這里的request、session、parameters等不是HttpServletRequest那些類,而是一個(gè) map。而且進(jìn)行了重新組裝,例如request封裝了 ServletActionContext.getRequest().setAttribute("aaa", "bbb");信息
我們通過(guò)Ognl.getValue("#request.aaa", map, context.getValueStack().getRoot())就可以取到值。當(dāng)然request這個(gè)map中還有一些其他的東西,例如我的打印結(jié)果是;
System.out.println(Ognl.getValue("#request", context.getContextMap(),new Object()));通過(guò)打印可以看出來(lái)
這些可以參考
http://hi.baidu.com/maml897/blog/item/e6d962c3d55e6338e5dd3bb0.html。
3.我們知道 ftl頁(yè)面 ${}寫的都是 ognl表達(dá)式,而且都是 根里面的 ,所以不用加上“#”,但是 要訪問(wèn)ActionContext里面,不是根的request怎么辦呢?
我是這樣用的 ${#request}發(fā)現(xiàn)時(shí)錯(cuò)誤的,后來(lái)查找資料發(fā)現(xiàn)
使用
${Request["a"]}
${RequestParameters["a"]}
${Session ["a"]}
${Application ["a"]}
或者${Application.myApplicationAttribute}
${Session.mySessionAttribute}
${Request.myRequestAttribute}
${Parameters.myParameter}
千萬(wàn)要注意的是
Application、Session、Request、Parameters都是map。都是大寫的,沒(méi)有寫成${#request}這個(gè)我也不知道為什么,
在頁(yè)面 用了大寫。
可以參考freemarker.ext.servlet.FreemarkerServlet
在action里使用
System.out.println(Ognl.getValue("#request.aaa", map, context.getValueStack().getRoot()));
剛才發(fā)現(xiàn) 在jsp頁(yè)面里訪問(wèn) actionContext的內(nèi)容
${request}
這樣寫 是訪問(wèn)actionContext的request,而不是 struts2內(nèi)定的
用struts2標(biāo)簽
<x:property value="#request.toString()"/>
就要加"#"