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

目录

一、方式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。


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何确保大模型追求“正确”的目标?丨AI安全与对齐圆桌回顾

导读 在智源大会「AI 安全与对齐」论坛上&#xff0c;与会嘉宾针对目前人们关心的 AI 安全控制标准、多智能体强化学习环境下的安全、开源对 AI 安全的影响、对智能涌现安全的思考等问题展开了讨论。 能力越大&#xff0c;责任越大。 嘉宾名单 谢旻希丨主持人&#xff0c;安远A…

【P61】JMeter JDBC Connection Configuration

文章目录 一、JDBC Connection Configuration 参数说明二、准备工作 一、JDBC Connection Configuration 参数说明 可以给数据源配置不同的连接池&#xff0c;供后续 JDBC 采样器使用&#xff1b;使用前请将对应的数据库驱动复制到 $JMETER_HOME/lib/ 或者 $JMETER_HOME/lible…

【剧前爆米花--爪哇岛寻宝】TCP实现可靠性的方法以及连接相关的三次握手四次挥手

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络编程的文章&#xff0c;在这篇文章中我会具体介绍TCP是如何实现可靠性的并且分析建立断开连接的情况&#xff0c;希望对你有所帮助&#xff01; 目录 可靠性 确认应答 超时…

leecode-下一排列

题目 题目 分析 妈呀&#xff0c;其实我直接调用函数&#xff0c;一行代码就通过了hhh&#xff0c;不过这种取巧的方式不可取&#xff0c;还是得老老实实的写。 首先需要明白什么叫下一排列&#xff1f; 比如输入&#xff1a; 1 5 8 4 7 6 5 3 1 答案就是&#xff1a; 1 5 …

macOS上下载安装Kibana并连接ES

下载Kibana 执行以下命令进行&#xff0c;版本号根据你所用的ES版本选择&#xff0c;比如我的是7.10.0 curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.0-darwin-x86_64.tar.gz解压安装Kibana tar -zxvf kibana-7.10.0-darwin-x86_64.tar.gz进行config…

QT——使用QListWidget、QListWidgetItem、QWidget实现自定义管理列表

作者&#xff1a;小 琛 欢迎转载&#xff0c;请标明出处 文章目录 需求场景思路描述Qt模块QListWidgetQListWidgetItem自定义QWidget配合QListWidget 例子&#xff1a;实现一个json文件管理窗口 需求场景 因工作需要&#xff0c;开发一个文件管理窗口&#xff0c;要让使用者可…

【python爬虫应用03】csdn个人所有文章质量分查询

&#x1f6e0;️ 环境准备 在开始编写代码之前&#xff0c;我们需要进行一些环境准备。以下是所需的环境和库&#xff1a; 操作系统&#xff1a;Windows编程语言&#xff1a;Python 3编辑器&#xff1a;VSCode&#xff08;可选&#xff09; 安装所需的库&#xff1a; reque…

Git快速入门

Git 1、Git概述Git简介Git下载与安装 2、Git代码托管服务常用的Git代码托管服务使用码云托管服务 3、Git常用命令Git全局设置获取Git仓库工作区、暂存区、版本库概念本地仓库常用命令远程仓库操作命令分支操作标签操作 4、在IDEA中使用Git在IDEA中配置Git获取Git仓库本地仓库操…

OpenAI Gym入门与实操(2)

本文内容参考&#xff1a; Getting Started With OpenAI Gym | Paperspace Blog&#xff0c; 【强化学习】 OpenAI Gym入门&#xff1a;基础组件&#xff08;Getting Started With OpenAI Gym: The Basic Building Blocks&#xff09;_iioSnail的博客-CSDN博客 3. 环境&#…

Blender导出gltf格式ThreeJS不显示问题-

1. 检查代码 import { GLTFLoader } from three/addons/loaders/GLTFLoader.js; 。。。。。。initRoomGltf() {const _this this;// const loader new OBJLoader();const loader new GLTFLoader();// load a resourceloader.load(// resource URL// this.commonFunc.getPat…

vcruntime140_1.dll无法继续执行代码,有哪些方法可以解决?

关于vcruntime140_1.dll无法继续执行代码的错误问题&#xff0c;其实还是非常的普遍的&#xff0c;这属于经常丢失的dll文件之一&#xff0c;当然还有一个vcruntime140.dll也是非常容易丢失的&#xff0c;本文下面会介绍到这两种有啥区别&#xff0c;以及怎么去修复这些文件丢失…

spring复习:(4)AbstractEnvironment

该类中指定了激活profile属性的名称(spring.profiles.active)&#xff0c;默认profile属性的名称(spring.profiles.default)&#xff0c;以及默认的profile的名字(default)。

【Leetcode】19.删除链表的倒数第 N 个结点

一、题目 1、题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例2: 输入:head = [1], n = 1 输出:[]示例3: 输入:head = [1,2], n = 1 输出:[1]提示: 链表中结点的数目为 sz…

【剑指offer专项突破版】二叉树篇——“C“

文章目录 前言一、二叉树剪枝题目分析思路分析代码 二、序列化与反序列化二叉树题目分析思路分析代码 三、从根节点到叶节点的路径数字之和题目分析思路分析代码 四、 向下的路径节点之和题目分析思路分析思路①代码思路②代码 五、节点之和最大的路径题目分析思路分析代码 六、…

XSS注入——DOM型XSS

DOM型xss XSS根据恶意脚本的传递方式可以分为3种&#xff0c;分别为反射型、存储型、DOM型&#xff0c;前面两种恶意脚本都会经过服务器端然后返回给客户端&#xff0c;相对DOM型来说比较好检测与防御&#xff0c;而DOM型不用将恶意脚本传输到服务器在返回客户端&#xff0c;这…

Elasticsearch 地理空间计算

地理位1置搜索&#xff1a;使用查询API进行搜索 1、Geo Distance Query Geo Distance Query是在给定的距离范围内搜索数据的查询。例如&#xff0c;可以搜索给定地理位置附近指定距离内的所有文档。 GET /my_index/_search {"query": {"bool" : {"fi…

9、Redis集群(cluster)

是什么 Redis集群是一个提供在多个Redis节点间共享数据的程序集&#xff0c;Redis集群可以支持多个master 能干嘛 Redis集群支持多个master&#xff0c;每个master又可以挂载多个slave 读写分离 支持数据的高可用 支持海量数据的读写存储操作 由于Cluster自带Sentinel的故障转…

软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

目录 掌握的知识点 创建型 结构型 行为型 掌握的知识点 设计模式分为哪3类 每一类包含哪些具体的设计模式 创建型 创建型模式是对对象实例化过程的抽象&#xff0c;他通过抽象类所定义的接口&#xff0c;封装了系统中对象如何创建、组合等信息。 创建型模式主要用于创建对…

Buildroot 取消默认QT桌面-迅为RK3588开发板

本小节将讲解如何取消掉默认的 qt 桌面。 首先对开发板进行上电&#xff0c;开发板正常启动后&#xff0c;使用命令“cd /etc/init.d”进入到/etc/init.d 目录 下&#xff0c;然后使用以下命令对开机自启动脚本 rcS 进行查看&#xff0c;如下图所示&#xff1a; vi rcS 从上…

视觉SLAM十四讲需要提前知道的数学基础知识

学习视觉SLAM十四讲之前的必备数学基础知识 1. 正交矩阵2. 线性关系3. 求矩阵的逆4. 叉乘5.反对称矩阵6. 复数 1. 正交矩阵 定义&#xff1a; 设n阶矩阵A满足AATATAI &#xff0c;则称A为正交矩阵 性质&#xff1a; 以下为手写&#xff0c;从小字丑&#xff0c;请多担待。。 …