我是靠谱客的博主 虚幻板凳,最近开发中收集的这篇文章主要介绍OGNL基础学习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.什么是OGNL?
Object-Graph Navigation Language(对象图导航语言),是一种功能强大的表达式语言(EL)用在就是jsp中,通过简单一致的表达式语法存取对象的属性,调用对象的方法,遍历对象的结构图,实现字段类型转化等功能。
下面只是关于OGNL的简单介绍,若想学好它,请去http://commons.apache.org/proper/commons-ognl/index.html 学习
二.OGNL的基本使用
1.常量与操作符:
可以使用java的常量操作和数学运算。
注意:String常量可以使用单引号(只有超过一个字符的时候生效)或双引号。因为单个字符也用单引号。但如果需要只定义一个单个字符的String常量,我们需要转义。

例如:
< s:property value="‘account’"/>中的account就是个字符串。
< s:property value=“7+8”/> 输出的不是7+8,而是15.

2.设置数值及表达式列表
OGNL让用户可以在单条语句中执行逗号分隔的多个表达式,最后一个表达式的返回值作为整条语句的输出。
表达式foo, bar同时调用了getFoo()和getBar(),但最后返回的值是getBar()的值。(关于这个性质的意义,目前没找出正解,若有知道的小伙伴欢迎评论指教)。

3.使用OGNL访问ValueStack
在OGNL中,没有前缀代表了访问当前值栈。
比如< s:property value=“account”/> 中的value属性的值就是使用的ognl,他没有任何前缀,表示直接访问值栈,访问值栈后,会按照从栈顶到栈底的顺序寻找第一个匹配的对象,找到Action中的account属性取值。

4.使用OGNL访问ActionContext
在OGNL中可以通过符号#来访问ActionContext中除了值栈之外的各种值,例如:
#parameters:当前请求中的参数,对应request.getParameter(name)
#request:请求作用域中的属性,对应request.getAttribute(name)
#session:会话作用域中的属性,对应session.getAttribute(name)
#application:应用程序作用域的属性
#attr:按照页面,请求,会话和应用的顺序返回第一个符合条件的属性

例如:
Action文件:
HelloWorldAction.java

package cn.javass.hello.struts2impl.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{

	private String account;
	private String password;
	private String submitFlag;
	public String execute() throws Exception{
		this.businessExecute();
		ActionContext c=ActionContext.getContext();
		c.getSession().put("account", "session中的account");
		c.getApplication().put("account", "application's account");
		return this.SUCCESS;
	}
	public void businessExecute()
	{
		System.out.println("用户输入的参数为==="+"account="+account+"password="+password+"submitFlag="+submitFlag);
	}
	public String getAccount()
	{
		return account;
	}
	public void setAccount(String account)
	{
		this.account=account;
	}
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password=password;
	}
	public String getSubmitFlag()
	{
		return submitFlag;
	}
	public void setSubmitFlag(String submitFlag)
	{
		this.submitFlag=submitFlag;
	}
}

struts.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
 <struts>
 
 <constant name="struts.devMode" value="true"/>
 <constant name="struts.locale" value="zh_CN"/>
 <constant name="struts.i18n.encoding" value="UTF-8"/>
 
 <package name="struts2" extends="struts-default" namespace='/'>
 
   <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction">
    
     <result name="success">/Text01/welcome.jsp</result> 
      <interceptor-ref name="timer"/>
     <interceptor-ref name="defaultStack"/>
   </action>
 
 </package>
 
 
 </struts>

jsp文件:
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
<form action="/struts2/helloworldAction.action" method="post">
  <input type="hidden" name="submitFlag" value="login"/>
  Account :<input type="text" name="account"/><br/>
  PassWord:<input type="password" name="password"/><br/>
  
  <input type="submit" value="submit">
</form>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
<%@taglib prefix="s" uri="/struts-tags" %>

欢迎账号为<s:property value="account"/>的朋友来访<br/>

<s:property value="#application.account"/>

</body>
</html>

结果:
在这里插入图片描述
5.访问静态方法和静态属性
我们可以用@来访问任意类中的静态方法和静态属性,格式为:

@类的全路径名@属性名(或方法名)

具体使用方法如下:
1.在struts.xml中添加开启访问类的静态方法配置:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

2.编写一个类:
MyStatic.java

package cn.javass.hello.struts2impl.action;

public class MyStatic {

	public static String staticTest="staticTestValue"; 
	
	public static void testMethod()
	{
		System.out.println("static test method");
	}
}

3.编写welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
<%@taglib prefix="s" uri="/struts-tags" %>

欢迎账号为<s:property value="account"/>的朋友来访<br/>

静态属性值为:<s:property value="@cn.javass.hello.struts2impl.action.MyStatic@staticTest"/>
<br/>
调用静态方法:<s:property value="@cn.javass.hello.struts2impl.action.MyStatic@testMethod()"/>
</body>
</html>

结果:
在这里插入图片描述

最后

以上就是虚幻板凳为你收集整理的OGNL基础学习的全部内容,希望文章能够帮你解决OGNL基础学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部