深入理解Struts2中OGNL表达式的实战应用实例
Object Graph Navigation Language:对象图导航语言,就是用点来访问成员变量
<s:property value="cat.name"/>
例1:
struts.xml:
<package name="ognl" namespace="/ognl" extends="struts-default"> <action name="og1" class="cn.edu.hpu.action.OgnlAction1"> <result>/ognl.jsp</result> </action> </package>
OgnlAction1.java:
package cn.edu.hpu.action; import com.opensymphony.xwork2.ActionSupport; public class OgnlAction1 extends ActionSupport{ 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; } @Override public String execute() throws Exception { // TODO Auto-generated method stub return super.execute(); } }
访问链接:
<a href="<%=basePath%>ognl/og1?username=jack&&password=111" rel="external nofollow" >OGNL</a><br/>
结果界面:
OGNL SUCCESS!!<br/> <ol> <li>访问值栈中的action的普通属性1=<s:property value="username"/></li> <li>访问值栈中的action的普通属性2=<s:property value="password"/></li> </ol> <s:debug></s:debug>
结果显示:
OGNL SUCCESS!!
访问值栈中的action的普通属性1=jack
访问值栈中的action的普通属性2=111
[Debug]
ps:点击[Debug]可以查看到栈值中有username与password
例2:
struts.xml:
<package name="ognl" namespace="/ognl" extends="struts-default"> <action name="user2" class="cn.edu.hpu.action.UserAction2" method="add"> <result name="success">/ognl.jsp</result> </action> </package>
UserAction2.java:
package cn.edu.hpu.action; import cn.edu.hpu.mode.User; public class UserAction2 { private User user; public String add(){ System.out.println("name="+user.getName()); System.out.println("age="+user.getAge()); return "success"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
User.java:
package cn.edu.hpu.mode; 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 void setAge(int age) { this.age = age; } }
链接:
访问User属性
<a href="<%=basePath%>ognl/user2?user.name=tom&&user.age=21" rel="external nofollow" >OGNL2</a><br/>
(只有你传user.XXXX才能构造)
结果页面:
<%@taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>" rel="external nofollow" > <title>My JSP 'ognl.jsp' starting page</title> </head> <body> OGNL SUCCESS!!<br/> <ol> <li>访问值栈中对象的普通属性(get set 方法 ): <br/> user-age:<s:property value="user.age"/>|<s:property value="user['age']"/></li> </ol> <s:debug></s:debug> </body> </html>
显示结果:
OGNL SUCCESS!!
访问值栈中对象的普通属性(get set 方法 ):
user-age:21|21
[Debug]
点击[Debug]可以查看到栈值中有user对象的存在
例3:
struts.xml
<package name="ognl" namespace="/ognl" extends="struts-default"> <action name="cat1" class="cn.edu.hpu.ognl.OgnlAction2"> <result name="success">/ognl.jsp</result> </action> </package>
OgnlAction2.java:
package cn.edu.hpu.ognl; import cn.edu.hpu.mode.Cat; import com.opensymphony.xwork2.ActionSupport; public class OgnlAction2 extends ActionSupport{ private Cat cat; public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } public String execute(){ return "success"; } public String m(){ return "Hello"; } }
Cat.java:
package cn.edu.hpu.mode; public class Cat { private Dog friend; public Dog getFriend() { return friend; } public void setFriend(Dog friend) { this.friend = friend; } public String miaomiao(){ return "miaomiao"; } }
Dog.java:
package cn.edu.hpu.mode; public class Dog { private String name; public Dog(){ } public Dog(String name){ super(); this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { // TODO Auto-generated method stub return "dog:"+name; } }
链接:
访问Cat属性
<a href="<%=basePath%>ognl/cat1?cat.friend.name=littleBoy" rel="external nofollow" >OGNL3</a><br/>
结果页面:
<li>访问值栈中对象的普通属性(get set 方法 ): <br/> cat-friend-name:<s:property value="cat.friend.name"/></li>
结果:
访问值栈中对象的普通属性(get set 方法 ):
cat-friend-name:littleBoy
观察[Debug],发现只有cat在值栈中,说明通过cat联系到dog,取得dog中的属性
访问cat方法:
<a href="<%=basePath%>ognl/cat1" rel="external nofollow" rel="external nofollow" >OGNL4</a><br/>
结果页面:
<li>访问值栈中对象的普通方法: <br/> cat-miaomiao:<s:property value="cat.miaomiao()"/></li>
结果:
访问值栈中对象的普通属性:
cat-miaomiao:miaomiao
访问action的普通方法:
<a href="<%=basePath%>ognl/cat1" rel="external nofollow" rel="external nofollow" >OGNL5</a><br/>
结果页面:
<li>访问值栈中action的普通方法: <br/> action-m():<s:property value="m()"/></li>
结果:
访问值栈中acion的普通方法:
action-m():Hello
总结
以上就是本文关于Struts2 OGNL表达式实例详解的全部内容,希望对大家有所帮助。有什么问题可以随时留言,欢迎大家交流讨论。
推荐阅读
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法
-
玩转Kotlin性能测试:JMH入门指南一 - 测试基础" "深入理解JMH在Kotlin中的应用:基准测试实战解析" "轻松实践Kotlin基准测试:JMH工具详解与实例总结
-
深度学习中的不确定性量化:2020年实用技术与应用大解析 - 61页精华解读" 这份报告深入剖析了近年来深度学习领域中不确定性量化(UQ)技术的最新发展,包括其在强化学习(RL)中的运用实例。探讨了贝叶斯近似和集成学习等主流UQ方法在各个具体场景中的广泛应用,比如自动驾驶、目标识别、图像修复、医疗影像分析(如分类和分割)、文本理解(如文本分类和风险评估)、以及生物信息学等多个领域。 报告进一步梳理了UQ方法在深度学习领域的关键应用案例,并针对当前面临的挑战及未来研究方向进行了概览和展望,为这一领域的研究人员和实践者提供了有价值的参考指南。
-
理解与实战:Java SSH库JSch - 用途解析、四大认证法、无密码登录设置、SSH公钥验证深入讲解、三种选择方案、SFTP文件传输详解、Maven集成及实用代码实例 - 专讲JSch在SFTP文件传输中的应用
-
实战教程:深入理解Java Swing中的JTable表格应用——实例3详析
-
深入理解JVM系列(第二十一章):JMap命令在JVM调优中的实战应用
-
使用Struts2的OGNL表达式和ValueStack深入理解
-
通过实例深入学习Java的Struts框架中的OGNL表达式使用
-
OGNL表达式的实战应用:取值、赋值、方法调用(包括实例与静态)、创建List和Map对象详解
-
深入理解Struts2中OGNL表达式的实战应用实例