【Servlet学习三】实现一个内存版本的简易计算器~

news2025/2/22 0:42:09

目录

一、方式1:使用form表单的形式(不推荐)

🌈1、前端代码:HTML文件

🌈2、后端代码:Calculator_form.java文件

🌈3、最终效果

二、方式2:使用ajax形式(最常用&&重点!!!)

🌈1、前端代码:HTML文件

🌈2、后端代码:Calculator_ajax.java文件

🌈3、最终效果


一、方式1:使用form表单的形式(不推荐)

🌈1、前端代码:HTML文件

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>计算器-form表单提交</title>
</head>
<body>
    <form method="get" action="calculator">
        <div style="margin-top:50Px;margin-left:40%">
            <h2>计算器</h2>
            <!-- id是给js用的,name是form表单提交时给后端用得,等于后端的key值-->
            数值1: <input id="num1" name = "num1"><p></p>
            数值2: <input id="num2" name = "num2"><p></p>
            <!-- submit是给form表单用的,ajax用button-->
            <input type = "submit" value="相加">
        </div>
    </form>
</body>
</html>

🌈2、后端代码:Calculator_form.java文件

//2、创建路由
@WebServlet("/calculator_form")
//1、创建类,继承HttpServlet
public class Calculator_form extends HttpServlet {
    /**
     * 目标:从前端拿两个参数:num1和num2,进行相加操作并将结果返回给前端
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    //生成doPost或者doGet方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    //重写doPost方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //0、设置返回的数据类型和编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //1、从请求req中获取参数num1
        String num1 = req.getParameter("num1");
        String num2 = req.getParameter("num2");
        //2、参数的合法性校验
        if(num1==null || num1.equals("") || num2==null || num2.equals("")){
            //直接返回错误信息
            resp.getWriter().write("抱歉,参数有误");
            return;
        }
        //3、进行类型转换String-int
        int number1 = Integer.valueOf(num1);
        int number2 = Integer.valueOf(num2);
        //4、计算相加的结果
        int res = number1+number2;
        //5、将计算结果返回给前端
        resp.getWriter().write("相加结果:"+res);
    }
}

 注意:

(1)前端代码中id是给js用的,name是form表单提交时给后端用得,要设置name属性。

(2)后端代码中:设置的编码格式是html

🌈3、最终效果

运行代码,获取URL地址,在网页打开.html文件地址

方式1:存在问题:

        计算完之后,不能再进行下一次操作了,因为采用的是form表单的提交,form表单的提交是全部提交,将之前的页面一起提交了,只能计算一次,因此并不适用现实,实际中我们采用的是局部提交的技术,也就是ajax技术,见方式2。

方式2目标:

        方式1点击提交之后,将结果显示在按钮下方,页面保持不变,方便进行下一次操作。


二、方式2:使用ajax形式(最常用&&重点!!!)

🌈1、前端代码:HTML文件

这里使用jQuery的方式,因此首先要将jQuery引入到html文件中。

        jQuery有一个方法叫ajax,当获取到数值不为空的时候,就发送ajax到后端,前端与后端实现交互,就是 ajax实现。因此我要在ajax方法里面设置:我要提交到哪个URL里面?我要传递的参数是什么?最后返回了结果我要怎么去处理这个结果?因为是多个值,所以使用json的形式来传递,用{}实现。


🍈 最终完整html文件代码如下:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>计算器-ajax局部提交</title>
    <!-- 使用jquery方式进行ajax -->
    <!-- 在当前项目中引入jquery-->
    <script src = "jquery.min.js"></script>
</head>
<body>
    <div style="margin-top:50Px;margin-left:40%">
        <h2>计算器</h2>
        <!-- id是给js用的,name是form表单提交时给后端用得,等于后端的key值-->
        数值1:<input id="num1" name = "num1"><p></p>
        数值2:<input id="num2" name = "num2"><p></p>
        <!-- submit是给form表单用的,ajax用button-->

<!--        -------------------显示函数没有被定义-----------------------执行并不成功-->
        <input type = "button" value="相加" onclick="mysub()">
    </div>
    <script>
        // 实现按钮的函数
        
        function mysub(){
            //1、获取控件,进行非空校验
            var num1 = jQuery("#num1");
            var num2 = jQuery("#num2");
            //2、非空校验
            //没有输入任何信息
            if(num1.val().trim() == ""){//.trim()是去空格
                alert("抱歉,请先输入数值!");
                num1.focus();
                return false;
            }
            if(num2.val().trim() == ""){
                alert("抱歉,请先输入数值!");
                num1.focus();
                return false;
            }
            //3、发送ajax到后端:ajax是一个方法
            //需要设置:我要提交到哪个URL里面,我要传递的参数是什么,还有最终返回结果了我要怎么取处理。
            //多个值,所以用Json格式实现
            jQuery.ajax({
                url:"calculator_ajax",//请求地址
                method:"get",//请求方法类型--大小写都可以
                data:{//请求数据
                    "num1":num1.val(),
                    "num2":num2.val()
                },
                //success是一个方法,前面三个都是属性;这个方法接收了一个返回的参数,
                //返回的参数用res对象接收(名字是什么无所谓,反正是后端返回给前端的一个参数)
                success:function(res){
                    //规定后端发送给前端的是一个Json格式的数据{"code":200,"msg":"描述","data":xxx}
                    if(res.code == 200 && res.data == 1){
                        alert("计算的结果是:"+res.data);
                    }else{
                        alert("操作失败!"+res.msg);
                    }
                }
            });           
        }
    </script>
</body>
</html>

🌈2、后端代码:Calculator_ajax.java文件

注意点1:URL要对应

 注意点2:编码格式

 注意点3:学会Json的简单使用:objectMapper

        (下面用的HashMap,乱序,但不影响结果,只要最后有着三个属性值就好了;如果要保证有序性,用LinkedHashMap就行)。


🍈最终后端代码实现:Calculator_ajax.java文件

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;

/**
 * ajax版本
 */
@WebServlet("/calculator_ajax")
public class Calculator_ajax extends HttpServlet {
    //定义成类属性,且不能被修改
    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //-------------------------与form形式的不同点1--------------------------
        //0、设置返回的数据类型和编码:设置为json格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=utf-8");
        //1、从请求req中获取参数num1
        String num1 = req.getParameter("num1");
        String num2 = req.getParameter("num2");
        //2、参数的合法性校验
        if(num1==null || num1.equals("") || num2==null || num2.equals("")){
            //直接返回错误信息
            resp.getWriter().write("抱歉,参数有误");
        }
        //3、进行类型转换String-int
        int number1 = Integer.valueOf(num1);
        int number2 = Integer.valueOf(num2);
        //4、计算相加的结果
        int res = number1+number2;
        //---------------与form形式的不同点2-----------------------
        //5、返回json格式的对象
        //方式1:直接拼:要使用转义字符(不推荐,容易出错)
//        String jsonRes = "{\"code\":200, \"msg\":\"\", \"data\":"+res+"}";
//        resp.getWriter().write(jsonRes);
        //方式2:json工具:将一个字符串转为对象,或者将一个对象转为json字符串
        LinkedHashMap<String,Object> map = new LinkedHashMap<String, Object>();
        map.put("code",200);
        map.put("msg","成功");
        map.put("data",res);
        //返回结果
        String jsonStr = objectMapper.writeValueAsString(map);
        resp.getWriter().write(jsonStr);
     }
}

🌈3、最终效果

注意:如果出错了,F12打开控制台看报错信息。

 然后,我们也可以对上述操作用Fiddler进行抓包观察,同样结果显示是12。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 105. 从前序与中序遍历序列构造二叉树

题目来源&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/ C题解&#xff1a;前序遍历是中左右&#xff0c;中序遍历是左中右&#xff0c;所以拿到两个遍历数组&#xff0c;我们可以从前序遍历首节点获取中间…

Docker 私有仓库

一、私有仓库搭建 拉取私有仓库镜像 docker pull registry 启动私有仓库 docker run -id --nameprivate_registry -p 5000:5000 registry 打开浏览器输入 http://私有仓库服务器IP地址:5000/v2/_catalog 修改 daemon.json 文件 sudo gedit /etc/docker/daemon.json 在…

在Mapper.xml中写复杂的动态SQL语句

说明&#xff1a;在三层架构开发中&#xff0c;使用Mybatis框架操作数据库有两种方式&#xff0c;一种是在Mapper类里的方法上加注解&#xff08;Select、Insert等&#xff09;&#xff0c;另一种是在Mapper.xml文件的标签内写SQL语句。第二种方式相比第一种&#xff0c;具有更…

electron webview 页面加载事件顺序

electron webview 页面加载事件顺序 1.did-start-loading 页面开始加载web 2.load-commit 主页面文档加载框架 3.page-title-updated titledom 4.dom-ready 主页面 dom 加载完成electron 5.load-commit frame文档加载.net 6.did-frame-finish-load frame 加载完成cdn 7.d…

Springboot钉钉免密登录集成(钉钉小程序和H5微应用)

欢迎访问我的个人博客:www.ifueen.com RT&#xff0c;因为业务需要把我们系统集成到钉钉里面一个小程序和一个H5应用&#xff0c;并且在钉钉平台上面实现无感登录&#xff0c;用户打开我们系统后不需要再输入密码即可登录进系统&#xff0c;查阅文档实际操作过之后记录一下过程…

HTML转EXE工具(HTML App Build)永久免费版

HTML转EXE工具&#xff08;HTM2EXE&#xff09;在CSDN上发布时间轴&#xff1a; 序号时间链接12022-08-17HTML转EXE工具&#xff08;HTML App Build&#xff09;初始版22023-02-18HTML转EXE工具&#xff08;HTML App Build&#xff09;最新版32023-06-23&#xff08;实际未发布…

高德地图点聚合报错

最近做项目遇到这样一个玄学问题&#xff1a; 在写高德地图的时候加一个覆盖物 除了金华市其他城市覆盖并且不能点击&#xff0c;金华市内点击获取坐标点这样一个业务&#xff0c; 到这里都很正常&#xff0c;代码奉上 const AMap window.AMapconst state reactive({mapInp…

黑客进行网络欺骗攻击的手段有哪些?

网络欺骗主要方式有&#xff1a;IP 欺骗、ARP 欺骗、DNS 欺骗、Web 欺骗、电子邮件欺骗、源路由欺骗和地址欺骗等。其技术主要分为 HONEYPOT、分布式 HONEYPOT 和欺骗空间技术等。其中&#xff0c;源路由欺骗方式指通过指定路由&#xff0c;以假冒身份与其他主机进行合法通信或…

python实现遗传算法(单目标优化,多目标优化)

首先我们应该熟悉numpy的矩阵取值 [:, 1::2] # 第一维&#xff0c;从第二个元素起步长为2取元素[:, ::2] # 第一维&#xff0c;从第一个元素起步长为2取元素 1 遗传本质 染色体的交叉和变异 种群&#xff1a;很多个个体组成的群体&#xff0c;即为所有可能解的集合个体&…

[muduo学习笔记]事件分发器(Channel、Poller)

此学习笔记参考施磊老师的muduo教学课程。 目的是搞懂 muduo 网络库的核心框架。EventLoop、channel 和 Poller 之间的关系 文章目录 1 Poller 抽象基类2 Channel3 模块的包含muduo模块梳理参考&#xff1a; 整体框架如下&#xff1a; muduo是基于 Reactor 模式的网络库&#…

vue中v-for重复数据处理||element下拉框去除重复

前端去重方法有多种,只说三种常用的(新老方法都有) 1-使用常规双for循环(暴力算法)遍历比较的方式对值进行比较 2-使用js方法sort排序&#xff08;只针对数组&#xff09;&#xff0c;但是经常在vue等新框架中提示TypeError: arr.sort is not a function 3-使用reduce方法(>…

传统后端漏洞----(Web Server) 解析漏洞

笔记 前言IIS解析漏洞文件夹解析漏洞原理限制条件 ";" 分号截断漏洞原理 IIS解析漏洞检测IIS 文件夹解析漏洞检测IIS 分号截断漏洞检测 防御手段 Nginx解析漏洞Nginx 文件类型错误解析漏洞导致任意PHP代码执行原理Nginx 空字节解析漏洞导致任意文件可解析&#xff08…

DB2:DB2TOP解析

文章目录 简介主界面功能介绍快捷设置数据库监控(d)表空间监控(Tablespace)&#xff08;t&#xff09;动态SQL监控(Dynamic SQL)(D)表监控&#xff08;T&#xff09;会话监控(session)(l)缓冲池监控(Bufferpool)(b)锁监控(Locks)(U)瓶颈监控(Bottleneck)(B)load监控(Utilities)…

FastDFS单机部署及SpringBoot整合

前言 FastDFS是一个开源的高性能分布式文件系统。它的主要功能包括&#xff1a;文件存储、文件同步和文件访问&#xff08;文件上传和文件下载&#xff09;&#xff0c;可以解决高容量和负载平衡问题。FastDFS应满足其服务基于文件的网站的要求&#xff0c;如照片共享网站和视…

数据安全服务,美创科技为“数字国贸” 筑牢安全防线

在数字经济蓬勃发展的当下&#xff0c;国有企业作为国民经济的“中流砥柱”&#xff0c;正以主力军和先行者之姿&#xff0c;以数字化转型创新作为引擎&#xff0c;驱动高质量发展。数字化进程持续深入&#xff0c;伴随数据要素多样流动&#xff0c;降低数据安全风险&#xff0…

UART I2C SPI CAN LIN 和ETH这些通讯外设的内在联系

这些不同的通讯手段之间其实有着许多隐藏的共性。 物理层到数据链路层扒一扒这些通讯手段的底层原理。 物理层与数据链路层这两个概念&#xff1a; ISO国际标准化组织在上世纪70年代末&#xff0c; 把计算机网络通信的整个框架描述成了一个七层的模型&#xff0c;并称之为OS…

数据备份技术------概述与总结

数据备份技术------概述与总结 数据备份技术------概述与总结备份技术的发展&#xff08;组网方式&#xff09;1、Host备份方式2、LAN备份方式3、LAN-free备份方式&#xff08;SAN&#xff09;4、Server-free备份方式5、Sever-less备份方式 备份技术的发展&#xff08;主流备份…

Springboot搭配Redis实现接口限流

目录 介绍 限流的思路 代码示例 必需pom依赖 自定义注解 redis工具类 redis配置类 主拦截器 注册拦截器 介绍 限流的需求出现在许多常见的场景中&#xff1a; 秒杀活动&#xff0c;有人使用软件恶意刷单抢货&#xff0c;需要限流防止机器参与活动 某 api 被各式各样…

人工智能系统的技术架构

一、架构图 1.基础层包括&#xff1a; 硬件设施、软件设施、数据资源。其中在硬件设施方面&#xff0c;做深度学习和神经网络训练时候往往会涉及到模型训练是在CPU还是GPU上面&#xff0c;在这个里面GPU就是做计算加速的&#xff0c;第二个是智能芯片&#xff0c;市面上出现的…

linux 系统 最详细 启动流程

文章目录 详细分析 系统启动过程主要流程阶段说明BIOSMBR(Stage 1 bootloader)GROUB(Stage 2 bootloader)kernelvmlinuzinitrd.img Init 详细分析 系统启动过程 主要流程 PC 启动主要流程&#xff0c;分为四个阶段&#xff1a; BIOS -> MBR -> GRUB -> KERNEL ->…