Ext学习日记——网页计算器示例

作者: tcxurun 分类: Web前端 发布时间: 2013-05-19 22:39 ė 6 没有评论

网页计算器是方便用户进行数学计算的一种有力工具。传统的网页计算器通过纯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());
%>

本文出自天一直很蓝,转载时请注明出处及相应链接。

本文永久链接: http://www.tcxurun.cn/archives/52

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部