网站中文模板,sem专业培训公司,聊城网站推广怎么做,保驾护航装修网MVC设计模式 概念 - 代码的分层 MVC#xff1a;项目分层的思想 字母表示层理解MModle模型层业务的具体实现VView视图层展示数据CController控制器层控制业务流程#xff08;跳转#xff09;
1.细化理解层数 Controller#xff1a;控制器层#xff0c;用于存放Servlet项目分层的思想 字母表示层理解MModle模型层业务的具体实现VView视图层展示数据CController控制器层控制业务流程跳转
1.细化理解层数 Controller控制器层用于存放Servlet页面跳转 View视图层用于存放前端页面jsp Modle-Biz/service逻辑业务层用于存放业务具体的实现 Modle-Dao/mapper数据持久层用于存放操作数据的实现数据的增删改查 MVC涉及到了前端而后端只涉及到了MC 1.1 优缺点 缺点使用MVC不能减少代码量 还会增加系统结构和实现的复杂性 优点整个项目结构清晰业务逻辑清晰降低了代码的耦合性代码的重用性高 注意一般来说使用设计模式都会增加代码量 1.2 各层的命名规范 Controller控制器层controller/servlet/action/web Modle-Biz 逻辑业务层service/biz Modle-Dao 数据持久层dao/persist/mapper 2.学生管理系统 web2.0 mvc版本 具体的业务逻辑详情请见 Day59 学生管理系统 web1.0直接使用servletjsp写的v2.0只是使用mvc分层思想进行构造 项目结构(总结里有展示所有层) 注意mapper层、service层、controller层 2.1 学生 student StudentMapper 通过具体的业务判断需要用到什么增删查改然后写数据库增删查改的接口让实现类去实现 public interface StudentMapper {//添加学生public void add(String username,String password,String name,String sex,int age,String hobbies,String photo);//删除学生通过usernamepublic void delete(String username);//更新学生的密码通过username和newPasswordpublic void update(String username,String newPassword);//更新学生信息(除了密码)通过username去操作没有更新照片public void update(String username,String name,String sex,int age,String hobbies);//更新学生信息(除了密码)通过username更新有更新照片public void update(String username,String name,String sex,int age,String hobbies,String photo);//获取学生信息通过usernamepublic Student getStudent(String username);//获取学生信息通过username和usernamepublic Student getStudent(String username,String password);//获取学生的所有集合信息用于分页offset--偏移量count--数据条数public ListStudent getStudents(int offset,int count);//获取当前表的总条数public int getAllCount();
}StudentMapperImpl 具体操作数据库的增删查改可以使用自己写的DBUtils 工具类 public class StudentMapperImpl implements StudentMapper {Overridepublic void add(String username, String password, String name, String sex, int age, String hobbies, String photo) {try {DBUtils.commonUpdate(insert into student(username,password,name,sex,age,hobbies,photo) values(?,?,?,?,?,?,?),username,password,name,sex,age, hobbies,photo);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void delete(String username) {try {DBUtils.commonUpdate(delete from student where username ?,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void update(String username, String newPassword) {try {DBUtils.commonUpdate(update student set password? where username?,newPassword,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void update(String username, String name, String sex, int age, String hobbies) {try {DBUtils.commonUpdate(update student set name?,sex?,age?,hobbies? where username?,name,sex,age,hobbies,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void update(String username, String name, String sex, int age, String hobbies, String photo) {try {DBUtils.commonUpdate(update student set name?,sex?,age?,hobbies?,photo? where username?,name,sex,age,hobbies,photo,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic Student getStudent(String username) {Student student null;try {student DBUtils.commonQueryObj(Student.class, select * from student where username ?, username);} catch (SQLException e) {throw new RuntimeException(e);}return student;}Overridepublic Student getStudent(String username, String password) {Student student null;try {student DBUtils.commonQueryObj(Student.class, select * from student where username ? and password ?, username, password);} catch (SQLException e) {throw new RuntimeException(e);}return student;}Overridepublic ListStudent getStudents(int offset, int count) {ListStudent students null;try {students DBUtils.commonQueryList(Student.class, select * from student limit ?,?, offset, count);} catch (SQLException e) {throw new RuntimeException(e);}return students;}Overridepublic int getAllCount() {int allcount 0;try {allcount DBUtils.getAllCount(student);} catch (SQLException e) {throw new RuntimeException(e);}return allcount;}
}service业务逻辑层 具体的业务流程存放Servlet 不用进行跳转在Controller层进行跳转 有返回值的返回true/false就可以了 StudentService public interface StudentService {//是否成功注册功能public boolean isRegister(String username);//注册功能public boolean register(HttpServletRequest request, HttpServletResponse response);//初始化学生信息功能public void initModify(HttpServletRequest request, HttpServletResponse response);//修改学生信息功能public void modify(HttpServletRequest request, HttpServletResponse response);//获取学生信息列表方便分页public void getStudents(HttpServletRequest request, HttpServletResponse response);//删除学生功能public void delete(HttpServletRequest request, HttpServletResponse response);//添加学生的功能public boolean add(HttpServletRequest request, HttpServletResponse response);
}StudentServiceImpl 实现 StudentService接口写具体的业务逻辑 public class StudentServiceImpl implements StudentService {private StudentMapper studentMapper new StudentMapperImpl();//是否成功注册功能Overridepublic boolean isRegister(String username) {Student student studentMapper.getStudent(username);if(student null){//允许注册return true;}return false;}//注册功能注册表单是二进制流涉及到了图片上传Overridepublic boolean register(HttpServletRequest request, HttpServletResponse response) {ParseRequestDataStudent parseRequestData ParseRequestDataUtils.parseRequest(request, Student.class, upload\\student);Student stu parseRequestData.getT();InputStream in parseRequestData.getIn();OutputStream out parseRequestData.getOut();boolean register isRegister(stu.getUsername());if(register){//将数据插入到学生表中studentMapper.add(stu.getUsername(),stu.getPassword(),stu.getName(),stu.getSex(),stu.getAge(),stu.getHobbies(),stu.getPhoto());//将头像存储到本地磁盘try {IOUtils.copy(in,out);in.close();out.close();} catch (IOException e) {throw new RuntimeException(e);}return true;}else{try {in.close();out.close();} catch (IOException e) {throw new RuntimeException(e);}request.setAttribute(msg,注册失败 -- 账号已注册);return false;}}//初始化学生信息功能Overridepublic void initModify(HttpServletRequest request, HttpServletResponse response) {String username request.getParameter(username);Student student studentMapper.getStudent(username);request.setAttribute(student,student);}//修改学生信息功能Overridepublic void modify(HttpServletRequest request, HttpServletResponse response) {ParseRequestDataStudent parseRequestData ParseRequestDataUtils.parseRequest(request, Student.class, upload\\student);Student stu parseRequestData.getT();InputStream in parseRequestData.getIn();OutputStream out parseRequestData.getOut();try {if(stu.getPhoto() ! null){//说明用户修改头像studentMapper.update(stu.getUsername(),stu.getName(), stu.getSex(), stu.getAge(),stu.getHobbies(),stu.getPhoto());IOUtils.copy(in,out);//文件复制}else{studentMapper.update(stu.getUsername(),stu.getName(), stu.getSex(), stu.getAge(),stu.getHobbies());}if(in ! null){in.close();}if(out ! null){out.close();}} catch (IOException e) {throw new RuntimeException(e);}String role (String) request.getSession().getAttribute(role);if(student.equals(role)){//更新Session里的数据request.getSession().setAttribute(name,stu.getName());//更新Cookie里的数据response.addCookie(CookieUtils.createCookie(name,stu.getName(),60*60*24*5));if(stu.getPhoto() ! null){request.getSession().setAttribute(photo,stu.getPhoto());response.addCookie(CookieUtils.createCookie(photo,stu.getPhoto(),60*60*24*5));}}}//获取学生信息列表方便分页Overridepublic void getStudents(HttpServletRequest request, HttpServletResponse response) {//获取当前页数int curPage Integer.parseInt(request.getParameter(curPage));//设置URLString url student?actiondoGetStudentscurPage;//设置当前页的数据条数int count 15;//计算偏移量int offset (curPage-1)*count;//计算总页数int allCount studentMapper.getAllCount();int totalPage PageUtils.getTotalPage(allCount,count);//从数据库获取学生的集合ListStudent students studentMapper.getStudents(offset,count);//处理学生集合ListStudentDto studentDtos DtoUtils.studentDtoListHandler(students);//封装Page对象PageStudentDto page new Page(url, curPage, totalPage, studentDtos);//将数据存入到请求对象中request.setAttribute(page,page);}//删除学生功能Overridepublic void delete(HttpServletRequest request, HttpServletResponse response) {String username request.getParameter(username);studentMapper.delete(username);}//添加学生的功能Overridepublic boolean add(HttpServletRequest request, HttpServletResponse response) {ParseRequestDataStudent parseRequestData ParseRequestDataUtils.parseRequest(request, Student.class, upload\\student);Student stu parseRequestData.getT();InputStream in parseRequestData.getIn();OutputStream out parseRequestData.getOut();boolean register isRegister(stu.getUsername());if(register){//将数据插入到学生表中studentMapper.add(stu.getUsername(),stu.getPassword(),stu.getName(),stu.getSex(),stu.getAge(),stu.getHobbies(),stu.getPhoto());//将头像存储到本地磁盘try {IOUtils.copy(in,out);in.close();out.close();} catch (IOException e) {throw new RuntimeException(e);}return true;}else{try {in.close();out.close();} catch (IOException e) {throw new RuntimeException(e);}request.setAttribute(msg,添加失败 -- 账号已添加);return false;}}}ParseRequestDataUtils package com.qf.utils;public class ParseRequestDataUtils {public static T ParseRequestData parseRequest(HttpServletRequest request,ClassT clazz,String path){ParseRequestDataT parseRequestData new ParseRequestData();//创建文件上传工厂类的对象DiskFileItemFactory factory new DiskFileItemFactory();//创建文件上传类的对象ServletFileUpload upload new ServletFileUpload(factory);HashMapString, String map new HashMap();try {//解析请求ListFileItem list upload.parseRequest(request);for (FileItem fileItem : list) {if(fileItem.isFormField()){//文本数据String name fileItem.getFieldName();String value fileItem.getString(UTF-8);String v map.get(name);if(v null){//说明是第一次添加map.put(name,value);}else{//不是第一次添加就需要拼接多选框的情况map.put(name,v , value);}}else{//二进制数据//D:\\apache-tomcat-8.0.49\\webapps\\Day23_upload_war_exploded\\upload\\student//D:\\apache-tomcat-8.0.49\\webapps\\Day23_upload_war_exploded\\upload\\teacherString realPath request.getServletContext().getRealPath(path);//文件存储目录 -- 自定义路径\\用户名realPath realPath File.separator map.get(username);File file new File(realPath);if(!file.exists()){file.mkdirs();}String fileName fileItem.getName();//获取文件名//自定义路径\\用户名\\tx01.jpgrealPath realPath File.separator fileName;//拼接路径InputStream in fileItem.getInputStream();if(in.available() ! 0){FileOutputStream out new FileOutputStream(realPath);parseRequestData.setIn(in);parseRequestData.setOut(out);map.put(photo,path File.separator map.get(username) File.separator fileName);}}}} catch (FileUploadException e) {throw new RuntimeException(e);} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}SetMap.EntryString, String entries map.entrySet();for (Map.EntryString, String entry : entries) {System.out.println(entry);}T t null;try {t clazz.newInstance();//将map中的数据映射到实体类对象中BeanUtils.populate(t,map);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);}parseRequestData.setT(t);return parseRequestData;}
}controller 根据每一个前端传过来的action功能来判断跳转 判断功能进行页面跳转 action“student?actiondoRegister”前端设置路径加上actionxxx功能 Controller进行具体的判断成功就重定向失败就转发 WebServlet(/student)
public class StudentController extends BaseServlet {private StudentService studentService new StudentServiceImpl();//注册功能public void doRegister(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {boolean register studentService.register(request, response);if(register){response.sendRedirect(login.jsp);}else{request.getRequestDispatcher(register.jsp).forward(request,response);}}//初始化修改功能public void doInitModify(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {studentService.initModify(request,response);request.getRequestDispatcher(stuInfo.jsp).forward(request,response);}//修改功能public void doModify(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {studentService.modify(request,response);String role (String) request.getSession().getAttribute(role);if(student.equals(role)){response.sendRedirect(index.jsp);}else if(teacher.equals(role)){request.getRequestDispatcher(student?actiondoGetStudentscurPage1).forward(request,response);}else if(admin.equals(role)){request.getRequestDispatcher(student?actiondoGetStudentscurPage1).forward(request,response);}}//展示数据功能public void doGetStudents(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {studentService.getStudents(request,response);request.getRequestDispatcher(stuList.jsp).forward(request,response);}//删除功能public void doDelete(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {studentService.delete(request,response);request.getRequestDispatcher(student?actiondoGetStudentscurPage1).forward(request,response);}//添加学生功能public void doAddStu(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {boolean register studentService.register(request, response);if(register){request.getRequestDispatcher(student?actiondoGetStudentscurPage1).forward(request,response);}else{request.getRequestDispatcher(stuAdd.jsp).forward(request,response);}}//是否注册学生的提示功能ajaxpublic void isRegister(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {String username request.getParameter(username);boolean register studentService.isRegister(username);String code;if(register){code1;}else {code-1;}response.getWriter().write(code);}
}BaseServlet 给控制层重写的servlet以前继承HttpServlet就会写很多的if-else判断太麻烦了 package com.qf.servlet;public class BaseServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//url -- http://localhost:8080/Day24_MVC_war_exploded/user?actiondoLoginString action request.getParameter(action);//doLogin//获取Controller类的class对象Class? extends BaseServlet clazz this.getClass();try {//根据action获取Controller类对应的方法对象Method method clazz.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);//设置操作权限method.setAccessible(true);//调用方法method.invoke(this,request,response);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}
}2.2 老师 teacher TeacherMapper 明确数据库的功能 public interface TeacherMapper {//添加老师public void add(String username,String password,String name,String sex,int age,int courseId,String photo);//删除老师通过usernamepublic void delete(String username);//更新老师的密码通过username和newPasswordpublic void update(String username,String newPassword);//更新老师信息(除了密码)通过username去操作没有更新照片public void update(String username,String name,String sex,int age,int courseId);//更新老师信息(除了密码)通过username更新有更新照片public void update(String username,String name,String sex,int age,int courseId,String photo);//获取老师信息通过usernamepublic Teacher getTeacher(String username);//获取老师信息通过username和usernamepublic Teacher getTeacher(String username,String password);//获取老师的所有集合信息用于分页offset--偏移量count--数据条数public ListTeacher getTeachers(int offset,int count);//获取当前表的总条数public int getAllCount();
}StudentMapperImpl public class StudentMapperImpl implements StudentMapper {Overridepublic void add(String username, String password, String name, String sex, int age, String hobbies, String photo) {try {DBUtils.commonUpdate(insert into student(username,password,name,sex,age,hobbies,photo) values(?,?,?,?,?,?,?),username,password,name,sex,age, hobbies,photo);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void delete(String username) {try {DBUtils.commonUpdate(delete from student where username ?,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void update(String username, String newPassword) {try {DBUtils.commonUpdate(update student set password? where username?,newPassword,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void update(String username, String name, String sex, int age, String hobbies) {try {DBUtils.commonUpdate(update student set name?,sex?,age?,hobbies? where username?,name,sex,age,hobbies,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic void update(String username, String name, String sex, int age, String hobbies, String photo) {try {DBUtils.commonUpdate(update student set name?,sex?,age?,hobbies?,photo? where username?,name,sex,age,hobbies,photo,username);} catch (SQLException e) {throw new RuntimeException(e);}}Overridepublic Student getStudent(String username) {Student student null;try {student DBUtils.commonQueryObj(Student.class, select * from student where username ?, username);} catch (SQLException e) {throw new RuntimeException(e);}return student;}Overridepublic Student getStudent(String username, String password) {Student student null;try {student DBUtils.commonQueryObj(Student.class, select * from student where username ? and password ?, username, password);} catch (SQLException e) {throw new RuntimeException(e);}return student;}Overridepublic ListStudent getStudents(int offset, int count) {ListStudent students null;try {students DBUtils.commonQueryList(Student.class, select * from student limit ?,?, offset, count);} catch (SQLException e) {throw new RuntimeException(e);}return students;}Overridepublic int getAllCount() {int allcount 0;try {allcount DBUtils.getAllCount(student);} catch (SQLException e) {throw new RuntimeException(e);}return allcount;}
} 业务逻辑层 TeacherService public interface TeacherService {public boolean isAdd(String username);public boolean add(HttpServletRequest request, HttpServletResponse response);public void initModify(HttpServletRequest request, HttpServletResponse response);public void modify(HttpServletRequest request, HttpServletResponse response);public void getTeachers(HttpServletRequest request, HttpServletResponse response);public void delete(HttpServletRequest request, HttpServletResponse response);
} TeacherServiceImpl public class TeacherServiceImpl implements TeacherService {private TeacherMapper teacherMapper new TeacherMapperImpl();private CourseService courseService new CourseServiceImpl();Overridepublic boolean isAdd(String username) {Teacher teacher teacherMapper.getTeacher(username);if(teacher null){return true;}return false;}Overridepublic boolean add(HttpServletRequest request, HttpServletResponse response) {ParseRequestDataTeacher parseRequestData ParseRequestDataUtils.parseRequest(request, Teacher.class, upload\\teacher);Teacher t parseRequestData.getT();InputStream in parseRequestData.getIn();OutputStream out parseRequestData.getOut();boolean add isAdd(t.getUsername());if(add){//将数据插入到老师表中teacherMapper.add(t.getUsername(),t.getPassword(),t.getName(),t.getSex(),t.getAge(),t.getCourseId(),t.getPhoto());//将头像存储到本地磁盘try {IOUtils.copy(in,out);in.close();out.close();} catch (IOException e) {throw new RuntimeException(e);}return true;}else{try {in.close();out.close();} catch (IOException e) {throw new RuntimeException(e);}request.setAttribute(msg,添加失败 -- 账号已存在);return false;}}Overridepublic void initModify(HttpServletRequest request, HttpServletResponse response) {String username request.getParameter(username);Teacher teacher teacherMapper.getTeacher(username);request.setAttribute(teacher,teacher);courseService.getCourses(request,response);}Overridepublic void modify(HttpServletRequest request, HttpServletResponse response) {ParseRequestDataTeacher parseRequestData ParseRequestDataUtils.parseRequest(request, Teacher.class, upload\\teacher);Teacher tea parseRequestData.getT();InputStream in parseRequestData.getIn();OutputStream out parseRequestData.getOut();try {if(tea.getPhoto() ! null){//说明用户修改头像teacherMapper.update(tea.getUsername(),tea.getName(), tea.getSex(), tea.getAge(),tea.getCourseId(),tea.getPhoto());IOUtils.copy(in,out);}else{teacherMapper.update(tea.getUsername(),tea.getName(), tea.getSex(), tea.getAge(),tea.getCourseId());}if(in ! null){in.close();}if(out ! null){out.close();}} catch (IOException e) {throw new RuntimeException(e);}String role (String) request.getSession().getAttribute(role);if(teacher.equals(role)){//更新Session里的数据request.getSession().setAttribute(name,tea.getName());//更新Cookie里的数据response.addCookie(CookieUtils.createCookie(name,tea.getName(),60*60*24*5));if (tea.getPhoto() ! null){request.getSession().setAttribute(photo,tea.getPhoto());response.addCookie(CookieUtils.createCookie(photo,tea.getPhoto(),60*60*24*5));}}}Overridepublic void getTeachers(HttpServletRequest request, HttpServletResponse response) {//获取当前页数int curPage Integer.parseInt(request.getParameter(curPage));//设置URLString url teacher?actiondoGetTeacherscurPage;//设置当前页的数据条数int count 15;//计算偏移量int offset (curPage-1)*count;//计算总页数int allCount teacherMapper.getAllCount();int totalPage PageUtils.getTotalPage(allCount,count);//从数据库获取老师的集合ListTeacher teachers teacherMapper.getTeachers(offset,count);//处理老师集合ListTeacherDto teacherDtos DtoUtils.teacherDtoListHandler(teachers);//封装Page对象PageTeacherDto page new Page(url, curPage, totalPage, teacherDtos);//将数据存入到请求对象中request.setAttribute(page,page);}Overridepublic void delete(HttpServletRequest request, HttpServletResponse response) {String username request.getParameter(username);teacherMapper.delete(username);}
} 控制器层 TeacherController WebServlet(/teacher)
public class TeacherController extends BaseServlet {private TeacherService teacherService new TeacherServiceImpl();public void doInitModify(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {teacherService.initModify(request,response);request.getRequestDispatcher(teaInfo.jsp).forward(request,response);}public void doModify(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {teacherService.modify(request,response);request.getRequestDispatcher(teacher?actiondoGetTeacherscurPage1).forward(request,response);}public void doGetTeachers(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {teacherService.getTeachers(request,response);request.getRequestDispatcher(TeaList.jsp).forward(request,response);}public void doDelete(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {teacherService.delete(request,response);request.getRequestDispatcher(teacher?actiondoGetTeacherscurPage1).forward(request,response);}public void doAddTea(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {boolean add teacherService.add(request,response);if(add){request.getRequestDispatcher(teacher?actiondoGetTeacherscurPage1).forward(request,response);}else{request.getRequestDispatcher(teaAdd.jsp).forward(request,response);}}}
2.3 用户 user user是学生和老师的父类两个都有的功能就写在user里 注意在数据库中没有user这个表这是把学生和老师相同的功能提出来了放在user里 UserService public interface UserService {//绘制验证码功能public void drawCode(HttpServletRequest request, HttpServletResponse response);//登录功能public boolean login(HttpServletRequest request, HttpServletResponse response);//记住我功能public void rememberMe(HttpServletResponse response,String username,String name,String role,String photo);//安全退出功能public void loginOut(HttpServletRequest request, HttpServletResponse response);//修改验证码功能public boolean resetPassword(HttpServletRequest request, HttpServletResponse response);} UserServiceImpl public class UserServiceImpl implements UserService {private StudentMapper studentMapper new StudentMapperImpl();private TeacherMapper teacherMapper new TeacherMapperImpl();private AdminMapper adminMapper new AdminMapperImpl();//绘制验证码功能Overridepublic void drawCode(HttpServletRequest request, HttpServletResponse response) {//设置宽高的变量int width 120;int height 30;//创建画布BufferedImage image new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取画笔Graphics graphics image.getGraphics();//设置背景色 -- 填充矩形graphics.setColor(Color.BLUE);graphics.fillRect(0,0,width,height);//设置验证码Random random new Random();String[] codes {A,B,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9};Color[] colors {Color.CYAN,Color.BLACK,Color.GREEN,Color.PINK,Color.WHITE,Color.RED,Color.ORANGE};StringBuffer sb new StringBuffer();for (int i 0; i 4; i) {String randomCode codes[random.nextInt(codes.length)];Color randomColor colors[random.nextInt(colors.length)];graphics.setColor(randomColor);//设置随机颜色graphics.setFont(new Font(宋体,Font.BOLD,20random.nextInt(10)));//设置字体字体,样式,大小graphics.drawString(randomCode,20i*25,15random.nextInt(10));//设置单个验证码sb.append(randomCode);}//将系统验证码设置到Session对象中(会话对象)HttpSession session request.getSession();//获取请求里的JSESSIONID(客户端Cookie里的数据)如果没有就创建Session对象如果有就从Session容器中获取会话对象session.setAttribute(sysCode,sb.toString());//设置干扰线graphics.setColor(Color.YELLOW);for (int i 0; i 3; i) {graphics.drawLine(random.nextInt(width),random.nextInt(height),random.nextInt(width),random.nextInt(height));//绘制直线(x1,y1,x2,y2) - 两点为一线}//将画布以jpg形式的文件传出给客户端try {ImageIO.write(image,jpg,response.getOutputStream());} catch (IOException e) {throw new RuntimeException(e);}}//登录功能Overridepublic boolean login(HttpServletRequest request, HttpServletResponse response) {//获取请求中的数据String username request.getParameter(username);String password request.getParameter(password);String userCode request.getParameter(userCode);String rememberMe request.getParameter(rememberMe);String role request.getParameter(role);//从Session对象中获取系统的验证码String sysCode (String) request.getSession().getAttribute(sysCode);if(sysCode.equalsIgnoreCase(userCode)){//验证码正确User user null;if(student.equals(role)){user studentMapper.getStudent(username,password);}else if(teacher.equals(role)){user teacherMapper.getTeacher(username,password);} else if (admin.equals(role)) {user adminMapper.getAdmin(username, password);}if(user ! null){//登录成功//判断是否记住我if(rememberMe ! null){if(admin.equals(role)){rememberMe(response,user.getUsername(),user.getPassword(),role);HttpSession session request.getSession();session.setAttribute(username,user.getUsername());session.setAttribute(password,user.getPassword());session.setAttribute(role,role);return true;}else if (student.equals(role) || teacher.equals(role)){rememberMe(response,user.getUsername(),user.getName() ,role,user.getPhoto());//将数据存储到Session中HttpSession session request.getSession();session.setAttribute(username,user.getUsername());session.setAttribute(name,user.getName());session.setAttribute(role,role);session.setAttribute(photo,user.getPhoto());return true;}}if(admin.equals(role)){HttpSession session request.getSession();session.setAttribute(username,user.getUsername());session.setAttribute(name,user.getPassword());session.setAttribute(role,role);}else if (student.equals(role) || teacher.equals(role)){//将数据存储到Session中HttpSession session request.getSession();session.setAttribute(username,user.getUsername());session.setAttribute(name,user.getName());session.setAttribute(role,role);session.setAttribute(photo,user.getPhoto());}return true;}else{//登录失败 -- 账号或密码错误request.setAttribute(msg,登录失败 -- 账号或密码错误);return false;}}else{//登录失败 - 验证码错误request.setAttribute(msg,登录失败 -- 验证码错误);return false;}}//管理员的记住我private void rememberMe(HttpServletResponse response, String username, String password, String role) {response.addCookie(CookieUtils.createCookie(username,username,60*60*24*5));response.addCookie(CookieUtils.createCookie(password,password,60*60*24*5));response.addCookie(CookieUtils.createCookie(role,role,60*60*24*5));}//记住我功能Overridepublic void rememberMe(HttpServletResponse response,String username, String name, String role, String photo) {//将凭证添加到Cookie中response.addCookie(CookieUtils.createCookie(username,username,60*60*24*5));response.addCookie(CookieUtils.createCookie(name,name,60*60*24*5));response.addCookie(CookieUtils.createCookie(role,role,60*60*24*5));response.addCookie(CookieUtils.createCookie(photo,photo,60*60*24*5));}//安全退出功能Overridepublic void loginOut(HttpServletRequest request, HttpServletResponse response) {//删除Cookie里的数据response.addCookie(CookieUtils.createCookie(username,,0));response.addCookie(CookieUtils.createCookie(name,,0));response.addCookie(CookieUtils.createCookie(role,,0));response.addCookie(CookieUtils.createCookie(photo,,0));response.addCookie(CookieUtils.createCookie(password,,0));//删除Session里的数据HttpSession session request.getSession();session.removeAttribute(username);session.removeAttribute(name);session.removeAttribute(role);session.removeAttribute(photo);session.removeAttribute(password);}//修改密码功能Overridepublic boolean resetPassword(HttpServletRequest request, HttpServletResponse response) {//获取请求中的数据String username request.getParameter(username);String password request.getParameter(password);String newPassword request.getParameter(newPassword);String role request.getParameter(role);User user null;if(student.equals(role)){user studentMapper.getStudent(username,password);}else if(teacher.equals(role)){user teacherMapper.getTeacher(username,password);} else if (admin.equals(role)) {user adminMapper.getAdmin(username, password);}if(user ! null){if(student.equals(role)){studentMapper.update(username,newPassword);}else if(teacher.equals(role)){teacherMapper.update(username,newPassword);} else if (admin.equals(role)) {adminMapper.update(username,newPassword);}return true;}else{request.setAttribute(msg,修改密码失败 -- 原密码不正确);return false;}}
} UserController 前端传过来的路径中带有action“xxx功能”然后进行xxx功能的相关业务的跳转 WebServlet(/user)
public class UserController extends BaseServlet {private UserService userService new UserServiceImpl();public void doDrawCode(HttpServletRequest request,HttpServletResponse response){userService.drawCode(request,response);}public void doLogin(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {boolean login userService.login(request, response);if(login){response.sendRedirect(index.jsp);}else{request.getRequestDispatcher(login.jsp).forward(request,response);}}public void doLoginOut(HttpServletRequest request,HttpServletResponse response) throws IOException {userService.loginOut(request, response);response.sendRedirect(welcome.html);}public void doResetPassword(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {boolean resetPassword userService.resetPassword(request, response);if(resetPassword){request.getRequestDispatcher(user?actiondoLoginOut).forward(request,response);}else{request.getRequestDispatcher(resetPassword.jsp).forward(request,response);}}}
2.4 管理员 功能 1.登录user里有 2.修改密码user里有 3.管理老师 – 老师列表页面分页、修改、删除、添加 4.管理学科 – 学科列表页面展示所有学科、修改、删除、添加 5.管理学生 – 学生列表页面分页、修改、删除、添加 实体类 Admin 直接继承user类 SQL – admin username、password public class Admin extends User{} AdminMapper public interface AdminMapper {//获取管理员信息通过usernamepublic Admin getAdmin(String username);//获取管理员信息通过username和usernamepublic Admin getAdmin(String username,String password);//更新管理员的密码通过username和newPasswordpublic void update(String username,String newPassword);
} AdminMapperImpl public class AdminMapperImpl implements AdminMapper {Overridepublic Admin getAdmin(String username) {Admin adminnull;try {admin DBUtils.commonQueryObj(Admin.class, select * from admin where username ?, username);} catch (SQLException e) {throw new RuntimeException(e);}return admin;}Overridepublic Admin getAdmin(String username, String password) {Admin adminnull;try {admin DBUtils.commonQueryObj(Admin.class, select * from admin where username ? and password?, username,password);} catch (SQLException e) {throw new RuntimeException(e);}return admin;}Overridepublic void update(String username, String newPassword) {try {DBUtils.commonUpdate(update admin set password ? where username ?, newPassword, username);} catch (SQLException e) {throw new RuntimeException(e);}}
} AdminService 都是uer里写了的就没有AdminServiceImpl,controller层也没有直接在index.jsp跳转就可以了 public interface AdminService {//登录功能public boolean login(HttpServletRequest request, HttpServletResponse response);//修改验证码功能public boolean resetPassword(HttpServletRequest request, HttpServletResponse response);
} index.jsp % page contentTypetext/html;charsetUTF-8 languagejava %
% taglib urihttp://java.sun.com/jsp/jstl/core prefixc%
html
headtitleTitle/title
/head
bodybutton οnclicksafeExit()安全退出/buttonh1详情页面/h1c:if test${role eq admin}h1欢迎管理员进入到学生管理系统/h1/c:ifc:if test${role eq student || role eq teacher}h1欢迎${name}${(role eq student)?学员:}${(role eq teacher)?老师:}进入到学生管理系统/h1img src${photo} width100px height100pxbr//c:ifa hrefresetPassword.jsp修改密码/ac:if test${role eq admin}a hrefstudent?actiondoGetStudentscurPage1管理学生/aa hrefteacher?actiondoGetTeacherscurPage1管理老师/aa hrefcourse?actiondoGetCourses管理学科/a/c:ifc:if test${role eq student}a hrefstudent?actiondoInitModifyusername${username}修改信息/a/c:ifc:if test${role eq teacher}a hrefteacher?actiondoInitModifyusername${username}修改信息/aa hrefstudent?actiondoGetStudentscurPage1查看所有学生/a/c:ifscript typetext/javascriptfunction safeExit(){window.location user?actiondoLoginOut;}/script
/body
/html
2.5 其他补充 数据库工具类DBUtils package com.qf.utils;public class DBUtils {private static DruidDataSource pool;private static ThreadLocalConnection local;static{Properties properties new Properties();try {properties.load(DBUtils.class.getClassLoader().getResourceAsStream(DBConfig.properties));} catch (IOException e) {throw new RuntimeException(e);}String driverClassName properties.getProperty(driverClassName);String url properties.getProperty(url);String username properties.getProperty(username);String password properties.getProperty(password);int maxActive Integer.parseInt(properties.getProperty(maxActive));//初始化数据库连接池pool new DruidDataSource();//设置参数pool.setDriverClassName(driverClassName);pool.setUrl(url);pool.setUsername(username);pool.setPassword(password);pool.setMaxActive(maxActive);local new ThreadLocal();}/*** 获取连接对象*/public static Connection getConnection() throws SQLException {Connection connection local.get();//获取当前线程的Connection对象if(connection null){connection pool.getConnection();//获取数据库连接池里的连接对象local.set(connection);//将Connection对象添加到local中}return connection;}/*** 关闭资源*/public static void close(Connection connection, Statement statement, ResultSet resultSet){if(resultSet ! null){try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if(statement ! null){try {statement.close();} catch (SQLException e) {throw new RuntimeException(e);}}if(connection ! null){try {if(connection.getAutoCommit()){connection.close();local.set(null);}} catch (SQLException e) {throw new RuntimeException(e);}}}/*** 开启事务*/public static void startTransaction() throws SQLException {Connection connection getConnection();connection.setAutoCommit(false);}/*** 提交事务*/public static void commit() throws SQLException {Connection connection local.get();if(connection ! null){connection.commit();connection.close();local.set(null);}}public static void rollback() throws SQLException {Connection connection local.get();if(connection ! null){connection.rollback();connection.close();local.set(null);}}/*** 更新数据添加、删除、修改*/public static int commonUpdate(String sql,Object... params) throws SQLException {Connection connection null;PreparedStatement statement null;try {connection getConnection();statement connection.prepareStatement(sql);paramHandler(statement,params);int num statement.executeUpdate();return num;}finally {close(connection,statement,null);}}/*** 添加数据 - 主键回填(主键是int类型可以返回)*/public static int commonInsert(String sql,Object... params) throws SQLException {Connection connection null;PreparedStatement statement null;ResultSet resultSet null;try {connection getConnection();statement connection.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);paramHandler(statement,params);statement.executeUpdate();resultSet statement.getGeneratedKeys();int primaryKey 0;if(resultSet.next()){primaryKey resultSet.getInt(1);}return primaryKey;}finally {close(connection,statement,resultSet);}}/*** 查询多个数据*/public static T ListT commonQueryList(ClassT clazz,String sql, Object... params) throws SQLException{Connection connection null;PreparedStatement statement null;ResultSet resultSet null;try {connection getConnection();statement connection.prepareStatement(sql);paramHandler(statement,params);resultSet statement.executeQuery();//获取表数据对象ResultSetMetaData metaData resultSet.getMetaData();//获取字段个数int count metaData.getColumnCount();ListT list new ArrayList();while(resultSet.next()){T t null;try {t clazz.newInstance();} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}//获取字段名及数据for (int i 1; i count; i) {String fieldName metaData.getColumnName(i);Object fieldVal resultSet.getObject(fieldName);setField(t,fieldName,fieldVal);}list.add(t);}return list;} finally {DBUtils.close(connection,statement,resultSet);}}/*** 查询单个数据*/public static T T commonQueryObj(ClassT clazz,String sql, Object... params) throws SQLException{Connection connection null;PreparedStatement statement null;ResultSet resultSet null;try {connection getConnection();statement connection.prepareStatement(sql);paramHandler(statement,params);resultSet statement.executeQuery();//获取表数据对象ResultSetMetaData metaData resultSet.getMetaData();//获取字段个数int count metaData.getColumnCount();if(resultSet.next()){T t null;try {t clazz.newInstance();} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}//获取字段名及数据for (int i 1; i count; i) {String fieldName metaData.getColumnName(i);Object fieldVal resultSet.getObject(fieldName);setField(t,fieldName,fieldVal);}return t;}} finally {DBUtils.close(connection,statement,resultSet);}return null;}/*** 获取当前表的总条数*/public static int getAllCount(String table) throws SQLException {Connection connection getConnection();String sql select count(1) from table;PreparedStatement statement connection.prepareStatement(sql);ResultSet resultSet statement.executeQuery();if(resultSet.next()){int allCount resultSet.getInt(1);return allCount;}return 0;}/*** 处理statement对象参数数据的处理器*/private static void paramHandler(PreparedStatement statement,Object... params) throws SQLException {for (int i 0; i params.length; i) {statement.setObject(i1,params[i]);}}/*** 获取当前类及其父类的属性对象* param clazz class对象* param name 属性名* return 属性对象*/private static Field getField(Class? clazz,String name){for(Class? c clazz;c ! null;c c.getSuperclass()){try {Field field c.getDeclaredField(name);return field;} catch (NoSuchFieldException e) {} catch (SecurityException e) {}}return null;}/*** 设置对象中的属性* param obj 对象* param name 属性名* param value 属性值*/private static void setField(Object obj,String name,Object value){Field field getField(obj.getClass(), name);if(field ! null){field.setAccessible(true);try {field.set(obj, value);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}} 其余代码太多不一一展示 总结 1…MVC 注意MVC设计模式和服务端分层思想的区别 2.MVC版本的学生管理系统