超详细的JavaWeb用户的增删改查实现总结

本文详述了使用Spring+SpringMvc+MyBatis实现的JavaWeb角色维护功能,包括分页查询、全选、批量删除、新增和更新操作,以及如何处理异步请求的异常。前端利用Bootstrap+Ajax+Jsp,后端涉及Controller、Service和Mapper的实现细节。
摘要由CSDN通过智能技术生成

前言

本文是基于单体架构实现的角色的增删改查的功能。前台使用Bootstrap+Ajax+Jsp , 后端使用Spring+SpringMvc+MyBatis进行开发,相信使用过这些技术的小伙伴应该很好的理解以下的内容,也希望看了这篇文章小伙伴们有所收获。

准备工作

后端技术

技术 说明 官网
Spring Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。 https://spring.io/
SpringMvc MVC框架 https://spring.io/projects/spring-boot
MyBatis 持久层框架 https://mybatis.org/mybatis-3/zh/index.html
Druid 数据库连接池 https://github.com/alibaba/druid
log4j 日志框架 https://logging.apache.org/log4j/2.x/

前端技术

Bootstrap 简洁、直观、强悍的前端开发框架 https://www.bootcss.com/
Ajax 前后端交互 https://www.w3school.com.cn/ajax/index.asp
Jsp 模板引擎 https://www.runoob.com/jsp/jsp-intro.html
layer.js 消息提示 http://www.h-ui.net/lib/layer.js.shtml
Modal插件 模态框(Modal)是覆盖在父窗体上的子窗体 https://www.runoob.com/bootstrap/bootstrap-modal-plugin.html
jquery.pagination.js 分页插件 http://www.jq22.com/yanshi5697/

角色维护-分页实现

分页前端功能实现

创建外部JavaScript源文件,role.js

在页面 role-page.jsp引入role.js文件

<script type="text/javascript" src="script/my-role.js"></script>
初始化全局函数

分页实现初始化全局函数,每页的条数,页码,模糊查询的关键词

//初始化全局变量
function initGlobalVariable() {
   
    window.pageSize = 5; //每页的条数
    window.pageNum = 1;  //页码
    window.keyword = ""; //关键词
}
声明分页函数
//给服务器发送请求获取分页数据(pageInfo),并在页面上显示分页效果(主体、页码导航条)
function showPage() {
   

    // 给服务器发送请求获取分页数据:PageInfo
    var pageInfo = getPageInfo();

    // 在页面上的表格中tbody标签内显示分页的主体数据
    generateTableBody(pageInfo);

    // 在页面上的表格中tfoot标签内显示分页的页码导航条
    initPagination(pageInfo);
}

获取分页数据

function getPageInfo() {
   

    // 以同步请求方式调用$.ajax()函数并获取返回值(返回值包含全部响应数据)
    var ajaxResult = $.ajax({
   
        "url": "role/search/by/keyword.action",
        "type": "post",
        "data": {
   
            "pageNum": (window.pageNum == undefined) ? 1 : window.pageNum,
            "pageSize": (window.pageSize == undefined) ? 5 : window.pageSize,
            "keyword": (window.keyword == undefined) ? "" : window.keyword
        },
        "dataType": "json",
        "async": false	// 为了保证getPageInfo()函数能够在Ajax请求拿到响应后获取PageInfo,需要设置为同步操作
    });
    
    // 从全部响应数据中获取JSON格式的响应体数据
    var resultEntity = ajaxResult.responseJSON;

    // 从响应体数据中获取result,判断当前请求是否成功
    var result = resultEntity.result;

    // 如果成功获取PageInfo
    if (result == "SUCCESS") {
   
        return resultEntity.data;
    }

    if (result == "FAILED") {
   
        layer.msg(resultEntity.message);
    }

    return null;
}

使用PageInfo数据在tbody标签内显示分页数据

function generateTableBody(pageInfo) {
   
    // 执行所有操作前先清空
    $("#roleTableBody").empty();   //这个对应页面的 <tbody id="roleTableBody"> </tbody>
    // 获取数据集合
    var list = pageInfo.list;

    // 判断list是否有效
    if (list == null || list.length == 0) {
   
        $("#roleTableBody").append("<tr><td colspan='4' style='text-align:center;'>没有查询到数据!</td></tr>");
        return;
    }

    for (var i = 0; i < list.length; i++) {
   

        var role = list[i];

        var checkBtn = "<button type='button' class='btn btn-success btn-xs'><i class=' glyphicon glyphicon-check'></i></button>";
        var pencilBtn = "<button type='button' id='roleTableBody'  roleid='" + role.id + "' class='btn btn-primary btn-xs  editBtn'><i class=' glyphicon glyphicon-pencil'></i></button>";
        var removeBtn = "<button type='button'   roleid='" + role.id + "'  class='btn btn-danger btn-xs  removeBtn'><i class=' glyphicon glyphicon-remove'></i></button>";

        var numberTd = "<td>" + (i + 1) + "</td>";
        var checkBoxTd = "<td><input class='itemBox' roleid='" + role.id + "' type='checkbox'></td>";
        var roleNameTd = "<td>" + role.name + "</td>";
        var btnTd = "<td>" + checkBtn + " " + pencilBtn + " " + removeBtn + "</td>";

        var tr = "<tr>" + numberTd + checkBoxTd + roleNameTd + btnTd + "</tr>";

        // 将前面拼好的HTML代码追加到#roleTableBody中
        $("#roleTableBody").append(tr);
    }
}

声明函数封装导航条初始化操作

function initPagination(pageInfo) {
   

    // 声明变量存储分页导航条显示时的属性设置
    var paginationProperties = {
   
        num_edge_entries: 3,			//边缘页数
        num_display_entries: 5,		//主体页数
        callback: pageselectCallback,	//回调函数
        items_per_page: window.pageSize,	//每页显示数据数量,就是pageSize
        current_page: (window.pageNum - 1),//当前页页码
        prev_text: "上一页",			//上一页文本
        next_text: "下一页"			//下一页文本
    };

    // 显示分页导航条 <div id="Pagination" class="pagination"> <!-- 这里显示分页 --> </div>
    $("#Pagination").pagination(pageInfo.total, paginationProperties);
}

在每一次点击“上一页”、“下一页”、“页码”时执行这个函数跳转页面

function pageselectCallback(pageIndex, jq) {
   

    // 将全局变量中的pageNum修改为最新值
    // pageIndex从0开始,pageNum从1开始
    window.pageNum = pageIndex + 1;

    // 调用分页函数重新执行分页
    showPage();

    return false;
}

页面初始化,就是我们点击角色维护页面需要加载的内容

$(function(){
   
	
	// 调用分页参数初始化方法
	initGlobalVariable();
	// 执行分页
	showPage();
});

关键词查询功能

在点击“查询”按钮后,获取文本框中填写的keyword值,赋值给全局变量keyword,调用showPage()函数即可。

//关键字查询实现
        $("#searchBtn").click(function () {
   
            //获取关键字查询的值
            var keywordInput = $.trim($("#keywordInput").val());
            /*if (keywordInput==null || keywordInput==""){
            	layer.msg("请输入关键词");
            	return;
			}*/
            window.keyword = keywordInput;
            //执行查询操作
            showPage();

        });

分页后端实现

点击角色维护加载页面数据两种思路:

第一种是我们请求后台把查询到的数据放到Model,前台遍历把数据展示出来。

第二种是我们请求后台把查询到的数据当PageInfo,然后动态的拼接把数据展示到页面上。(我们采用第二种)

Controller方法的实现
@ResponseBody
    @RequestMapping("/role/search/by/keyword")
    public ResultEntity<PageInfo<Role>> search(
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
            @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
            @RequestParam(value = "keyword", defaultValue = "") String keyword) {
   

        // 1.查询得到PageInfo对象
        PageInfo<Role> pageInfo = roleService.queryForKeywordWithPage(pageNum, pageSize, keyword);

        // 2.封装结果对象返回
        return ResultEntity.successWithData(pageInfo);
    }
Service方法的实现
public PageInfo<Role> queryForKeywordWithPage(Integer pageNum, Integer pageSize, String keyword) {
   
		// 1.开启分页功能
		PageHelper.startPage(pageNum, pageSize);

		// 2.执行查询
		List<Role> list = roleMapper.selectForKeywordSearch(keyword);

		// 3.封装为PageInfo对象
		return new PageInfo<Role>
Javaweb是一个基于Java技术的Web开发框架,它结合了Java语言的强大特性和Web开发的灵活性,使开发人员能够快速构建高性能、高可靠性的Web应用程序。 在javaweb开发中,MVC架构被广泛应用:M代表Model(数据模型),是应用程序中处理数据的部分,V代表View(视图),是应用程序中呈现数据的部分,C代表Controller(控制器),是应用程序中协调Model和View之间交互的部分,实现了将业务逻辑和用户界面分离的目的。 在实现增删改查功能时,首先需要对数据模型进行设计并编写相应的Java类,用于映射数据库中的表。同时,在控制器中编写相应的方法,处理用户请求,并实现对数据模型的操作,例如添加、删除、修改和查询等操作。在视图中,需要开发者编写相应的页面,实现用户操作界面。其中,JSP和Servlet是实现控制器和视图的两种主要方式。 对于添加功能,在视图中,需要编写一个表单,用于接收用户输入的数据;在控制器中,在相应的方法中,对表单数据进行验证和存储操作;最后,应该向用户显示添加成功的消息或跳转到相应的页面。 对于删除功能,用户需要提供要删除的数据ID。在控制器中,需要对相应的数据进行删除操作,最后通知用户成功删除或者跳转到相应的页面。 对于修改功能,用户需要提供要修改的数据ID,在视图中提供修改相应数据的表单。在控制器中,需要对接收到的数据进行验证,并对相应的数据进行修改操作。最后通知用户修改成功或跳转到相应的页面。 对于查询功能,需要根据用户提供的查询条件在数据模型中进行查询,在控制器中将查询结果返回给视图展示给用户。 总之,在实现增删改查功能时,需要清晰的MVC架构,合理的设计数据模型和操作方法,并编写相应的视图页面,最后实现对控制器和模型的交互操作,从而达到实现增删改查功能的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值