难点:模糊查询后再次分页,并可以选择页数。

最终环境配置:

maven3.8:依赖包管理

IDEA2021+JDK8+mysql connector java5+Mysql5+mybatis3.5:从数据库取出数据。

tomcat7插件:web服务器

servlet、fastjson、axios:处理前后端数据交互

fastjson:阿里提供的依赖包。新增时后端收到前端发过来的JSON字符串后,简化将JSON字符串解析成对象。展示商品列表时后端通过mybatis从数据库中查出数据封装成实体类对象的list之后,简化将对象list序列化成JSON字符串。

axios框架:封装了原生JavaScript的ajax操作,简化了HTTP请求的发起和响应参数的获取。

vue.js+ElementUI+html5+css3+chorme:vue.js封装了JavaScript。ElementUI组件库,封装了vue.js,通过提供了搭配的CSS。所以作为后端搭建个简易前端界面,只需要新建个html页面,new一个Vue,绑定一个DIV,然后在这个DIV里填ElementUI提供的组件,并且在head标签中的style中填ElementUI提供的CSS样式就行了。

重点:记住一切操作的背后都是对象,比如前端是在操作vue data中return的对象,后端就是new 的Brand对象。深浅拷贝涉及JS的内存知识

================================================================

项目结构:

表结构

运行效果

 =================================================================

代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ldj</groupId><artifactId>brand-crud</artifactId><version>1.0-SNAPSHOT</version><name>brand-crud</name><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--MyBatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!--MySQL--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><!-- junit测试包--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build>
</project>
BrandMapper
package com.ldj.mapper;import com.ldj.pojo.Brand;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface BrandMapper {/*** 查询所有** @return*/List<Brand> selectAll();/*** 添加数据** @param brand*/int add(Brand brand);int update(Brand brand);int delete(Integer id);//根据批量删除int deleteByIds(int[] ids);//多条件查询动态SQL。多个参数可以使用mapList<Brand> selectLike4(Map map);//分页查询。多个参数也可以使用@Param标签List<Brand> selectByPage(@Param("begin") int begin, @Param("size") int size);//查询总记录数int selectTotalCount();//分页模糊条件查询List<Brand> selectByPageAndCondition(Map map);//分页模糊查询//查询总记录数int selectTotalCountByPageAndCondition(Map map);}
Brand
package com.ldj.pojo;public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态:0:禁用  1:启用private Integer status;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}//逻辑视图public String getStatusStr(){if (status == null){return "未知";}return status == 0 ? "禁用":"启用";}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
}
PageBean
package com.ldj.pojo;import java.util.List;//用于分页查询的数据传递,泛型T在new的时候指定
public class PageBean<T> {//总记录数private int totalCount;//当前页数据private List<T> rows;@Overridepublic String toString() {return "PageBean{" +"totalCount=" + totalCount +", rows=" + rows +'}';}public int getTotalCount() {return totalCount;}public void setTotalCount(int totalCount) {this.totalCount = totalCount;}public List<T> getRows() {return rows;}public void setRows(List<T> rows) {this.rows = rows;}
}
BrandService
package com.ldj.service;import com.ldj.pojo.Brand;
import com.ldj.pojo.PageBean;import java.util.HashMap;
import java.util.List;
import java.util.Map;//接口约束功能,方便servlet更换具体的实现类
public interface BrandService {/*** 查询所有** @return*/List<Brand> selectAll();/*** 添加数据** @param brand*/int add(Brand brand);/*** 修改数据** @param brand*/int update(Brand brand);int delete(Integer id);List<Brand> selectLike4(Map map);int deleteByIds(int[] ids);PageBean<Brand> selectByPage(int currentPage, int pageSize);List<Brand>  selectByPageLike(Map map);int selectTotalCountByPageAndCondition(Map map);
}
BrandServiceImpl
package com.ldj.service.impl;import com.ldj.mapper.BrandMapper;
import com.ldj.pojo.Brand;
import com.ldj.pojo.PageBean;
import com.ldj.service.BrandService;
import com.ldj.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.HashMap;
import java.util.List;
import java.util.Map;//实现接口
public class BrandServiceImpl implements BrandService {//1. 创建SqlSessionFactory 工厂对象SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();@Overridepublic List<Brand> selectAll() {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法List<Brand> brands = mapper.selectAll();//5. 释放资源sqlSession.close();return brands;}@Overridepublic int add(Brand brand) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法int add = mapper.add(brand);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return add;}@Overridepublic int delete(Integer id) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法int delete = mapper.delete(id);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return delete;}@Overridepublic int update(Brand brand) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法int update = mapper.update(brand);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return update;}@Overridepublic List<Brand> selectLike4(Map map) {//多条件动态查询,如果某些条件用户不填写,就要用这种对应的映射文件,类似java if else if//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);List<Brand> tbBrands = mapper.selectLike4(map);System.out.println(tbBrands);return tbBrands;}@Overridepublic int deleteByIds(int[] ids) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法int res = mapper.deleteByIds(ids);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return res;}@Overridepublic PageBean<Brand> selectByPage(int currentPage, int pageSize) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法int begin = (currentPage - 1) * pageSize;List<Brand> list = mapper.selectByPage(begin, pageSize);int totalCount = mapper.selectTotalCount();PageBean<Brand> pageBean = new PageBean<>();pageBean.setRows(list);pageBean.setTotalCount(totalCount);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return pageBean;}@Overridepublic List<Brand> selectByPageLike(Map map) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法List<Brand> brands = mapper.selectByPageAndCondition(map);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return brands;}@Overridepublic int selectTotalCountByPageAndCondition(Map map) {//2. 获取SqlSession对象SqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法int count = mapper.selectTotalCountByPageAndCondition(map);sqlSession.commit();//提交事务//5. 释放资源sqlSession.close();return count;}}
SqlSessionFactoryUtils
package com.ldj.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {//静态代码块会随着类的加载而自动执行,且只执行一次try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSessionFactory getSqlSessionFactory(){return sqlSessionFactory;}
}
BaseServlet
package com.ldj.web.servletoptimization;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String requestURI = req.getRequestURI();int i = requestURI.lastIndexOf('/');String methodName = requestURI.substring(i + 1);System.out.println(methodName);Class clazz = this.getClass();Method method = null;try {method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);method.invoke(this, req, resp);} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}
}
BrandServletAfterOptimization
package com.ldj.web.servletoptimization;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ldj.pojo.Brand;
import com.ldj.pojo.PageBean;
import com.ldj.service.BrandService;
import com.ldj.service.impl.BrandServiceImpl;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author ldj* 优化后的servlet,通过BaseServlet重写HttpServlet的service方法,解析出访问的方法名,通过反射获取相应的方法并调用*/
@WebServlet("/brandAfterOptimization/*")
public class BrandServletAfterOptimization extends BaseServlet {private BrandService brandService = new BrandServiceImpl();//查询所有public void selectAllServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("收到查询所有的请求");//1. 调用service查询List<Brand> brands = brandService.selectAll();//2. 转为JSONString jsonString = JSON.toJSONString(brands);System.out.println(jsonString);//3. 写数据//有中文防止乱码response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}//添加一条数据public void addServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("收到添加一条数据的请求");//解决乱码request.setCharacterEncoding("utf-8");//指定输入流的解码方式//1. 接收品牌数据BufferedReader br = request.getReader();String params = br.readLine();//json字符串/*阿里的fastJson.jar:(import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;)
//list转换为json
List<CustPhone> list = new ArrayList<CustPhone>();
String str=JSON.toJSON(list).toString();
//json转换为list
List<Person> list = new ArrayList<Person>();
list = JSONObject.parseArray(jasonArray, Person.class);*/if (!"".equals(params)) {//转为Brand对象Brand brand = JSON.parseObject(params, Brand.class);System.out.println("收到一条修改信息" + params);//2. 调用service添加int add = brandService.add(brand);//3. 响应成功的标识if (add == 1) {response.getWriter().write("success");}}}//批量删除public void deleteSelectedListServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("收到批量删除的请求");//解决乱码request.setCharacterEncoding("utf-8");//指定输入流的解码方式//1. 接收品牌数据BufferedReader br = request.getReader();String params = br.readLine();//json字符串System.out.println("前端想要批量删除传过来的JSON字符串:" + params + "======");/*阿里的fastJson.jar:(import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;)
//list转换为json
List<CustPhone> list = new ArrayList<CustPhone>();
String str=JSON.toJSON(list).toString();
//json转换为list
List<Person> list = new ArrayList<Person>();
list = JSONObject.parseArray(jasonArray, Person.class);*/if (!"".equals(params)) {//转为ids数组int[] arr = JSONObject.parseObject(params, int[].class);if (arr.length != 0) {//2. 调用service删除brandService.deleteByIds(arr);//3. 响应成功的标识response.getWriter().write("success");}}}//删除一条数据public void deleteOneServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("收到删除一条数据的请求");//解决乱码request.setCharacterEncoding("utf-8");//指定输入流的解码方式//1. 接收想要删除的IDString id = request.getParameter("id");//转为System.out.println("收到一条删除信息,想要删除的ID是" + id);//2. 调用service删除brandService.delete(Integer.valueOf(id));//3. 响应成功的标识response.getWriter().write("success");}//模糊分页查询public void selectLikeServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {//获取前端传过来的三个参数封装进Map//解决乱码request.setCharacterEncoding("utf-8");//指定输入流的解码方式//1. 接收模糊查询的品牌数据BufferedReader br = request.getReader();String params = br.readLine();//json字符串//转为Brand对象Brand brandLike = JSON.parseObject(params, Brand.class);System.out.println("收到一条模糊查询信息" + params);//2接收当前页信息和每页显示多少页int currentPageLike = Integer.parseInt(request.getParameter("currentPageLike"));int pageSizeLike = Integer.parseInt(request.getParameter("pageSizeLike"));int begin = (currentPageLike - 1) * pageSizeLike;//封装查询条件Map map = new HashMap();String companyName = "";String brandName = "";if (!"".equals(brandLike.getCompanyName())) {//不为空则进行模糊查询companyName = "%" + brandLike.getCompanyName() + "%";brandLike.setCompanyName(companyName);}if (!"".equals(brandLike.getBrandName())) {//不为空则进行模糊查询brandName = "%" + brandLike.getBrandName() + "%";brandLike.setBrandName(brandName);}map.put("begin", begin);map.put("pageSizeLike", pageSizeLike);map.put("brandLike", brandLike);//1. 调用service模糊查询List<Brand> brands = brandService.selectByPageLike(map);int countLike = brandService.selectTotalCountByPageAndCondition(map);PageBean<Brand> pageBean =new PageBean<>();pageBean.setTotalCount(countLike);pageBean.setRows(brands);//2. 转为JSONString jsonString = JSON.toJSONString(pageBean);System.out.println("模糊查询到的" + jsonString);//3. 写数据//有中文防止乱码response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}//更新一条数据public void updateOneBrandServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {//解决乱码request.setCharacterEncoding("utf-8");//指定输入流的解码方式//1. 接收品牌数据BufferedReader br = request.getReader();String params = br.readLine();//json字符串//转为Brand对象Brand brand = JSON.parseObject(params, Brand.class);System.out.println("收到一条修改信息" + params);//2. 调用service添加int update = brandService.update(brand);//3. 响应成功的标识if (update == 1) {response.getWriter().write("success");}}//分页查询public void selectByPage(HttpServletRequest request, HttpServletResponse response) throws IOException {int currentPage = Integer.parseInt(request.getParameter("currentPage"));int pageSize = Integer.parseInt(request.getParameter("pageSize"));PageBean<Brand> pageBean = brandService.selectByPage(currentPage, pageSize);//2. 转为JSONString jsonString = JSON.toJSONString(pageBean);System.out.println("模糊查询到的" + jsonString);//3. 写数据//有中文防止乱码response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}
}

BrandMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ldj.mapper.BrandMapper"><resultMap id="brandResultMap" type="brand"><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result></resultMap><!--查询所有--><select id="selectAll" resultMap="brandResultMap">select *from tb_brand;</select><!--插入一条数据--><insert id="add">insert into tb_brandvalues (null, #{brandName}, #{companyName}, #{ordered}, #{description}, #{status})</insert><update id="update" parameterType="com.ldj.pojo.Brand">update tb_brandset brand_name   = #{brandName},company_name = #{companyName},ordered      = #{ordered},description  = #{description},`status`     = #{status}where id = #{id}</update><delete id="delete">deletefrom tb_brandwhere id = #{id}</delete><!--多条件动态查询用where标签和if test标签,如果一个条件都不满足,就会自动去除where中的所有内容--><select id="selectLike4" parameterType="com.ldj.pojo.Brand" resultMap="brandResultMap">select *from tb_brand<where><if test="status != null">and status = #{status}</if><if test="companyName != null and companyName != ''"><!-- 这里不能用equals来判断-->and company_name like #{companyName}</if><if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if></where></select><delete id="deleteByIds" parameterType="int">deletefrom tb_brand where  id in<foreach item="item" collection="array" open="(" separator="," close=")">#{item}</foreach></delete><select id="selectByPage" parameterType="int" resultMap="brandResultMap">select *from tb_brandlimit #{begin},#{size};</select><select id="selectTotalCount" resultType="int">select count(*)from tb_brand</select><select id="selectByPageAndCondition" resultMap="brandResultMap">select *from tb_brand<where><if test="brandLike.status != null">and status = #{brandLike.status}</if><if test="brandLike.companyName != null and brandLike.companyName != ''"><!-- 这里不能用equals来判断-->and company_name like #{brandLike.companyName}</if><if test="brandLike.brandName != null and brandLike.brandName != ''">and brand_name like #{brandLike.brandName}</if></where>limit #{begin},#{pageSizeLike};</select><select id="selectTotalCountByPageAndCondition"  resultType="int">select count(*)from tb_brand<where><if test="brandLike.status != null">and status = #{brandLike.status}</if><if test="brandLike.companyName != null and brandLike.companyName != ''"><!-- 这里不能用equals来判断-->and company_name like #{brandLike.companyName}</if><if test="brandLike.brandName != null and brandLike.brandName != ''">and brand_name like #{brandLike.brandName}</if></where></select>
</mapper>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><package name="com.ldj.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///db1?useSSL=false"/><property name="username" value="root"/><property name="password" value="1234"/></dataSource></environment></environments><mappers><!--扫描mapper--><package name="com.ldj.mapper"/></mappers>
</configuration>

brandAfterOptimizationPageBehind.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.el-table .warning-row {background: oldlace;}.el-table .success-row {background: #f0f9eb;}</style></head>
<body>
<a href="http://localhost:8080/brand-crud/brand.html">去往前端分页未优化servlet</a> <br> <br> <br>
<a href="http://localhost:8080/brand-crud/brandAfterOptimization.html">去往前端分页已优化servlet</a> <br> <br> <br>
<a href="http://localhost:8080/brand-crud/brandAfterOptimizationPageBehind.html">去往后端分页已优化servlet</a><div id="app"><!--模糊查询表单--><el-form :inline="true" :model="brandLike" class="demo-form-inline"><el-form-item label="当前状态"><el-select v-model="brandLike.status" placeholder="当前状态"><el-option label="启用" value="1"></el-option><el-option label="禁用" value="0"></el-option></el-select></el-form-item><el-form-item label="企业名称"><el-input v-model="brandLike.companyName" placeholder="企业名称"></el-input></el-form-item><el-form-item label="品牌名称"><el-input v-model="brandLike.brandName" placeholder="品牌名称"></el-input></el-form-item><el-form-item><el-button type="primary" @click="selectByPageAndCondition">模糊查询</el-button></el-form-item></el-form><!--删除、新增按钮--><el-row><el-button type="danger" plain @click="deleteList">批量删除</el-button><el-button type="primary" plain @click="dialogVisible = true">新增</el-button></el-row><!--添加数据对话框表单--><el-dialogtitle="编辑品牌":visible.sync="dialogVisible"width="30%"><el-form ref="form" :model="brandAdd" label-width="80px"><el-form-item label="品牌名称"><el-input v-model="brandAdd.brandName"></el-input></el-form-item><el-form-item label="企业名称"><el-input v-model="brandAdd.companyName"></el-input></el-form-item><el-form-item label="排序"><el-input v-model="brandAdd.ordered"></el-input></el-form-item><el-form-item label="备注"><el-input type="textarea" v-model="brandAdd.description"></el-input></el-form-item><el-form-item label="状态"><el-switch v-model="brandAdd.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="cancelDo">取消</el-button></el-form-item></el-form></el-dialog><!--修改的弹对话框表单--><el-dialogtitle="修改更新品牌":visible.sync="dialogVisibleUpdate"width="30%"><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="updateBrandDo">提交修改</el-button><el-button @click="dialogVisibleUpdate = false">取消</el-button></el-form-item></el-form></el-dialog><!--显示数据的主表格,后端分页--><template><el-table:data="tableData"style="width: 100%":row-class-name="tableRowClassName"@selection-change="handleSelectionChange"><!--            每条记录最前方的小选择框--><el-table-columntype="selection"width="55"></el-table-column><!--            每条记录的编号--><el-table-columnlabel="序号"type="index"width="50"></el-table-column><!--            <el-table-column--><!--                    prop="id"--><!--                    label="ID"--><!--                    align="center"--><!--           //row自动对应整个对象,取出ID备用 >--></el-table-column><el-table-columnprop="brandName"label="品牌名称"align="center"></el-table-column><el-table-columnprop="companyName"label="企业名称"align="center"></el-table-column><el-table-columnprop="ordered"align="center"label="排序"></el-table-column><el-table-columnprop="description"align="center"label="描述"></el-table-column><el-table-columnprop="status"align="center"label="当前状态":formatter="stateFormat"></el-table-column><el-table-columnalign="center"label="操作"><template slot-scope="updateData"><el-row><el-button type="primary" @click="updateOneBrand(updateData.row)">修改</el-button><el-button type="danger" @click="deleteOneBrand(updateData.row)">删除</el-button></el-row></template></el-table-column></el-table></template><!--分页工具条--><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage":page-sizes="pageSizes":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="totalNum"></el-pagination></div><!--引入依赖-->
<script src="js/vue.js"></script>
<script src="element-ui/lib/index.js"></script>
<link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
<script src="js/axios-0.18.0.js"></script><script>new Vue({el: "#app",methods: {//点击取消新增或者取消修改按钮时执行此方法重置提示框cancelDo() {this.dialogVisible = false;this.brand = {status: '',brandName: '',companyName: '',id: "",ordered: "",description: ""};this.brandAdd = {status: '',brandName: '',companyName: '',id: "",ordered: "",description: ""}},//显示每行颜色间隔变化tableRowClassName({row, rowIndex}) {if (rowIndex === 1) {return 'warning-row';} else if (rowIndex === 3) {return 'success-row';}return '';},// 复选框选中后执行的方法handleSelectionChange(val) {this.multipleSelection = val;//选中的对象集合let listSelect = this.multipleSelection;console.log(listSelect)//获取ID集合this.ids = [];//保险起见。先重置一下if (listSelect.length != 0) {for (let i = 0; i < listSelect.length; i++) {this.ids[i] = listSelect[i].id;}}console.log("删除的ID集合" + this.ids)},//点击批量删除后执行此方法deleteList() {let _this = this;console.log("想要批量删除:" + _this.ids);axios({method: "post",url: "http://localhost:8080/brand-crud/brandAfterOptimization/deleteSelectedListServlet",data: JSON.stringify(this.ids)//会自动转换,可以不写转换语句//JS对象转通过方法JSON.stringify(js对象) 转换为 JSON串,servlet中以req.getReader()流的形式读取}).then(function (resp) {// 判断响应数据是否为 successif (resp.data === "success") {_this.selectByPageAndCondition();// alert("删除成功!"_this.ids = [];//重置选择的IDS集合_this.$message({message: '批量删除成功', type: 'success'});} else {alert("删除失败");_this.selectByPageAndCondition();}})},// 点击查询后执行此方法:按条件模糊查询selectByPageAndCondition() {console.log("模糊查询的条件为" + this.brandLike.status + this.brandLike.companyName + this.brandLike.brandName);let _this = this;_this.selectMethod = 1;//标志符改成模糊查询axios({method: "post",url: "http://localhost:8080/brand-crud/brandAfterOptimization/selectLikeServlet?currentPageLike=" + this.currentPageLike + "&pageSizeLike=" + this.pageSizeLike,data: JSON.stringify(this.brandLike)//会自动转换,可以不写转换语句//JS对象转通过方法JSON.stringify(js对象) 转换为 JSON串,servlet中以req.getReader()流的形式读取}).then(function (resp) {// 判断响应数据是否为 successif (resp.data != "") {// alert("查询成功!")_this.tableData = resp.data.rows;//后端已经分页_this.totalNum = resp.data.totalCount;_this.$message({message: '模糊分页查询成功', type: 'success'});} else {alert("模糊分页查询失败");}})},// 点击新增按钮后会将新增提示框显现,数据填写完毕后,点击提交会执行此方法:添加数据addBrand() {let _this = this;console.log("想要添加:" + _this.brandAdd.brandName);axios({method: "post",url: "http://localhost:8080/brand-crud/brandAfterOptimization/addServlet",data: JSON.stringify(this.brandAdd)//会自动转换,可以不写转换语句//JS对象转通过方法JSON.stringify(js对象) 转换为 JSON串,servlet中以req.getReader()流的形式读取}).then(function (resp) {// 判断响应数据是否为 successif (resp.data == "success") {// alert("添加成功!")_this.dialogVisible = false;_this.selectByPageAndCondition();_this.brandAdd = {};//重置brandAdd对象// location.href = "http://localhost:8080/brand-crud/brandAfterOptimization/brand.html";// 弹出消息提示_this.$message({message: '恭喜你,添加成功', type: 'success'});} else {alert("添加失败");_this.selectByPageAndCondition();// location.href = "http://localhost:8080/brand-crud/brandAfterOptimization/brand.html";}})},//后端分页==========================================//每页显示条数改变后执行:选择  ?条/页后执行此方法handleSizeChange(val) {console.log(`每页 ${val} 条`);if (this.selectMethod == 0) {//正常分页查询this.pageSize = val;this.selectByPageAndCondition();} else if (this.selectMethod == 1) {//模糊分页查询this.pageSizeLike = val;this.selectByPageAndCondition();}},//当前页改变后执行://选择 123456.。。之后执行此方法。//选择 前往?页后执行此方法handleCurrentChange(val) {if (this.selectMethod == 0) {//正常分页查询this.currentPage = val;this.selectByPageAndCondition();} else if (this.selectMethod == 1) {//模糊分页查询this.currentPageLike = val;this.selectByPageAndCondition();}},//点击删除按钮后执行此方法deleteOneBrand(data) {console.log("想要删除的数据的ID" + data.id)let _this = this;//页面加载完成后发送异步请求获取列表数据,获取到的为JSON字符串//往前端传JS对象会自动转成JSON字符串axios({method: "get",url: "http://localhost:8080/brand-crud/brandAfterOptimization/deleteOneServlet?id=" + data.id}).then(function (resp) {//axios会将后端传过来JSON字符串自动转成JS对象//将JSON字符串转成JS对象的原生JS方法是===parse(str) :// 将 JSON串转换为 js 对象。使用方式是: var jsObject = JSON.parse(jsonStr);// 判断响应数据是否为 successif (resp.data == "success") {_this.selectByPageAndCondition();// 弹出消息提示_this.$message({message: '删除成功', type: 'success'});} else {alert("删除失败");_this.selectByPageAndCondition();}});},//点击修改按钮后获取当前行数据,提示框显现updateOneBrand(data) {console.log("想要修改的数据的ID" + data.id)this.dialogVisibleUpdate = true;// this.brand = data;//浅拷贝,我改你也改this.brand = JSON.parse(JSON.stringify(data));//深拷贝,我改你不改},//修改提示框显现后,显示停用启用stateFormat(row, column) {if (row.status === 1) {return '启用'} else {return '停用'}},//填写修改后的信息后,点击提交修改按钮后,执行此方法updateBrandDo() {let _this = this;console.log("想要添加:" + _this.brand.brandName);axios({method: "post",url: "http://localhost:8080/brand-crud/brandAfterOptimization/updateOneBrandServlet",data: JSON.stringify(this.brand)//会自动转换,可以不写转换语句//JS对象转通过方法JSON.stringify(js对象) 转换为 JSON串,servlet中以req.getReader()流的形式读取}).then(function (resp) {// 判断响应数据是否为 successif (resp.data == "success") {// alert("添加成功!")_this.dialogVisibleUpdate = false;//关闭弹窗_this.selectByPageAndCondition();//重现所有_this.brand = {};//重置brand对象// location.href = "http://localhost:8080/brand-crud/brandAfterOptimization/brand.html";// 弹出消息提示_this.$message({message: '修改成功', type: 'success'});} else {alert("修改失败");_this.selectByPageAndCondition();// location.href = "http://localhost:8080/brand-crud/brandAfterOptimization/brand.html";}})},},//钩子函数,页面初次加载DIV被EL后自动调用此方法mounted() {this.selectByPageAndCondition();},//页面中用到的相关VM对象data() {return {//是否是模糊查询的标志0表示正常分页查询,1表示模糊分页查询,默认0selectMethod: 0,// 默认当前页码currentPage: 1,//每页显示多少条选择框pageSizes: [3, 10, 15, 20],//当前每页默认显示多少条pageSize: 3,//默认总数据的条数totalNum: 0,//默认首次模糊查询当前页码currentPageLike: 1,//当前每页默认显示多少条pageSizeLike: 3,// 添加数据对话框是否展示的标记,默认不显示dialogVisible: false,//修改更新数据对话框是否展示的标记,,默认不显示dialogVisibleUpdate: false,// 品牌模型数据:用于修改brand: {status: '',brandName: '',companyName: '',id: "",ordered: "",description: ""},//品牌模型数据:用于模糊查询brandLike: {status: '',brandName: '',companyName: '',id: "",ordered: "",description: ""},//品牌模型数据:用于新增brandAdd: {status: '',brandName: '',companyName: '',id: "",ordered: "",description: ""},//复选框选中的数据集合multipleSelection: [],//复选框选中的数据的ID集合ids: [],// 表格数据,从后端接收到的JSON字符串经过AXIOS自动转成JS对象并赋值到这里tableData: []}}})</script></body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><a href="http://localhost:8080/brand-crud/brand.html">去往前端分页,未优化servlet</a> <br> <br> <br>
<a href="http://localhost:8080/brand-crud/brandAfterOptimization.html">去往前端分页,已优化servlet</a> <br> <br> <br>
<a href="http://localhost:8080/brand-crud/brandAfterOptimizationPageBehind.html">去往后端分页,已优化servlet</a></body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
</web-app>

element-UI和vue.js和axios的依赖包太长,需要时直接上官网下载吧,版本如下:

Vue.js v2.6.10
=================================
"name": "element-ui",
"version": "2.13.0",
===============================
axios v0.18.0

在pom.xml上右键点击tomcat7.run后,浏览器输入初始页面的地址,点击第三个功能:

http://localhost:8080/brand-crud

如上,实现了:

1、单表的后端分页显示到前端页面、前端页面三种方式选择页数。

2、进行模糊查询,并且模糊查询后能在模糊查询结果中实现分页。

3、新增一条、删除一条、批量删除、修改

Javaweb15==mysql+mybatis+servlet+axios+fasetjson+vue+elementUI前后端分离,实现列表后端分页、模糊查询后分页、新增、单一/批量删除、修改相关推荐

  1. mysql模糊查询后分页_jsp模糊查询后的数据进行分页,但点击下一页后就查询全部的了...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 String path = request.getContextPath(); String basePath = request.getScheme() ...

  2. 鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统

    鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统 1. 项目背景 一.随着公司的快速发展,企业人员和经 ...

  3. dotnetcore+vue+elementUI 前后端分离 三(前端篇)

    说明: 本项目使用了 mysql employees数据库,使用了vue + axois + element UI 2.0 ,演示了 单页程序 架构 ,vue router 的使用,axois 使用, ...

  4. 基于SSM+SpringBoot+Vue+ElementUI前后端分离的校园岗位招聘就业管理系统

    运行视频 基于SSM+SpringBoot+Vue+ElementUI前后端分离的校园岗位招聘就业管理系统 项目运行截图 学生管理 添加学生 学生信息 教师管理 教师信息 实习基地 公告信息 公司管理 ...

  5. Bootstrap4+MySQL前后端综合实训-Day07-PM【用户信息管理页面——功能展示(分页显示数据、添加用户、批量删除用户、编辑用户信息)、servlet项目代码整理汇总】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目   录 页面展示 分页显示数据 添加用户信息 (单个/批量)删除用户 编辑 ...

  6. 短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离

    感谢您的关注,请收藏以免忘记,点赞以示鼓励,评论给以建议,爱你哟 项目编号:BS-PT-071 一,项目简介 本项目基于Springboot+vue开发实现了一个电影点播和短视频分享平台,名为爱奇艺影 ...

  7. dotnetcore+vue+elementUI 前后端分离架 二(后端篇)

    前言 最近几年前后端分离架构大行其道,而且各种框架也是层出不穷.本文通过dotnetcore +vue 来介绍 前后端分离架构实战. 涉及的技术栈 服务端技术 mysql 本项目使用mysql 作为持 ...

  8. springboot+vue +ElementUI前后端分离框架搭建教程

    项目介绍 一款 Java 语言基于 SpringBoot2.x.MybatisPlus.Vue.ElementUI.MySQL等框架精心打造的一款前后端分离框架,致力于实现模块化.组件化.可插拔的前后 ...

  9. 最棒的Vue+ElementUI前后端分离框架

    项目介绍 一款 Java 语言基于 SpringBoot2.x.MybatisPlus.Vue.ElementUI.MySQL等框架精心打造的一款前后端分离框架,致力于实现模块化.组件化.可插拔的前后 ...

最新文章

  1. 解决问题 inner element must either be a resource reference or empty.
  2. 2021-05-19 Schur补引理及证明
  3. python restful 框架_restful-dj
  4. HSSFDataFormat大全
  5. K-th Beautiful String CodeForces - 1328B(二分+数学)
  6. linux系统监控和进程管理
  7. java时间类Date、Calendar及用法
  8. YUV格式学习:YUV444转换RGB24
  9. 昆明北大附中2021高考成绩查询入口,昆明高考成绩单:昆明多所高中高考数据来啦!...
  10. 赣南师范大学科技学院计算机科学与技术,2021江西独立学院转设最新消息(新增两所):赣南师范大学科技学院转设公办?...
  11. 程序员常用的泛型机制究竟怎么玩?
  12. Html设置div重置样式,CSS 重置样式
  13. 拓端tecdat|把握出租车行驶的数据脉搏 :出租车轨迹数据给你答案!
  14. Access数据库的查询
  15. 10-20210308华为海思Hi3516DV300在鸿蒙系统下测试网络(以太网+WIFI)
  16. 企业内网通讯软件有哪些优势?
  17. cookie.setValue一些注意事项
  18. SPSS进行问卷数据的效度分析及结果解读(问卷数据统计分析第3步(转载)
  19. Pairing heap
  20. ubuntu16.04无线网卡rtl8723be驱动问题

热门文章

  1. 电气控制电路图——(3)设计
  2. bugku 0和1的故事 用Excel完成
  3. 第一章 计算机网络和因特网
  4. 怎么转换音频格式?建议收藏这几个方法
  5. 音频转换成文字的方法你知道吗?操作非常简单
  6. 软件测试的国家标准及链接,软件测试相关国家标准.doc
  7. Unrecognized DataType
  8. Linux内存池技术
  9. Java分布式全局ID(一)
  10. stm32利用外部中断控制小台灯