package exp; 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; import com.ycsoft.beans.core.cust.CCust; /** * 表达式处理单元 * * @author liujiaqi * */ class Fee { private int ACCTITEM_2701=10000; private int ACCTITEM_2721=10000; private int ACCTITEM_2740=0; private int ACCTITEM_2763=0; private int ACCTITEM_2792=0; private int ACCTITEM_2804=0; private int times=0; public int getACCTITEM_2701() { return ACCTITEM_2701; } public void setACCTITEM_2701(int acctitem_2701) { ACCTITEM_2701 = acctitem_2701; } public int getACCTITEM_2721() { return ACCTITEM_2721; } public void setACCTITEM_2721(int acctitem_2721) { ACCTITEM_2721 = acctitem_2721; } public int getACCTITEM_2740() { return ACCTITEM_2740; } public void setACCTITEM_2740(int acctitem_2740) { ACCTITEM_2740 = acctitem_2740; } public int getACCTITEM_2763() { return ACCTITEM_2763; } public void setACCTITEM_2763(int acctitem_2763) { ACCTITEM_2763 = acctitem_2763; } public int getACCTITEM_2792() { return ACCTITEM_2792; } public void setACCTITEM_2792(int acctitem_2792) { ACCTITEM_2792 = acctitem_2792; } public int getACCTITEM_2804() { return ACCTITEM_2804; } public void setACCTITEM_2804(int acctitem_2804) { ACCTITEM_2804 = acctitem_2804; } public int getTimes() { return times; } public void setTimes(int times) { this.times = times; } } public class ExpUnit { private StandardEvaluationContext context = new StandardEvaluationContext(); private ExpressionParser parser = new SpelExpressionParser(); public static void main(String[] args){ ExpressionParser p1 = new SpelExpressionParser(); Expression exp = p1.parseExpression("cust_name"); CCust cust = new CCust(); cust.setCust_name("潘玉奔"); StandardEvaluationContext context = new StandardEvaluationContext(); context.setRootObject(cust); System.out.println(exp.getValue(context).toString()); Fee fee = new Fee(); String expStr = "(((ACCTITEM_2701>0?1:0)+ "+ " (ACCTITEM_2721>0?1:0)+"+ " (ACCTITEM_2740>0?1:0)+"+ " (ACCTITEM_2763>0?1:0)+"+ " (ACCTITEM_2792>0?1:0)+"+ " (ACCTITEM_2804>0?1:0))>=2 "+ " and "+ " ((ACCTITEM_2701>=600*times) or"+ " (ACCTITEM_2721>=600*times) or"+ " (ACCTITEM_2740>=600*times) or"+ " (ACCTITEM_2763>=600*times) or"+ " (ACCTITEM_2792>=600*times) or"+ " (ACCTITEM_2804>=600*times) ))"; System.out.println(expStr); exp = p1.parseExpression(expStr); context.setRootObject(fee); for (int i=0;i<1000;i++){ fee.setTimes(i); if (exp.getValue(context).toString().equalsIgnoreCase("false")){ System.out.println(i-1); break; } } } public StandardEvaluationContext getContext() { return context; } public ExpressionParser getParser() { return parser; } /** * 返回指定类型的表达式结果 * * @param <T> * 返回类型 * @param exp * 表达式 * @param resultType * @return */ public <T> T getVariable(String exp, Class<T> resultType) { try { return parser.parseExpression(exp).getValue(context, resultType); } catch (Exception e) { e.printStackTrace(); } return null; } public String getVariable(String exp) { return getVariable(exp, String.class); } /** * 返回Boolean类型的表达式结果 * * @param exp * 表达式 * @return */ public boolean parseBoolean(String exp) { return getVariable(exp, Boolean.class); } public void setContext(StandardEvaluationContext context) { this.context = context; } public void setParser(ExpressionParser parser) { this.parser = parser; } public void setVariable(Object variables) { context.setRootObject(variables); } /** * 将变量加入表达式容器 以#varname的方式调用 * * @param varname * @param value */ public void setVariable(String varname, Object value) { context.setVariable(varname, value); } }