//程序入口 @WebServlet("/student")//使用注解代替web.xml配置 public class MainStudents extends HttpServlet { /* doGet接口,实现功能为展示所有学生信息 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //从数据类Data中获得信息 ArrayListstudents=Data.input(); //创建一个Map对象存储返回值 Map map=new HashMap<>(); map.put("msg","查询成功"); map.put("code",200); map.put("data",students); //用jar包fastjson2-2.0.14.jar中的JSON.toJSONString()将map对象转化成String类型 String newMap= JSON.toJSONString(map); //设置文本格式和编码格式 resp.setContentType("application/json;charset=utf8"); //将数据发送给前端 resp.getWriter().write(newMap); System.out.println("展示完毕"); //设置请求头解决跨域问题 resp.setHeader("Access-Control-Allow-Origin","*"); } /* doPost接口:实现功能为增加新的学生 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求头 resp.setHeader("Access-Control-Allow-Origin","*"); //从Data类中拿到静态数据 ArrayList students=Data.students; //设置前端发送给的服务器的数据的编码格式为"utf8" req.setCharacterEncoding("utf8"); //利用时间戳生成不重复的id Long id=System.currentTimeMillis(); String name=req.getParameter("name"); Integer age=null; //防止空指针异常,要先判断文件是否为空(null) if (req.getParameter("age")!=null){ age=Integer.valueOf(req.getParameter("age")); } String sex=req.getParameter("sex"); //添加新的学生对象到集合中 students.add(new Student(id,name,age,sex)); //同样的,创建一个Map对象存储返回值 Map map=new HashMap<>(); map.put("msg","添加成功"); map.put("code",200); //发送数据到客户端(前端) String newMap= JSON.toJSONString(map); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(newMap); System.out.println("添加成功"); //数据保存 Data.output(); } /* doPut:功能为修改学生信息 */ @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求头,解决跨域问题,但是PUT请求和DELET的请求不只是设置表头,下面还有操作 resp.setHeader("Access-Control-Allow-Origin","*"); ArrayList students=Data.students; req.setCharacterEncoding("utf8"); //获取前端数据,由于getParameter方法只能在GET方法和POST方法中才能获取到数据,所有这里使用系统封装好的getReader(),获取高效的字符输入流 BufferedReader reader=req.getReader(); //将字符流的首行转化为字符串 String string=reader.readLine(); //设置字符串的编码格式,防止乱码 String params= URLDecoder.decode(string,"utf8"); //changeIntoMap是我写在Data类里的将字符流转化成的字符串处理成map集合的方法 Map mapNow=Data.changeIntoMap(params); /* 创建一个新集合用于存储传输数据,为了防止字符流中有不规范数据 */ Map map=new HashMap<>(); //为学号赋空值,防止数据异常,学号正常才可以修改,否则修改失败 Long id=null; if (mapNow.get("id")!=null){ id=Long.valueOf(mapNow.get("id")); //依次判断数据是否规范 for (Student student : students) { if (student.getId().equals(id)){ student.setName(mapNow.get("name")); Integer age=null; if (mapNow.get("age")!=null){ age=Integer.valueOf(mapNow.get("age")); } student.setAge(age); student.setSex(mapNow.get("sex")); System.out.println("修改成功"); break; } } map.put("msg","修改成功"); map.put("code","200"); }else { map.put("msg","修改失败"); map.put("code","500"); } //同样的,发射数据回前端并且保存数据到本地文件 String newMap= JSON.toJSONString(map); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(newMap); Data.output(); } /* doDelete:功能为删除学生信息 */ @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求头,防止跨域,但还需要额外设置 resp.setHeader("Access-Control-Allow-Origin","*"); ArrayList students=Data.students; //同样的,设置输入字节流 BufferedReader reader=req.getReader(); String string=reader.readLine(); String params=URLDecoder.decode(string,"utf8"); Map map1=Data.changeIntoMap(params); System.out.println(map1.get("id")); //判断前端发来的id的输入数据是否符合规范 Long id=null; if (map1.get("id")!=null){ id=Long.valueOf(map1.get("id")); System.out.println(id); } //同样的流程 Map map=new HashMap<>(); boolean flag=true; for (Student student : students) { if (student.getId().equals(id)){ students.remove(student); System.out.println("删除成功"); map.put("msg","删除成功"); map.put("code",200); System.out.println("删除成功"); flag=false; break; } } if (flag){ System.out.println("未找到学号"); map.put("msg","删除失败"); map.put("code",500); System.out.println("删除失败"); } String newMap= JSON.toJSONString(map); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(newMap); Data.output(); } //doOption:功能为设置请求对象,解决跨域问题 @Override protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Access-Control-Allow-Origin", "http://localhost:63342"); //PUT,DELETE需要额外设置允许的请求方法 resp.setHeader("Access-Control-Allow-Methods", "PUT,DELETE"); resp.setHeader("Access-Control-Allow-Headers", "Content-Type"); resp.setHeader("Access-Control-Max-Age", "3600"); } } /* SearchByID:实现根据ID查找学生信息 */ @WebServlet("/student/search") public class SearchByID extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //从文件中取出数据 ArrayList students=Data.input(); //设置请求头 resp.setHeader("Access-Control-Allow-Origin","*"); Map map=new HashMap<>(); boolean flag=true;//判断是否查找成功 //设置前端发来的数据编码格式 req.setCharacterEncoding("utf8"); System.out.println(req.getParameter("id")); Long id=null; if (req.getParameter("id")!=null){ id=Long.valueOf(req.getParameter("id")); } System.out.println(id); for (Student student : students) { if (student.getId().equals(id)){ map.put("data",student); map.put("msg","查找成功"); map.put("code",200); System.out.println("查找成功"); flag=false; break; } } if (flag){ System.out.println("未找到学号"); map.put("msg","查找失败"); map.put("code",500); System.out.println("查找失败"); } String newMap= JSON.toJSONString(map); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(newMap); } }
//Data类 public class Data { //文件保存地址 private static File file=new File("D:\\桌面\\java38\\javaweb03\\1.txt"); //所有学生数据临时存在idea中的静态代码区 public static ArrayListstudents=null; //获取文件中的数据,输入到idea public static ArrayList input() throws IOException { //同样的,创建数据输入流对象,判断student是否为空,存入数据到静态区 ObjectInputStream objectInputStream=null; try { objectInputStream=new ObjectInputStream(new FileInputStream(file)); students=(ArrayList )objectInputStream.readObject(); } catch (EOFException e) { if (students==null){ students=new ArrayList<>(); } } catch (Exception e) { e.printStackTrace(); System.out.println("数据载入失败"); }finally { if (objectInputStream!=null){ objectInputStream.close(); System.out.println("数据输入流关闭成功"); }else { System.out.println("数据输入流关闭失败"); } return students; } } //数据从idea保存到本地文件中 public static void output() throws IOException { //同样的创建数据输出流 ObjectOutputStream outputStream=null; try { outputStream=new ObjectOutputStream(new FileOutputStream(file)); outputStream.writeObject(students); }catch (Exception e){ System.out.println("数据保存失败"); }finally { if (outputStream!=null){ outputStream.close(); System.out.println("数据保存成功"); }else { System.out.println("数据保存失败"); } } } //将前端传来的数据从String类型整理成键值对的map形式返回 public static Map changeIntoMap(String s){ //先用split方法将数据分割成字符串数组 String[] strings=s.split("&"); Map map=new HashMap<>(); //第二次以等号为分割符循环切割 for (String string : strings) { String[] strings1=string.split("="); map.put(strings1[0],strings1[1]); } return map; } }
//Student类 public class Student implements Serializable { private Long id; private String name; private Integer age; private String sex; public Student(Long id, String name, Integer age, String sex) { this.id = id; this.name = name; this.age = age; this.sex = sex; } public Student() { } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
/* student.html:功能为展示所有学生信息,删除学生 连接的接口为:student的Get和Delete方法 */ 首页 //首页标题 学生信息
添加学生//添加跳转功能,可以跳转到添加的前端页面
ID | 姓名 | 性别 | 年龄 | 操作 |
---|
/* add.html:添加页面 连接接口:添加学生,student的post方法 */ 添加学生 //标题标签,系统自动加粗添加学生
//标签容器,支持流动数据类型//type:用于设置数据类型 id为数据设置一个唯一的标识符 姓名://提供大量输入的数据类型,接收来自用户的数据 性别:年龄://button, 提供一个可点击的按钮,这里还绑定了一个函数
/* update.html页面:实现学生信息的修改 连接接口:student的put方法和SerchByID类的update */ 修改学生信息 //数据输入页面相同修改学生信息
姓名:性别:年龄:
部分输入异常没有捕获
没有登录界面,信息不安全
查询功能过于简陋
捕获异常
增加登录界面
增加模糊查询