Struts2 的Action 和Result我们们都学习过了。现在开始进行OGNL的学习。OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
我们整体用一个项目不断增加代码,功能来学习。
struts.xml include了ognl.xml 配置文件在ognl.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="ognl" extends="struts-default" >
<action name="ognl" class="com.tfj.struts2.ognl.OgnlAction">
<result>/ognl.jsp</result>
</action>
</package>
</struts>
主页只有一个连接访问http://localhost:8080/Struts2_2001_OGNL/ognl?username=u&password=p 传递两个参数username=u,password=p。
调用OgnlAction.java 和User.java
OgnlAction.java
package com.tfj.struts2.ognl;
import com.opensymphony.xwork2.ActionSupport;
public class OgnlAction extends ActionSupport{
private String username;
private String password;
private User user;
public OgnlAction() {
}
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 User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
User.java
package com.tfj.struts2.ognl;
public class User {
private int age=8;
public User() {
System.out.print(age);
}
public User(int age){
super();
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "user"+age;
}
}
重点在
ognl.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Ognl表达式学习</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<ol>
<li>访问值栈中的action的普通属性:username=<s:property value="username"/></li>
<li>访问值栈中对象的普通属性:<s:property value="user.age"/></li>
</ol>
<s:debug></s:debug>
</body>
</html>
由页面的结果可以看到,我们可以访问得到username,但是user.age的值却是空(我们在User.java里已经定义他的默认值是8),那么为什么得不到呢?我们debug一下看看。
user的值是空,那么我们就传进去一个值。访问http://localhost:8080/Struts2_2001_OGNL/ognl?username=u&password=p&user.age=9
这时候就得到了user9,那么我们很自然想到是user的对象没有创建。
结论:如果传递了user的值,那么struts就会帮我们创建一个user对象。如果不传递user的值,就需要我们手动创建一个user对象,在本项目可以再OgnlAction.java里Private User user = new User();即可,大家可以自己试一试。
如果有一个在Cat类OgnlAction.java 里Cat对象,内部还有一个Dog 对象名字叫friend,Dog有name属性,那么我们要访问值栈中的内容就需要<s:property value="cat.friend.name"/>这样就可以访问了,同样的需要传递进去一个参数使得对象初始化。