目录

要求:

项目目录:

建表

 pom.xml

controller层

filter

Listener

mapper

pojo

service层

Util

配置文件

JSP

总结:


JSP+Servlet+HTML5+MyBatis+Maven

jdk8+MySQL8.0

要求:

具体完成如下3个模块的功能:

1.用户登录与注册模块

系统的使用者必须是注册用户,一个注册用户需要注册的信息有:用户登录名、密码、用户真实名字等信息。该模块具有两个功能:

(1)用户登录:在登录时,如果用户名和密码正确,进入系统页面。

(2)用户注册:新用户应该先注册,然后再登录该系统。

2.名片管理模块

一个名片包含信息有:序号(id)、姓名、性别、登录账号、密码、电子邮箱等有关信息,需要完成对名片有关的管理操作,主要有:

(1)增加名片:增加名片信息到数据库内。

(2)修改名片:修改名片信息。

(3)查询名片:以模糊查询方式查询名片。

(4)删除名片:名片的删除由2种方式,即把名片移到回收站,把名片彻底删除。

(5)可以实现名片批量导入和导出,即将查询满足条件的所有名片导入Excel中,也可以将Excel中存放的名片信息导入到数据库中。

(6)浏览/查询:可以模糊查询、浏览目前有效的名片。

3.回收站管理模块

(1)还原:把回收站中的名片还原回收。

(2)彻底删除:把名片彻底从回收站删除。

(3)浏览/查询:可以模糊查询、浏览回收站中的名片

4、系统角色划分

该系统分为两个角色:系统管理员、注册的用户。每种角色功能要求如下。

(1)系统管理员

系统管理员,可以完成系统中所规定的所有功能,且可以对所有数据具有操作权限,并可以对注册用户进行管理(删除),注意,当删除该注册用户时,对应于该用户的所有名片记录也全部删除。

(2)注册的用户

一个注册用户,只能对自己添加的名片记录有操作权限(查询、修改、删除)。对于其它的注册用户信息以及其它用户添加的名片记录是不可见的。

项目目录:

Java大作业 名片录入管理 java名片管理系统总结_mybatis

 

Java大作业 名片录入管理 java名片管理系统总结_用户登录_02

建表

#创建注册用户表
CREATE TABLE IF NOT EXISTS user_tb(   
`account` VARCHAR(15) COLLATE utf8_bin COMMENT '用户登录名',								#用户登录名(唯一)(与名片中的对应)		#注册时判断长度,=》传入后判断
`password` VARCHAR(15) COLLATE utf8_bin NOT NULL COMMENT '用户登录密码',							#密码(非空)#传入后先判断长度
CONSTRAINT pk_user_name PRIMARY KEY(`account`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户信息';

#创建名片
CREATE TABLE IF NOT EXISTS card_tb(   
`account` VARCHAR(15) COMMENT '用户登录名(登录账号)',									#外键约束		登录账号		用户登录名(唯一)				
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'id',										#自增
`sex` VARCHAR(2) NOT NULL COMMENT '性别',
`name` VARCHAR(15) COLLATE utf8_bin NOT NULL COMMENT '姓名',
`password` VARCHAR(15) COLLATE utf8_bin NOT NULL COMMENT '密码',
`email` VARCHAR(15) COLLATE utf8_bin NOT NULL COMMENT '电子邮箱',   			
`status` INT(2) NOT NULL DEFAULT '1' COMMENT '状态 0:禁用,1:正常',					#都非空 判断是否在回收站(是否可见)1 0  默认值
CONSTRAINT pk_card_id PRIMARY KEY (`id`) USING BTREE,
CONSTRAINT fk_user_account FOREIGN KEY (`account`) REFERENCES user_tb(`account`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='名片信息';

#创建系统管理员表
CREATE TABLE IF NOT EXISTS manager_tb(   
`account` VARCHAR(15) COLLATE utf8_bin COMMENT '管理员登录名',								#用户登录名(唯一)(与名片中的对应)		#注册时判断长度,=》传入后判断
`password` VARCHAR(15) COLLATE utf8_bin NOT NULL COMMENT '管理员登录密码',							#密码(非空)#传入后先判断长度
CONSTRAINT pk_manager_name PRIMARY KEY(`account`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='管理员信息';

 pom.xml

<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 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>qihang</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>

  <name>qihang Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <!--指定jdk版本-->
  <properties>
    <java.version>1.8</java.version>
  </properties>

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
      </dependency>

      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.10</version>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.29</version>
      </dependency>

      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
      </dependency>

      <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
      </dependency>

      <!--jstl-->
      <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
      </dependency>
      <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.58</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.1.1</version>
      </dependency>
<!--      -->
      <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
      </dependency>
      <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
      </dependency>
<!--        <dependency>-->
<!--            <groupId>org.apache.tomcat.embed</groupId>-->
<!--            <artifactId>tomcat-embed-core</artifactId>-->
<!--            <version>9.0.65</version>-->
<!--        </dependency>-->
    </dependencies>


  <build>
    <finalName>qihang</finalName>
  </build>
</project>

controller层

common放置公用servlet

包含 验证码,文件上传,文件下载

(用户下载有bug)

package com.qihang.controller.common;

import com.qihang.Util.CheckCodeUtil;
import com.qihang.pojo.Card;
import com.qihang.service.CardService;
import com.qihang.service.impl.CardServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    private CardService cardService=new CardServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletOutputStream servletOutputStream= resp.getOutputStream();
        String checkCode = CheckCodeUtil.outputVerifyImage(100, 50, servletOutputStream, 4);
        //存入Session
        HttpSession session=req.getSession();
        session.setAttribute("checkCodeGen",checkCode);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//       换成resopnse 的字节输出流 OutputStream fos = new FileOutputStream("d://a.jpg");
        ServletOutputStream servletOutputStream= resp.getOutputStream();
        String checkCode = CheckCodeUtil.outputVerifyImage(100, 50, servletOutputStream, 4);
    }
}
package com.qihang.controller.common;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.qihang.pojo.Card;
import com.qihang.pojo.Manager;
import com.qihang.pojo.User;
import com.qihang.service.CardService;
import com.qihang.service.impl.CardServiceImpl;

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

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    CardService cardService=new CardServiceImpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        HttpSession session=req.getSession();
        String who = (String) session.getAttribute("who");
//        List<Card> cards=cardService.selectAll();
        //?合并
        User user =(User)session.getAttribute("user");
//        Manager manager=(Manager)session.getAttribute("manager");
        List<Card> cards=null;
        if (user != null) {
            cards = cardService.selectAllEyeableByAccount(user.getAccount());
        }else{
            cards=cardService.selectAllEyeable();
        }
        FileOutputStream out = new FileOutputStream("C:\\File\\Card"+".xlsx");//导出文件地址
        EasyExcel.write(out, Card.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .autoCloseStream(Boolean.FALSE)
                .sheet("sheet")
                .doWrite(cards);
        session.setAttribute("download_msg","下载成功");
        resp.sendRedirect("/"+who+"/index");
    }

    @Override
    protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
        this.doGet(req,resp);
    }
}
package com.qihang.controller.common;

import com.alibaba.excel.EasyExcel;
import com.qihang.controller.Listener.ExcelListener;
import com.qihang.pojo.Card;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.io.InputStream;
import java.util.List;

@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        HttpSession session=req.getSession();
        try {
            List<FileItem> list = fileUpload.parseRequest(req);
            for (FileItem fileItem : list) {
                if (!fileItem.isFormField()) {
                    // 是附件
                    InputStream inputStream = fileItem.getInputStream();
                    EasyExcel.read(inputStream, Card.class, new ExcelListener())
                            .sheet().doRead();
                }
            }
            session.setAttribute("upload_msg","上传成功");
            resp.sendRedirect("/user/index");
        } catch (FileUploadException e) {
            session.setAttribute("upload_msg","上传失败");
            e.printStackTrace();
        }
    }
    @Override
    protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
        this.doGet(req,resp);
    }
}

filter

登录验证拦截器

(不太会)

package com.qihang.controller.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 登录验证的过滤器
 * 放行 登录 注册
 */
@WebFilter("/*")
public class LoginFiter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) servletRequest;
        String[] urls={".jsp","/userLogin.jsp","/managerLogin.jsp","/user/login",
        "/Manager/login","userRegister.jsp","managerRegister.jsp","/user/register",
                "/Manager/register","/checkCodeServlet","/downloadServlet","/uploadServlet"};
        String url = req.getRequestURL().toString();
        for(String u:urls){
            if(url.contains(u)){
                filterChain.doFilter(servletRequest, servletResponse);
                //放行后,执行完跳转后的界面,会回到这里
//                不想执行后面的操作
                return;
            }
        }
        //1 判读session是否有Session
        HttpSession session=req.getSession();
        Object who = session.getAttribute("who");
        Object user = session.getAttribute("user");
        Object manager = session.getAttribute("manager");
        if(who != null){
            //登录郭
            if(user!=null){
                if(url.contains("/user/")){
                    filterChain.doFilter(servletRequest, servletResponse);
                    return;
                }
            }else{
                if(url.contains("/Manager/")){
                    filterChain.doFilter(servletRequest, servletResponse);
                    return;
                }
            }
        }else{
            //存入提示信息
            req.setAttribute("login_msg","您尚未登录!");
            req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);
        }
    }
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

Listener

上传或下载要用到

package com.qihang.controller.Listener;


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.qihang.pojo.Card;
import com.qihang.service.CardService;
import com.qihang.service.impl.CardServiceImpl;

import javax.servlet.annotation.WebListener;

@WebListener
public class ExcelListener extends AnalysisEventListener<Card> {

    CardService cardService = new CardServiceImpl();

    @Override
    public void invoke(Card card, AnalysisContext analysisContext) {
        cardService.add(card);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

}

 用反射重写service方法

(不是很懂)

package com.qihang.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();
        int beginIndex=uri.lastIndexOf('/');
        int endIndex=uri.indexOf('?');
        String methodName="";
        if(endIndex==-1){
            methodName = uri.substring(beginIndex+1);
        }else{
            methodName = uri.substring(beginIndex+1,endIndex);
        }
        //this 代表了BaseServlet的子类们
        //获取 子类 的字节码对象 class
        Class<? extends BaseServlet> cls = this.getClass();
        try {
            Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}
package com.qihang.controller;

import com.qihang.pojo.Card;
import com.qihang.pojo.Manager;
import com.qihang.pojo.User;
import com.qihang.service.CardService;
import com.qihang.service.ManagerService;
import com.qihang.service.UserService;
import com.qihang.service.impl.CardServiceImpl;
import com.qihang.service.impl.ManagerServiceImpl;
import com.qihang.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@WebServlet("/Manager/*")
public class ManagerServlet extends BaseServlet{
    private ManagerService managerService=new ManagerServiceImpl();
    private CardService cardService=new CardServiceImpl();

    private UserService userService = new UserServiceImpl();

    public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //前端判断是否为空
        String account = req.getParameter("account").trim();
        String password = req.getParameter("password").trim();
        Manager manager = new Manager();
        manager.setAccount(account);
        manager.setPassword(password);
        //获取复选框数据
        String remember = req.getParameter("remember");
        Manager manager_selected = managerService.login(manager);
        //没有或者在回收站
        if (manager_selected != null) {
            //登录成功
            //判断用户是否勾选记住我   调用常量的equals,防止空值异常
            if ("1".equals(remember)) {
                System.out.println("yse");
                Cookie c_account = new Cookie("managerAccount", account);
                Cookie c_password = new Cookie("managerPassword", password);
                c_account.setMaxAge(60 * 60 * 24 * 7);//一周
                c_password.setMaxAge(60 * 60 * 24 * 7);//一周
                resp.addCookie(c_account);
                resp.addCookie(c_password);
            }
            //将登录成功后的user对象,存储到session中
            HttpSession session = req.getSession();
            session.setAttribute("manager", manager_selected);
            session.setAttribute("who","Manager");
            //不需要传参数,用重定向
    //            String contextPath=req.getContextPath();//用 动态生成虚拟路径
            resp.sendRedirect("/Manager/index");
        } else {
            //登录失败,携带用户名,密码跳转回去
            req.setAttribute("login_msg", "用户名或密码错误");
            req.getRequestDispatcher("/managerLogin.jsp").forward(req, resp);
        }
    }
    public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String account = req.getParameter("account").trim();
        String password = req.getParameter("password").trim();
        Manager manager=new Manager();
        manager.setAccount(account);
        manager.setPassword(password);
        String checkCode = req.getParameter("checkCode");
        HttpSession session=req.getSession();
        String checkCodeGen = (String) session.getAttribute("checkCodeGen");
        if(!checkCodeGen.equalsIgnoreCase(checkCode)){
            req.setAttribute("register_msg","验证码错误");
            req.getRequestDispatcher("/managerRegister.jsp").forward(req,resp);
            return;
        }
        boolean flag=managerService.register(manager);
        String register_mag="";
        String path="";
        if(flag){
            register_mag="注册成功,请登录";
            path="/managerLogin.jsp";
        }else{
            register_mag="用户已存在";
            path="/managerRegister.jsp";
        }
        req.setAttribute("register_msg",register_mag);
        req.getRequestDispatcher(path).forward(req,resp);
    }
    public void index(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        List<Card> cards = cardService.selectAllEyeable();
        req.setAttribute("cards",cards);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }
    public void recycle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        List<Card> cards = cardService.selectAllRecycle();
        req.setAttribute("cards",cards);
        req.getRequestDispatcher("/recycle.jsp").forward(req,resp);
    }

    /**
     * 如果有 ,直接添加,没有直接注册
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String account = req.getParameter("account");
        String name = req.getParameter("name");
        String sex = req.getParameter("sex");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        User user=new User();
        user.setAccount(account);
        user.setPassword(password);
        userService.register(user);
        Card card=new Card();
        card.setName(name);
        card.setSex(sex);
        card.setAccount(account);
        card.setPassword(password);
        card.setEmail(email);
        cardService.add(card);
        req.getRequestDispatcher("/Manager/index").forward(req,resp);
    }
    public void selectById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id = req.getParameter("id");
        Card card = cardService.selectById(Long.parseLong(id));
        req.setAttribute("card",card);
        req.getRequestDispatcher("/updateCard.jsp").forward(req,resp);
    }
    public void toRecycle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        req.setCharacterEncoding("utf-8");
//        String id=req.getParameter("id");
//        String name=req.getParameter("name");
//        String uri="";
//        if(id==null){
//            userService.toRecycle(name);
//            cardService.toAllRecycle(name);
//            uri="/Manager/userAll";
//            req.setAttribute("name",null);
//        }else{
//            cardService.toRecycle(Long.valueOf(id));
//            uri="/Manager/index";
//            req.setAttribute("id",null);
//        }
//        req.getRequestDispatcher(uri).forward(req,resp);
        req.setCharacterEncoding("utf-8");
        String id=req.getParameter("id");
        cardService.toRecycle(Long.valueOf(id));
        req.getRequestDispatcher("/Manager/index").forward(req,resp);
    }
    public void outRecycle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        req.setCharacterEncoding("utf-8");
//        String id=req.getParameter("id");
//        String name=req.getParameter("name");
//        String uri="";
//        if(id==null){
//            userService.outRecycle(name);
//            cardService.outAllRecycle(name);
//            uri="/Manager/userAll";
//            req.setAttribute("name",null);
//        }else{
//            cardService.toRecycle(Long.valueOf(id));
//            uri="/Manager/index";
//            req.setAttribute("id",null);
//        }
        req.setCharacterEncoding("utf-8");
        String id=req.getParameter("id");
        cardService.outRecycle(Long.valueOf(id));
        req.getRequestDispatcher("/Manager/recycle").forward(req,resp);
    }
    public void deleteById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id = req.getParameter("id");
        cardService.deleteById(Long.valueOf(id));
        req.getRequestDispatcher("/Manager/recycle").forward(req,resp);
    }
    public void out(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session=req.getSession();
        session.setAttribute("who",null);
        session.setAttribute("manager",null);
        resp.sendRedirect("/login.jsp");
    }
    public void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id =req.getParameter("id");
        String name = req.getParameter("name");
        String sex = req.getParameter("sex");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        Card card=new Card();
        card.setId(Long.parseLong(id));
        card.setName(name);
        card.setSex(sex);
        card.setPassword(password);
        card.setEmail(email);
        cardService.update(card);
        req.getRequestDispatcher("/Manager/index").forward(req,resp);
    }
    public void userAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        List<User> users = userService.selectAll();
        req.setAttribute("users",users);
        req.getRequestDispatcher("/userAll.jsp").forward(req,resp);
    }
    public void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String account = req.getParameter("account");
        managerService.deleteUser(account);
        req.getRequestDispatcher("/Manager/userAll").forward(req,resp);
    }
}
package com.qihang.controller;

import com.qihang.pojo.Card;
import com.qihang.pojo.User;
import com.qihang.service.CardService;
import com.qihang.service.UserService;
import com.qihang.service.impl.CardServiceImpl;
import com.qihang.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
    private UserService userService = new UserServiceImpl();
    private CardService cardService=new CardServiceImpl();
    public void selectALl(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("user selectAll()");
    }
    public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //前端判断是否为空
        String account = req.getParameter("account").trim();
        String password = req.getParameter("password").trim();
        User user = new User();
        user.setAccount(account);
        user.setPassword(password);
        String remember = req.getParameter("remember");
        User user_selected = userService.login(user);
        if (user_selected != null) {
            //判断用户是否勾选记住我   调用常量的equals,防止空值异常
            if ("1".equals(remember)) {
                //勾选了,发送Cookie
                //想要存储中文需要设置URL编码,获取时,用URL解码
                Cookie c_account = new Cookie("userAccount", account);
                Cookie c_password = new Cookie("userPassword", password);
                c_account.setMaxAge(60 * 60 * 24 * 21);//一周
                c_password.setMaxAge(60 * 60 * 24 * 21);//一周
                resp.addCookie(c_account);
                resp.addCookie(c_password);
            }
            HttpSession session = req.getSession();
            session.setAttribute("user", user_selected);
            session.setAttribute("who","user");
//            String contextPath=req.getContextPath();//用 动态生成虚拟路径
            resp.sendRedirect("/user/index");
        } else {
            req.setAttribute("login_msg", "用户名或密码错误");
            req.getRequestDispatcher("/userLogin.jsp").forward(req, resp);
        }
    }
    public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String account = req.getParameter("account").trim();
        String password = req.getParameter("password").trim();
        User user=new User();
        user.setAccount(account);
        user.setPassword(password);
        String checkCode = req.getParameter("checkCode");
        HttpSession session=req.getSession();
        String checkCodeGen = (String) session.getAttribute("checkCodeGen");
        if(!checkCodeGen.equalsIgnoreCase(checkCode)){
            req.setAttribute("register_msg","验证码错误");
            req.getRequestDispatcher("/userRegister.jsp").forward(req,resp);
            return;
        }
        boolean flag=userService.register(user);
        String register_mag="";
        String path="";
        if(flag){
            register_mag="注册成功,请登录";
            path="/userLogin.jsp";
        }else{
            register_mag="用户已存在";
            path="/userRegister.jsp";
        }
        req.setAttribute("register_msg",register_mag);
        req.getRequestDispatcher(path).forward(req,resp);
    }
    public void index(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        HttpSession session = req.getSession();
        User user =(User)session.getAttribute("user");
        List<Card> cards = cardService.selectAllEyeableByAccount(user.getAccount());
        req.setAttribute("cards",cards);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }
    public void recycle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        HttpSession session = req.getSession();
        User user =(User)session.getAttribute("user");
        List<Card> cards = cardService.selectAllByAccountRecycle(user.getAccount());
        req.setAttribute("cards",cards);
        req.getRequestDispatcher("/recycle.jsp").forward(req,resp);
    }
    public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("name");
        String sex = req.getParameter("sex");
        HttpSession session= req.getSession();
        User user = (User) session.getAttribute("user");
        String account =user.getAccount();
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        Card card=new Card();
        card.setName(name);
        card.setSex(sex);
        card.setAccount(account);
        card.setPassword(password);
        card.setEmail(email);
        cardService.add(card);
        req.getRequestDispatcher("/user/index").forward(req,resp);
    }
    public void selectById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id = req.getParameter("id");
        Card card = cardService.selectById(Long.parseLong(id));
        req.setAttribute("card",card);
        req.getRequestDispatcher("/updateCard.jsp").forward(req,resp);
    }
    public void toRecycle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id=req.getParameter("id");
        cardService.toRecycle(Long.valueOf(id));
        req.getRequestDispatcher("/user/index").forward(req,resp);
    }
    public void outRecycle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id = req.getParameter("id");
        cardService.outRecycle(Long.valueOf(id));
        req.getRequestDispatcher("/user/recycle").forward(req,resp);
    }
    public void deleteById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id = req.getParameter("id");
        cardService.deleteById(Long.valueOf(id));
        req.getRequestDispatcher("/user/recycle").forward(req,resp);
    }
    public void out(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session=req.getSession();
        session.setAttribute("who",null);
        session.setAttribute("user",null);
        resp.sendRedirect("/login.jsp");
    }
    public void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String id =req.getParameter("id");
        String name = req.getParameter("name");
        String sex = req.getParameter("sex").trim();
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        Card card=new Card();
        card.setId(Long.parseLong(id));
        card.setName(name);
        card.setSex(sex);
        card.setPassword(password);
        card.setEmail(email);
        cardService.update(card);
        req.getRequestDispatcher("/user/index").forward(req,resp);
    }
}

mapper

package com.qihang.mapper;

import com.qihang.pojo.Card;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface CardMapper {
    /**
     * 查询所有可见 名片
     * @return
     */
    @Select("select * from card_tb where status=1")
    List<Card> selectAllEyeable();
    /**
     * 查询所有 名片
     * @return
     */
    @Select("select * from card_tb")
    List<Card> selectAll();

    /**
     * 管理员的回收站
     * @return
     */
    @Select("select * from card_tb where status=0")
    List<Card> selectAllRecycle();
    /**
     * 用户的回收站
     * @return
     */
    @Select("select * from card_tb where account=#{account} and status=0")
    List<Card> selectAllByAccountRecycle(@Param("account") String account);
    /**
     * 用 同名用户名限制 查询所有 名片
     * @param account 同名用户名
     * @return
     */
    @Select("select * from card_tb where account=#{account} and status=1")
    List<Card> selectAllEyeableByAccount(@Param("account") String account);
    /**
     * 用 同名用户名限制 查询所有 名片
     * @param account 同名用户名
     * @return
     */
    @Select("select * from card_tb where account=#{account}")
    List<Card> selectAllByAccount(@Param("account") String account);
    @Select("select * from card_tb where id=#{id}")
    Card selectById(Long id);

    @Insert("insert into card_tb (account,sex,name,password,email) values (#{account},#{sex},#{name},#{password},#{email})")
    void add(Card card);

    @Update("update card_tb set sex = #{sex},name=#{name},password=#{password},email=#{email} where id =#{id}")
    void update(Card card);

    @Update("update card_tb set status=0 where id=#{id}")
    void upataStatusTo_0(@Param("id") Long id);
    @Update("update card_tb set status=0 where name=#{name}")
    void upataStatusAllTo_0(@Param("name") String name);
    @Update("update card_tb set status=1 where id=#{id}")
    void upataStatusTo_1(@Param("id") Long id);
    @Update("update card_tb set status=1 where name=#{name}")
    void upataStatusAllTo_1(@Param("name") String name);
    /**
     * 批量删除
     * @param ids
     */
    void deleteByIds(@Param("ids") int[] ids);
    @Delete("delete from card_tb where id = #{id}")
    void deleteById(@Param("id") Long id);
    @Delete("delete from card_tb where account=#{account}")
    void deleteByAccount(@Param("account") String account);
}
package com.qihang.mapper;

import com.qihang.pojo.Manager;
import com.qihang.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface ManagerMapper {
    /**
     * 用user 查询管理者
     * @param manager
     * @return
     */
    @Select("select * from manager_tb where account = #{account} and password=#{password}")
    Manager selectByManager(Manager manager);

    /**
     * 用account 查询所有的管理者
     * @param account
     * @return
     */
    @Select("select * from manager_tb where account = #{account}")
    Manager selectByAccount(@Param("account") String account);

    @Insert("insert into manager_tb (account,password) values (#{account},#{password})")
    void add(Manager manager);
}
package com.qihang.mapper;

import com.qihang.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {
    //查不到返回null

    /**
     * 用user 查询 不在回收站的 用户
     * @param user
     * @return
     */
    @Select("select * from user_tb where account = #{account} and password=#{password} and status=1")
    User selectByUser(User user);

    /**
     * 用account 查询所有(包括在回收站)的用户
     * @param account
     * @return
     */
    @Select("select * from user_tb where account = #{account}")
    User selectAllByAccount(@Param("account") String account);

    @Insert("insert into user_tb (account,password) values (#{account},#{password})")
    void add(User user);

    @Select("select * from user_tb")
    List<User> selectAll();
    @Update("update user_tb set status=0 where name=#{name}")
    void upataStatusTo_0(@Param("name") String name);
    @Update("update user_tb set status=1 where name=#{name}")
    void upataStatusTo_1(@Param("name") String name);
    @Delete("delete from user_tb where account=#{account}")
    void deleteByAccount(@Param("account") String account);
}

pojo

package com.qihang.pojo;

import lombok.Data;

@Data
public class Card {
    private String account;
    private Long id;
    private String sex;
    private String name;
    private String password;
    private String email;
    private Integer status;
}
package com.qihang.pojo;

import lombok.Data;

@Data
public class Manager {
    private String account;
    private String password;
}
package com.qihang.pojo;

import lombok.Data;

@Data
public class User {
    private String account;
    private String password;
//    private Integer status;
}

service层

package com.qihang.service.impl;

import com.qihang.Util.SqlSessionFactoryUtils;
import com.qihang.mapper.CardMapper;
import com.qihang.pojo.Card;
import com.qihang.service.CardService;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class CardServiceImpl implements CardService {
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();

    /**
     * 管理员查询所有可见名片  !分页
     * @return
     */
    public List<Card> selectAllEyeable() {
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> cards = mapper.selectAllEyeable();
        sqlSession.close();
        return cards;
    }
    public List<Card> selectAll() {
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> cards = mapper.selectAll();
        sqlSession.close();
        return cards;
    }
    public List<Card> selectAllEyeableByAccount(String account) {
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> cards = mapper.selectAllEyeableByAccount(account);
        sqlSession.close();
        return cards;
    }
    public List<Card> selectAllByAccount(String account) {
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> cards = mapper.selectAllByAccount(account);
        sqlSession.close();
        return cards;
    }
    /**
     * 添加名片
     * @param card
     */
    public void add(Card card){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.add(card);
        sqlSession.commit();
        sqlSession.close();
    }

    /**
     * 修改 时 回显数据用
     * @param id
     * @return
     */
    public Card selectById(Long id) {
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        Card card = mapper.selectById(id);
        sqlSession.close();
        return card;
    }

    /**
     * 修改名片
     * @param card
     */
    public void update(Card card){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.update(card);
        sqlSession.commit();
        sqlSession.close();
    }

    @Override
    public void deleteByIds(int[] ids) {
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.deleteByIds(ids);
        sqlSession.commit();
        sqlSession.close();
    }
    public List<Card> selectAllRecycle(){
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> cards = mapper.selectAllRecycle();
        sqlSession.close();
        return cards;
    }
    public List<Card> selectAllByAccountRecycle(String account){
        SqlSession sqlSession = factory.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> cards = mapper.selectAllByAccountRecycle(account);
        sqlSession.close();
        return cards;
    }

    public void toRecycle(Long id){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.upataStatusTo_0(id);
        sqlSession.commit();
        sqlSession.close();
    }
    public void toAllRecycle(String name){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.upataStatusAllTo_0(name);
        sqlSession.commit();
        sqlSession.close();
    }

    public void outRecycle(Long id){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.upataStatusTo_1(id);
        sqlSession.commit();
        sqlSession.close();
    }
    public void outAllRecycle(String name){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.upataStatusAllTo_1(name);
        sqlSession.commit();
        sqlSession.close();
    }
    public void deleteById(Long id){
        SqlSession sqlSession=factory.openSession();
        CardMapper mapper=sqlSession.getMapper(CardMapper.class);
        mapper.deleteById(id);
        sqlSession.commit();
        sqlSession.close();
    }
}
package com.qihang.service.impl;

import com.qihang.Util.SqlSessionFactoryUtils;
import com.qihang.mapper.CardMapper;
import com.qihang.mapper.ManagerMapper;
import com.qihang.mapper.UserMapper;
import com.qihang.pojo.Manager;
import com.qihang.service.ManagerService;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;


public class ManagerServiceImpl implements ManagerService {
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
    public Manager login(Manager manager) {
        SqlSession sqlSession = factory.openSession();
        ManagerMapper mapper = sqlSession.getMapper(ManagerMapper.class);
        Manager manager_selected = mapper.selectByManager(manager);
        sqlSession.close();
        return manager_selected;
    }

    public void add(Manager manager) {
        SqlSession sqlSession = factory.openSession();
        ManagerMapper mapper = sqlSession.getMapper(ManagerMapper.class);
        mapper.add(manager);
        sqlSession.commit();
        sqlSession.close();
    }

    /**
     * 注册方法  1 先判断是否有相同account
     * 2 添加
     * @param manager
     * @return
     */
    public boolean register (Manager manager) {
        SqlSession sqlSession = factory.openSession();
        ManagerMapper mapper = sqlSession.getMapper(ManagerMapper.class);
        Manager manager_selected=mapper.selectByAccount(manager.getAccount());
        if(manager_selected==null){
            mapper.add(manager);
            sqlSession.commit();
        }
        sqlSession.close();
        return manager_selected==null;
    }
    public void deleteUser(String account){
        SqlSession sqlSession = factory.openSession();
        CardMapper cardMapper = sqlSession.getMapper(CardMapper.class);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        cardMapper.deleteByAccount(account);
        userMapper.deleteByAccount(account);
        sqlSession.commit();
        sqlSession.close();
    }
}
package com.qihang.service.impl;

import com.qihang.Util.SqlSessionFactoryUtils;
import com.qihang.mapper.CardMapper;
import com.qihang.mapper.UserMapper;
import com.qihang.pojo.Card;
import com.qihang.pojo.User;
import com.qihang.service.UserService;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;


public class UserServiceImpl implements UserService {
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
    public User login(User user) {
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User u = mapper.selectByUser(user);
        sqlSession.close();
        return u;
    }

    public void add(User user) {
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.add(user);
        sqlSession.commit();
        sqlSession.close();
    }

    /**
     * 注册方法  1 先判断是否有相同account
     * 2 添加
     * @param user
     * @return
     */
    public boolean register (User user) {
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //判断用户名是否存在
        User user_selected=mapper.selectAllByAccount(user.getAccount());
//        //在if判断里不要直接return true false
//        if(u==null){
//            //用户名存在
//            userMapper.add(user);
//            sqlSession.close();
//            return true;
//        }else{
//            //用户名不存在
//            sqlSession.close();
//
//            return false;
//        }
        if(user_selected==null){
            //用户不存在,注册
            mapper.add(user);
            sqlSession.commit();
        }
        sqlSession.close();
        return user_selected==null;
    }
    public User selectAllByAccount(String account){
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user_select = mapper.selectAllByAccount(account);
        sqlSession.close();
        return user_select;
    }
    public List<User> selectAll(){
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectAll();
        sqlSession.close();
        return users;
    }
    public void toRecycle(String name) {
        SqlSession sqlSession=factory.openSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        mapper.upataStatusTo_0(name);
        sqlSession.commit();
        sqlSession.close();
    }

    public void outRecycle(String name){
        SqlSession sqlSession=factory.openSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        mapper.upataStatusTo_1(name);
        sqlSession.commit();
        sqlSession.close();
    }
}
package com.qihang.service;

import com.qihang.pojo.Card;
import com.qihang.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface CardService {
    List<Card> selectAllEyeable();
    List<Card> selectAll();
    List<Card> selectAllEyeableByAccount(String account);
    List<Card> selectAllByAccount(String account);
    void add(Card card);
    Card selectById(Long id);
    void update(Card card);
    void deleteByIds(int[] ids);
    List<Card> selectAllRecycle();
    List<Card> selectAllByAccountRecycle(String account);
    void toRecycle(Long id);
    void toAllRecycle(String name);
    void outRecycle(Long id);
    void outAllRecycle(String name);
    void deleteById(Long id);
}
package com.qihang.service;

import com.qihang.pojo.Manager;
import com.qihang.pojo.User;

public interface ManagerService {
    Manager login(Manager manager);
    void add(Manager manager);
    boolean register (Manager manager);
    void deleteUser(String account);
}
package com.qihang.service;

import com.qihang.pojo.Card;
import com.qihang.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserService {
    User login(User user);
    void add(User user);
    boolean register (User user);
    User selectAllByAccount (String account);
    List<User> selectAll();
    void toRecycle(String name);
    void outRecycle(String name);
}

Util

工具类

验证码(抄的黑马的)

package com.qihang.Util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;

/**
 * 生成验证码工具类
 */
public class CheckCodeUtil {

    public static final String VERIFY_CODES = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static Random random = new Random();

//测试
    public static void main(String[] args) throws IOException {//将这个换成response的输出流
        OutputStream fos = new FileOutputStream("d://a.jpg");
        String checkCode = CheckCodeUtil.outputVerifyImage(100, 50, fos, 4);

        System.out.println(checkCode);
    }


    /**
     * 输出随机验证码图片流,并返回验证码值(一般传入输出流,响应response页面端,Web项目用的较多)
     *
     * @param width 图片宽度
     * @param height 图片高度
     * @param os  输出流
     * @param verifySize 数据长度
     * @return 验证码数据
     * @throws IOException
     */
    public static String outputVerifyImage(int width, int height, OutputStream os, int verifySize) throws IOException {
        String verifyCode = generateVerifyCode(verifySize);
        outputImage(width, height, os, verifyCode);
        return verifyCode;
    }

    /**
     * 使用系统默认字符源生成验证码
     *
     * @param verifySize 验证码长度
     * @return
     */
    public static String generateVerifyCode(int verifySize) {
        return generateVerifyCode(verifySize, VERIFY_CODES);
    }

    /**
     * 使用指定源生成验证码
     *
     * @param verifySize 验证码长度
     * @param sources    验证码字符源
     * @return
     */
    public static String generateVerifyCode(int verifySize, String sources) {
        // 未设定展示源的字码,赋默认值大写字母+数字
        if (sources == null || sources.length() == 0) {
            sources = VERIFY_CODES;
        }
        int codesLen = sources.length();
        Random rand = new Random(System.currentTimeMillis());
        StringBuilder verifyCode = new StringBuilder(verifySize);
        for (int i = 0; i < verifySize; i++) {
            verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
        }
        return verifyCode.toString();
    }

    /**
     * 生成随机验证码文件,并返回验证码值 (生成图片形式,用的较少)
     *
     * @param w 照片宽度
     * @param h 照片高度
     * @param outputFile 输出流
     * @param verifySize 数据长度
     * @return
     * @throws IOException
     */
    public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException {
        String verifyCode = generateVerifyCode(verifySize);
        outputImage(w, h, outputFile, verifyCode);
        return verifyCode;
    }



    /**
     * 生成指定验证码图像文件
     *
     * @param w
     * @param h
     * @param outputFile
     * @param code
     * @throws IOException
     */
    public static void outputImage(int w, int h, File outputFile, String code) throws IOException {
        if (outputFile == null) {
            return;
        }
        File dir = outputFile.getParentFile();
        //文件不存在
        if (!dir.exists()) {
            //创建
            dir.mkdirs();
        }
        try {
            outputFile.createNewFile();
            FileOutputStream fos = new FileOutputStream(outputFile);
            outputImage(w, h, fos, code);
            fos.close();
        } catch (IOException e) {
            throw e;
        }
    }

    /**
     * 输出指定验证码图片流
     *
     * @param w
     * @param h
     * @param os
     * @param code
     * @throws IOException
     */
    public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {
        int verifySize = code.length();
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Random rand = new Random();
        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // 创建颜色集合,使用java.awt包下的类
        Color[] colors = new Color[5];
        Color[] colorSpaces = new Color[]{Color.WHITE, Color.CYAN,
                Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
                Color.PINK, Color.YELLOW};
        float[] fractions = new float[colors.length];
        for (int i = 0; i < colors.length; i++) {
            colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
            fractions[i] = rand.nextFloat();
        }
        Arrays.sort(fractions);
        // 设置边框色
        g2.setColor(Color.GRAY);
        g2.fillRect(0, 0, w, h);

        Color c = getRandColor(200, 250);
        // 设置背景色
        g2.setColor(c);
        g2.fillRect(0, 2, w, h - 4);

        // 绘制干扰线
        Random random = new Random();
        // 设置线条的颜色
        g2.setColor(getRandColor(160, 200));
        for (int i = 0; i < 20; i++) {
            int x = random.nextInt(w - 1);
            int y = random.nextInt(h - 1);
            int xl = random.nextInt(6) + 1;
            int yl = random.nextInt(12) + 1;
            g2.drawLine(x, y, x + xl + 40, y + yl + 20);
        }

        // 添加噪点
        // 噪声率
        float yawpRate = 0.05f;
        int area = (int) (yawpRate * w * h);
        for (int i = 0; i < area; i++) {
            int x = random.nextInt(w);
            int y = random.nextInt(h);
            // 获取随机颜色
            int rgb = getRandomIntColor();
            image.setRGB(x, y, rgb);
        }
        // 添加图片扭曲
        shear(g2, w, h, c);

        g2.setColor(getRandColor(100, 160));
        int fontSize = h - 4;
        Font font = new Font("Algerian", Font.ITALIC, fontSize);
        g2.setFont(font);
        char[] chars = code.toCharArray();
        for (int i = 0; i < verifySize; i++) {
            AffineTransform affine = new AffineTransform();
            affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);
            g2.setTransform(affine);
            g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
        }

        g2.dispose();
        ImageIO.write(image, "jpg", os);
    }

    /**
     * 随机颜色
     *
     * @param fc
     * @param bc
     * @return
     */
    private static Color getRandColor(int fc, int bc) {
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    private static int getRandomIntColor() {
        int[] rgb = getRandomRgb();
        int color = 0;
        for (int c : rgb) {
            color = color << 8;
            color = color | c;
        }
        return color;
    }

    private static int[] getRandomRgb() {
        int[] rgb = new int[3];
        for (int i = 0; i < 3; i++) {
            rgb[i] = random.nextInt(255);
        }
        return rgb;
    }

    private static void shear(Graphics g, int w1, int h1, Color color) {
        shearX(g, w1, h1, color);
        shearY(g, w1, h1, color);
    }

    private static void shearX(Graphics g, int w1, int h1, Color color) {

        int period = random.nextInt(2);

        boolean borderGap = true;
        int frames = 1;
        int phase = random.nextInt(2);

        for (int i = 0; i < h1; i++) {
            double d = (double) (period >> 1)
                    * Math.sin((double) i / (double) period
                    + (6.2831853071795862D * (double) phase)
                    / (double) frames);
            g.copyArea(0, i, w1, 1, (int) d, 0);
            if (borderGap) {
                g.setColor(color);
                g.drawLine((int) d, i, 0, i);
                g.drawLine((int) d + w1, i, w1, i);
            }
        }

    }

    private static void shearY(Graphics g, int w1, int h1, Color color) {

        int period = random.nextInt(40) + 10; // 50;

        boolean borderGap = true;
        int frames = 20;
        int phase = 7;
        for (int i = 0; i < w1; i++) {
            double d = (double) (period >> 1)
                    * Math.sin((double) i / (double) period
                    + (6.2831853071795862D * (double) phase)
                    / (double) frames);
            g.copyArea(i, 0, 1, h1, 0, (int) d);
            if (borderGap) {
                g.setColor(color);
                g.drawLine(i, (int) d, i, 0);
                g.drawLine(i, (int) d + h1, i, h1);
            }

        }

    }
}
//package com.qihang.Util;
//
//import org.apache.ibatis.io.Resources;
//import org.apache.ibatis.session.SqlSession;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.apache.ibatis.session.SqlSessionFactoryBuilder;
//
//import java.io.IOException;
//import java.io.InputStream;
//
//public class SqlSessionUtil {
//    public static SqlSession getSqSession() {
//        SqlSession sqlSession = null;
//        try {
//            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//            SqlSessionFactory build = builder.build(inputStream);
//            sqlSession = build.openSession(true);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return sqlSession;
//    }
//}
package com.qihang.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;
    }
}

配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qihang.mapper.CardMapper">
<!--    <resultMap id="cardResultMap" type="card">-->
<!--        <result column=""-->
<!--    </resultMap>-->
<!--    在mapper里面 方法 前 加 @ResultMap("cardResultMap")-->
    <delete id="deleteByIds">
        delete from card_tb where in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qihang.mapper.ManagerMapper">

</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qihang.mapper.UserMapper">

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

    </environments>
    <mappers>
        <package name="com.qihang.mapper"/>
    </mappers>
</configuration>

JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>添加名片</title>
</head>
<body>
<h3>添加名片</h3>
<form action="/${who}/add" method="post" id="myfrom">
    <c:if test="${who eq 'Manager'}">
        登录账号:<input name="account"><br>
    </c:if>
    <c:if test="${who eq 'user'}">
        登录账号:<input disabled name="account" value="${user.account}">
    </c:if>
    <br>
    姓名:<input name="name"><br>
    性别:<input type="radio" name="sex" value="男">男
         <input type="radio" name="sex" value="女">女<br>
    密码:<input name="password"><br>
    电子邮箱:<input name="email"><br>
    <input type="submit" onclick="mycheck()" value="提交">
</form>
</body>
<script type="text/javascript">
    // function mycheck(){
    //     var account = $("#account").val().trim();
    //     var name = $("#name").val().trim();
    //     var sex = $("#sex").val().trim();
    //     var password = $("#password").val().trim();
    //     var email = $("#email").val().trim();
    //     if(account == null || account == "" || name == null || name == "" || sex == null || sex == ""
    //         ||password == null || password == ""||email == null || email == ""){
    //         alert("姓名,性别,密码,电子邮箱不能为空");	//如果值为空,提示用户填写
    //         return;
    //     }else{//如果值不为空,提交表单
    //         alert("确定提交");
    //         $("#myfrom").submit();
    //         return false;
    //     }
    // }
    // function validateForm()
    // {
    //     var x=document.forms["myForm"]["name"].value;
    //     if (x==null || x=="")
    //     {
    //         alert("姓必须填写");
    //         return false;
    //     }
    // }
</script>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
    <c:if test="${who=='user'}">
        <h1>${user.account},欢迎您</h1>
    </c:if>
    <c:if test="${who=='Manager'}">
        <h1>${manager.account},欢迎您</h1>
    </c:if>
    <input type="button" value="退出" id="out"> 
    <input type="button" value="新增" id="add"> 
    <input type=button value="回收站" id="recycle"> 
    <input type=button value="导出" id="download"> 
    <c:if test="${who=='Manager'}">
         <input type=button value="管理用户" id="userAll">
    </c:if> 
    ${download_msg}
    <br>
<hr>
<table border="1" cellspacing="0" width="80%">
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>性别</th>
        <c:if test="${who=='Manager'}">
            <th>登录账号</th>
        </c:if>
        <th>密码</th>
        <th>电子邮箱</th>
        <th>操作</th>
    </tr>

    <c:forEach items="${cards}" var="card" varStatus="status">
        <tr align="center">
<%--            <td>${brand.id}</td>--%>
            <td>${status.count}</td>
            <td>${card.name}</td>
            <td>${card.sex}</td>
            <c:if test="${who=='Manager'}">
                <td>${card.account}</td>
            </c:if>
            <td>${card.password}</td>
            <td>${card.email}</td>
            <td><a href="/${who}/selectById?id=${card.id}">修改</a> <a href="/${who}/toRecycle?id=${card.id}">删除</a></td>
        </tr>
    </c:forEach>
</table>
    <div class="upload">
        <form action="<c:url value="/uploadServlet"/>" method="post" enctype="multipart/form-data">
            <input type="file" name="file"/><br/>
            <input type="submit" value="上传"/> ${upload_msg}
        </form>
    </div>
<script>
    document.getElementById("add").onclick = function (){
        location.href = "/addCard.jsp";
    }
    document.getElementById("recycle").onclick = function (){
        location.href = "/${who}/recycle";
    }
    document.getElementById("out").onclick = function (){
        location.href = "/${who}/out";
    }
    document.getElementById("userAll").onclick = function (){
        location.href = "/Manager/userAll";
    }
    document.getElementById("download").onclick = function (){
        location.href = "/downloadServlet";
    }
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>登录</title>
</head>

<body>
<div id="loginDiv">
  <pre>
    <h1 id="loginMsg">欢迎使用敏子登录系统</h1>
      <a href="/userLogin.jsp">用户登录</a>     <a href="/userRegister.jsp">用户注册</a>
      <a href="/managerLogin.jsp">管理员登录</a>    <a href="/managerRegister.jsp">管理员注册</a>
    </pre>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>管理员登录</title>
</head>

<body>
<div id="loginDiv" style="height: 350px">
    <form action="/Manager/login" method="post" id="form">
        <h1 id="loginMsg">管理员登录</h1>
        <div id="errorMsg">${login_msg}${register_msg}</div>
        <p>Username:<input id="account" name="account" value="${cookie.managerAccount.value}" type="text"></p>
        <p>Password:<input id="password" name="password" value="${cookie.managerPassword.value}" type="password"></p>
        <p>Remember:<input id="remember" name="remember" value="1" type="checkbox"></p>
        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">   
            <a href="managerRegister.jsp">没有账号?</a>
        </div>
    </form>
</div>

</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>管理员注册</title>
</head>
<body>

<div class="form-div">
  <div class="reg-content">
    <h1>管理员注册</h1>
    <span>已有帐号?</span> <a href="managerLogin.jsp">登录</a>
  </div>
  <form id="reg-form" action="/Manager/register" method="post">

    <table>

      <tr>
        <td>用户名</td>
        <td class="inputs">
          <input name="account" type="text" id="account">
          <br>
          <span id="managername_err" class="err_msg">${register_msg}</span>
        </td>

      </tr>

      <tr>
        <td>密码</td>
        <td class="inputs">
          <input name="password" type="password" id="password">
          <br>
          <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
        </td>
      </tr>


      <tr>
        <td>验证码</td>
        <td class="inputs">
          <input name="checkCode" type="text" id="checkCode">
          <img id="checkCodeImg" src="/checkCodeServlet">
          <a href="#" id="changeImg" >看不清?</a>
        </td>
      </tr>

    </table>

    <div class="buttons">
      <input value="注 册" type="submit" id="reg_btn">
    </div>
    <br class="clear">
  </form>

</div>
<script>
    document.getElementById("changeImg").onclick=function(){
        document.getElementById("checkCodeImg").src="/checkCodeServlet?"+new Date().getMilliseconds();
    }
    document.getElementById("checkCodeImg").onclick=function(){
        document.getElementById("checkCodeImg").src="/checkCodeServlet?"+new Date().getMilliseconds();
    }
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>回收站</title>
</head>
<body>
<c:if test="${who=='user' }">
    <h1>${user.account},欢迎您</h1>
</c:if>
<c:if test="${who=='Manager'}">
    <h1>${manager.account},欢迎您</h1>
</c:if>
<input type="button" value="返回" id="index"><br>
<hr>
<table border="1" cellspacing="0" width="80%">
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>性别</th>
        <c:if test="${who=='Manager'}">
            <th>登录账号</th>
        </c:if>
        <th>密码</th>
        <th>电子邮箱</th>
        <th>操作</th>
    </tr>
    <c:forEach items="${cards}" var="card" varStatus="status">
        <tr align="center">
<%--            <td>${brand.id}</td>--%>
            <td>${status.count}</td>
            <td>${card.name}</td>
            <td>${card.sex}</td>
            <c:if test="${who=='Manager'}">
                <td>${card.account}</td>
            </c:if>
            <td>${card.password}</td>
            <td>${card.email}</td>
            <td><a href="/${who}/outRecycle?id=${card.id}">还原</a> <a href="/${who}/deleteById?id=${card.id}">删除</a></td>
        </tr>
    </c:forEach>
</table>
<script>
    document.getElementById("index").onclick = function (){
        location.href = "/${who}/index";
    }
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>修改名片</title>
</head>
<body>
<h3>修改名片</h3>
<form action="/${who}/update" method="post">
<%--    修改 需要id  用户看不到,所以要用隐藏域提交id--%>
    <input type="hidden" name="id" value="${card.id}">
    姓名:<input name="name" value="${card.name}"><br>
    <c:if test="${card.sex eq '男'}">
        <input type="radio" name="sex" value="男" checked>男
        <input type="radio" name="sex" value="女">女<br>
    </c:if>
    <c:if test="${card.sex eq '女'}">
        <input type="radio" name="sex" value="男">男
        <input type="radio" name="sex" value="女" checked>女<br>
    </c:if>
<%--    登录账号:<input name="account" value="${card.account}"><br>--%>
    密码:<input name="password" value="${card.password}"><br>
    电子邮箱:<input name="email" value="${card.email}"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>管理用户</title>
</head>
<body>
  <h1>${manager.account},欢迎您</h1>
  <input type="button" value="返回" id="index"> 
<br>
<hr>
<table border="1" cellspacing="0" width="80%">
  <tr>
    <th>序号</th>
    <th>登录账号</th>
    <th>密码</th>
    <th>操作</th>
  </tr>
  <c:forEach items="${users}" var="user" varStatus="status">
    <tr align="center">
        <%--            <td>${brand.id}</td>--%>
      <td>${status.count}</td>
      <td>${user.account}</td>
      <td>${user.password}</td>
<%--      <td><a href="/${who}/selectById?id=${card.id}">修改</a> --%>
      <td><a href="/Manager/deleteUser?account=${user.account}">删除</a></td>
    </tr>
  </c:forEach>
</table>
<script>
  document.getElementById("index").onclick = function (){
    location.href = "/Manager/index";
  }
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>

<body>
<div id="loginDiv" style="height: 350px">
    <form action="/user/login" method="post" id="form">
        <h1 id="loginMsg">用户登录</h1>
        <div id="errorMsg">${login_msg}${register_msg}</div>
        <p>Username:<input id="account" name="account" value="${cookie.userAccount.value}" type="text"></p>
        <p>Password:<input id="password" name="password" value="${cookie.userPassword.value}" type="password"></p>
        <p>Remember:<input id="remember" name="remember" value="1" type="checkbox"></p>
        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">   
            <a href="userRegister.jsp">没有账号?</a>
        </div>
    </form>
</div>

</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>用户注册</title>
</head>
<body>

<div class="form-div">
  <div class="reg-content">
    <h1>用户注册</h1>
    <span>已有帐号?</span> <a href="userLogin.jsp">登录</a>
  </div>
  <form id="reg-form" action="/user/register" method="post">

    <table>

      <tr>
        <td>用户名</td>
        <td class="inputs">
          <input name="account" type="text" id="account">
          <br>
          <span id="username_err" class="err_msg">${register_msg}</span>
        </td>

      </tr>

      <tr>
        <td>密码</td>
        <td class="inputs">
          <input name="password" type="password" id="password">
          <br>
          <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
        </td>
      </tr>


      <tr>
        <td>验证码</td>
        <td class="inputs">
          <input name="checkCode" type="text" id="checkCode">
<%--        设成动态路径  <img src="imgs/a.jpg">--%>
          <img id="checkCodeImg" src="/checkCodeServlet">
          <a href="#" id="changeImg" >看不清?</a><!--js 单机后-->
        </td>
      </tr>

    </table>

    <div class="buttons">
      <input value="注 册" type="submit" id="reg_btn">
    </div>
    <br class="clear">
  </form>

</div>
<script>
    document.getElementById("changeImg").onclick=function(){
        // document.getElementById("changeImg").src="/checkCodeServlet";
    //    上面  路径被浏览器缓存 需要一个永远不一样的路径
        document.getElementById("checkCodeImg").src="/checkCodeServlet?"+new Date().getMilliseconds();
    }
    document.getElementById("checkCodeImg").onclick=function(){
        document.getElementById("checkCodeImg").src="/checkCodeServlet?"+new Date().getMilliseconds();
    }
</script>
</body>
</html>

总结:

还是CV大法好

帮助巩固了一下javaweb的知识

路径还是不懂,还是有很多bug