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"/>这样就可以访问了,同样的需要传递进去一个参数使得对象初始化。