值栈和ognl
1. 值栈是ActionContext的一个对象,它是栈结构,特征:先进后出,struts2中值栈存放的数据是Action对象。
2. ognl表达式(Object Graph Navigation Language 对象图形导航语言),他的主要优点是:可以访问OGNL上下文和ActionContext。
publicstaticvoid main(String[] args) { //数据有常用的数据和不常用的数据----常用的一般是"小数据"(如本案例 //中的user),不常用的一般是"大数据" //表达式:常用的数据是直接取,不常用的数据(ActionContext中数据)加#取 Map<String,Object> map=new HashMap<String,Object>(); map.put("username","张三"); map.put("age", 30); User user=new User(); user.setAge(10); user.setUsername("李四"); Object obj=null; try { obj=Ognl.getValue("#username", map, user); //取的不常用数据 } catch (OgnlException e) { e.printStackTrace(); } System.out.println(obj); //输出结果为张三 } |
注意:值栈中的数据理解为“小数据”,ActionContext中的数据理解为“大数据”,小数据又叫根对象,对应getValue的第三个参数。
3. struts2中使用ognl表达式是通过struts2标签来取值的。
在jsp中导入struts2的标签库
<%@taglib prefix="s" uri="/struts-tags" %> |
注意:要使用struts2的标签那么要通过struts2过滤器来启动,如果过滤器的配置为*.action结尾时,不能直接访问jsp页面,需要通过action跳转。如果过滤器配置为/*时,可以直接访问jsp页面,Struts2推荐不直接访问jsp页面,推荐使用action来跳转页面,因为如果直接到jsp页面会暴露地址。
在jsp页面通过struts2标签获得值栈的数据和ActionContext对象中的数据写法不同,因为值栈是直接把Action对象(本案例中的Action对象是指LoginAction对象)的属性暴露,所以访问值栈中的user的值写法如下:
用户名:<s:property value="user"/> |
若访问ActionContext中对象的值写法如下:
用户名:<s:property value="#session.user"/> |
如果session没有设置值,则无法取到
Action页面:
publicclass LoginAction{ private String user; private String pwd; HttpServletRequest request;
public String execute(){ if(user.equals("zys")&&pwd.equals("12345")){ System.out.println("登录成功"); HttpServletRequest request=ServletActionContext.getRequest(); request.getSession().setAttribute("user", user); System.out.println("user="+request.getParameter("user")); return"success"; }else{ System.out.println("登录失败"); return"failure"; } }
public String getUser() { returnuser; } publicvoid setUser(String user) { this.user = user; } public String getPwd() { returnpwd; } publicvoid setPwd(String pwd) { this.pwd = pwd; } } |
结论:使用ognl表达式访问action属性时,直接访问,访问actionContext对象值需要加#号。