servlet和vue的增删改查

news2024/11/24 4:52:57

1.servlet实现步骤

Servlet->新增

servlet获取请求参数,将参数转化为对象,调用service

@WebServlet("/addService")
public class addAllService extends HttpServlet {

    private BrandService brandService = new BrandServiceimpl() ;

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.接收请求传递的数据
        BufferedReader reader = req.getReader();
        String param = reader.readLine();
        //2.将 param 转化为对象
        Brand brand = JSON.parseObject(param,Brand.class);
        //3.调用service的新增方法
        brandService.add(brand);
        //4.响应数据
        resp.getWriter().write("success");
    }
}

service调用mapper方法进行查询


public class BrandServiceimpl implements BrandService {

//   1. 创建sql工程对象
    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

 @Override
    public void add(Brand brand) {
        // 2. 获取sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获得mapper对象
        BrandMapper brandMapper = (BrandMapper)sqlSession.getMapper(BrandMapper.class);
        // 4.调用方法
        brandMapper.add(brand);
        // 5.提交事物 增加/删除/修改
        sqlSession.commit();
        // 6.关闭资源
        sqlSession.close();
    }
}

Vue: 将输入的数据赋值给模型,给确定按钮绑定单机事件,发送请求时,将数据发送到服务器段,接收服务器响应的数据,进行判断

        <el-form ref="form" :model="brand" label-width="80px">
            <el-form-item label="品牌名称">
                <el-input v-model="brand.brandName"></el-input>
            </el-form-item>

            <el-form-item label="企业名称">
                <el-input v-model="brand.companyName"></el-input>
            </el-form-item>

            <el-form-item label="排序">
                <el-input v-model="brand.ordered"></el-input>
            </el-form-item>

            <el-form-item label="备注">
                <el-input type="textarea" v-model="brand.description"></el-input>
            </el-form-item>

            <el-form-item label="状态">
                <el-switch v-model="brand.status"
                           active-value="1"
                           inactive-value="0"
                ></el-switch>
            </el-form-item>


            <el-form-item>
                <el-button type="primary" @click="addBrand">提交</el-button>
                <el-button @click="dialogVisible = false">取消</el-button>
            </el-form-item>
        </el-form>

    </el-dialog>

new Vue({
        el: "#app",
        methods: {
        addBrand(){
                // 添加点击确定时,调用这个方法
                var _this = this;
                axios({
                    method:"post",
                    url:"http://localhost:8080/brand/brand/add",
                    data:_this.brand   //发送到服务器的数据
                }).then(function (response) {  //请求过去获取响应数据
                   if (response.data == "success"){
                       //添加成功,关闭窗口
                       _this.dialogVisible = false
                       //再次调用方法,查询所有的方法
                       _this.selectAll();
                       // 添加成功提示框
                           _this.$message({
                               message: '操作成功',
                               type: 'success'
                           });
                   }
                })
            }
        }
        data() {

  // 品牌模型数据
                brand: {
                    status: '',
                    brandName: '',
                    companyName: '',
                    id:"",
                    ordered:"",
                    description:""
                }
}

在这里插入图片描述

servlet -> 查询

servlet 调用service的方法处理请求,将查询到的数据响应回去

@WebServlet("/selectAllService")
public class SelectAllService extends HttpServlet {

    private BrandService brandService = new BrandServiceimpl() ;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.调用service方法
        List<Brand> brands = brandService.selectAll();
        // 2.将方法转化为json
        String s = JSON.toJSONString(brands);
        // 响应浏览器数据
        resp.setContentType("text/json;charset=utf-8");
        resp.getWriter().write(s);
    }
    }

service调用mapper处理请求

public class BrandServiceimpl implements BrandService {

//   1. 创建sql工程对象
    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

    @Override
    public List<Brand> selectAll() {
        // 2. 获取sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获得mapper对象
        BrandMapper brandMapper = (BrandMapper)sqlSession.getMapper(BrandMapper.class);
        // 4.调用方法
        List<Brand> brands = brandMapper.selectAll();
        // 5.关闭资源
        sqlSession.close();
        return brands;
    }
    }

vue:当页面完成的时候,调用方法,获取数据,将响应的数据赋值到数据模型中

   new Vue({
        el: "#app",
        mounted(){
          // 当页面加载完成,获取数据
            this.selectAll();
        },
        methods: {
            // 查询所有数据的方法
            selectAll(){
                var _this = this;
                axios({
                    method:"get",
                    url:"http://localhost:8080/brand/brand/selectAll",
                }).then(function (response) {  //请求过去获取响应数据
                    _this.tableData = response.data; // 响应的数据,复制给表单属性
                })
            }
            data() {
            return {
                    tableData: [{
                    brandName: '',
                    companyName: '',
                    ordered: '',
                    status: ""
                }]
                }
            }
表格数据:
 <!--表格-->
    <template>
        <el-table
                :data="tableData"
                style="width: 100%"
                :row-class-name="tableRowClassName"
                @selection-change="handleSelectionChange"
        >
            <el-table-column
                    type="selection"
                    width="55">
            </el-table-column>
            <el-table-column
                    type="index"
                    width="50">
            </el-table-column>

            <el-table-column
                    prop="brandName"
                    label="品牌名称"
                    align="center"
            >
            </el-table-column>
            <el-table-column
                    prop="companyName"
                    label="企业名称"
                    align="center"
            >
            </el-table-column>
            <el-table-column
                    prop="ordered"
                    align="center"
                    label="排序">
            </el-table-column>
            <el-table-column
                    prop="status"
                    align="center"
                    label="当前状态">
            </el-table-column>

            <el-table-column
                    align="center"
                    label="操作">

                <el-row>
                    <el-button type="primary">修改</el-button>
                    <el-button type="danger">删除</el-button>
                </el-row>

            </el-table-column>

        </el-table>
    </template>

在这里插入图片描述
利用反射的方式,自动处理请求

public class BashServiet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取请求路径
        String requestURI = req.getRequestURI();
        // 2.获取请求最后的方法
        int i = requestURI.lastIndexOf('/');
        // 3. 获取方法名称
        String addBrand = requestURI.substring(i+1);
        // 4.获取方法,执行方法,
        Class<? extends BashServiet> aClass = this.getClass();
        try {
            Method method = aClass.getMethod(addBrand, HttpServletRequest.class, HttpServletResponse.class);
            // 调用方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

在这里插入图片描述

批量删除

servlet将请求转化为数组,调用service处理方法

    public void  deleteByIds(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.接收请求传递的数据
        BufferedReader reader = req.getReader();
        String param = reader.readLine();
        // 2.Json转化为数组
        int[] ids = JSON.parseObject(param, int[].class);

        brandService.deleteByIds(ids);
        resp.getWriter().write("success");
    }

service处理方法

    @Override
    public void deleteByIds(int[] ids) {
        // 2. 获取sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获得mapper对象
        BrandMapper brandMapper = (BrandMapper) sqlSession.getMapper(BrandMapper.class);
        brandMapper.deleteByIds(ids);
        // 5.提交事物 增加/删除/修改
        sqlSession.commit();
        // 6.关闭资源
        sqlSession.close();
    }

vue:


            // 批量删除
            deleteByIds(){

                this.$confirm('此操作将删除该数据, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    //用户点击确认按钮

                    //1. 创建id数组 [1,2,3], 从 this.multipleSelection 获取即可
                    for (let i = 0; i < this.multipleSelection.length; i++) {
                        let selectionElement = this.multipleSelection[i];
                        this.selectedIds[i] = selectionElement.id;
                    }

                    //2. 发送AJAX请求
                    var _this = this;

                    // 发送ajax请求,添加数据
                    axios({
                        method:"post",
                        url:"http://localhost:8080/brand/brand/deleteByIds",
                        data:_this.selectedIds
                    }).then(function (resp) {
                        if(resp.data == "success"){
                            //删除成功3.
                            // 重新查询数据
                            _this.selectAll();
                            // 弹出消息提示
                            _this.$message({
                                message: '恭喜你,删除成功',
                                type: 'success'
                            });

                        }
                    })
                }).catch(() => {
                    //用户点击取消按钮
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                });

            }

        },
        data() {
            return {
                  // 被选中的数组
                selectedIds:[]
                }
            }

在这里插入图片描述
在这里插入图片描述

查询/分页

servlet接收请求,调用sevice进行查询,将结果返回到浏览器。

  public void selectByPageAndCondition(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 接收 当前页码 和 每页展示条数    url?currentPage=1&pageSize=5
        String _currentPage = request.getParameter("currentPage");
        String _pageSize = request.getParameter("pageSize");

        int currentPage = Integer.parseInt(_currentPage);
        int pageSize = Integer.parseInt(_pageSize);

        // 获取查询条件对象
        BufferedReader br = request.getReader();
        String params = br.readLine();//json字符串

        //转为 Brand
        Brand brand = JSON.parseObject(params, Brand.class);


        //2. 调用service查询
        PageBean<Brand> pageBean = brandService.selectByPageAndCondition(currentPage,pageSize,brand);

        //2. 转为JSON
        String jsonString = JSON.toJSONString(pageBean);
        //3. 写数据
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }

service调用mapper接口处理请求

@Override
    public PageBean<Brand> selectByPageAndCondition(int currentPage, int pageSize, Brand brand) {
        //2. 获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //3. 获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);


        //4. 计算开始索引
        int begin = (currentPage - 1) * pageSize;
        // 计算查询条目数
        int size = pageSize;

        // 处理brand条件,模糊表达式
        String brandName = brand.getBrandName();
        if (brandName != null && brandName.length() > 0) {
            brand.setBrandName("%" + brandName + "%");
        }

        String companyName = brand.getCompanyName();
        if (companyName != null && companyName.length() > 0) {
            brand.setCompanyName("%" + companyName + "%");
        }


        //5. 查询当前页数据
        List<Brand> rows = mapper.selectByPageAndCondition(begin, size, brand);

        //6. 查询总记录数
        int totalCount = mapper.selectTotalCountByCondition(brand);

        //7. 封装PageBean对象
        PageBean<Brand> pageBean = new PageBean<>();
        pageBean.setRows(rows);
        pageBean.setTotalCount(totalCount);


        //8. 释放资源
        sqlSession.close();

        return pageBean;
    }

mapper处理请求

在这里插入代码片
    <!-- 分页-->  
    <select id="selectByPageAndCondition" resultMap="brandResultMap">
        select *
        from tb_brand
--         如果if符合条件,则拼接查询
        <where>
            <if test="brand.brandName != null and brand.brandName != '' ">
                and  brand_name like #{brand.brandName}
            </if>

            <if test="brand.companyName != null and brand.companyName != '' ">
                and  company_name like #{brand.companyName}
            </if>

            <if test="brand.status != null">
                and  status = #{brand.status}
            </if>

        </where>

        limit #{begin} , #{size}

    </select>
<!--    查询总记录数,每有查询时,不拼接查询条件-->
    <select id="selectTotalCountByCondition" resultType="java.lang.Integer">

        select count(*)
        from tb_brand
        <where>
            <if test="brandName != null and brandName != '' ">
                and  brand_name like #{brandName}
            </if>

            <if test="companyName != null and companyName != '' ">
                and  company_name like #{companyName}
            </if>

            <if test="status != null">
                and  status = #{status}
            </if>

        </where>

vue
在这里插入图片描述
点击第几页就发送请求到第几页
在这里插入图片描述

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

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

相关文章

云计算之虚拟化技术学习(KVM/Xen/Hyper-V/VMware)

文章目录虚拟化技术什么是虚拟化服务器虚拟化cpu的虚拟化内存虚拟化管理硬盘的虚拟化网络虚拟化IO虚拟化Intel虚拟化技术主流的虚拟化技术虚拟化技术对比XenKVMHyper-VVMware ESX/ESXi虚拟化服务平台Libvirt基于KVM的虚拟化服务平台虚拟化技术 什么是虚拟化 虚拟化是云计算的…

最长公共子序列长度

求两个字符串的最长公共子序列长度。 输入格式: 输入长度≤100的两个字符串。 输出格式: 输出两个字符串的最长公共子序列长度。 输入样例1: ABCBDAB BDCABA输出样例1: 4输入样例2: ABACDEF PGHIK输出样例2: 0 (1条消息) HBU训练营【动态规划DP】——最长公共子序列长…

力扣(LeetCode)799. 香槟塔(C++)

动态规划 设 iii 是行 , jjj 是列 &#xff0c; f[i][j]f[i][j]f[i][j] 表示经过杯子的酒量 &#xff0c;初始 f[0][0]pouredf[0][0]pouredf[0][0]poured &#xff0c; 为了理解&#xff0c;当做每个杯子有无限容量。 当香槟溢出时&#xff0c;f[i][j]f[i][j]f[i][j] 保留自己的…

放大镜-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第80讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

SpringCloud系列(一)Eureka 注册中心

本文主要介绍 Eureka 用来做什么&#xff1f; 如何搭建以及测试&#xff1b;  微服务框架区分于普通的单体架构项目&#xff0c;它是一种经过良好架构设计的分布式架构方案&#xff0c;根据业务功能对系统进行拆分&#xff0c;将每个业务模块都当做是一个独立的项目进行开发&a…

session共享问题及四种解决方案-前端存储、session的复制 、session粘性、后端存储(Mysql、Redis等)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 常用工具类以及常见问题处理方法 &#x1f308; 每日一语&…

Alos PALSAR 12.5米免费DEM下载教程

Alos PALSAR 12.5米免费DEM下载教程ALOS 12.5米数据简介2. 下载2.1 搜索数据2.2 下载数据3. 使用数据ALOS 12.5米数据简介 ALOS 12.5m DEM 数据&#xff0c;是使用ALOS&#xff08;Advanced Land Observing Satellite&#xff09;卫星相控阵型L波段合成孔径雷达&#xff08;PA…

SpringBoot + EasyExcel 实现表格数据导入

1. 准备 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version><scope>compile</scope> </dependency><dependency><groupId>org.proj…

使用vi、vim、sed、echo、cat操作文件

记录&#xff1a;324 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用vi编辑器、vim编辑器、sed编辑器操作文件读、写、删、替换等操作&#xff1b;使用echo命令和cat命令将内容输出文件并查看内容。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 1.vi编辑器…

同花顺_代码解析_技术指标_R

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 RAD RADER RCCD ROC ROCFS RSI RSIFS RAD 威力雷达 大盘指标。 RAD的判断基准法与传统指标相似: 白线上穿黄线为金叉,示强势,为买入建仓机会参考&#xff1b; 白线下穿黄线为…

红黑树的插入(C++实现)

1. 红黑树 1.1 概念 红黑树是一种二叉搜索树&#xff0c;它是AVL树的优化版本。红黑树是每个节点都带有颜色属性的二叉搜索树&#xff0c;颜色为红色或黑色。 之所以选择“红色”是因为这是作者在帕罗奥多研究中心公司Xerox PARC工作时用彩色雷射列印机可以产生的最好看的颜色…

Java学习之包访问修饰符

基本介绍 java 提供四种访问控制修饰符号&#xff0c;用于控制方法和属性(成员变量)的访问权限&#xff08;范围&#xff09; 公开级别:用 public 修饰,对外公开受保护级别:用 protected 修饰,对子类和同一个包中的类公开默认级别:没有修饰符号,向同一个包的类公开.私有级别:…

采用sFlow工具实现流量监控--实验

采用sFlow工具实现流量监控--实验采用sFlow工具实现流量监控---实验学习目标学习内容实验原理实验拓扑实验仿真启动sFlow-rt以及floodlight控制器创建拓扑部署sFlow agent步骤1.步骤2.步骤3步骤4步骤5.步骤6.总结申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&…

C++模拟OpenGL库——图形学状态机接口封装(一):用状态模式重构部分代码及接口定义

目录 什么是状态机&#xff1f; 基于状态机模式进行重构 Canvas.h源码 什么是状态机&#xff1f; 回顾之前两部分内容&#xff0c;我们做了&#xff1a; 绘制点绘制线&#xff08;Brensenham&#xff09;绘制三角形&#xff08;拆分法&#xff09;图片操作&#xff08;stb…

RabbitMQ------延迟队列(整合SpringBoot以及使用延迟插件实现真正延时)(七)

RabbitMQ------延迟队列&#xff08;七&#xff09; 延迟队列 延迟队列&#xff0c;内部是有序的&#xff0c;特点&#xff1a;延时属性。 简单讲&#xff1a;延时队列是用来存放需要在指定时间被处理的元素队列。 是基于死信队列的消息过期场景。 适用场景 1.订单在十分钟…

Linux(centos7)安装MySQL5.7

Linux 安装MySQL5.7 数据库 所有的安装方式是基于手动式的安装&#xff0c;也就是整体的下载然后配置 rpm与yum之间的关系 rpm 是Linux 免除编译安装带来的安装方式&#xff0c;而yum 是在rpm 上面的进一步的优化&#xff0c;换句话说yum 既包含了rpm 的简单安装&#xff0c…

百度地图自定义覆盖物(html)格式

<style type"text/css"> body, html{ width: 100%; height: 100%; overflow: hidden; margin: 0; font-family: "微软雅黑"; display: flex; justify-content: space-between; } #cont…

使用html+css实现一个静态页面(厦门旅游网站制作6个页面) 旅游网页设计制作 HTML5期末考核大作业,网站——美丽家乡。 学生旅行 游玩 主题住宿网页

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

FL Studio2023水果完整中文版音乐制作软件

FL Studio2023水果中文版是一款由 Image Line 公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。它可以播放由你指定或加入的…

IP包头分析

数据来源 IP包头长度 ip包头的长度在20-60个字节间&#xff0c;一般是20字节&#xff08;固定部分&#xff09;&#xff0c;可选项最大是40个字节&#xff08;比较少用&#xff09;。 第一行 版本 就是指出IP数据包是什么版本&#xff1b;常见的版本就是0100 IPV4和 0110 IPV6…