struts2中的ognl表达式
1、object graph navigation language 对象导航图语言
2、ognl和struts2没有必然的关系,它不是真正的编程语言,它只是一种数据访问语言。
3、在struts2中ognl完成数据设置,类型转换两个功能,Apache推荐使用。
4、需要的jar包 ognl-3.1.15.jar javassist-3.20.0-GA.jar
5、ognl的思想 把数据分为两类,常用的和不常用的。(比如内存和磁盘的关系)
案例一、
创建User类
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.util.HashMap;
import java.util.Map;
import ognl.Ognl;
import ognl.OgnlException;
import testdemo.ognl.vo.User;
public class OgnlDemo {
public static void main(String[] args) throws OgnlException {
/**
* ognl思想 把数据分为两类 常用的和不常用的
*/
//不常用的数据
Map<String ,Object> map = new HashMap<>();
map.put("school", "重庆*******");
map.put("address", "重庆");
//常用的数据
User user = new User("张三丰",150);
//ognl表达式的写法 获取常用的数据 常用的数据自接获取
// 表达式(expression) 上下文(context) ognl表达式的根(root)
String name = (String) Ognl.getValue("name", map,user);//User对象里面有name
//上下文 就是大数据,不常用的数据 常用的数据放在root根 里面
System.out.println(name);
//ognl表达式的写法 不常用的数据 通过#来获取
String name2 = (String) Ognl.getValue("#school", map,user);
System.out.println(name2);
//在struts中是通过ognl来设值和取值的
//在 struts2中是通过ognl来设值和取值的 Action Context作为ognl的上下文对象,ValueStack作为ognl叫的root对象。
}
}
6、struts2中 对象驱动 模型驱动就是通过ognl表达式设置的,一般用EL表达式来取值,struts2官方推荐用ognl来取值。
7、在struts2 ActionContext作为ognl的上下文对象,ValueStack(值栈)作为ognl的root对象。所以在struts2中我要获取域(request .....)数据要用#去获取,我要获取值栈的数据直接去获取。
8、在 struts2中使用ognl表达式获取数据需要使用 struts2的标签库,使用 struts2的标签库,需要注意页面一定是通过过滤器后才能解析suts2的标签。
案例二、
javaWeb项目
登录成功的success.sjp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入标签库 -->
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 使用EL表达式获取 -->
登录成功:欢迎${username}<br>
<!-- 使用ognl表达式获取 value填写ognl表达式 -->
登录成功:欢迎<s:property value="username"/><br><!-- 值栈中存放着Action的属性对象 -->
<!-- 获取我存入ActionContext的值 -->
我存入ActionContext的值是:<s:property value="#application.address"/><br>
<!-- 还可以这样 -->
<s:property value="#parameters.username"/><br>
</body>
</html>
Action
/**
* 属性驱动
*/
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//登录处理业务
public String login() {
ActionContext.getContext().getApplication().put("address", "重庆");
System.out.println("username="+username+"\tpassword="+password);
return Action.SUCCESS;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
".3.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
<action name="login" class="cn.sxt.action.LoginAction" method="login">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>