动态调用动态语言,第 2 部分: 在运行时寻找、执行和修改脚本
2009-11-19 00:00:00 来源:WEB开发网请注意全局变量 result、borrower、loan 和 property,脚本使用这些变量访问和设置共享 Java 对象中的值。这些变量名是通过调用 ScriptEngine.put() 方法设置的。
还要注意 result.productName = 'Groovy Mortgage' 这样的 Groovy 语句。这个语句似乎是直接设置 MortgageQualificationResult 对象的字符串属性 productName,但是,清单 3 清楚地说明它是一个私有的实例变量。这并不 表示 Java 脚本编程 API 允许违反封装规则,而是说明通过使用 Java 脚本编程 API,Groovy 和大多数其他脚本语言解释器可以很好地操作共享的 Java 对象。如果一个 Groovy 语句尝试设置或读取 Java 对象的私有属性值,Groovy 就会寻找并使用 JavaBean 风格的公共 setter 或 getter 方法。例如,语句 result.productName = 'Groovy Mortgage' 会自动转换为适当的 Java 语句:result.setProductName("Groovy Mortgage")。这个 Java setter 语句也是有效的 Groovy 代码,可以在脚本中使用,但是直接使用属性赋值语句更符合 Groovy 的风格。
现在看看清单 5 中的 JavaScript 抵押产品脚本。这个 JavaScript 脚本代表一种政府担保的贷款,政府支持这种贷款是为了提高公民的住宅拥有率。所以,业务规则要求这是贷款人购买的第一套住宅,而且贷款人打算在此居住,而不是出租获利。
清单 5. JavaScript 抵押脚本/**
* This script defines the "JavaScript FirstTime Mortgage" product.
* It is a government-sponsored mortgage intended for low-income, first-time
* home buyers without a lot of assets who intend to live in the home.
* Bankruptcies and bad (but not terrible!) credit are OK.
*/
result.productName = 'JavaScript FirstTime Mortgage'
if (!borrower.intendsToOccupy) {
result.message = 'This mortgage is not intended for investors.'
scriptExit.noMessage()
}
if (!borrower.firstTimeBuyer) {
result.message = 'Only first-time home buyers qualify for this mortgage.'
scriptExit.noMessage()
}
if (borrower.monthlyIncome > 4000) {
result.message = 'Monthly salary of $' + borrower.monthlyIncome +
' exceeds the $4,000 maximum.'
scriptExit.noMessage()
}
if (borrower.creditScore < 500) {
result.message = 'Your credit score of ' + borrower.creditScore +
' does not meet the 500 requirement.'
scriptExit.noMessage()
}
// Qualifies. Determine interest rate based on loan amount and credit score.
result.qualified = true
result.message = 'Congratulations, you qualify.'
if (loan.loanAmount > 450000) {
result.interestRate = 0.08 // Big loans and poor credit require higher rate.
} else if (borrower.creditScore < 550) {
result.interestRate = 0.08
} else if (borrower.creditScore < 600) {
result.interestRate = 0.07
} else if (borrower.creditScore < 700) {
result.interestRate = 0.065
} else { // Good credit gets best rate.
result.interestRate = 0.06
}
更多精彩
赞助商链接