目录
要求:
项目目录:
建表
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)注册的用户
一个注册用户,只能对自己添加的名片记录有操作权限(查询、修改、删除)。对于其它的注册用户信息以及其它用户添加的名片记录是不可见的。
项目目录:
建表
#创建注册用户表
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