SMBMS

SMBMS

项目搭建准备工作

  1. 搭建一个maven,web工程

  2. 配置tomcat

  3. 测试项目能不能跑起来

  4. 导入jar包

    jsp,servlet,mysql驱动,jstl,stand…

  5. 创建项目包结构

在这里插入图片描述

  1. 编写实体类

    ORM映射:表-类映射

  2. 编写基础公共类

    1. 数据库配置文件

      driver=com.mysql.jdbc.Driver
      url=jdbc:mysql://localhost:3306/ssmbuild?useUnicode=true&characterEncoding=utf8
      username=root
      password=root
      
    2. 编写数据库的公共类

      package com.kuang.dao;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.sql.*;
      import java.util.Properties;
      
      //操作数据库的公共类
      public class BaseDao{
          private static String driver;
          private static String url;
          private static String username;
          private static String password;
          //静态代码块,类加载的时候就初始化了
          static {
              //通过类加载器读取对应的资源
              Properties properties = new Properties();
              InputStream is =BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
              try {
                  properties.load(is);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              driver = properties.getProperty("driver");
              url = properties.getProperty("url");
              username = properties.getProperty("username");
              password = properties.getProperty("password");
          }
          //获取数据库的连接
          public static Connection getConnection() throws Exception{
              Class.forName(driver);
              Connection connection = DriverManager.getConnection(url, username, password);
              return connection;
          }
          //编写查询公共类
          public static ResultSet execute(Connection connection, String sql,Object[] params, ResultSet rs, PreparedStatement preparedStatement)throws Exception{
              preparedStatement = connection.prepareStatement(sql);
              for (int i = 0; i <params.length; i++) {
                  //setObject,占位符从1开始,但是我们的数组从0开始
                  preparedStatement.setObject(i+1,params[i]);
              }
              rs = preparedStatement.executeQuery();
              return rs;
          }
          //编写增删改公共类
          public static int execute(Connection connection, String sql,Object[] params, PreparedStatement preparedStatement)throws Exception{
              preparedStatement = connection.prepareStatement(sql);
              for (int i = 0; i <params.length; i++) {
                  //setObject,占位符从1开始,但是我们的数组从0开始
                  preparedStatement.setObject(i+1,params[i]);
              }
              int update = preparedStatement.executeUpdate();
              return update;
          }
          public static void closeResourc(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) throws SQLException {
      
              if (resultSet!=null&&preparedStatement!=null&&connection!=null){
                  resultSet.close();
                  preparedStatement.close();
                  connection.close();
              }
          }
      }
      
    3. 编写字符编码过滤器

      package com.kuang.filter;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      public class CharacterEncodingFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
      
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              servletRequest.setCharacterEncoding("utf-8");
              servletResponse.setCharacterEncoding("utf-8");
              filterChain.doFilter(servletRequest,servletResponse);
          }
      
          @Override
          public void destroy() {
      
          }
      }
      

      记得在web.xml中形成映射

  3. 导入静态资源

在这里插入图片描述

登录功能实现

  1. 编写前端页面

  2. 设置首页

        <welcome-file-list>
            <welcome-file>login.jsp</welcome-file>
        </welcome-file-list>
    
  3. 编写dao层用户登录的接口

    public interface UserDao {
        public User getLoginUser(Connection connection,String userCode) throws Exception;
    }
    
  4. 编写dao层用户登录的实现类

    package com.kuang.dao.User;
    
    import com.kuang.dao.BaseDao;
    import com.kuang.pojo.User;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public class UserDaoImpl implements UserDao{
        @Override
        public User getLoginUser(Connection connection, String userCode) throws Exception{
            PreparedStatement preparedStatement =null;
            ResultSet resultSet=null;
            User user=null;
            String sql = "select * from smbms_user where userCode = ?";
            Object[] params={userCode};
            resultSet=BaseDao.execute(connection,sql,params,resultSet,preparedStatement);
            if (resultSet.next()){
                user=new User();
                user.setId((resultSet.getInt("id")));
                user.setUserCode(resultSet.getString("userCode"));
                user.setUserName(resultSet.getString("userName"));
                user.setUserPassword(resultSet.getString("userPassword"));
                user.setGender(resultSet.getInt("gender"));
                user.setBirthday(resultSet.getDate("birthday"));
                user.setPhone(resultSet.getString("phone"));
                user.setAddress(resultSet.getString("address"));
                user.setUserRole(resultSet.getInt("userRole"));
                user.setCreatedBy(resultSet.getInt("createdBy"));
                user.setCreationDate(resultSet.getTimestamp("creationDate"));
                user.setModifyBy(resultSet.getInt("modifyBy"));
                user.setModifyDate(resultSet.getTimestamp("modifyDate"));
            }
            BaseDao.closeResourc(connection,preparedStatement,resultSet);
            return user;
        }
    }
    
  5. 业务层接口

    //用户登录
    public User login(String userCode,String password);
    
  6. 业务层实现类

    package com.kuang.service.user;
    
    import com.kuang.dao.BaseDao;
    import com.kuang.dao.User.UserDao;
    import com.kuang.dao.User.UserDaoImpl;
    import com.kuang.pojo.User;
    import org.junit.Test;
    
    import java.sql.Connection;
    
    public class UserServiceImpl implements UserService{
        //业务层都会调用dao层,所以我们要引入dao层
        private UserDao userDao;
        public UserServiceImpl(){
            userDao=new UserDaoImpl();
        }
        @Override
        public User login(String userCode, String password) {
            Connection connection=null;
            User user =null;
            try {
                connection= BaseDao.getConnection();
                //通过业务层调用对应的具体的数据库操作
                user =userDao.getLoginUser(connection,userCode);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return user;
        }
        @Test
        public void test(){
            UserServiceImpl userService = new UserServiceImpl();
            User admin = userService.login("admin", "12");
            System.out.println(admin.getUserPassword());
        }
    }
    
  7. 编写servlet

    package com.kuang.servlet.user;
    
    import com.kuang.pojo.User;
    import com.kuang.service.user.UserServiceImpl;
    import com.kuang.util.Constansts;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginServlet extends HttpServlet {
        //控制层,调用业务层代码
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Jin");
            //获取用户名的代码
            String userCode = req.getParameter("userCode");
            String userPassword = req.getParameter("userPassword");
            //和数据库中的密码进行对比,调用业务层;
            UserServiceImpl userService = new UserServiceImpl();
            User user = userService.login(userCode, userPassword);//这里已经把登录的人查出来了
            if (user!=null){//将用户的信息放到session中
                req.getSession().setAttribute(Constansts.USER_SESSION,user);
                //跳转到主页
                resp.sendRedirect("jsp/frame.jsp");
            }
            else {//查无此人,无法登录,转发回登录页面,顺带提示它,用户名或者密码错误
                req.setAttribute("error","用户名或者密码不正确");
                req.getRequestDispatcher("login.jsp").forward(req,resp);
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    }
    
    
  8. 注册servlet

        <servlet>
            <servlet-name>LoginServlet</servlet-name>
            <servlet-class>com.kuang.servlet.user.LoginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>LoginServlet</servlet-name>
            <url-pattern>/login.do</url-pattern>
        </servlet-mapping>
    
  9. 测试访问,确保以上功能成功

优化登录功能

注销功能:

思路:移除Session,返回登录页面

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //移除用户的Constants.USER_SESSION
        req.getSession().removeAttribute(Constansts.USER_SESSION);
        resp.sendRedirect("/login.jsp");//返回登录页面
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册xml

<servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.kuang.servlet.user.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/jsp/logout.do</url-pattern>
    </servlet-mapping>

登录拦截优化

编写一个过滤器,并注册

public class SysFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain Chain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        User user= (User)request.getSession().getAttribute(Constansts.USER_SESSION);
        if (user==null){//已经被移除或者注销了,或者未登录
            response.sendRedirect("/error.jsp");
        }
        else{
            Chain.doFilter(req,resp);
        }
    }

    @Override
    public void destroy() {

    }
}
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.kuang.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/jsp/*</url-pattern>
    </filter-mapping>

在这里插入图片描述

密码修改

  1. 导入前端素材

  2. 写项目,建议从底层往上写

在这里插入图片描述

  1. UserDao接口

    public int updatePwd(Connection connection,int id,int password) throws Exception;
    
  2. UserDao接口实现类

        public int updatePwd(Connection connection, int id, int password) throws Exception {
            PreparedStatement pstm = null;
            String sql="update smbms_user set userPassword = ? where id=?";
            Object[] params={password,id};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            return execute;
        }
    
  3. UserService

    public boolean updatePwd( int id, int password);
    
  4. UserService实现类

        @Override
        public boolean updatePwd(int id, int 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();
            }
            return flag;
        }
    
  5. Servlet记得实现复用,需要提取出方法

        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);
            }
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
        public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
            //从Session里面拿ID
            User user = (User)req.getSession().getAttribute(Constansts.USER_SESSION);
            String newpassword = req.getParameter("newpassword");
            boolean flag = false;
            //判断user是否为空,newpassword是否为空
            if (user!=null&& !StringUtils.isNullOrEmpty(newpassword)){
                UserServiceImpl userService = new UserServiceImpl();
                flag=userService.updatePwd(user.getId(),newpassword);
                if (flag){
                    req.setAttribute("message","修改密码成功,请退出,使用新密码登录");
                    //密码修改成功,移除当前session
                    req.getSession().removeAttribute(Constansts.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();
            }
    
        }
    
  6. 测试

优化密码修改用Ajax

  1. 阿里巴巴的fastjson

      <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.58</version>
            </dependency>
    
  2. 后台代码修改

    public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
            //从Session里面拿ID
            User user = (User)req.getSession().getAttribute(Constansts.USER_SESSION);
            String newpassword = req.getParameter("newpassword");
            boolean flag = false;
            //判断user是否为空,newpassword是否为空
            if (user!=null&& !StringUtils.isNullOrEmpty(newpassword)){
                UserServiceImpl userService = new UserServiceImpl();
                flag=userService.updatePwd(user.getId(),newpassword);
                if (flag){
                    req.setAttribute("message","修改密码成功,请退出,使用新密码登录");
                    //密码修改成功,移除当前session
                    req.getSession().removeAttribute(Constansts.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();
            }
    
        }
    
  3. 测试

用户管理实现

思路:

在这里插入图片描述

  1. 导入分页的工具类

  2. 用户列表页面导入

    userlist.jsp

1.获取用户数量

  1. UserDao

    public int getUserCount(Connection connection,String username,int userRole) throws Exception;
    
  2. UserDaoImpl

     @Override
        public int getUserCount(Connection connection, String username, int userRole) throws Exception {
            PreparedStatement pstm=null;
            ResultSet rs=null;
            int count = 0;
            StringBuffer sql = new StringBuffer();
            sql.append("SELECT COUNT(1) AS COUNT FROM smbms_user u,smbms_role r WHERE u.`userRole`=r.`id`");
            ArrayList<Object> list = new ArrayList<>();//存放我们的参数
            if (!StringUtils.isNullOrEmpty(username)){
                sql.append("add u.username like ?");
                list.add("%"+username+"%");//index:0
            }if (userRole>0){ //where trim mybatis
                sql.append("and u.userRole =?");
                list.add(userRole);//index:1
            }
            //怎么把list转化为数组
            Object[] params = list.toArray();
            rs = BaseDao.execute(connection, sql.toString(), params, rs, pstm);
            if (rs.next()){
                count=rs.getInt("count");//从结果集中获取最终的数量
            }
            return count;
        }
    
  3. UserService

    public int getUserCount(String username,int userRole);
    
  4. UserServiceImpl

        @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 (Exception e) {
                e.printStackTrace();
            }
            return count;
        }
    

2.获取用户列表

  1. userdao
  2. userdaoImpl
  3. userService
  4. userServiceImpl

3.获取角色操作

为了我们职责统一,可以把角色的操作单独放在一个包中,和POJO类对应

  1. roledao…与上面等同

4.用户显示的Servlet

  1. 获取用户前端的数据(查询)
  2. 判断请求是否需要执行,看参数的值判断
  3. 为了实现分页,需要计算出当前页面和总页面,页面大小
  4. 用户列表展示
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>