1.首先struts2为我们定义了几个可以在ftl中使用的变量,都放在了org.apache.struts2.views.util.ContextUtil里面,具体怎么做的,还没有看。
- 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";
复制代码这里定义了我们常用的${base}、${stack}等。
注意:这里面定义都是对应的类。例如stack对应的就是ValueStack,所以我们在页面可以使用
${stack.findValue('@com.Blog@PERMIT_COMMENT_BY_NONE')}.这就是方法问ValueStack的findValue方法。我们还可以使用
${request}来使用HttpServletRequest类,(只能)然后调用里面的方法。例如${request.getAttribute("aaa")}等。
2.通过使用struts2我们知道,页面传递过来的值都是保存在ActionContext中的值栈里面的,其中这个值栈是ActionContext 的根,因此可以不用加“#”访问。而在ActionContext中还封存了其他的东西,比如request,session、parameters 等。。但是一定要注意。这里的request、session、parameters等不是HttpServletRequest那些类,而是一个 map。而且进行了重新组装,例如request封装了 ServletActionContext.getRequest().setAttribute("aaa", "bbb");信息
我们通过Ognl.getValue("#request.aaa", map, context.getValueStack().getRoot())就可以取到值。当然request这个map中还有一些其他的东西,例如我的打印结果是;
System.out.println(Ognl.getValue("#request", context.getContextMap(),new Object()));通过打印可以看出来
这些可以参考
http://hi.baidu.com/maml897/blog/item/e6d962c3d55e6338e5dd3bb0.html。
3.我们知道 ftl页面 ${}写的都是 ognl表达式,而且都是 根里面的 ,所以不用加上“#”,但是 要访问ActionContext里面,不是根的request怎么办呢?
我是这样用的 ${#request}发现时错误的,后来查找资料发现
使用
${Request["a"]}
${RequestParameters["a"]}
${Session ["a"]}
${Application ["a"]}
或者${Application.myApplicationAttribute}
${Session.mySessionAttribute}
${Request.myRequestAttribute}
${Parameters.myParameter}
千万要注意的是
Application、Session、Request、Parameters都是map。都是大写的,没有写成${#request}这个我也不知道为什么,
在页面 用了大写。
可以参考freemarker.ext.servlet.FreemarkerServlet
在action里使用
System.out.println(Ognl.getValue("#request.aaa", map, context.getValueStack().getRoot()));
刚才发现 在jsp页面里访问 actionContext的内容
${request}
这样写 是访问actionContext的request,而不是 struts2内定的
用struts2标签
<x:property value="#request.toString()"/>
就要加"#"