1. 程式人生 > >14-spring學習-變量操作

14-spring學習-變量操作

throw 字母 except lang 存在 nco tap see contex

表達式所有操作都是可以以變量形式出現的。

觀察變量的定義:

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("#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學習-變量操作