1.ognl概念
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。
2.ognl与struts
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;
支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
支持对象方法调用,如xxx.doSomeSpecial();
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80;
访问OGNL上下文(OGNL context)和ActionContext;
操作集合对象。
可以直接new一个对象
3.值栈
概念:
struts2中提供的一种存储机制,类似于域对象,叫值栈,可以存值和取值。
(1)在action中可以把数据放到值栈里面,然后在页面中取到值栈数据。
servlet与action的区别
(1)servlet:默认在第一次访问时创建,创建一次,单实例对象
(2)action:每次访问时,都会创建action对象,多实例对象。
使用方法:
(1)值栈存储位置
每个action对象里面都会有一个值栈对象(只有一个值栈对象)。
(2)值栈中存值的方式
action类:
package action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class UserAction extends ActionSupport {
private String name;
public String getName() {
return name;
}
@Override
public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
ValueStack stack1 = context.getValueStack();
//值栈中存值的方式,有以下三种方法
//1.
stack1.set("username", "lv");
//2.
stack1.push("abcd");
//3.一般用下面这种方法,在action中定义变量,并生成该变量的get方法,减小空间利用
name = "aba";
return "success";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo1" extends="struts-default" namespace="/">
<action name="user" class="action.UserAction">
<result name="success">/ognl.jsp</result>
</action>
</package>
</struts>
ognl.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- ognl引入标签库 -->
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 使用ognl+struts2标签实现计算字符串长度
value属性值:ognl表达式
-->
<s:property value="'haha'.length()"/>
<s:debug></s:debug>
</body>
</html>