Day42
MVC设计-以WEB-学生管理系统为例:
Mapper层
创建mapper包,
StudentMapper接口:
package com.qf.mapper; import com.qf.pojo.Student; import java.util.List; public interface StudentMapper { public void add(String username,String password,String name,String sex,int age,String hobbies,String photo); public void delete(String username); public void update(String username,String password,String name,String sex,int age,String hobbies,String photo); public Student getStudent(String username); public Student getStudent(String username,String password); public void update(String username,String password); public List<Student> getStudents(int offset,int count); public int getAllCount(); }
在mapper中创建一个包impl,实现接口,StudentMapperImpl:
package com.qf.mapper.impl; import com.qf.mapper.StudentMapper; import com.qf.pojo.Student; import com.qf.utils.DBUtil; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class StudentMapperImpl implements StudentMapper { @Override public void add(String username, String password, String name, String sex, int age, String hobbies, String photo) { try { DBUtil.commonInsert("insert into student values (?,?,?,?,?,?,?)",username,password,name,sex,age,hobbies,photo); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void delete(String username) { try { DBUtil.commonUpdate("delete from student where username=?",username); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void update(String username, String password, String name, String sex, int age, String hobbies, String photo) { String sql = "update student set password=?,name=?,sex=?,age=?,hobbies=?,photo=? where username=?"; try { DBUtil.commonUpdate(sql,password,name,sex,age,hobbies,photo,username); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void update(String username, String password) { String sql = "update student set password=? where username=?"; try { DBUtil.commonUpdate(sql,password,username); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public Student getStudent(String username) { Student student = null; try { student = DBUtil.commonQueryObj(Student.class, "select * from student where username=?", username); } catch (SQLException | InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } return student; } public Student getStudent(String username,String password){ Student student = null; try { student = DBUtil.commonQueryObj(Student.class, "select * from student where username=? and password=?", username,password); } catch (SQLException | InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } return student; } @Override public List<Student> getStudents(int offset, int count) { List<Student> list = new ArrayList<>(); try { list = DBUtil.commonQueryList(Student.class, "select * from student limit ?,?", offset, count); } catch (SQLException | InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } return list; } @Override public int getAllCount() { int allCount = DBUtil.getAllCount("select count(username) from student"); return allCount; } }
注:mapper层所有的参数是service层传进来的。
同理:mapper包中写一个TeacherMapper接口:
package com.qf.mapper; import com.qf.pojo.Course; import com.qf.pojo.Student; import com.qf.pojo.Teacher; import java.sql.SQLException; import java.util.List; public interface TeacherMapper { public void update(String username,String password,String name,int courseId,String photo); public Teacher getTeacher(String username); public Teacher getTeacher(String username,String password); public void update(String username, String password); public List<Course> getCourses() throws SQLException, InstantiationException, IllegalAccessException; }
在impl中写TeacherMapperImpl
package com.qf.mapper.impl; import com.qf.mapper.TeacherMapper; import com.qf.pojo.Course; import com.qf.pojo.Teacher; import com.qf.utils.DBUtil; import java.sql.SQLException; import java.util.List; public class TeacherMapperImpl implements TeacherMapper { @Override public void update(String username, String password, String name, int courseId, String photo) { String sql = "update teacher set password=?,name=?,courseId=?,photo=? where username=?"; try { DBUtil.commonUpdate(sql,password,name,courseId,photo,username); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void update(String username, String password) { String sql = "update teacher set password=? where username=?"; try { DBUtil.commonUpdate(sql,password,username); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public Teacher getTeacher(String username) { Teacher teacher =null; try { teacher = DBUtil.commonQueryObj(Teacher.class, "select * from teacher where username=?", username); } catch (SQLException | InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } return teacher; } @Override public Teacher getTeacher(String username, String password) { Teacher teacher = null; try { teacher = DBUtil.commonQueryObj(Teacher.class, "select * from teacher where username=? and password=?", username, password); } catch (SQLException | InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } return teacher; } @Override public List<Course> getCourses() throws SQLException, InstantiationException, IllegalAccessException { List<Course> courseList = DBUtil.commonQueryList(Course.class, "select * from course"); return courseList; } }
Service层
再写service层:
在service包中写一个UserService接口:
package com.qf.service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface UserService { public void drawCode(HttpServletRequest request,HttpServletResponse response); public boolean login(HttpServletRequest request,HttpServletResponse response); public void rememberMe(HttpServletRequest request,HttpServletResponse response,String username,String name,String role,String photo ); public void safeExit(HttpServletRequest request,HttpServletResponse response); public boolean resetPassword(HttpServletRequest request,HttpServletResponse response); }
创建impl包,写实现类UserServiceImpl:
package com.qf.service.impl; import com.qf.mapper.StudentMapper; import com.qf.mapper.TeacherMapper; import com.qf.mapper.impl.StudentMapperImpl; import com.qf.mapper.impl.TeacherMapperImpl; import com.qf.pojo.Student; import com.qf.pojo.Teacher; import com.qf.pojo.User; import com.qf.service.UserService; import com.qf.utils.CookieUtil; import com.qf.utils.DBUtil; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.sql.SQLException; import java.util.Random; public class UserServiceImpl implements UserService { private StudentMapper studentMapper = new StudentMapperImpl(); private TeacherMapper teacherMapper = new TeacherMapperImpl(); @Override public 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); String[] codes={"A","B","C","D","E","F","G","H","J","K","L","M","N","O","P","Q","1","2","3"}; Color[] colors={Color.CYAN,Color.GREEN,Color.MAGENTA,Color.RED}; StringBuffer sb = new StringBuffer(); Random ran = new Random(); for(int i=0;i<4;i++){ graphics.setColor(colors[ran.nextInt(colors.length)]); graphics.setFont(new Font("宋体",Font.BOLD,30+ran.nextInt(10))); String code = codes[ran.nextInt(codes.length)]; graphics.drawString(code,20+20*i,20+ran.nextInt(10)); sb.append(code); } graphics.setColor(Color.YELLOW); for(int j=0;j<5;j++) { graphics.drawLine(ran.nextInt(width),ran.nextInt(height),ran.nextInt(width),ran.nextInt(height)); } HttpSession session = request.getSession(); session.setAttribute("Syscode",sb.toString()); try { ImageIO.write(image,"jpg",response.getOutputStream()); } catch (IOException e) { throw new RuntimeException(e); } } @Override public 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"); String sysCode= (String) request.getSession().getAttribute("Syscode"); User user = null; //判断角色并获取相应角色的数据 //判断验证码 if(sysCode.equalsIgnoreCase(userCode)){ try { if("student".equals(role)) { user = studentMapper.getStudent(username); }else if("teacher".equals(role)){ user = teacherMapper.getTeacher(username); } } catch (Exception e) { throw new RuntimeException(e); } if(user!=null){ //有相关数据,登录成功 //记住我功能 if(rememberMe!=null){ rememberMe(request,response,user.getUsername(),user.getName(),role,user.getPhoto()); } 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; } } @Override public void rememberMe(HttpServletRequest request, HttpServletResponse response, String username, String name, String role, String photo) { response.addCookie(CookieUtil.createCookie("username",username,60*60*24)); response.addCookie(CookieUtil.createCookie("name",name,60*60*24)); response.addCookie(CookieUtil.createCookie("role",role,60*60*24)); if(photo!=null){ response.addCookie(CookieUtil.createCookie("photo",photo,60*60*24)); } } @Override public void safeExit(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); //删除session里的数据 session.removeAttribute("username"); session.removeAttribute("name"); session.removeAttribute("role"); //删除cookie里的数据 CookieUtil.removeCookie(response,"username"); CookieUtil.removeCookie(response,"name"); CookieUtil.removeCookie(response,"role"); } @Override public boolean resetPassword(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); String role = request.getParameter("role"); String password = request.getParameter("password"); String repassword = request.getParameter("repassword"); User user = null; if("student".equals(role)){ user = studentMapper.getStudent(username,password); if(user != null){ studentMapper.update(username,repassword); } }else if("teacher".equals(role)){ user = teacherMapper.getTeacher(username,password); if(user != null){ teacherMapper.update(username,repassword); } } if(user != null){ return true; }else{ request.setAttribute("msg","修改密码失败 -- 原密码不正确"); return false; } } }
…
(展示头像)
StudentService接口:
package com.qf.service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public interface StudentService { public boolean isRegister(String username); public boolean register(HttpServletRequest request,HttpServletResponse response) throws IOException; public void initModify(HttpServletRequest request, HttpServletResponse response); public void modify(HttpServletRequest request,HttpServletResponse response); public void delete(HttpServletRequest request,HttpServletResponse response); public void getStudents(HttpServletRequest request,HttpServletResponse response); }
PageUtil:
package com.qf.utils; public class PageUtil { public static int getTotalPage(int allCount,int count){ if(allCount%count==0){ return allCount/count; }else { return allCount/count+1; } } }
实现类:
(拿copyio,parseRequest(把this改为request),register,修改头像(stuinfo里面添加)更新头像,modify里面先用parseRequest解析请求得到stu和copyio,查询出对象,对象修改,判断photo是否为null(copyIO.getIn().available!=0)再更新photo,记住我(cookie和session)有photo)
Student ServiceImpl:
package com.qf.service.impl; import com.qf.dto.StudentDto; import com.qf.mapper.StudentMapper; import com.qf.mapper.impl.StudentMapperImpl; import com.qf.pojo.CopyIO; import com.qf.pojo.Page; import com.qf.pojo.Student; import com.qf.service.StudentService; import com.qf.utils.*; import org.apache.commons.beanutils.BeanUtils; 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 org.apache.commons.io.IOUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.net.URLDecoder; import java.net.URLEncoder; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class StudentServiceImpl implements StudentService { StudentMapper studentMapper = new StudentMapperImpl(); @Override public boolean isRegister(String username) { Student student = studentMapper.getStudent(username); if(student==null){ return true; }else { return false; } } @Override public boolean register(HttpServletRequest request, HttpServletResponse response) throws IOException { Student student = new Student(); CopyIO copyIO = new CopyIO(); parseRequest(request,student,copyIO); boolean isregister = isRegister(student.getUsername()); if(isregister){ studentMapper.add(student.getUsername(),student.getPassword(),student.getName(),student.getSex(),student.getAge(),student.getHobbies(),student.getPhoto()); InputStream in = copyIO.getIn(); OutputStream out = copyIO.getOut(); if(in!=null && in.available()!=0){ try { IOUtils.copy(in, out); in.close(); out.close(); } catch (IOException e) { throw new RuntimeException(e); } } }else { request.setAttribute("msg","已有该账号,注册失败"); } return isregister; } @Override public void initModify(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); //利用账户查询学生对象 Student student = studentMapper.getStudent(username); //将对象返回给前端 request.setAttribute("stu",student); } @Override public void modify(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); String role = (String) session.getAttribute("role"); Student student = new Student(); CopyIO copyIO = new CopyIO(); parseRequest(request,student,copyIO); Student sqlStu = studentMapper.getStudent(student.getUsername()); sqlStu.setName(student.getName()); sqlStu.setSex(student.getSex()); sqlStu.setAge(student.getAge()); sqlStu.setHobbies(student.getHobbies()); try { if(copyIO.getIn()!=null &©IO.getIn().available()!=0){ //修改了头像 InputStream in = copyIO.getIn(); OutputStream out = copyIO.getOut(); IOUtils.copy(in,out); in.close(); out.close(); if("student".equals(role)){ session.setAttribute("photo",student.getPhoto()); response.addCookie(CookieUtil.createCookie("photo",student.getPhoto(),60*60*24*10)); } } } catch (IOException e) { throw new RuntimeException(e); } sqlStu.setPhoto(student.getPhoto()); studentMapper.update(sqlStu.getUsername(),sqlStu.getPassword(), sqlStu.getName(), sqlStu.getSex(), sqlStu.getAge(), sqlStu.getHobbies(), sqlStu.getPhoto()); if("student".equals(role)){ session.setAttribute("name",student.getName()); response.addCookie(CookieUtil.createCookie("name",student.getName(),60*60*24*10)); } } @Override public void delete(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); System.out.println(username); studentMapper.delete(username); } @Override public void getStudents(HttpServletRequest request, HttpServletResponse response) { String url = "Student?action=getStudents&curPage="; int curPage = Integer.parseInt(request.getParameter("curPage")); int count = 15;//每一页的数据条数 int offset = (curPage-1)*count;//计算偏移量 int allCount = studentMapper.getAllCount(); int totalPage= PageUtil.getTotalPage(allCount,count); List<Student> stuList = studentMapper.getStudents(offset,count); List<StudentDto> stuDtoList = DtoUtil.studentListHandler(stuList); //将数据封装到对象中 Page<StudentDto> page = new Page<>(url,curPage,totalPage,stuDtoList); //将数据传回前端 request.setAttribute("page",page); } public void parseRequest(HttpServletRequest request, Student student , CopyIO copyIO){ ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); String username=null; try { List<FileItem> list = upload.parseRequest(request); for(FileItem fileItem:list){ if(fileItem.isFormField()){ String fieldName = fileItem.getFieldName(); String value = fileItem.getString("UTF-8"); if("username".equals(fieldName)){ username=value; } String s = map.get(fieldName); if(s==null){ //第一次添加 map.put(fieldName, value); } else{ //多选的情况 value= s+","+value; map.put(fieldName,value); } }else{ //二进制数据 String realPath = request.getServletContext().getRealPath("upload"+ File.separator+"student"+File.separator+username); File file = new File(realPath); if(!file.exists()){ file.mkdirs(); } String fileName = fileItem.getName(); if(fileItem.getName()!=null&&!fileName.isEmpty()){ String path = realPath + File.separator + fileName; copyIO.setIn(fileItem.getInputStream()); copyIO.setOut(new FileOutputStream(path)); } map.put(fileItem.getFieldName(),"upload"+File.separator+"student"+File.separator+username+File.separator+fileName); } } BeanUtils.populate(student,map); } catch (FileUploadException | IOException | InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } } }
同理:
TeacherService:
package com.qf.service; import com.qf.pojo.Student; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface TeacherService { public void initModify(HttpServletRequest request,HttpServletResponse response); public void modify(HttpServletRequest request,HttpServletResponse response); }
TeacherServiceImpl
package com.qf.service.impl; import com.qf.dto.StudentDto; import com.qf.mapper.StudentMapper; import com.qf.mapper.TeacherMapper; import com.qf.mapper.impl.StudentMapperImpl; import com.qf.mapper.impl.TeacherMapperImpl; import com.qf.pojo.CopyIO; import com.qf.pojo.Page; import com.qf.pojo.Student; import com.qf.pojo.Teacher; import com.qf.service.TeacherService; import com.qf.utils.CookieUtil; import com.qf.utils.DBUtil; import com.qf.utils.DtoUtil; import com.qf.utils.PageUtil; import org.apache.commons.beanutils.BeanUtils; 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 org.apache.commons.io.IOUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.net.URLEncoder; import java.util.List; import java.util.concurrent.ConcurrentHashMap; public class TeacherServiceImpl implements TeacherService { TeacherMapper teacherMapper = new TeacherMapperImpl(); StudentMapper studentMapper = new StudentMapperImpl(); @Override public void getAllStudent(HttpServletRequest request, HttpServletResponse response) { String url = "QueryAllStuServlet?curPage="; int curPage = Integer.parseInt(request.getParameter("curPage")); int count = 15;//每一页的数据条数 int offset = (curPage - 1) * count;//计算偏移量 int allCount = studentMapper.getAllCount(); int totalPage = PageUtil.getTotalPage(allCount, count); List<Student> stuList = studentMapper.getStudents(offset, count); List<StudentDto> stuDtoList = DtoUtil.studentListHandler(stuList); //将数据封装到对象中 Page<StudentDto> page = new Page<>(url, curPage, totalPage, stuDtoList); //将数据传回前端 request.setAttribute("page", page); } @Override public void initModify(HttpServletRequest request, HttpServletResponse response) { String username = (String) request.getAttribute("username"); Teacher tea = teacherMapper.getTeacher(username); request.setAttribute("tea", tea); } @Override public void modify(HttpServletRequest request, HttpServletResponse response) { Teacher teacher = new Teacher(); CopyIO copyIO = new CopyIO(); parseRequest(request, teacher, copyIO); Teacher sqlTea = teacherMapper.getTeacher(teacher.getUsername()); sqlTea.setName(teacher.getName()); sqlTea.setCourseId(teacher.getCourseId()); try { if (copyIO.getIn().available() != 0) { InputStream in = copyIO.getIn(); OutputStream out = copyIO.getOut(); IOUtils.copy(in, out); in.close(); out.close(); } } catch (IOException e) { throw new RuntimeException(e); } HttpSession session = request.getSession(); sqlTea.setPhoto(teacher.getPhoto()); session.setAttribute("photo", teacher.getPhoto()); response.addCookie(CookieUtil.createCookie("photo", teacher.getPhoto(), 60 * 60 * 24 * 10)); } public void parseRequest(HttpServletRequest request, Teacher teacher, CopyIO copyIO) { ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); String username = null; try { List<FileItem> list = upload.parseRequest(request); for (FileItem fileItem : list) { if (fileItem.isFormField()) { String fieldName = fileItem.getFieldName(); String value = URLEncoder.encode(fileItem.getString(), "UTF-8"); if ("username".equals(fieldName)) { username = value; } String s = map.get(fieldName); if (s == null) { //第一次添加 map.put(fieldName, value); } else { //多选的情况 s = s + "," + value; map.put(fieldName, s); } } else { //二进制数据 String realPath = request.getServletContext().getRealPath("upload" + File.separator + "teacher" + File.separator + username); File file = new File(realPath); if (!file.exists()) { file.mkdirs(); } String fileName = fileItem.getName(); String path = realPath + File.separator + fileName; copyIO.setIn(fileItem.getInputStream()); copyIO.setOut(new FileOutputStream(path)); map.put(fileItem.getFieldName(), "upload" + File.separator + "teacher" + File.separator + username + File.separator + fileName); } } BeanUtils.populate(teacher, map); } catch (FileUploadException | IOException | InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } } }
Controller层
版本一 servlet:
缺点:学生功能越多if else越多
创建一个controller包,分角色写servlet。
版本二:controller
创建一个servlet包,里面创建BaseServlet。然后把之前的servlet改为controller(改名),注解中改成User,Teacher和Student,controller中继承BaseServlet,不写doGet和doPost,而是把所有功能封装成方法。然后在baseservlet中拿到action,利用反射拿到controller类,再拿到方法对象,找不到不抛出异常而是跳转到错误页面,找到了用method.invoke()方法。注:要改所有的链接(页面和跳转都要改),包括分页URL。
package com.qf.controller; import com.qf.service.UserService; import com.qf.service.impl.UserServiceImpl; import com.qf.servlet.BaseServlet; 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 java.io.IOException; @WebServlet("/User") public class UserController extends BaseServlet { private UserService userService = new UserServiceImpl(); public void drawCode(HttpServletRequest request, HttpServletResponse response){ userService.drawCode(request,response); try { request.getRequestDispatcher("login.jsp").forward(request,response); } catch (ServletException | IOException e) { throw new RuntimeException(e); } } public void login(HttpServletRequest request, HttpServletResponse response){ boolean login = userService.login(request, response); if(login){ try { response.sendRedirect("index.jsp"); } catch (IOException e) { throw new RuntimeException(e); } }else { try { request.getRequestDispatcher("login.jsp").forward(request,response); } catch (ServletException | IOException e) { throw new RuntimeException(e); } } } public void SafeExit(HttpServletRequest request, HttpServletResponse response){ userService.safeExit(request, response); try { response.sendRedirect("welcome.html"); } catch (IOException e) { throw new RuntimeException(e); } } public void resetPassword(HttpServletRequest request, HttpServletResponse response){ boolean b = userService.resetPassword(request, response); if(b){ try { request.getRequestDispatcher("User?action=SafeExit").forward(request,response); } catch (ServletException | IOException e) { throw new RuntimeException(e); } }else { try { request.getRequestDispatcher("repassword.jsp").forward(request,response); } catch (ServletException | IOException e) { throw new RuntimeException(e); } } } }
package com.qf.controller; import com.qf.service.StudentService; import com.qf.service.impl.StudentServiceImpl; import com.qf.servlet.BaseServlet; 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; @WebServlet("/Student") public class StudentController extends BaseServlet { private StudentService studentService = new StudentServiceImpl(); public void register(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { boolean register = studentService.register(request, response); if(register){ response.sendRedirect("login.jsp"); }else{ request.getRequestDispatcher("register.jsp").forward(request,response); } } public void initModify(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { studentService.initModify(request,response); request.getRequestDispatcher("stuinfo.jsp").forward(request,response); } public void modify(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { studentService.modify(request,response); HttpSession session = request.getSession(); String role = (String) session.getAttribute("role"); if("student".equals(role)){ response.sendRedirect("index.jsp"); }else if("teacher".equals(role)){ request.getRequestDispatcher("Student?action=getStudents&curPage=1").forward(request,response); } } public void getStudents(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { studentService.getStudents(request,response); request.getRequestDispatcher("stuList.jsp").forward(request,response); } public void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { studentService.delete(request,response); request.getRequestDispatcher("Student?action=getStudents&curPage=1").forward(request,response); } }
package com.qf.controller; import com.qf.service.TeacherService; import com.qf.service.impl.TeacherServiceImpl; import com.qf.servlet.BaseServlet; 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 java.io.IOException; @WebServlet("/Teacher") public class TeacherController extends BaseServlet { private TeacherService teacherService = new TeacherServiceImpl(); public void initModify(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { teacherService.initModify(request,response); request.getRequestDispatcher("teainfo.jsp").forward(request,response); } public void modify(HttpServletRequest request, HttpServletResponse response) throws IOException { teacherService.modify(request,response); response.sendRedirect("index.jsp"); } }
package com.qf.servlet; 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 java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @WebServlet("/BaseServlet") public class BaseServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); Class<? extends BaseServlet> clazz = this.getClass(); try { Method method = clazz.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this,request,response); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } } }
修的bug总结:一、在修改信息功能这里尝试如果不上传则仍然是原来的头像的效果:
1.在ParseRequest()方法中如果是二进制数据的话,在设置绝对路径以进行输出的过程中必须要注意如果用户没有上传图片头像,则此时fileItem.getName()方法获取的值是空的,但并不是null,而是一个空字符串,所以建议思路为在输出前先判断上传的文件名是否为空,即if(fileItem.getName()!=null&&!fileName.isEmpty()),如果不为空字符串,则设置上传的输入输出流,否则就不进行设置。(如果不判断就会是向一个没有的路径设置输出流,会报错。)
2.在modify方法中必须判断copyIO.getIn()是否为空,然后才是是否有输入的数据:if(copyIO.getIn()!=null &©IO.getIn().available()!=0)。否则会空指针异常。
3.在register方法中也一样,需要判断if(copyIO.getIn()!=null &©IO.getIn().available()!=0),不为空再进行输入以及流的关闭。
二、修改了名字后显示的是乱码:
1.parseRequest()方法中获取某一个文本数据项时要设置编码格式,即fileItem.getString(“UTF-8”);