14-spring學習-變量操作
表達式所有操作都是可以以變量形式出現的。
觀察變量的定義:
package com.Spring.ELDemo; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; importorg.springframework.expression.spel.support.StandardEvaluationContext; public class TestSimple2 { public static void main(String[] args) { ExpressionParser parser=new SpelExpressionParser(); Expression exp=parser.parseExpression("#myevl"); EvaluationContext context=new StandardEvaluationContext(); context.setVariable("myevl", "hello"); System.out.println(exp.getValue(context)); } }
如果要想設置變量,必須需要依靠“StandardEvaluationContext”類完成,而這個類的子類的構造方法也可以接收一個變量:
public StandardEvaluationContext(Object rootObject)
這個構造方法表示的是設置根變量的內容:整個變量體系之中 會自動存在一個“#root
觀察如下:
package com.Spring.ELDemo; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class TestSimple2 { public static void main(String[] args) { ExpressionParser parser=new SpelExpressionParser(); Expression exp=parser.parseExpression("#root"); EvaluationContext context=new StandardEvaluationContext("hello"); System.out.println(exp.getValue(context)); } }
如上,沒有調用context.setVariable("#root", "hello");,也就是說直接通過了構造方法完成了根變量#root值的傳遞。
範例:進行比較:
package com.Spring.ELDemo; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class TestSimple2 { public static void main(String[] args) { ExpressionParser parser=new SpelExpressionParser(); Expression exp=parser.parseExpression("#root==‘hello‘ ? ‘你好‘:‘大家好‘"); EvaluationContext context=new StandardEvaluationContext("hello"); System.out.println(exp.getValue(context)); } }
結果:您好。
大部分情況下,最多的時候使用一下自定義變量進行使用,而不是使用根變量。
還能對方法進行引用操作。
方法引用:
範例:將Integer.parseInt()方法設置為myInt()的引用(可以結合之前java知識復習)
package com.Spring.ELDemo; import java.lang.reflect.Method; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class TestSimple2 { public static void main(String[] args) throws Exception { ExpressionParser parser=new SpelExpressionParser(); //通過反射找到Integer.parseInt()方法的對象 Method met=Integer.class.getMethod("parseInt", String.class); Expression exp=parser.parseExpression("#myInt(‘123‘)"); //利用StandardEvaluationContext類進行方法的引用註冊 StandardEvaluationContext context=new StandardEvaluationContext(); //方法進行引用,註冊 context.registerFunction("myInt", met); System.out.println(exp.getValue(context)); } }
註意以上方法引用步驟。
使用myInt方法在表達式之中相當於調用了Integer.parseInt()方法實現類字符串與int數據的互相轉型操作。
還可以調用類中屬性,以date類為例,裏面有一個getTime()方法,可以將date數據變成lang型數據。
範例:調用屬性
package com.Spring.ELDemo; import java.util.Date; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class TestSimple2 { public static void main(String[] args) throws Exception { ExpressionParser parser=new SpelExpressionParser(); Expression exp=parser.parseExpression("time"); //利用StandardEvaluationContext類進行方法的引用註冊 StandardEvaluationContext context=new StandardEvaluationContext(new Date()); System.out.println(exp.getValue(context)); } }
此時將date類的對象設置到了根變量,所以一旦表達式出現了“time”單詞就表示,要調用getTime方法。
所以需要特別提醒的是,第一個字母不區分大小寫。
這種調用本身有風險,此時調用必須有前提:根變量有內容
範例:根變量為空
public class TestSimple2 { public static void main(String[] args) throws Exception { ExpressionParser parser=new SpelExpressionParser(); Expression exp=parser.parseExpression("time"); //利用StandardEvaluationContext類進行方法的引用註冊 StandardEvaluationContext context=new StandardEvaluationContext(); System.out.println(exp.getValue(context)); } }
根變量為空就會出現異常:
最好解決方式不是增加什麽判斷,而是使用Groovy安全導航操作,利用Groovy安全運算符避免空異常。
範例:使用“?. ”範圍屬性
package com.Spring.ELDemo; import java.util.Date; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class TestSimple2 { public static void main(String[] args) throws Exception { ExpressionParser parser=new SpelExpressionParser(); Expression exp=parser.parseExpression("#root?.time"); //利用StandardEvaluationContext類進行方法的引用註冊 StandardEvaluationContext context=new StandardEvaluationContext(); System.out.println(exp.getValue(context)); } }
結果:
如果此時根變量內容為空,那麽返回就是null。
以上所有操作變量都是程序中定義的,也可以引用在applicationContext.xml文件中內容。
範例:引用配置中的變量
定義一個Message類
package com.Spring.vo; public class Message { private String info; public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
在applicationcontext.xml裏面配置這個類
<bean id="msg" class="com.Spring.vo.Message"> <property name="info" value="hello word"></property> </bean>
現在msg對象裏面的info屬性裏面是包含配置內容的,隨後希望可以在表達式裏面去引用這部分的內容。
引入配置內容,如果要進行導入外部配置,使用“@名稱.方法()”
package com.Spring.ELDemo; import java.util.Date; import org.springframework.context.ApplicationContext; import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class TestApplication { public static void main(String[] args) throws Exception { ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); ExpressionParser parser=new SpelExpressionParser(); //格式,@配置bean的ID.方法() Expression exp=parser.parseExpression("@msg.getInfo()"); StandardEvaluationContext context=new StandardEvaluationContext(); //將這個配置文件的內容讀取交給上下文 context.setBeanResolver(new BeanFactoryResolver(ctx)); System.out.println(exp.getValue(context)); } }
運行結果:
相當於此時,在外部配置的對象,都可以直接在表達式中使用了。並且利用表達式的語法調用對象所提供的方法。
14-spring學習-變量操作