• Vue+elementUI+ajax+java3层架构实现前后端分离踏坑总结+具体案例增删改查+批量删除+多条件查询+源码


    目录

    后台部分

    过滤器

    过滤器能做什么

    跨域请求

    统一设置字符编码

    分页

    在service进行异常处理

    使用getParameter获取不到数据

    原因

    解决方案

    前台部分

    elementui怎么获取鼠标点击的那一行的索引

    elementui分页

    把提示信息整合成一个函数

    总结

    源码分享


    后台部分

    过滤器

    过滤器能做什么

    过滤器一般完成一些通用的操作。我们可以将通用操作的这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。

    注意请求和响应都要经过过滤器

    跨域请求

    所谓的跨域请求就是指 当前发起请求的域名与服务器的域名不一样。是一种安全策略(...)

    个人开发在前后端分离时

    1. //java后端解决跨域请求问题
    2. package com.web.filter;
    3. import javax.servlet.*;
    4. import javax.servlet.annotation.WebFilter;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. @WebFilter("/*")
    8. public class Cores implements Filter {
    9. @Override
    10. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    11. HttpServletResponse response = (HttpServletResponse) servletResponse;
    12. response.setHeader("access-control-allow-methods","*");
    13. response.setHeader("Access-Control-Allow-Headers","*");
    14. response.setHeader("Access-Control-Allow-Origin","*");
    15. filterChain.doFilter(servletRequest,response);
    16. }
    17. }

    统一设置字符编码

    后端由于历史原因大都采用GBK或GB2312进行编码,所有传送到前端的数据有时候会乱码

    注意类型转换幺

    1. //在过滤器中统一设置编码
    2. package com.web.filter;
    3. import javax.servlet.*;
    4. import javax.servlet.annotation.WebFilter;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. @WebFilter("/*")
    10. public class charsetsfilter implements Filter {
    11. @Override
    12. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    13. HttpServletResponse response = (HttpServletResponse) servletResponse;
    14. HttpServletRequest request = (HttpServletRequest) servletRequest;
    15. response.setCharacterEncoding("utf-8");
    16. request.setCharacterEncoding("utf-8");
    17. filterChain.doFilter(request, response);
    18. }
    19. }

    分页

            当我们在前端传送多个字段,但这些字段,在后端已有放对象的无法满足需求的时候,我们应该,重新再构建一个对象,把我们所需要的字段全部都丢进去,以便JSON类型转换为java对象后好操作

            我们分页时就用到了这种思想

    重新建立一个数据模型类

    1. public class BrandPageVo {
    2. //前台当前页面所需的数据条数
    3. private Integer total;
    4. //响应给前台的数据对象
    5. private List brandList;
    6. //当前的页码
    7. private Integer current;
    8. }

    service层写方法(已去除trycatch块防止干扰视线) 

    值得注意的是,分页的公式为

    当前的页数减一乘以当前请求的页面中的所有数据数目

    前端                    数据库

    1 10         =>        1,10

    2 10        =>        10,10

    3 10        =>        20,10

    1. public List selectAllBrandByPage(Integer cur, Integer pagSize) {
    2. String sql="SELECT * FROM tb_brand LIMIT ?,?";
    3. Connection connection = null;
    4. List list=new ArrayList<>();
    5. connection=DbUtils.getConnection();
    6. connection.setAutoCommit(false);
    7. PreparedStatement ps = connection.prepareStatement(sql);
    8. ps.setInt(1,(cur-1)*pagSize);
    9. ps.setInt(2,pagSize);
    10. ResultSet rs = ps.executeQuery();
    11. while (rs.next()){
    12. Brand brand = new Brand(
    13. rs.getInt(1),
    14. rs.getString(2),
    15. rs.getString(3),
    16. rs.getInt(4),
    17. rs.getString(5),
    18. rs.getInt(6)
    19. );
    20. list.add(brand);
    21. }
    22. connection.commit();
    23. DbUtils.close(rs,ps,null);
    24. return list;
    25. }

    在service进行异常处理

    当我们在dao,查询数据出错后,应该在service层进行异常处理,空值判断,字符串校验等等,以及返回给servlet层的值

    题外话

    在判断字符串是否为空时

    尽量使用 .length()>0,不要使用.equals("")这样效率最低!!

    servlet拿到值后就可以响应了,尽量减少servlet的逻辑代码

    使用getParameter获取不到数据

    原因

    原因出在http传输协议身上

    1、http传输协议默认的编码方式为enctype=”application/x-www-form-urlencoded”,这种方式我们只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。

    2、传输大数据量的二进制数据时,http协议将会把编码方式设置成enctype=”multipart/form-data”,当用这种方式传输数据时,用 request.getParameter()是获取不到提交的数据的(API的规定),只能使用request.getInputStream(),request.getReader()来获取提交的数据 。

    解决方案

    1. BufferedReader reader = request.getReader();
    2. String s = reader.readLine();
    3. //将JSON字符串转换为对象
    4. Brand brand = JSON.parseObject(s, Brand.class);

    前台部分

    elementui怎么获取鼠标点击的那一行的索引

            这个问题苦扰了很久,百度的没有什么好的方法,最后去看的官方文档才恍然大悟!!

    所以有问题,一定要先去看官方文档!!养成好习惯

            方法很简单,我们在,某一行外面套一个,然后在事件中填入参数(scope.$index,scope.row)就可以获取到所点击的这一行的所有值和索引了,第一个参数返回索引和第二个参数返回字段的所有属性(包括id)

    eg:

    1. <el-table-column label="操作">
    2. <template slot-scope="scope">
    3. <el-button type="primary" round size="small" @click="editBrandShow(scope.$index,scope.row)">修改el-button>
    4. <el-button type="danger" round size="small">删除el-button>
    5. template>
    6. el-table-column>
    7. //scrpit代码
    8. //删除事件
    9. //第一个是索引,row是当前所点击的标签对象啊,通过标签id属性的即可获取到id值(真实的id值,
    10. // 因为我们在页面初始化时,已经将id属性绑定到了table上只是不可见而已)
    11. removeBrand(index, row) {
    12. console.log("当前索引为,当前要删除的数据的Id也为", row.id);
    13. axios.get(`http://localhost:8080/Web/removeBrand?id=${row.id}`).then((resp) => {
    14. if (resp.status===200)
    15. {
    16. this.messagefun("remove",1)
    17. }
    18. else {
    19. this.messagefun("remove",0)
    20. }
    21. })
    22. //刷新页面
    23. location.reload();
    24. }

    elementui分页

    分页使用的控件是

    常用属性:

    current-page.sync当前页数number1
    layout组件布局,子组件名用逗号分隔String'prev, pager, next, jumper, ->, total'
    page-sizes每页显示个数选择器的选项设置number[][10, 20, 30, 40, 50, 100]
    layout组件布局,子组件名用逗号分隔String'prev, pager, next, jumper, ->, total'
    total总条目数number

    详细看官网

    组件 | Element

    其中total是数据库中所有的数据数量,我们为什么还要查这个那?

    因为要是我们不去进行这个判断,有可能没有数据了但是前端却还可以去选择下一页

    1. <div class="pagination" style="padding: 10px 0px">
    2. <el-pagination
    3. @current-change="handleCurrentChange"
    4. :current-page.sync="current"
    5. :page-sizes="[10, 20, 50]"
    6. v-model:page-size="pageSize"
    7. layout="sizes, prev, pager, next"
    8. :total="total"
    9. align="center"
    10. >
    11. el-pagination>
    12. div>
    13. new Vue({
    14. el:"#app",
    15. data(){
    16. return{
    17. tableFormData:[],
    18. searchForm:{
    19. status:1,
    20. companyName:'',
    21. brandName:''
    22. },
    23. rowId:[],
    24. dialogFormVisible:false,
    25. formLabelWidth:80,
    26. addEditForm:{},
    27. formLabelWidth2:'80',
    28. current:1,
    29. pageSize:10,
    30. total:0,
    31. }
    32. },
    33. methods:{
    34. //分页触发
    35. handleCurrentChange(){
    36. let _this=this;
    37. axios.get(`http://localhost:8080/brandcase/brandSelect?current=${_this.current}&pageSize=${_this.pageSize}`)
    38. .then(function (resp) {
    39. if (resp.status===200){
    40. _this.tableFormData=resp.data.brandList
    41. _this.current=resp.data.current
    42. _this.total=resp.data.total
    43. }
    44. })
    45. },
    46. }

    把提示信息整合成一个函数

    这并不是最佳实践,你可以进一步简化参数,减少函数执行时间

    1. messagefun(deal, status) {
    2. if (deal == "insert") {
    3. if (status === 1) {
    4. this.$message(
    5. {
    6. message: "数据插入成功!",
    7. type: 'success'
    8. })
    9. } else {
    10. this.$message(
    11. {
    12. message: "数据插入失败!",
    13. type: 'warning'
    14. })
    15. }
    16. } else if (deal == "remove") {
    17. if (status === 1) {
    18. this.$message(
    19. {
    20. message: "数据删除成功!",
    21. type: 'success'
    22. })
    23. } else {
    24. this.$message(
    25. {
    26. message: "数据删除失败!",
    27. type: 'warning'
    28. })
    29. }
    30. } else if (deal == "update") {
    31. if (status === 1) {
    32. this.$message(
    33. {
    34. message: "数据更新成功!",
    35. type: 'success'
    36. })
    37. } else {
    38. this.$message(
    39. {
    40. message: "数据更新失败!",
    41. type: 'warning'
    42. })
    43. }
    44. } else if (deal == "search") {
    45. if (status === 1) {
    46. this.$message(
    47. {
    48. message: "数据查询成功!",
    49. type: 'success'
    50. })
    51. } else {
    52. this.$message(
    53. {
    54. message: "数据查询失败!",
    55. type: 'warning'
    56. })
    57. }
    58. }
    59. }

    总结

    调试好难,呜呜呜

    源码分享

    夸克网盘
    链接:https://pan.quark.cn/s/282c6a8e29aa
    提取码:C4BJ

    百度网盘

    链接:https://pan.baidu.com/s/1XYkLshGnel2GY459lt2CLg?pwd=gtt1 
    提取码:gtt1

  • 相关阅读:
    ZooKeeper面试那些事儿
    【毕业设计】基于javaEE+原生Servlet+MySql的酒店管理系统设计与实现(毕业论文+程序源码)——酒店管理系统
    基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库
    day6_redis学习
    SpringBoot进阶教程(七十五)数据脱敏
    【C刷题】day1
    深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包
    高手必备 | Revit插件到底哪个好?区别是什么?
    Vue_生命周期函数
    运用 Elastic Stack 收集 docker 容器日志
  • 原文地址:https://blog.csdn.net/qq_53679247/article/details/127595533