网页计算器是方便用户进行数学计算的一种有力工具。传统的网页计算器通过纯JvaScript在客户端实现,计算逻辑易被用户获取,安全性不高。通过Ajax优化过的网页计算器将主要的计算逻辑放在服务器端进行运算,客户端服装收集用户输入的表达式,提高了程序的安全性非常适合于有安全要求的场合。
/* * 网页计算器示例 */ Ext.onReady(function() { Ext.onReady(function() { var calpanel = new Ext.panel.Panel({ title: '计算器', renderTo: Ext.getBody(), bodyPadding: 5, width: 270, layout: { type: 'table', columns: 5 //设置表格布局默认列数 }, frame: true, tbar: ['公式:',new Ext.form.field.Text({ id: 'expression', readOnly: true, style: 'text-align:right' }), '=', new Ext.form.field.Text({ id: 'result', width: 60 })], defaultType: 'button', defaults: { minWidth: 50, handler: btnClick }, items: [{ text: '1',symbol: '1' }, { text: '2',symbol: '2' }, { text: '3',symbol: '3' }, { text: '(',symbol: '(' },{ text: ')',symbol: ')' }, { text: '4',symbol: '4' }, { text: '5',symbol: '5' }, { text: '6',symbol: '6' }, { text: '+',symbol: '+' },{ text: '-',symbol: '-' }, { text: '7',symbol: '7' }, { text: '8',symbol: '8' }, { text: '9',symbol: '9' }, { text: '×',symbol: '*' }, { text: '÷',symbol: '/' }, { text: '0',symbol: '0' }, { text: '.',symbol: '.' }, { text: '=',symbol: '=' }, { text: 'c',symbol: 'clear' }, { text: '<―',symbol: 'back' }] }) //取得id为expression的组件引用 var expression = Ext.getCmp('expression'); //取得id为result的组件引用 var result = Ext.getCmp('result'); //按钮单击事件的处理函数 function btnClick(btn) { var oldValue = expression.getValue(); if(btn.symbol == 'back') { //取消最后一次输入的字符 oldValue = oldValue.substring(0, oldValue.length - 1); } else if(btn.symbol == 'clear') { //清空表达式和结果 oldValue = ''; result.setValue(''); } else if(btn.symbol == '=') { //计算表达式 calculate(); } else if(btn.symbol == '.') { alert(oldValue.indexOf('.')) if(oldValue.indexOf('.') != -1) { return; } oldValue += btn.symbol; } else { //累计表达式字符串 oldValue += btn.symbol; } expression.setValue(oldValue); } //计算表达式函数 function calculate() { var str = expression.getValue(); //判断表达式是否为空 if(!Ext.isEmpty(str)) { //将表达式发送到服务器进行计算 Ext.Ajax.request({ url: 'calculateServer.jsp', params: { Exp: str }, callback: function(options, success, response) { if(success) { result.setRawValue(response.responseText); } else { result.setRawValue('error'); } } }) } } }) })
服务器端代码:
在服务端使用Apache的commons-jexl-1.1.jar解析表达式字符串并进行计算
<%@ page language="java" contentType="text/html;charset=utf-8" import="java.util.*" pageEncoding="utf-8"%> <%@ page import="org.apache.commons.jexl.*" %> <% String jexlExp = request.getParameter("Exp"); System.out.println(jexlExp); Expression e = ExpressionFactory.createExpression(jexlExp); JexlContext jc = JexlHelper.createContext(); Object result = e.evaluate(jc); response.getWriter().write(result.toString()); %>