一.密码修改实现

目标页面:

Java 修改密码设计 java实现修改密码_sql

从底层向上写,先编写Dao层,再编写Service层,最后编写Servlet层实现与前端jsp页面的通信。

1.1修改密码的Dao层

编写sql语句:update smbms_user set userPassword = ? where id = ?
?处的参数为password和id,调用BaseDao中的execute查询方法。

public int updatePwd(Connection connection, int id, String password) throws SQLException {
        PreparedStatement preparedStatement=null;
        int excute=0;
        System.out.println("Dao"+password);
        if(connection!=null){
            String sql="update smbms_user set userPassword = ? where id = ?";
            Object[] params={password,id};
            excute=BaseDao.execute(connection,sql,preparedStatement,params);
            BaseDao.closeResource(connection,preparedStatement,null);
        }
        return excute;
    }

1.2修改密码的Service层

service层主要目的是调用dao层,如果查找到就返回true,否则false。

//修改密码功能service层
    @Override
    public boolean update(int id, String password) throws SQLException {
        System.out.println("update"+password);
        Connection connection=null;
        Boolean flag=false;
        try {
            connection = BaseDao.getConnection();
            if (userDao.updatePwd(connection, id, password) > 0) {
                flag = true;
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            BaseDao.closeResource(connection,null,null);
        }
        return flag;
    }

1.3修改密码Servlet层实现

首先利用req.getparameter从前端的输入中获取用户填写的新密码。如果:

!StringUtils.isNullOrEmpty(newpassword)

不成立,则说明用户前端输入的新密码有问题,则返回对应的消息。

req.setAttribute("message","新密码设置有问题");

输入的newpassword没问题,调用service中的update方法进行更新。

public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
        Object o=req.getSession().getAttribute(Constant.USER_SESSION);
        String newpassword= req.getParameter("newpassword");
        //没有获取到newpassword
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        boolean flag=false;
        System.out.println("HttpServlet1"+newpassword);
        if(o!=null&& !StringUtils.isNullOrEmpty(newpassword)){

            UserService userService=new UserServiceImpl();
            try {
                flag=userService.update(((User)o).getId(),newpassword);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

            if(flag==true){
                req.setAttribute("message","密码修改成功");
                req.getSession().removeAttribute(Constant.USER_SESSION);
            }
            else{
                req.setAttribute("message","密码修改失败");
            }
        }
        else{
            req.setAttribute("message","新密码设置有问题");
        }

        //无论结果,进行转发
        try {
            req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //super.doPost(req, resp);
    }

关于新密码的长度,已经第二次输入与第一次输入是否一致,使用前端的js进行判断,与后端无关。

1.4验证旧密码(Ajax实现)

除此之外,应当验证旧密码的输入是否正确。本项目中,希望达到实时判断的效果,即每次失去焦点时,都会立即判断当前输入的旧密码是否正确,使用Ajax实现需求。

Ajax再js中编写,以json的形式,get方法,获取data。

oldpassword.on("blur", function () {
        $.ajax({
            type: "GET",
            url: path + "/jsp/user.do",
            data: {method: "pwdmodify", oldpassword: oldpassword.val()}, //ajax传递的参数
            dataType: "json",
            success: function (data) {
                if (data.result == "true") {//旧密码正确
                    validateTip(oldpassword.next(), {"color": "green"}, imgYes, true);
                } else if (data.result == "false") {//旧密码输入不正确
                    validateTip(oldpassword.next(), {"color": "red"}, imgNo + " 原密码输入不正确", false);
                } else if (data.result == "sessionerror") {//当前用户session过期,请重新登录
                    validateTip(oldpassword.next(), {"color": "red"}, imgNo + " 当前用户session过期,请重新登录", false);
                } else if (data.result == "error") {//旧密码输入为空
                    validateTip(oldpassword.next(), {"color": "red"}, imgNo + " 请输入旧密码", false);
                }
            },
            error: function (data) {
                //请求出错
                validateTip(oldpassword.next(), {"color": "red"}, imgNo + " 请求错误", false);
            }
        });

先通过session获取已经登录的用户,使用一个Hashmap储存结果(因为是键值对,后面Ajax使用json形式,也是键值对,方便进行转换),并通过req.getparameter获取用户中的oldpassword,当object为空时,说明session失效了。正常情况下:
读取session用户中存储的密码,与前端输入的密码进行比较,并向hashmap结果集中存储对应的结果。

使用:

JSONArray.toJSONString(resultMap)

将hashmap转化为json格式(需要导入fastalibaba依赖包)。
最后通过流的形式写入。

public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
        Object o=req.getSession().getAttribute(Constant.USER_SESSION);
        String oldpassword = req.getParameter("oldpassword");
        //Map结果集
        Map<String,String> resultMap=new HashMap<String,String>();

        if(o==null){//session失效了
            System.out.println("o==null");
            resultMap.put("result","sessionerror");
        }
        else if(StringUtils.isNullOrEmpty(oldpassword)){//输入的密码为空
            System.out.println("word=null");
            resultMap.put("result","error");
        }
        else{
          
            String userPassword=((User)o).getUserPassword();//读取session中存储的用户密码
            if(oldpassword.equals(userPassword)){
                System.out.println("y");
                resultMap.put("result","true");
            }
            else{
                System.out.println("g");
                resultMap.put("result","false");
            }
        }
        resp.setContentType("application/json");
        PrintWriter writer= null;
        try {
            writer = resp.getWriter();
            //将resultmap转化为json格式,给ajax使用
            //使用ajax验证旧密码,可以达到每次输入完成都会进行检验(js失去焦点事件),而不是点击保存之后才及进行检验
            writer.write(JSONArray.toJSONString(resultMap));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

二.用户管理功能

目标页面:

Java 修改密码设计 java实现修改密码_mvc_02

可以通过输入用户名进行模糊查询,以及角色下拉框选择,实现共同删选记录,同时记录过多时,可以进行翻页。

2.1用户管理Dao层

因为需要分页,所以要获取用户总数。
使用string buffer存储sql,方便进行拼接,因为需要根据输入的用户名和选择的角色类别进行联合查询。
如果输入了username,就将and u.username like ?拼接到sql语句中,注意and前应当有空格。最后将拼接完成的sql语句作为参数,调用BaseDao中的execute查询方法,并使用rs(结果集)的next方法,获得符合条件的条数,并返回。

@Override
    public int getUserCount(Connection connection, String username, int userRole) throws SQLException {
        PreparedStatement pstm=null;
        ResultSet rs=null;
        int count=0;//不使用Integer,包装类可能为空,空指针异常

        if(connection!=null){
            StringBuffer sql=new StringBuffer();
            //连结两表进行查询
            //select count(1) as count from smbms_user u,smbms_role r where u.userRole=r.id
            ArrayList<Object> list= new ArrayList<Object>();
            sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole=r.id");

            if(!StringUtils.isNullOrEmpty(username)){//如果输入的username不为空,就继续拼接一部分参数。
                sql.append(" and u.username like ?");//?为param中的参数
                list.add("%"+username+"%");//用户名模糊查询
            }
            if(userRole>0){
                sql.append(" and u.userRole = ?");
                list.add(userRole);
            }
            Object[] params=list.toArray();

            System.out.println("UserDao->getUserCount->sql:"+sql.toString());//输出完整的sql语句。
            rs = BaseDao.execute(connection,sql.toString(),pstm,rs,params);
            if(rs.next()){
                count=rs.getInt("count");//从结果集中获取最终的数量.
            }
        }
        BaseDao.closeResource(null,pstm,rs);
        return count;
    }

获取用户列表:
与上面类似,依次访问得到的rs(结果集),每次申请一个user对象,获得各种属性,并添加到list中,并返回list。

@Override
    public List<User> getUserList(Connection connection, String username, int userRole, int currentPageNo, int pageSize) throws SQLException {
        PreparedStatement pstm=null;
        ResultSet rs=null;
        List<User> userList=new ArrayList<>();

        System.out.println("UserDaoImpl:getUserList");
        if(connection!=null){

            System.out.println("connection!=null");//
            StringBuffer sql=new StringBuffer();
            List<Object> list=new ArrayList<>();//存放参数
            sql.append("select * from smbms_user u,smbms_role r where u.userRole=r.id");//sql语句
            if(!StringUtils.isNullOrEmpty(username)){
                sql.append(" and u.username like ?");
                list.add("%"+username+"%");
            }
            if(userRole>0){
                sql.append(" and u.userRole = ?");
                list.add(userRole);
            }
            //在数据库中,,分页使用 limit startindex pageSize;例如pageSize=5
            //第1页 对应数据库 01234
            //第2页 对应数据库 56789

            sql.append(" order by u.creationDate DESC limit ?,?");//两个参数
            currentPageNo=(currentPageNo-1)*pageSize;
            list.add(currentPageNo);
            list.add(pageSize);

            Object[] params=list.toArray();
            System.out.println("UserDao->getUserList->sql: "+sql.toString());

            rs=BaseDao.execute(connection,sql.toString(),pstm,rs,params);//在此处抛出异常,到UserServiceImpl的catch中
            System.out.println("调用BaseDao.execute结束");
            while(rs.next()){
                User _user=new User();
                _user.setId(rs.getInt("id"));
                _user.setUserCode(rs.getString("userCode"));
                _user.setUserName(rs.getString("userName"));
                _user.setGender(rs.getInt("gender"));
                _user.setBirthday(rs.getDate("birthday"));
                _user.setPhone(rs.getString("phone"));
                _user.setUserRole(rs.getInt("userRole"));
                //_user.setUserRoleName();
                userList.add(_user);
            }
            BaseDao.closeResource(null,pstm,rs);
        }
        return userList;
    }

2.2用户管理service层

直接调用写好的Dao层即可,connection在service中进行关闭。

//查询记录数
    @Override
    public int getUserCount(String username, int userRole){
        Connection connection=null;
        int count=0;
        try{
            connection=BaseDao.getConnection();
            count=userDao.getUserCount(connection,username,userRole);
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            BaseDao.closeResource(connection,null,null);//connection在service层才关闭.
        }
        return count;
    }
@Override
    public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) {
        Connection connection=null;
        List<User> list=new ArrayList<>();
        try{
            connection=BaseDao.getConnection();
            list=userDao.getUserList(connection,queryUserName,queryUserRole,currentPageNo,pageSize);
        }catch (SQLException e){
            e.printStackTrace();
        }
        finally {
            BaseDao.closeResource(connection,null,null);
        }
        return list;
    }

2.3用户管理servlet层

当前页,总页数,每页的页数,编写了pagesupport工具类进行控制。

public void query(HttpServletRequest req, HttpServletResponse resp){
        //从userlist.jsp中获取数据
        String queryUserName=req.getParameter("queryname");
        String temp=req.getParameter("queryUserRole");
        String pageIndex=req.getParameter("pageIndex");
        int queryUserRole = 0;//role默认是0

        //用户列表
        UserServiceImpl userService=new UserServiceImpl();
        List<User> userList=null;

        int Pagesize=5;//每5条一页
        int currentPageNo=1;//第一次一定是第一页
        if(queryUserName==null){
            queryUserName="";
        }
        if(temp!=null&&!temp.equals("")){
            queryUserRole=Integer.parseInt(temp);//给查询赋值0,1,2,3

        }
        if(pageIndex!=null){
            currentPageNo=Integer.parseInt(pageIndex);
        }
        //获取用户的总数,分页(上一页,下一页)
        int totalCount=userService.getUserCount(queryUserName,queryUserRole);
        //使用pagesupport工具类
        PageSupport pageSupport=new PageSupport();
        pageSupport.setCurrentPageNo(currentPageNo);
        pageSupport.setPageSize(Pagesize);
        pageSupport.setTotalCount(totalCount);
        int totalPageCount = ((int)(totalCount/Pagesize))+1;
        pageSupport.setTotalPageCount(totalPageCount);
        if(currentPageNo<1){
            currentPageNo=1;
        }else if(currentPageNo>totalCount){
            currentPageNo=totalCount;
        }
        //获取用户列表
        userList=userService.getUserList(queryUserName,queryUserRole,currentPageNo,Pagesize);
        req.setAttribute("userList",userList);
        //将userlist传到前端
        //
        RoleServiceImpl roleService= new RoleServiceImpl();

        List<Role> roleList= null;
        try {
            roleList = roleService.getRoleList();
            System.out.println(roleList.toArray()[0]);
            System.out.println("UserServlet:调用service层中的getRoleList成功");
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        req.setAttribute("roleList",roleList);
        req.setAttribute("totalCount",totalCount);
        req.setAttribute("currentPageNo",currentPageNo);
        req.setAttribute("totalPageCount",totalPageCount);

        try {
            req.getRequestDispatcher("userlist.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.4Servlet层的管理

在前端中设置了method属性,req.getParameter获取后即可进行判断,将各个功能的Servlet进行封装,并使用if条件判断是哪种方法,并执行。

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method=req.getParameter("method");
        if(method!=null&&method.equals("savepwd")){
            this.updatePwd(req, resp);
        }
        else if(method!=null&&method.equals("pwdmodify")){
            this.pwdModify(req, resp);
        }
        else if(method!=null&&method.equals("query")){
            this.query(req, resp);
        }
    }