学生管理系统(BS版本)&文件上传

学生管理系统(BS版本)&文件上传

一.学生管理系统(BS版本)

1.1 环境搭建
  • 创建项目,创建包,添加jar包

    学生管理系统(BS版本)&文件上传_第1张图片

  • 四个jsp页面

    • 首页(index.jsp)

      使用项目自带的index.jsp即可,提供一个跳转到所有学生列表页面的超链接
      
    • 所有学生列表页(list.jsp)

    • 添加学生页面(add.jsp)

    • 修改学生信息页面(edit.jsp)

1.2 查询所有功能
  • 流程分析

    学生管理系统(BS版本)&文件上传_第2张图片

  • 代码实现

    index.jsp页面
        <h2>学生管理系统</h2>
    	<a href="${pageContext.request.contextPath}/findAllStudents">查询所有学生列表</a>
    
    FindAllStudentsServlet.java
        @WebServlet(name = "FindAllStudentsServlet",urlPatterns = "/findAllStudents")
        public class FindAllStudentsServlet extends HttpServlet {
            protected void doGet(HttpServletRequest request, HttpServletResponse response){
                //0.设置响应体和请求体的编码
                response.setContentType("text/html;charset=UTF-8");
                request.setCharacterEncoding("UTF-8");
                //Servlet干的四件事:参调存转
                //1.获取参数(无)
                //2.调用service,获取所有学生的信息
                StudentService service = new StudentService();
                List<Student> students = service.findAllStudents();
                //3.把数据保存到域对象中
                request.setAttribute("students",students);
                //4.转发到另外一个jsp页面
                request.getRequestDispatcher("/list.jsp").forward(request, response);
            }
        }
    
    StudentService.java
        public class StudentService {
            /**
             * 查询所有学生的方法
             */
            public List<Student> findAllStudents(){
                //调用dao层
                StudentDao dao = new StudentDao();
                List<Student> students = dao.findAllStudents();
                //返回
                return students;
            }
    	}
    
    StudentDao.java
        public class StudentDao {
            /**
             * 查询所有学生的方法
             */
            public List<Student> findAllStudents(){
                //要从文件中真正查询数据
                List<Student> students = DataUtil.readAll();
                //返回
                return students;
            }
        }
    DataUtil.java
        public class DataUtil {
            //从文件中读取所有学员信息
            public static List<Student> readAll(){
                //保存所有学生对象信息
                List<Student> stuList = new ArrayList<>();
                try {
                    //得到文件真实路径
                    String realpath = DataUtil.class.getClassLoader().getResource("student.txt").getPath();
                    //创建字符输入流
                    Reader isr = new InputStreamReader(new FileInputStream(realpath), "UTF-8");
                    //创建字符缓冲流
                    BufferedReader br = new BufferedReader(isr); //装饰者模式
    
                    //一次读一行
                    String row = null;
                    while ((row = br.readLine()) != null) {//row = "1,张三,m,20"
                        String[] arr = row.split(","); //[1,张三,m,20]
                        Student stu = new Student();
                        stu.setId(arr[0]);
                        stu.setName(arr[1]);
                        stu.setSex(arr[2]);
                        stu.setAge(arr[3]);
    
                        //将Student对象添加到集合
                        stuList.add(stu);
                    }
    
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                return stuList;
            }
       }
    
    list.jsp 展示所有学生信息页面
        
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <html>
        <head>
            <title>Title</title>
            <script>
    
            </script>
        </head>
        <body>
            <a href="">新增</a>
            <table border="1" >
                <tr>
                    <th>学号</th>
                    <th>姓名</th>
                    <th>性别</th>
                    <th>年龄</th>
                    <th>操作</th>
                </tr>
               <%--使用jstl的foreach标签遍历集合--%>
                <c:forEach items="${students}" var="s">
                    <tr>
                        <td>${s.id}</td>
                        <td>${s.name}</td>
                        <td>${s.sex}</td>
                        <td>${s.age}</td>
                        <td>
                            <a href="">修改</a><a href="">删除</a>
                        </td>
                    </tr>
                </c:forEach>
            </table>
        </body>
    </html>
    
1.3 新增功能
  • 流程分析

    学生管理系统(BS版本)&文件上传_第3张图片

  • 代码实现

    list.jsp页面
        <a href="${pageContext.request.contextPath}/add.jsp">新增</a> ${isOK}
    
    add.jsp页面
        <body>
            <form action="${pageContext.request.contextPath}/addStudent" method="post">
                学号:<input type="text" name="id"/><br/>
                姓名:<input type="text" name="name"/><br/>
                性别:<input type="radio" name="sex" value="男" checked/><input type="radio" name="sex" value="女"/><br/>
                年龄:<input type="text" name="age"/><br/>
                <input type="submit" value="提交"/>
            </form>
        </body>
        
    AddStudentServlet.java
        @WebServlet(name = "AllStudentServlet",urlPatterns = "/addStudent")
        public class AllStudentServlet extends HttpServlet {
            protected void doGet(HttpServletRequest request, HttpServletResponse response){
                //0.设置响应体和请求体的编码
                response.setContentType("text/html;charset=UTF-8");
                request.setCharacterEncoding("UTF-8");
                //Servlet的四大功能:参调存转
                //1.获取请求参数
                Map<String, String[]> map = request.getParameterMap();
                //封装到学生对象
                Student s = new Student();
                //使用BeanUtils
                try {
                    BeanUtils.populate(s,map);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //2.调用service
                StudentService service = new StudentService();
                boolean b = service.addStudent(s);
                //3.可以把成功的信息保存到域对象(也可以不保存)
                request.setAttribute("isOK", b?"添加成功":"添加失败");
                //4.转发到findAllServlet
                request.getRequestDispatcher("/findAllStudents").forward(request, response);
            }
        }
    
    	StudentService.java
            /**
             * 添加学生的方法
             */
            public boolean addStudent(Student s){
                //调用Dao
                StudentDao dao = new StudentDao();
                boolean b = dao.addStudent(s);
                return b;
            }
    
    	StudentDao.java
            /*
             * 添加学生的方法
             */
            public boolean addStudent(Student s) {
                //把新增的学生信息添加到文件中
                //1.先获取所有学生(没有添加之前的)
                List<Student> students = DataUtil.readAll();
                //2.把新的学生添加到集合中
                students.add(s);
                //3.把所有学生(添加之后)再写去到文件中
                DataUtil.writeAll(students);
                //4.返回成功
                return true;
            }
    
    	DataUtil.java
               //向文件中写入所有学员信息--覆盖写
            public static void writeAll(List<Student> stuList) {
                try {
                    //得到文件真实路径
                    String realpath = DataUtil.class.getClassLoader().getResource("student.txt").getPath();
                    //创建字符输出流
                    Writer osw=new OutputStreamWriter(new FileOutputStream(realpath),"UTF-8");
                    //创建字符缓冲流
                    BufferedWriter out = new BufferedWriter(osw);
                    //循环向文件中写入文本
                    for (Student stu : stuList) {
                        out.write(stu.getId() + "," + stu.getName() + "," + stu.getSex() + "," + stu.getAge());
                        out.newLine();//创建新的一行
                    }
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } 
    
1.4 解决全站乱码
为了解决所有资源的中文乱码问题,我们建议添加一个全站中文乱码的过滤器
@WebFilter(filterName = "EncodingFilter", urlPatterns = "/*")
public class EncodingFilter implements Filter {
    /**
     * 销毁方法:项目被卸载或者服务器正常关闭时销毁
     */
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.将ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //2.请求体和响应体乱码
        if (request.getMethod().equalsIgnoreCase("POST")) {
            request.setCharacterEncoding("UTF-8");
        }
        response.setContentType("text/html;charset=UTF-8");
        //3.放行,访问目标资源
        chain.doFilter(req, resp);
    }

    /**
     * 初始化方法:项目部署到服务器时初始化
     */
    public void init(FilterConfig config) throws ServletException {

    }
}    
1.5 修改功能
1.5.1 数据回显
  • 流程分析

    学生管理系统(BS版本)&文件上传_第4张图片

  • 代码实现
    list.jsp的修改按钮
        <tr>
            <td>${s.id}</td>
            <td>${s.name}</td>
            <td>${s.sex}</td>
            <td>${s.age}</td>
            <td>
            <a href="${pageContext.request.contextPath}/findStudent?id=${s.id}">修改</a><a href="${pageContext.request.contextPath}/deleteStudent?id=${s.id}">删除</a>
            </td>
        </tr>
        
     FindStudentServlet.java
       protected void doGet(HttpServletRequest request, HttpServletResponse response){
            //Servlet的四个功能:参调存转
            //1.获取请求中的参数
            String id = request.getParameter("id");
            //2.调用Service
            StudentService service = new StudentService();
            Student s = service.findStudent(id);
            //3.保存到域对象中
            request.setAttribute("student",s);
            //4.转发到edit.jsp
            request.getRequestDispatcher("/edit.jsp").forward(request, response);
        }
    
     StudentService.java
            /**
             * 根据ID查询学生
             * @param id
             * @return
             */
            public Student findStudent(String id) {
                //调用Dao
                StudentDao dao = new StudentDao();
                Student s =  dao.findStudent(id);
                //返回
                return s;
            }
     StudentDao.java
         	/**
             * 根据id查询学生
             */
            public Student findStudent(String id) {
                //从文件中查询指定id的学生信息
                //1.获取所有学生
                List<Student> students = DataUtil.readAll();
                //2.查询指定id的学生
                for (Student student : students) {
                    //3.判断
                    if (student.getId().equals(id)) {
                        return student;
                    }
                }
                //3.如果2中的循环没有找到
                return null;
            }
     edit.jsp进行数据回显
     <form action="" method="post">
        学号:<input type="text" name="id" value="${student.id}" disabled/><br/>
        姓名:<input type="text" name="name" value="${student.name}"/><br/>
        性别:<input type="radio" name="gender" value="男" ${student.sex == "男" ? "checked":""}/><input type="radio" name="gender" value="女" ${student.sex == "女" ? "checked":""}/><br/>
        年龄:<input type="text" name="age" value="${student.age}"/><br/>
        <input type="submit" value="提交"/>
    </form>
    
1.5.2 修改信息
  • 流程分析

    学生管理系统(BS版本)&文件上传_第5张图片

  • 代码实现
    edit.jsp修改数据页面
    <form action="${pageContext.request.contextPath}/updateStudent" method="post">
        学号:<input type="hidden" name="id" value="${student.id}"/><br/>
        姓名:<input type="text" name="name" value="${student.name}"/><br/>
        性别:<input type="radio" name="sex" value="男" ${student.sex == "男" ? "checked":""}/><input type="radio" name="sex" value="女" ${student.sex == "女" ? "checked":""}/><br/>
        年龄:<input type="text" name="age" value="${student.age}"/><br/>
        <input type="submit" value="提交"/>
    </form>
        
     UpdateStudentServlet.java   
            protected void doGet(HttpServletRequest request, HttpServletResponse response) {
            //参调存转
            //1.获取参数
            Map<String, String[]> map = request.getParameterMap();
            Student s = new Student();
            try {
                BeanUtils.populate(s,map);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //2.调用service
            StudentService service = new StudentService();
            boolean b = service.updateStudent(s);
            //3.结果保存到域对象
            request.setAttribute("isOK",b?"修改成功":"修改失败");
            //4.转发
            request.getRequestDispatcher("/findAllStudents").forward(request, response);
        }
    
    StudentService.java
         /**
         * 修改学生
         */
        public boolean updateStudent(Student s) {
            //调用Dao
            StudentDao dao = new StudentDao();
            boolean b = dao.updateStudent(s);
            //返回
            return b;
        }
    StudentDao.java
       /**
         * 修改学生
         */
        public boolean updateStudent(Student s) {
            //把文件中的指定id的学生信息改为最新信息
            //1.获取所有学生(未修改之前)
            List<Student> students = DataUtil.readAll();
            //2.修改
            for (Student student : students) {
                //判断
                if (student.getId().equals(s.getId())) {
                    //修改
                    student.setName(s.getName());
                    student.setAge(s.getAge());
                    student.setSex(s.getSex());
                }
            }
            //3.把所有学生(修改之后)再写去到文件中
            DataUtil.writeAll(students);
            //4.返回结果
            return true;
        }
    
1.6 删除功能
  • 流程分析

    学生管理系统(BS版本)&文件上传_第6张图片

  • 代码实现

    list.jsp
        <tr>
       		<td>${s.id}</td>
            <td>${s.name}</td>
            <td>${s.sex}</td>
            <td>${s.age}</td>
            <td>
                 <a href="">修改</a><a href="${pageContext.request.contextPath}/deleteStudent?id=${s.id}">删除</a>
            </td>
         </tr>
        
    DeleteStudentServlet.java
            protected void doGet(HttpServletRequest request, HttpServletResponse response){
            //0.设置响应体和请求体的编码
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");
            //Servlet四大功能:参调存转
            //1.获取请求参数
            String id = request.getParameter("id");
            //2.调用Service
            StudentService service = new StudentService();
            boolean b = service.deleteStudent(id);
            //3.保存域对象
            request.setAttribute("isOK",b?"删除功能":"删除失败");
            //4.请求转发
            request.getRequestDispatcher("/findAllStudents").forward(request, response);
        }
    
    StudentService.java
            /**
             * 根据ID删除学生
             */
            public boolean deleteStudent(String id) {
                //调用Dao
                StudentDao dao = new StudentDao();
                boolean b = dao.delteStudent(id);
                return b;
            }
    StudentDao.java
        	/**
             * 删除学生的方法
             * @param id
             * @return
             */
            public boolean deleteStudent(String id) {
                //把文件中指定id的学生删除
                //1.先获取所有学生(没有删除之前的)
                List<Student> students = DataUtil.readAll();
                //2.根据id 从集合students中把学生删除
                for (Student student : students) {
                    //判断
                    if (student.getId().equals(id)) {
                        students.remove(student);
                        break;
                    }
                }
                //3.把所有学生(删除之后)再写去到文件中
                DataUtil.writeAll(students);
                //4.返回成功
                return true;
            }
    

二.文件上传(了解)

2.1 什么是文件上传
用户通过客户端/浏览器把本地的文件,通过网络上传到服务器,并保存到服务器本地磁盘中
2.2 文件上传的三要素
使用浏览器实现文件上传的三要素:
	a.请求方式必须是post
    b.上传文件的file标签,必须提供一个name属性    
    c.form标签的enctype属性值必须为multipart/form-data(表示需要使用文件上传功能)
        	如果是普通表单(没有文件需要上传的),
			其属性值为enctype="application/x-www-form-urlencoded"(默认的)
    示例:
	<form action="..." method="post" enctype="multipart/form-data"> 
        	<input type="file" name=".."/> 
    </form>
2.3 文件上传流程分析
  • 创建文件上传的页面

    用户名:
    密 码:
    文 件:
  • 点击按钮上传文件(上传数据的格式)

    学生管理系统(BS版本)&文件上传_第7张图片

  • 编写一个Servlet接收文件上传表单的数据(借助Apache的commons-fileupload文件上传框架)

2.4 文件上传的几种方式
第一种:
	借助Apache提供的一个 commons-fileupload.jar 包实现[今天讲解]【最最最恶心】
第二种:
	使用Servlet3.0提供的 注解方式上传文件,很简单
第三种:
	SpringMVC实现的文件上传【最最最变态的简单】
2.5 文件上传的代码实现
首先你要把Apache用于文件上传相关jar包导入到项目中:
	commons-fileupload-1.3.1.jar
    commons-io-2.6.jar    
代码实现
/**
 * 接收文件上传表单的Servlet
 */
@WebServlet(name = "FileUploadServlet",urlPatterns = "/upload")
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//       doPost(req,resp);//StackOverflowError
        doGet(req,resp);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0.设置响应体和请求体的编码
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        //使用Apache提供的commons-file-upload.jar解析普通项和文件项
        //1.创建一个 磁盘文件项的工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2.创建 核心的解析文件上传数据的对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        //3.使用核心类的对象,解析请求中的数据
        try {
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            //4.遍历集合
            for (FileItem fileItem : fileItems) {
                //5.判断是普通项还是文件项
                if (fileItem.isFormField()) {
                    //6.代表的是普通项
                    String fieldName = fileItem.getFieldName();
                    String fieldValue = fileItem.getString();
                    System.out.println(fieldName + "=" + fieldValue);
                }else{
                    //7.代表的是文件项
                    //a.获取文件的名字
                    String fileName = fileItem.getName();
                    //b.获取文件的输入流
                    InputStream in = fileItem.getInputStream();
                    //8.创建和fileName一样同名文件
                    //注意:如果uploads文件夹是空的,那么编译后部署到Tomcat时,会删除该文件夹
                    //解决方案:
                    //a.在uploads文件夹下随便放一个文件(保证其不空,不会被删除)
                    //b.使用File对象的mkdir方法创建该文件夹即可
                    String realPath = getServletContext().getRealPath("/WEB-INF/uploads");
                    //判断该文件夹是否存在
                    File file = new File(realPath);
                    if (!file.exists()) {
                        file.mkdir();
                    }
                    //9.创建文件的输出流
                    FileOutputStream fos = new FileOutputStream(realPath+"/"+fileName);
                    //10.复制
                    //一个一个字节复制,一个一个字节数组复制,要么使用IOUtils复制
                    IOUtils.copy(in, fos);
                    //11.释放资源
                    fos.close();
                    in.close();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(学习记录)