JavaWeb-end

综合案例-1

查询所有-后台&前台

  1. 前端页面(brand.html)

    页面加载完成后,自动发送一个异步请求(AJAX),向后端请求品牌列表数据。拿到响应数据后,将其设置到页面对应的数据模型上,用于渲染展示。

  2. Web层(SelectAllServlet)

    接收到前端的异步请求后,调用Service层的selectAll方法进行业务查询。得到返回的List<Brand>集合后,将该集合转换为JSON格式字符串,最后通过响应对象将JSON数据返回给前端。

  3. Service层(BrandService)
    selectAll方法被调用后,直接调用Dao层的brandMapper.selectAll()方法,获取所有品牌数据的列表,并将结果原样返回给Web层。

  4. Dao层(BrandMapper)
    selectAll()方法执行数据库查询(例如SQL的SELECT * FROM brand),返回一个包含所有品牌记录的List<Brand>集合。

新增品牌-后台&前端

1. 前端页面(brand.html)

用户点击提交按钮后,页面收集表单中的品牌数据,通过异步请求(AJAX)将这些数据发送给后端。收到后端返回的成功标识后,前端判断添加操作成功,然后关闭当前添加窗口,并重新加载品牌列表数据以刷新页面显示。

2. Web层(AddServlet)

接收前端发来的品牌数据,随后调用Service层的add方法进行添加操作。添加完成后,向前端响应一个表示操作成功的标识。

3. Service层(BrandService)
add方法接收Web层传入的品牌对象,调用Dao层的brandMapper.add(brand)方法,将该品牌数据传递下去。

4. Dao层(BrandMapper)
add(brand)方法执行数据库的插入操作(例如SQL的INSERT INTO brand语句),将品牌数据持久化到数据库中。

综合案例-2

Servlet代码优化

·Web层的Servlet个数太多了,不利于管理和编写

·将Servlet进行归类,对于同一个实体的操作方法,写到一个Servlet中。

1.获取最后一段路径,其实就是方法名称

2.通过反射获取方法对象,执行方法

自定义Servlet,使用请求路径进行方法分发;替换HttpServlet的灯具请求凡是进行方法分发

批量删除

1. 前端页面(brand.html)

用户点击"批量删除"按钮后,前端收集所有被勾选的品牌ID,组成一个ID数组。然后发送一个异步请求(AJAX),将这个ID数组作为请求数据提交给后端。收到后端返回的成功标识后,前端判断删除操作是否成功,向用户给出操作结果的提示(如"删除成功"),并重新查询加载品牌列表数据,刷新页面。

2. Web层(BrandServlet 或专门的删除Servlet)

接收前端发来的ID数组数据。随后调用Service层的deleteByIds方法,将该ID数组传入进行批量删除操作。删除完成后,向前端响应一个表示操作成功的标识。

3. Service层(BrandService)
deleteByIds(int[] ids)方法接收Web层传入的ID数组,调用Dao层的brandMapper.deleteByIds(ids)方法,将待删除的ID集合传递下去。

4. Dao层(BrandMapper)
deleteByIds(int[] ids)方法执行数据库的批量删除操作。对应的SQL语句为 DELETE FROM tb_brand WHERE id IN (?, ?, ?)(问号个数根据数组长度动态生成)。在MyBatis等持久层框架中,通过 <foreach> 标签动态拼接多个ID占位符,最终将数组中的ID传入SQL,完成数据库记录的删除。

分页查询

前端传递给后台:1.当前页码:currentPage 2.每页显示条数:pageSize

后台给前端返回:1.当前页数据:List 2.总记录数:totalCount

1. 前端页面(brand.html)

页面加载完成后,自动发送一个异步请求(AJAX),携带当前页码(page)和每页显示条数(size)作为请求参数,向后端请求分页数据。收到响应后,获取分页结果(包含列表数据和总记录数等),用于页面渲染。

2. Web层(BrandServlet)

接收到前端的异步请求,获取参数中的"当前页码"和"每页显示条数"。随后调用Service层的分页查询方法,并得到封装好的PageBean对象。将该PageBean转换为JSON格式字符串,通过响应写回客户端。

3. Service层(BrandService)

接收当前页码和每页显示条数两个参数。首先根据页码和每页条数计算起始索引(begin),即数据库查询的偏移量。然后调用Dao层的两个方法:

  • 调用brandMapper.selectByPage(begin, size),查询该页对应的品牌列表数据;

  • 调用brandMapper.selectTotalCount(),查询品牌的总记录数。

    最后将列表数据和总记录数组装进PageBean对象,返回给Web层。

4. Dao层(BrandMapper)

提供两个具体的数据操作方法:

  • selectByPage(begin, size):根据传入的起始索引和每页条数,执行数据库的分页查询(例如使用LIMIT begin, size),返回当前页的品牌列表。

  • selectTotalCount():执行数据库的计数查询(例如SELECT COUNT(*) FROM tb_brand),返回品牌的总记录数,用于前端计算总页数等。

条件查询

·三个条件之间的关系:AND

·三个条件不需要全部填写-->动态SQL <if><where>

·条件查询需要分页

1. 前端页面(brand.html)

  • 查询表单与一个"查询条件对象模型"绑定,用于收集用户输入的筛选条件(如品牌名称、状态等)。

  • 用户点击"查询"按钮时触发数据请求。

  • 页面加载完成(或点击查询按钮)后,发送异步请求(AJAX)到后端,请求参数包括:当前页码、每页显示条数,以及封装了查询条件的对象(通常以JSON格式传递)。

2. Web层(BrandServlet)

  • 接收前端传来的三个参数:当前页码、每页显示条数、查询条件对象。

  • 调用Service层的条件分页查询方法,获得返回结果 PageBean(包含总记录数和当前页数据列表)。

  • PageBean 对象转换为 JSON 字符串,写回客户端响应。

3. Service层(BrandService)

  • 接收参数:当前页码、每页显示条数、查询条件对象。

  • 先根据页码和每页条数计算数据库查询的起始索引(begin = (page - 1) * size)。

  • 然后分两步调用 Dao 层:

    • 调用 brandMapper.selectByPageAndCondition(begin, size, brand),获取当前页符合条件的品牌列表。

    • 调用 brandMapper.selectTotalCount(brand),获取符合查询条件的总记录数。

  • 将获得的当前页列表和总记录数组装成一个 PageBean 对象,并返回给 Web 层。

4. Dao层(BrandMapper)

  • selectByPageAndCondition(begin, size, brand):执行带条件的分页查询,SQL 形如 SELECT * FROM tb_brand WHERE ... LIMIT begin, size,返回符合条件的当前页品牌列表。

  • selectTotalCount(brand):执行带条件的计数查询,SQL 形如 SELECT COUNT(*) FROM tb_brand WHERE ...,返回符合条件的品牌总数。

相关推荐
bzmK1DTbd2 小时前
Git版本控制:Java项目中的分支管理与合并策略
java·开发语言·git
JWASX4 小时前
【RocketMQ 生产者和消费者】- 事务源码分析(1)
java·rocketmq·java-rocketmq
AlunYegeer5 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
DFT计算杂谈6 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
2301_771717216 小时前
Spring Boot 自动配置核心注解
java·spring boot·mybatis
小Y._6 小时前
面试被问synchronized锁升级,这5个问题答不上来直接挂!
java
姚青&6 小时前
测试技术体系
java·python
南境十里·墨染春水7 小时前
C++日志 2——实现单线程日志系统
java·jvm·c++