mvc三层架构(用户信息管理系统)

2023-11-14

mvc三层架构(实战项目 用户信息管理系统)

一、三层架构

  1. View 层:用于接收用户提交请求的代码。
  2. Service 层:系统的业务逻辑主要在这里完成。
  3. Dao 层:直接操作数据库的代码。

二、三层架构图

三、用户信息管理系统
利用MVC三层架构设计思想完成的一个用户信息管理系统,主要是让大家熟悉MVC三层架构。
1.项目功能

  1. 用户登录
  2. 用户注册
  3. 查看个人信息
  4. 修改个人信息
  5. 查看所有用户信息
  6. 退出
    2.数据库设计
  7. 创建数据库
    create database test;
    -创建表
    在这里插入图片描述
    3.打开IDEA创建项目
    在这里插入图片描述
    登入注册其他的jsp部分我就不展示,最主要是让大家了解三层架构的逻辑思维,怎么样的一个流程。
  8. 建包
    在这里插入图片描述

1 在pojo包中创建一个实体类User

package cn.pojo;

public class User {
   private int uid;
   private String uname;
   private String pwd;
   private String sex;
   private int age;
   private String birth;

   public User() {
       super();
   }

   public User(int uid, String uname, String pwd, String sex, int age, String birth) {
       super();
       this.uid = uid;
       this.uname = uname;
       this.pwd = pwd;
       this.sex = sex;
       this.age = age;
       this.birth = birth;
   }

   public int getUid() {
       return uid;
   }

   public void setUid(int uid) {
       this.uid = uid;
   }

   public String getUname() {
       return uname;
   }

   public void setUname(String uname) {
       this.uname = uname;
   }

   public String getPwd() {
       return pwd;
   }

   public void setPwd(String pwd) {
       this.pwd = pwd;
   }

   public String getSex() {
       return sex;
   }

   public void setSex(String sex) {
       this.sex = sex;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public String getBirth() {
       return birth;
   }

   public void setBirth(String birth) {
       this.birth = birth;
   }
}
  1. 创建servlet包,新建userServlet类

Servlet层

package cn.servlet;

import cn.pojo.User;
import cn.service.UserService;
import cn.service.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

public class userServlet extends HttpServlet {
    //获取service层对象
    UserService us = new UserServiceImpl();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取操做符
        String oper = req.getParameter("oper");
        if ("login".equals(oper)) {
            //调用登录处理方法
            checkUserLogin(req, resp);
        } else if ("out".equals(oper)) {
            //调用退出功能
            userOut(req, resp);
        } else if ("pwd".equals(oper)) {
            //调用密码修改功能
            userChangePwd(req, resp);
        } else if ("show".equals(oper)) {
            //调用显示所有用户功能
            userShow(req, resp);
        } else if("reg".equals(oper)){
            //调用注册功能
            userReg(req,resp);
        }else{
            return;
        }
    }
    //注册用户功能
    private void userReg(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取请求信息
        String uname=req.getParameter("uname");
        String pwd=req.getParameter("pwd");
        String sex=req.getParameter("sex");
        int age=req.getParameter("age")!=""?Integer.parseInt(req.getParameter("age")):0;
        String birth=req.getParameter("birth");
        /*//转日期格式
        String[] bs=null;
        if(birth!=""){
            bs=birth.split("/");
            birth=bs[0]+"-"+bs[1]+"-"+bs[2];//拼接
        }*/
        System.out.println(uname+":"+pwd+":"+sex+":"+age+":"+birth);
        User u=new User(0,uname,pwd,sex,age,birth);//封装数据
        //处理请求信息
        //调用业务层处理
        int index=us.userRegService(u);
        //响应处理结果
        if(index>0){
            //获取session
            HttpSession hs=req.getSession();
            hs.setAttribute("reg", "true");
            //重定向
            resp.sendRedirect("login.jsp");
        }
    }

    //显示所有用户信息
    private void userShow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理请求
        //调用service
        List<User> lu=us.userShowService();
        //判断
        if(lu!=null){
            //将查询的用户数据存储到request对象
            req.setAttribute("lu",lu);
            //请求转发
            req.getRequestDispatcher("user/showUser.jsp").forward(req, resp);
            return;
        }
    }
    //登录处理
    private void checkUserLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        //获取请求信息
        String uname=req.getParameter("uname");
        String pwd=req.getParameter("pwd");
        //处理请求信息
        //校验
        User u=us.checkUserLoginService(uname,pwd);
        //System.out.println(u.getUid()+" "+u.getUname()+" "+u.getPwd()+" "+u.getSex()+" "+u.getAge()+" "+u.getBirth());
        //响应处理结果
        if(u!=null){
            //获取session对象
            HttpSession hs=req.getSession();
            //将用户数据存储到session中
            hs.setAttribute("user",u);
            //重定向
            resp.sendRedirect("main.jsp");
            return;
        }else {
            //添加标识符到request中
            req.setAttribute("flag",false);
            //请求转发
            req.getRequestDispatcher("login.jsp").forward(req, resp);
            return;
        }
    }
    //用户退出
    private void userOut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取session对象
        HttpSession hs=req.getSession();
        //强制销毁session
        hs.invalidate();
        //重定向到登录页面
        resp.sendRedirect("login.jsp");
    }
    //用户修改密码
    private void userChangePwd(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取数据
        String newPwd=req.getParameter("newPwd");
        //从session中获取用户信息
        User u=(User)req.getSession().getAttribute("user");
        int uid=u.getUid();
        //处理请求
        //调用service处理
        int index=us.userChangePwdService(newPwd,uid);
        if(index>0){
            //获取session对象
            HttpSession hs=req.getSession();
            hs.setAttribute("pwd","true");
            //重定向到登录页面
            resp.sendRedirect("login.jsp");
        }
    }

}
  1. 创建service包,新建UserService接口类,UserServiceImpl实现接口类

Service层

package cn.service;

import cn.pojo.User;

import java.util.List;

public interface UserService {
    User checkUserLoginService(String uname,String pwd);//校验用户登录

    int userChangePwdService(String newPwd, int uid);//修改用户密码

    List<User> userShowService();//获取所有用户信息

    int userRegService(User u);//用户注册
}
package cn.service;

import cn.dao.UserDao;
import cn.dao.UserDaoImpl;
import cn.pojo.User;

import java.util.List;

public class UserServiceImpl implements UserService{
    //声明Dao层对象
    UserDao ud=new UserDaoImpl();
    @Override
    public User checkUserLoginService(String uname, String pwd) {//用户登录
        return ud.checkUserLoginDao(uname,pwd);
    }
    //修改密码
    @Override
    public int userChangePwdService(String newPwd, int uid) {
        return ud.userChangePwdDao(newPwd,uid);
    }
    //获取所有用户信息
    @Override
    public List<User> userShowService() {
        return ud.userShowDao();
    }
    //用户注册
    @Override
    public int userRegService(User u) {
        return ud.userRegDao(u);
    }
}
  1. 创建dao包,新建UserDao接口类,UserDaoImpl实现接口类

Dao层

package cn.dao;

import cn.pojo.User;

import java.util.List;

public interface UserDao {
    User checkUserLoginDao(String uname,String pwd);//根据用户名和密码查询用户信息

    int userChangePwdDao(String newPwd, int uid);//修改密码

    List<User> userShowDao();//查看所有用户


    int userRegDao(User u);//用户注册
}
package cn.dao;

import cn.pojo.User;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao{
    @Override//用户注册
    public int userRegDao(User u) {
        //声明jdbc对象
        Connection conn=null;
        PreparedStatement ps=null;
        //声明变量
        int index=-1;
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取链接
            conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","2001223");
            //创建sql语句
            String sql="insert into t_user value(default,?,?,?,?,?)";
            //创建sql命令对象
            ps=conn.prepareStatement(sql);
            //给占位符赋值
            ps.setString(1,u.getUname());
            ps.setString(2,u.getPwd());
            ps.setString(3,u.getSex());
            ps.setInt(4,u.getAge());
            ps.setString(5,u.getBirth());
            //执行sql
            index=ps.executeUpdate();
        }catch (Exception e){
            e.getStackTrace();
        }finally {
            //关闭资源
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //返回结果
        return index;
    }

    @Override
    //获取所有用户信息
    public List<User> userShowDao() {
        //声明jdbc对象
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        //声明变量
        List<User> lu=null;
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取链接
            conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","2001223");
            //创建sql语句
            String sql="select * from t_user";
            //创建sql命令对象
            ps=conn.prepareStatement(sql);
            //执行sql
            rs=ps.executeQuery();
            //给集合赋值
            lu=new ArrayList<User>();
            //遍历结果集
            while (rs.next()){
                //给变量赋值
                User u=new User();
                u.setUid(rs.getInt("uid"));
                u.setUname(rs.getString("uname"));
                u.setPwd(rs.getString("pwd"));
                u.setSex(rs.getString("sex"));
                u.setAge(rs.getInt("age"));
                u.setBirth(rs.getString("birth"));
                //将对象存储到集合中
                lu.add(u);
            }
        }catch (Exception e){
            e.getStackTrace();
        }finally {
            //关闭资源
            try {
                assert rs != null;
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return lu;
    }

    @Override
    //根据用户id修改用户密码
    public int userChangePwdDao(String newPwd, int uid) {
        //声明jdbc对象
        Connection conn=null;
        PreparedStatement ps=null;
        //创建变量
        int index=-1;
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取链接
            conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","2001223");
            //创建sql语句
            String sql="update t_user set pwd=? where uid=?";
            //创建sql命令对象
            ps=conn.prepareStatement(sql);
            //给占位符赋值
            ps.setString(1,newPwd);
            ps.setInt(2,uid);
            //执行sql
            index=ps.executeUpdate();
        }catch (Exception e) {
            e.getStackTrace();
        }finally {
            //关闭资源
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //返回结果
        return index;
    }

    @Override
    public User checkUserLoginDao(String uname, String pwd){//根据用户名和密码查询用户信息
        //声明jdbc对象
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        //声明变量
        User u=null;
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取链接
            conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","2001223");
            //创建sql语句
            String sql="select * from t_user where uname=? and pwd=?";
            //创建sql命令对象
            ps=conn.prepareStatement(sql);
            //给占位符赋值
            ps.setString(1,uname);
            ps.setString(2,pwd);
            //执行sql
            rs=ps.executeQuery();
            //遍历结果集
            while (rs.next()){
                u=new User();
                u.setUid(rs.getInt("uid"));
                u.setUname(rs.getString("uname"));
                u.setPwd(rs.getString("pwd"));
                u.setSex(rs.getString("sex"));
                u.setAge(rs.getInt("age"));
                u.setBirth(rs.getString("birth"));
            }
        }catch (Exception e){
            e.getStackTrace();
        }finally {
            //关闭资源
            try {
                assert rs != null;
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
            //返回结果
            return u;
    }
}

主要功能实现代码,仅供学习者参考

最后就是一些效果图
登录
注册
查看个人信息
修改信息
查看所有用户信息
用户退出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mvc三层架构(用户信息管理系统) 的相关文章

  • 唯一索引或主键违规:“PRIMARY KEY ON PUBLIC.xxx”; SQL语句

    每当我的应用程序启动时 我都会收到以下错误消息 Caused by org h2 jdbc JdbcSQLException Unique index or primary key violation PRIMARY KEY ON PUBL
  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • Java手写数组和案例拓展

    Java手写数组和案例拓展 1 Mermanid代码绘制的思维导图解释实现思路原理 mermaid svg HoH3kyfEhPDhcUh4 font family trebuchet ms verdana arial sans serif
  • js发布——订阅模式的通用实现及取消订阅

    h1 发布 订阅模式的通用实现 h1 p javaScript作为一门解释执行的语言 给对象添加动态职责是理所当然的 所以我们将发布 订阅的功能提取出来 放在一个单独的对象内 p
  • Javascript创建对象的几种方式及优劣

    1 字面量方式 var obj name tom age 20 career network getName function return this name alert obj getName 这种方式适合创建单个对象 2 创建Obje
  • HttpCanary使用指南——各种神奇的插件

    HttpCanary更多资料 点我 作为目前Android平台最强大的抓包工具 HttpCanary从设计之初就规划了插件功能 2 6 0版本之前称为 模组 基于NetBare框架的虚拟网关 拦截器设计 HttpCanary可以实现非常多的
  • 2020春秋招聘图像处理 人工智能方向 各大厂面试常见题整理一(附答案)(阿里腾讯华为字节)

    因为本人近期也要紧临毕业 面临招聘面试 所以整体别人公开的面经 做一个整理 并且加上自己认为的答案 欢迎各位读者对答案进行指正和交流 深度残差的作用 直观上 深度加深 出现梯度消失和梯度爆炸的问题 在论文中 出现了一个奇怪的现象 就是56层
  • Hive命令的使用

    命令行界面 Command Line Interface CLI 是Hive交互最常见也是最方便的方式 在命令行界面可以执行Hive支持的觉大多数功能 如查询 创建等 hive e 有时 并不需要一直打开命令行界面 也就是说执行完查询后立刻
  • Vue-ref用法

    用ref操作模版中的dom元素 1 在模版中 声明ref名称 div ref引用Dom节点 div 2 用法 change this refs chagneBack style color red 用ref操作组件 1 在组件引用中声明re
  • Redis 汇总

    Redis 0 声明 1 概述 1 1 Redis是什么 1 2 Redis优缺点 1 3 为什么要用 Redis 为什么要用缓存 1 4 Redis为什么这么快 2 常用数据结构 2 1 String 应用场景 2 2 List 应用场景
  • Jetpack Compose多平台用于Android和IOS

    JetBrains和外部开源贡献者已经努力工作了几年时间来开发Compose Multiplatform 并最近发布了适用于iOS的Alpha版本 自然地 我们对其功能进行了测试 并决定通过使用该框架在iOS上运行我们的Dribbble复制
  • Matlab中求数据概率分布的方法

    一 问题描述 对已有的一些列数据进行分析 想得到该数据的分布和统计特性 如概率密度函数 概率分布 累计概率密度等等 例如 已有一段时间的声音测量数据 求该数据的分布特性 并给出噪声的95 置信区间统计参数以表征该声音监测数据的总体水平 二
  • HTTP响应的结构是怎么样的?

    HTTP响应由三部分组成 状态行 响应头 响应正文 状态行 包括协议版本的Version 状态码 Status Code 回应短语 响应头 包括搭建服务器的软件 发送响应的时间 回应数据的格式等信息 响应正文 就是响应的具体数据 HTTP请
  • PROJ.4学习——初识PROJ

    PROJ 4介绍 初始认识 前言 PROJ是一个通用的坐标转换软件 它将地理空间坐标从一个坐标系转换为另一个坐标系 这包括地图投影和大地坐标变换 PROJ包含命令行应用程序 可以方便地从文本文件或直接从用户输入转换坐标 除了命令行实用程序之
  • eclipse安装教程(2021最新版)超级易懂到吐血

    第一步 下载JDK 下载地址 http www oracle com technetwork java javase downloads index html 第二步 根据自己电脑的系统 选择相应的版本x64代表64位 x86代表32位 点
  • 螺杆真空泵安装流程图_螺杆式真空泵基本知识送给刚入行的新朋友

    螺杆式真空泵是容积式真空泵中的新兴成员 出现于上世纪90年代前后 发展较晚 但作为一种理想干泵 螺杆式真空泵在面世后获得了快速发展 现在就跟小编去了解一下它的基本知识吧 一 螺杆式真空泵特点 螺杆式真空泵脱胎于螺杆式压缩机与螺杆液体输送泵
  • 精英反向与二次插值改进的黏菌算法-附代码

    精英反向与二次插值改进的黏菌算法 文章目录 精英反向与二次插值改进的黏菌算法 1 黏菌算法 2 改进黏菌算法 2 1 精英反向学习机制 2 2 二次插值方法 3 实验结果 4 参考文献 5 Matlab代码 6 python代码 摘要 针对
  • 关于集合Collection

    集合框架 概念 1 Collection是所有集合的顶级接口 2 集合和数组一样 可以保存一组元素 并且提供了操作元素的相关方法 使用更方便 3 Collection 下面有多种实现类 因此我们有更多的数据结构可以选择 Collection
  • 蓝桥杯2020年第十一届省赛真题-子串分值

    题目 题目链接 题解 思维 考虑每个字符对最终答案的贡献 每个字符的贡献为其左侧连续与之不相同的字符个数 1乘以其右侧与之不相同的字符个数 1 样例 ababc 第一个字符a的贡献 0 1 1 1 2 a ab 第二个字符b的贡献 1 1
  • Java使用poi-tl1.9.1生成Word文档的几个小技巧

    目录 前言 一 poi tl简介 1 什么是poi tl 2 常见的word生成对比 3 poi tl功能点 二 poi tl文档生成 1 模板准备 2 目标参数填充 3 生成效果 三 可能会遇到的问题 1 混合图表生成报错 2 图表参数设
  • Linux /etc/resolv.conf DNS服务器IP地址修改被覆盖问题

    为了临时修改DNS服务器IP地址 可能会选择手动修改 etc resolv conf 文件 而在重启Network Manager服务后 sudo systemctl restart NetworkManager resolv conf 文
  • mvc三层架构(用户信息管理系统)

    mvc三层架构 实战项目 用户信息管理系统 一 三层架构 View 层 用于接收用户提交请求的代码 Service 层 系统的业务逻辑主要在这里完成 Dao 层 直接操作数据库的代码 二 三层架构图 三 用户信息管理系统 利用MVC三层架构