当前位置: 首页 > news >正文

web计算器

在页面中实现一个具有+-×/功能的计算器,起初只是把form表单提交到servlet,然后把符号switch...case...,但是这样做不符合开闭原则,如果要增加运算符号,则会有很大的代码修改,最后有同学提出,可以用反射机制,这样只需要增加运算方法即可

前端html代码如下:

 <form action="calc" method="post">
		num1:<input type="text" name="num1" value="${sessionScope.num1 }" />
		<select name="method" id="method">
			<option value="add" id="add" >+</option>
			<option value="sub" id="sub">-</option>
			<option value="*" id="multiply">*</option>
			<option value="/" id="divide">/</option>
		</select>
		num2:<input type="text" name="num2" value="${sessionScope.num2 }" />
		<input type="submit" value="计算" id="submit" /><br /> 
	</form>
servlet代码如下:
package com.wzl.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CalcServlet extends HttpServlet {
	private static final long serialVersionUID = -3273567269240835150L;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String method = req.getParameter("method");
		System.out.println(method);
		Integer num1 = new Integer(req.getParameter("num1").trim());
		Integer num2 = new Integer(req.getParameter("num2").trim());
		Class calcClass = this.getClass();
		try {
 //反射,得到class中的方法,参数中method为方法名,后边接参数列表的类对象(注:Integer.class和int.class不一样)
			Method calcMethod = calcClass.getDeclaredMethod(method,Integer.class,Integer.class);
			if (calcMethod != null) {
				Object result= calcMethod.invoke(this, num1, num2);
				String message = String.format(method + "执行结果:%d", result);
				req.setAttribute("message", message);
				req.getRequestDispatcher("result.jsp").forward(req, resp);;
				
			}
		} catch (NoSuchMethodException | SecurityException e) {
			e.printStackTrace();
			resp.sendError(500,"NoSuchMethod方法");
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	public Integer  add(Integer num1,Integer num2){
		return num1+num2;
	}
}

servlet类中,只写了增加(add)方法,如果需要增加减法运算的方法,只需要增加方法即可,类的反射会得到减法,并给出结果

相关文章:

  • iptables的配置文件/etc/sysconfig/iptables不存在怎么办
  • MySQL控制(关闭、打开)自动提交功能
  • beego框架之orm模块——sqlite
  • 数据库的连接池
  • JavaWeb学习总结(五十一)——邮件的发送与接收原理
  • xml文件的读取
  • Java 反射机制(一)
  • fail-fast
  • UVA11212 EditingaBook ( IDA*搜索)
  • TreeMap的介绍
  • Treemap的应用
  • 《Effective C++》——条款04:确定对象使用前已先被初始化
  • Treemap的使用
  • 数组根据index拆分和查询下标
  • include指令和include动作的区别
  • “大数据应用场景”之隔壁老王(连载四)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 4. 路由到控制器 - Laravel从零开始教程
  • JavaScript函数式编程(一)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Python 反序列化安全问题(二)
  • 半理解系列--Promise的进化史
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 番外篇1:在Windows环境下安装JDK
  • 记录一下第一次使用npm
  • 什么软件可以剪辑音乐?
  • 数组大概知多少
  • 正则表达式小结
  • Nginx实现动静分离
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​linux启动进程的方式
  • ​ubuntu下安装kvm虚拟机
  • #pragam once 和 #ifndef 预编译头
  • #pragma 指令
  • #单片机(TB6600驱动42步进电机)
  • (arch)linux 转换文件编码格式
  • (Oracle)SQL优化技巧(一):分页查询
  • (poj1.3.2)1791(构造法模拟)
  • (python)数据结构---字典
  • (多级缓存)缓存同步
  • (二)fiber的基本认识
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转载)hibernate缓存
  • (转载)从 Java 代码到 Java 堆
  • 、写入Shellcode到注册表上线
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 解决重复提交问题
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈