59简单学生管理系统【功能实现((完善注册、登录、详情页)、记住我 、安全退出、修改密码、修改学生信息、修改老师信息)】、JSP

功能实现

什么是JSP

html+java

5.完善注册、登录、详情页

html页面改用jsp

使用:<%java代码%>,展示用<%=“行了”%>

注册

完善注册

修改RegisterServlet

改用转发方式跳转

原因:注意重定向是两次请求,存在第一次请求中的数据会在它发送第二次请求时消失,就不能在页面获取展示出来

        }else{//不允许注册

//            //利用重定向跳转到注册页面
//            response.sendRedirect("register.html");
            //将提示信息存在请求里
            request.setAttribute("msg","注册失败 -- 账号已存在");
            //利用转发跳转到注册页面
            request.getRequestDispatcher("register.jsp").forward(request,response);
        }
register.jsp

原有基础加两段代码

对于改用jsp后,就可解决在页面提示:展示提示信息

        <%String msg = (String) request.getAttribute("msg");%>
        <%=(msg !=null)?msg:""%>
登录

完善登录

修改LoginServlet

添加将数据存储到Session中

登录成功,将数据存储到Session中,方便详情页获取展示,跳转详情页就用重定向

登录失败,对于提示信息和跳转的处理同注册

        if(sysCode.equalsIgnoreCase(userCode)){//验证码正确

            if(user != null){//登录成功

                //将数据存储到Session中
                HttpSession session = request.getSession();
                session.setAttribute("username",user.getUsername());
                session.setAttribute("name",user.getName());
                session.setAttribute("role",role);

                response.sendRedirect("index.jsp");

            }else{//登录失败 -- 账号或密码错误

//                response.sendRedirect("login.html");
                request.setAttribute("msg","登录失败 -- 账号或密码错误");
                request.getRequestDispatcher("login.jsp").forward(request,response);
            }

        }else{//登录失败 - 验证码错误
            
//            response.sendRedirect("login.html");
            //将提示信息存在请求里
            request.setAttribute("msg","登录失败 -- 验证码错误");
            //利用转发跳转到注册页面
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
    }
}
login.jsp

原有基础加两段代码

  <%
    String msg = (String) request.getAttribute("msg");
  %>
  <%=(msg!=null)?msg:""%>
详情页

完善登录03角色跳转

index.jsp

获取存在session中的数据进行学生或者老师信息展示,添加一些后续功能的入口

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        String username = (String) session.getAttribute("username");
        String name = (String) session.getAttribute("name");
        String role = (String) session.getAttribute("role");
    %>

    <button >安全退出</button>
    <h1>详情页面</h1>
    <h1>欢迎<%=name%><%=("student".equals(role))?"学员":""%><%=("teacher".equals(role))?"老师":""%>进入到学生管理系统</h1>

    <a href="#">修改密码</a>


    <%if("student".equals(role)){%>
        <a href="#">修改信息</a>
    <%}%>

    <%if("teacher".equals(role)){%>
        <a href="#">修改信息</a>
        <a href="#">查看所有学生</a>
    <%}%>

    </script>
</body>
</html>

6.记住我

实现:存Session、存Cookie

记住我

修改LoginServlet

添加存凭证

1.当第一次登录时,点击了“记住我”,就会存凭证【username、name、role合起来是一个凭证】存在Cookie中

2.再次登录就会判断,是否有凭证

​ 有,直接跳详情页面,不过在跳转前会将凭证存在session中【因为详情页展示需要session的数据】

​ 没有,就不管,就用户直接输入登录

              if(user != null){//登录成功

                //判断是否记住我
                if(rememberMe != null){

                    //将凭证添加到Cookie中
                    response.addCookie(CookieUtils.createCookie("username",user.getUsername(),60*60*24*5));
                    response.addCookie(CookieUtils.createCookie("name",user.getName(),60*60*24*5));
                    response.addCookie(CookieUtils.createCookie("role",role,60*60*24*5));

                }

                //将数据存储到Session中
                HttpSession session = request.getSession();
                session.setAttribute("username",user.getUsername());
                session.setAttribute("name",user.getName());
                session.setAttribute("role",role);

                response.sendRedirect("index.jsp");

            }else{//登录失败 -- 账号或密码错误

            }

修改login.jsp

添加凭证判断跳转

获取请求中存在session中的数据,进行凭证判断,有就直接跳转详情,没有就用户直接输入登录

<body>

  <%
    Cookie[] cookies = request.getCookies();

    if(cookies != null){
      int count = 0;
      for (Cookie cookie : cookies) {
        String name = cookie.getName();
          //解码类解码
        String value = URLDecoder.decode(cookie.getValue(),"UTF-8");

        if("username".equals(name)){
          session.setAttribute("username",value);
          count++;
        }
        if("name".equals(name)){
          session.setAttribute("name",value);
          count++;
        }
        if("role".equals(name)){
          session.setAttribute("role",value);
          count++;
        }
      }
      if(count == 3){
        response.sendRedirect("index.jsp");
      }
    }


  %>
    
</body>
新增工具类CookieUtils
public class CookieUtils {

    public static Cookie createCookie(String name,String value,int time){

        Cookie cookie = null;
        try {
            //注意:数据有中文必须设置编码格式
            cookie = new Cookie(name, URLEncoder.encode(value,"UTF-8"));
            //设置过期时间
            cookie.setMaxAge(time);
            return cookie;
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
}

7.安全退出

实现:删Session、删Cookie

安全退出

SafeExitServlet
@WebServlet("/SafeExitServlet")
public class SafeExitServlet 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 {

        //删除Cookie里的数据
        response.addCookie(CookieUtils.createCookie("username","",0));
        response.addCookie(CookieUtils.createCookie("name","",0));
        response.addCookie(CookieUtils.createCookie("role","",0));

        //删除Session里的数据
        HttpSession session = request.getSession();
        session.removeAttribute("username");
        session.removeAttribute("name");
        session.removeAttribute("role");

        //跳转
        response.sendRedirect("welcome.html");
    }
}
修改index.jsp
<button οnclick="safeExit()">安全退出</button>

    <script type="text/javascript">
        function safeExit(){
            window.location = "SafeExitServlet";
        }
        
    </script>

8.修改密码

修改密码
修改密码06

注意:在写代码时考虑代码冗余,应先考虑代码的可读性

新增ResetPasswordServlet
  1. 设置请求、响应编码格式
  2. 获取请求中的数据
  3. 通过username、password查询数据库中的用户对象
  4. 通过用户对象进行判断

​ 用户存在,判断角色修改密码,注意要做安全退出【不然在有记住我的情况下,第二次登录直接进来】

​ 用户不存在,设置提示修改密码失败信息,又转发方式跳转回到修改密码页面

@WebServlet("/ResetPasswordServlet")
public class ResetPasswordServlet 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 {
        //设置请求、响应编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取请求中的数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String newPassword = request.getParameter("newPassword");
        String role = request.getParameter("role");
        //方案1
//        String username = (String) request.getSession().getAttribute("username");
//        String role = (String) request.getSession().getAttribute("role");
		
        //通过username、password查询数据库中的用户对象
        User user = null;
        try {
            if("student".equals(role)){
                user = DBUtils.commonQueryObj(Student.class, "select * from student where username=? and password=?", username, password);
            }else if("teacher".equals(role)){
                user = DBUtils.commonQueryObj(Teacher.class, "select * from teacher where username=? and password=?", username, password);
            }

            //通过用户对象进行判断
            if(user != null){
                if("student".equals(role)){
                    DBUtils.commonUpdate("update student set password=? where username=?",newPassword,username);
                }else if("teacher".equals(role)){
                    DBUtils.commonUpdate("update teacher set password=? where username=?",newPassword,username);
                }

                //修改密码成功后,做安全退出的功能
                request.getRequestDispatcher("SafeExitServlet").forward(request,response);

            }else{
                request.setAttribute("msg","修改密码失败 -- 原密码不正确");
                request.getRequestDispatcher("resetPassword.jsp").forward(request,response);
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


    }
}
修改index.jsp
<a href="resetPassword.jsp">修改密码</a>
新增resetPassword.jsp

需要展示页面就要先获取session中的username

要用户输入就原密码和新密码【对于为什么要原密码,就是在用户电脑在登录情况下被别人直接改密码】

注意1:对于ResetPasswordServlet查询用户对象,是需要username和role,怎么获取?

​ 方案1:ResetPasswordServlet直接通过session获取【session里面存的有】

//        String username = (String) request.getSession().getAttribute("username");
//        String role = (String) request.getSession().getAttribute("role");

​ 方案2:在这个表单直接请求传过去,ResetPasswordServlet就可以在请求中取

方案2更好,方案一不但太麻烦,而且对于数据一处取可读性更高

注意2:方案2也有两种传法【get、post】,get会在地址栏显示,不好

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%
        String username = (String) session.getAttribute("username");
        String role = (String) session.getAttribute("role");

        String msg = (String) request.getAttribute("msg");
    %>
    <%=(msg!=null)?msg:""%>
    
 //ResetPasswordServlet?username=<%=username%>&role=<%=role%>也能传,但是会在浏览器地址栏显示
    <form action="ResetPasswordServlet" method="post">

        <!--隐藏域-->
        <input type="hidden" name="username" value="<%=username%>"/>
        <input type="hidden" name="role" value="<%=role%>"/>

        账号:<%=username%><br/>
        原密码:<input type="password" name="password"/><br/>
        新密码:<input type="password" name="newPassword"/><br/>

        <input type="submit" value="修改"/>
        <input type="button" value="返回" οnclick="goIndex()"/>
    </form>

    <script type="text/javascript">
        function goIndex(){
            window.location = "index.jsp";
        }
    </script>
</body>
</html>

9.修改学生信息

修改学生信息

新增StuInitModifyServlet

初始化修改学生数据

  1. 设置请求、响应编码格式
  2. 获取请求中的数据
  3. 从数据库中获取学生对象
  4. 将学生对象存在请求中,转发方式到学生修改信息页面stuInfo.jsp
@WebServlet("/StuInitModifyServlet")
public class StuInitModifyServlet 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 {
        //设置请求、响应编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取请求中的数据
        String username = request.getParameter("username");

        //从数据库中获取学生对象
        Student student = null;
        try {
            student = DBUtils.commonQueryObj(Student.class, "select * from student where username=?", username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        request.setAttribute("student",student);
        request.getRequestDispatcher("stuInfo.jsp").forward(request,response);
    }
}
新增StuModifyServlet
  • 设置请求、响应编码格式
  • 获取请求中的数据
  • 更新数据库里的学生数据
  • 更新Session里的数据【原因:可能改名字,如果不改还是原来的名字就会在使用时出错】
  • 更新Cookie里的数据【可存可不存,还是存一下,Cookie只有记住我才会有数据,name涉及凭证】
  • 重定向方式跳转到详情页面index.jsp
@WebServlet("/StuModifyServlet")
public class StuModifyServlet 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 {
        //设置请求、响应编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取请求中的数据
        String username = request.getParameter("username");
        String name = request.getParameter("name");
        String sex = request.getParameter("sex");
        String age = request.getParameter("age");
        String[] hobbies = request.getParameterValues("hobbies");

        //更新数据库里的学生数据
        try {
            DBUtils.commonUpdate("update student set name=?,sex=?,age=?,hobbies=? where username=?",name,sex,age, StringUtils.handleArray(hobbies),username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        //更新Session里的数据
        request.getSession().setAttribute("name",name);
        //更新Cookie里的数据
        response.addCookie(CookieUtils.createCookie("name",name,60*60*24*5));

        response.sendRedirect("index.jsp");
    }
}
新增stuInfo.jsp

对于没有直接进行学生信息处理【因为没有修改学生的年龄,性别,爱好信息】,需要先到StuInitModifyServlet获取到学生对象,再获取其中信息,用来修改页面展示和表单发送StuModifyServlet中的修改

注意:对性别和爱好的选择处理

<%@ page import="com.qf.pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%
        Student student = (Student) request.getAttribute("student");
    %>

    <h1>学生修改信息页面</h1>

    <form action="StuModifyServlet" method="post">

        <input type="hidden" name="username" value="<%=student.getUsername()%>"/>

        账号:<%=student.getUsername()%><br/>
        姓名:<input type="text" name="name" value="<%=student.getName()%>"/><br/>
        年龄:<input type="text" name="age" value="<%=student.getAge()%>"/><br/>
        性别:
        <input type="radio" name="sex" value="man" <%=(student.getSex().equals("man"))?"checked='checked'":""%>/>男
        <input type="radio" name="sex" value="woman" <%=(student.getSex().equals("woman"))?"checked='checked'":""%>/>女
        <br/>
        爱好:
        <input type="checkbox" name="hobbies" value="football" <%=(student.getHobbies().contains("football"))?"checked='checked'":""%>/>足球
        <input type="checkbox" name="hobbies" value="basketball" <%=(student.getHobbies().contains("basketball"))?"checked='checked'":""%>/>篮球
        <input type="checkbox" name="hobbies" value="shop" <%=(student.getHobbies().contains("shop"))?"checked='checked'":""%>/>购物
        <br/>

        <input type="submit" value="修改"/>
        <input type="button" value="返回" οnclick="goIndex()"/>
    </form>

    <script type="text/javascript">
        function goIndex(){
            window.location = "index.jsp";
        }
    </script>
</body>
</html>

修改index.jsp

在跳转的同传username的原因【使StuInitModifyServlet可以拿到账号到数据库查询到改账号的学生信息】

   <%if("student".equals(role)){%>
        <a href="StuInitModifyServlet?username=<%=username%>">修改信息</a>
    <%}%>

10.修改老师信息

修改老师信息

新增TeaInitModifyServlet

初始化修改老师数据

  1. 设置请求、响应编码格式
  2. 获取请求中的数据
  3. 从数据库中获取老师对象
  4. 将老师对象和课程集合对象存在请求中,转发方式到老师修改信息页面teaInfo.jsp
@WebServlet("/TeaInitModifyServlet")
public class TeaInitModifyServlet 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 {
        //设置请求、响应编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取请求中的数据
        String username = request.getParameter("username");

        //从数据库中获取相应的数据
        Teacher teacher = null;
        List<Course> courses = null;
        try {
            teacher = DBUtils.commonQueryObj(Teacher.class,"select * from teacher where username=?",username);
            courses = DBUtils.commonQueryList(Course.class,"select * from course");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        //存入请求对象中
        request.setAttribute("teacher",teacher);
        request.setAttribute("courses",courses);

        //跳转页面
        request.getRequestDispatcher("teaInfo.jsp").forward(request,response);
    }
}
新增TeaModifyServlet
  • 设置请求、响应编码格式
  • 获取请求中的数据
  • 更新数据库里的老师数据
  • 更新Session里的数据【原因:可能改名字,如果不改还是原来的名字就会在使用时出错】
  • 更新Cookie里的数据【可存可不存,还是存一下,Cookie只有记住我才会有数据,name涉及凭证】
  • 重定向方式跳转到详情页面index.jsp
@WebServlet("/TeaModifyServlet")
public class TeaModifyServlet 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 {
        //设置请求、响应编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取请求中的数据
        String username = request.getParameter("username");
        String name = request.getParameter("name");
        String sex = request.getParameter("sex");
        String age = request.getParameter("age");
        String courseId = request.getParameter("courseId");

        //更新数据库里的学生数据
        try {
            DBUtils.commonUpdate("update teacher set name=?,sex=?,age=?,courseId=? where username=?",name,sex,age, courseId,username);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        //更新Session里的数据
        request.getSession().setAttribute("name",name);
        //更新Cookie里的数据
        response.addCookie(CookieUtils.createCookie("name",name,60*60*24*5));

        response.sendRedirect("index.jsp");
    }
}
teaInfo.jsp

对于没有直接进行老师信息处理【因为没有修改老师的年龄,性别信息】,需要先到TeaInitModifyServlet获取到老师对象,再获取其中信息,用来修改页面展示和表单发送TeaModifyServlet中的修改

注意:对性别和学科选择的处理

对于学科考虑到会新增的情况,不能写死,通过获取学科集合再遍历的方式进行选择展示

<%@ page import="com.qf.pojo.Teacher" %>
<%@ page import="java.util.List" %>
<%@ page import="com.qf.pojo.Course" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        Teacher teacher = (Teacher) request.getAttribute("teacher");
        List<Course> courses = (List<Course>) request.getAttribute("courses");
    %>

    <h1>老师修改信息页面</h1>

    <form action="TeaModifyServlet" method="post">

        <input type="hidden" name="username" value="<%=teacher.getUsername()%>"/>

        账号:<%=teacher.getUsername()%><br/>
        姓名:<input type="text" name="name" value="<%=teacher.getName()%>"/><br/>
        年龄:<input type="text" name="age" value="<%=teacher.getAge()%>"/><br/>
        性别:
        <input type="radio" name="sex" value="man" <%=(teacher.getSex().equals("man"))?"checked='checked'":""%>/>男
        <input type="radio" name="sex" value="woman" <%=(teacher.getSex().equals("woman"))?"checked='checked'":""%>/>女
        <br/>
        学科:
            <select name="courseId">
                <% for(Course course : courses){%>
                    <option value="<%=course.getId()%>" <%=(course.getId() == teacher.getCourseId())?"selected='selected'":""%> ><%=course.getName()%></option>
                <% }%>
            </select>
        <br/>

        <input type="submit" value="修改"/>
        <input type="button" value="返回" οnclick="goIndex()"/>
    </form>

    <script type="text/javascript">
        function goIndex(){
            window.location = "index.jsp";
        }
    </script>
</body>
</html>

修改index.jsp

在跳转的同传username的原因【使TeaInitModifyServlet可以拿到账号到数据库查询到改账号的老师信息】

    <%if("teacher".equals(role)){%>
        <a href="TeaInitModifyServlet?username=<%=username%>">修改信息</a>
        <a href="#">查看所有学生</a>
    <%}%>
  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值