SMBMS项目练习

SMBMS项目练习

超市订单管理系统

项目架构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAKUGIhy-1616469649708)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210308163336705.png)]

项目数据库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubFgrrn7-1616469649710)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210308164142452.png)]

如何创建项目

项目搭建

  1. 搭建一个maven web项目

  2. 配置tomcat

  3. 测试项目是否能跑起来

  4. 导入项目中会遇到的jar包

    • jsp,servlet,mysql驱动,jstl,standard
  5. 创建项目包结构

    1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYaSnDna-1616469649712)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210308165854238.png)]
  6. 编写实体类:

    ORM映射:表——》类

  7. 编写基础公共类

    1. driver=com.mysql.jdbc.Driver
      url=jdbc:mysql://localhost:3306?useUnicode=true$characterEncoding=utf-8
      username=root
      password=123456
      
    2. 编写数据库的公共类

      package com.lv.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 username;
          private static String password;
          private static String url;
          //静态代码块,类加载的时候就初始化了
          static {
              Properties properties = new Properties();
              //通过类加载器读取对应的资源
              InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
              try {
                  properties.load(is);
      
              } catch (IOException e) {
                  e.printStackTrace();
              }
              url=properties.getProperty("url");
              driver=properties.getProperty("driver");
              username=properties.getProperty("username");
              password=properties.getProperty("password");
          }
          //获取数据库连接
          public static Connection getConnection(){
              Connection connection=null;
              try {
                  Class.forName(driver);
                  connection = DriverManager.getConnection(url, username, password);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return connection;
          }
          //编写查询公共类
            public static ResultSet execute(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet,String sql,Object[] params) throws SQLException {
                preparedStatement = connection.prepareStatement(sql);
                for (int i = 0; i < params.length; i++) {
                    //setObject,?占位符从1开始,数组是从0开始的
                    preparedStatement.setObject(i+1,params[i]);
                }
                 resultSet = preparedStatement.executeQuery();
                return resultSet;
            }
      
            //编写增删改公共方法
            public static int execute(Connection connection,PreparedStatement preparedStatement,String sql,Object[] params) throws SQLException {
                preparedStatement = connection.prepareStatement(sql);
                for (int i = 0; i < params.length; i++) {
                    //setObject,?占位符从1开始,数组是从0开始的
                    preparedStatement.setObject(i+1,params[i]);
                }
                int updateRows = preparedStatement.executeUpdate();
                return updateRows;
            }
      
            //释放资源
          public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){
              boolean flag=true;
              if (resultSet!=null){
                  try {
                      resultSet.close();
                      //gc回收
                      resultSet=null;
                  } catch (SQLException throwables) {
                      throwables.printStackTrace();
                      flag=false;
                  }
              }
              if (preparedStatement!=null){
                  try {
                      resultSet.close();
                      //gc回收
                      resultSet=null;
                  } catch (SQLException throwables) {
                      throwables.printStackTrace();
                      flag=false;
                  }
              }
              if (connection!=null){
                  try {
                      resultSet.close();
                      //gc回收
                      resultSet=null;
                  } catch (SQLException throwables) {
                      throwables.printStackTrace();
                      flag=false;
                  }
              }
              return true;
          }
      }
      
      
    3. 编写字符编码过滤器

  8. 导入静态资源

登录功能实现

  1. 编写前端代码

  2. 设置首页

      <welcome-file-list>//设置login.jsp为打开的首页
        <welcome-file>/login.jsp</welcome-file>
      </welcome-file-list>
    
  3. 业务层接口

    package com.lv.service.user;
    
    import com.lv.pojo.User;
    
    public interface UserService {
        //用户登录
        public User login(String userCode,String password);
    }
    
    
    1. 业务层实现

      package com.lv.service.user;
      
      import com.lv.dao.BaseDao;
      import com.lv.dao.user.UserDao;
      import com.lv.dao.user.UserDaoImpl;
      import com.lv.pojo.User;
      import org.junit.Test;
      
      import java.sql.Connection;
      import java.sql.SQLException;
      
      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;
              connection= BaseDao.getConnection();
              try {
                  user = userDao.getLoginUser(connection, userCode);
              } catch (SQLException throwables) {
                  throwables.printStackTrace();
              }finally {
                  BaseDao.closeResource(connection,null,null);
              }
              return user;
          }
          @Test
          public void test(){
              UserServiceImpl userService = new UserServiceImpl();
              User admin = userService.login("admin", "566");
              System.out.println(admin.getUserPassword());
          }
      }
      
      
    2. 编写servlet

      package com.lv.servlet.user;
      
      import com.lv.pojo.User;
      import com.lv.service.user.UserService;
      import com.lv.service.user.UserServiceImpl;
      import com.lv.util.Constants;
      
      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 {
      
          //Servlet:控制层调用业务层
          private UserService userService;
          public LoginServlet(){
              userService=new UserServiceImpl();
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("LoginServlet------start-----");
              String userCode = req.getParameter("userCode");
              String userPassword = req.getParameter("userPassword");
              User user = userService.login(userCode, userPassword);//已经能查询到登录的用户
              if (user != null) {//查询到有这个用户
                  //将用户的信息放入session;
                  req.getSession().setAttribute(Constants.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 {
              doGet(req, resp);
          }
      }
      
    3. 注册

登录功能优化

注销:

package com.lv.servlet.user;

import com.lv.util.Constants;

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 LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().removeAttribute(Constants.USER_SESSION);
        resp.sendRedirect("/login.jsp");
    }

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

登录拦截优化:实现在还没登录的情况下不能进入系统和其他的操作页面

package com.lv.filter;

import com.lv.util.Constants;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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 req1=(HttpServletRequest)req;
        HttpServletResponse resp1=(HttpServletResponse)resp;
        Object attribute = req1.getSession().getAttribute(Constants.USER_SESSION);
        if (attribute==null){
            resp1.sendRedirect("/error.jsp");
        }
        chain.doFilter(req,resp);

    }

    @Override
    public void destroy() {

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

密码修改

写项目从底层向上写

  1. UserDao接口

    //修改当前用户密码
        public  int  updateUserPassword(Connection connection,int id,String password)throws SQLException;
    
  2. UserDaoImpl接口实现类

    //修改当前用户的密码
        @Override
        public int updateUserPassword(Connection connection, int id, String password) throws SQLException {
            PreparedStatement preparedStatement=null;
            String sql="update smbms_user set userPassword=?where id=?";
            Object[] params={password,id};
            int execute = 0;
            if (connection!=null){
                execute = BaseDao.execute(connection, preparedStatement, sql, params);
                BaseDao.closeResource(null,preparedStatement,null);
            }
            return execute;
        }
    
  3. UserService接口层;

    //修改当前用户密码
        public  boolean  updateUserPassword(int id, String pwd);
    
  4. UserService接口层实现类

    //修改密码成功返回true,否则返回false
        @Override
        public boolean updateUserPassword(int id, String pwd) {
            Connection connection=null;
            User user=null;
            boolean flag=false;
            try {
                connection=BaseDao.getConnection();
                //判断是否成功
                if (userDao.updatePwd(connection,id,pwd)>0){
                    flag=true;
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                BaseDao.closeResource(connection,null,null);
            }
            return flag;
        }
    

    5.Servlet

    \package com.lv.servlet.user;
    
    import com.lv.pojo.User;
    import com.lv.service.user.UserService;
    import com.lv.service.user.UserServiceImpl;
    import com.lv.util.Constants;
    import com.mysql.jdbc.StringUtils;
    
    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 UserServlet extends HttpServlet {
        private UserService userService;
        public UserServlet(){
            userService=new UserServiceImpl();
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //从session里拿id
            boolean flag=false;
            Object attribute = req.getSession().getAttribute(Constants.USER_SESSION);
            String newpassword = req.getParameter("newpassword");
            User user=(User)attribute;
            System.out.println(user.getUserCode());
            System.out.println(user.getUserPassword());
            Integer id = user.getId();
            System.out.println("id为"+id);
            System.out.println("这是"+attribute);
            System.out.println(newpassword);
            System.out.println(!StringUtils.isNullOrEmpty(newpassword)+"!StringUtils.isNullOrEmpty(newpassword) 不为空");
            System.out.println("id不等于空"+id!=null);
    
            if (id!=null&&!(StringUtils.isNullOrEmpty(newpassword))){
                flag = userService.updateUserPassword(id,newpassword);
                System.out.println("进入了");
                System.out.println("flag="+flag);
                if (flag){
                req.setAttribute("message","密码修改成功,请退出使用新密码登录");
                //当密码修改成功后需要移除session
                req.getSession().removeAttribute(Constants.USER_SESSION);
                }else {
                    req.setAttribute("message","密码修改失败,请重新修改");
                    }
            }else {
                req.setAttribute("message","您的新密码设置不符合规范");
            }
            req.getRequestDispatcher("/jsp/pwdmodify.jsp").forward(req,resp);
        }
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    

servlet复用

需要提取doget的内容成一个方法,然后丢入req,resp,的参数然后在doget里调用方法,为了程序的安全性,还需要添加一些判断

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

优化密码修改使用Ajax

public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
        Object o = req.getSession().getAttribute(Constants.USER_SESSION);
        String oldpassword=req.getParameter("oldpassword");

        //使用Map存放错误信息  一切的东西都可以用Map
        Map<String, String> resultHashMap = new HashMap<String, String>();
        if (o==null){//网站session过期了 真实业务有的需求
            resultHashMap.put("result","sessionerror");
        }else if (StringUtils.isNullOrEmpty(oldpassword)){//输入密码为空
            resultHashMap.put("result","error");
        }else {
            boolean equals = ((User) o).getUserPassword().equals(oldpassword);//session中的密码和填入的旧密码验证是否相同
            if (equals){
                resultHashMap.put("result","true");
            }else {
                resultHashMap.put("result","false");
            }
        }

        try {
            resp.setContentType("application/json");
            PrintWriter writer = resp.getWriter();
            //JSONArray阿里巴巴的json工具类,转换格式
            writer.write(JSONArray.toJSONString(resultHashMap));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

用户管理实现

导入分页的工具类

用户列表页面的导入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vv39TzCe-1616469649714)(SMBMS项目练习.assets/image-20210311170918310.png)]

分成三条线路来解决

1、获取用户数量
  1. UserDao

        //查询用户总数
        public int getUserCount(Connection connection,String userCode,int userRole)throws SQLException;
    
  2. UserDaoImpl

    //根据用户用或者角色查询总数
        @Override
        public int getUserCount(Connection connection, String userCode, int userRole) throws SQLException {
            PreparedStatement preparedStatement=null;
            ResultSet resultSet=null;
            ArrayList<Object> list = new ArrayList<Object>();
            int count=0;
            if (connection!=null){
                StringBuffer sql = new StringBuffer();
                sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");
    
                if (!StringUtils.isNullOrEmpty(userCode)){
                    sql.append(" and u.userCode like?");
                    list.add("%"+userCode+"%");
                }
                if (userRole>0){
                    sql.append(" and u.userRole = ?");
                    list.add(userRole);
                }
                Object[] params = list.toArray();
                resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params);
                if (resultSet.next()){
                    count = resultSet.getInt("count");//从结果集中获取最终的数量
                }
                System.out.println("完整的"+sql);
                BaseDao.closeResource(null,preparedStatement,resultSet);
            }
    
            return count;
        }
    
  3. UserService

        //查询出用户的计数
        public int getUserCount(String userName,int userRole);
    
  4. UserServiceImpl

    //查询记录的数量
        @Override
        public int getUserCount(String userName, int userRole) {
            Connection connection=null;
            connection = BaseDao.getConnection();
            int userCount=0;
            try {
                userCount = userDao.getUserCount(connection, userName, userRole);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                BaseDao.closeResource(connection,null,null);
            }
            return userCount;
        }
    
2.获取用户列表
  1. UserDao

     //通过条件查询获取用户列表得到userList
        public List<User> getUserList(Connection connection,String userName,int userRole,int currentPageNo,int PageSize) throws SQLException;
    
    
  2. UserDaoImpl

    /获取用户列表
        @Override
        public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws SQLException {
            PreparedStatement preparedStatement=null;
            List<User> userList=null;
            ResultSet resultSet=null;
            List<Object> objects = new ArrayList<Object>();
            if (connection!=null){
                StringBuffer sql = new StringBuffer();
                sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole =r.id");
                if (userName!=null){
                    sql.append(" and userCode like ?");
                    objects.add("%"+userName+"%");
                }
                if (userRole>0){
                    sql.append(" and userRole = ?");
                    objects.add(userRole);
                }
                // order by排序 DESC降序  limit ?,? 展示从?开始的?个数据之后开始分页
                sql.append(" order by creationDate DESC limit ?,?");
                currentPageNo=(currentPageNo-1)*pageSize;
                objects.add(currentPageNo);
                objects.add(pageSize);
    
                Object[] params = objects.toArray();
    
                    ResultSet execute = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params);
                    while (execute.next()){
                        User _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"));
                        userList.add(_user);
                    }
    
                    BaseDao.closeResource(null,preparedStatement,resultSet);
    
                System.out.println(sql.toString());
    
            }
            return userList;
        }
    
  3. UserService

        //更具条件查询用户列表
        public List<User> getUserList(String userName,int userRole,int currentPageNo,int PageSize);
    
  4. UserServiceImpl

    //查询用户列表
        @Override
        public List<User> getUserList(String userName, int userRole, int currentPageNo, int PageSize) {
            Connection connection =null;
            List<User> userList=null;
            try {
                connection=BaseDao.getConnection();
                userList = userDao.getUserList(connection, userName, userRole, currentPageNo, PageSize);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                BaseDao.closeResource(connection,null,null);
            }
            return userList;
        }
    
3、获取校色操作

为了职责统一,把角色放在单独的包下,和POJO类对应,记得 service在调用Dao层的时候 静态的引入、

1.
        //获取角色列表
    public List<Role> getRoleList(Connection connection)throws SQLException;
2.
     @Override
    public List<Role> getRoleList(Connection connection) throws SQLException {
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        Object[] params=null;
        ArrayList<Role> roleList = new ArrayList<Role>();
        if (connection!=null){
            String sql="select * from smbms_role";
            resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql, params);
            while (resultSet.next()){
                Role role = new Role();
                role.setId(resultSet.getInt("id"));
                role.setId(resultSet.getInt("roleCode"));
                role.setId(resultSet.getInt("roleName"));
                roleList.add(role);
            }
            BaseDao.closeResource(null,preparedStatement,resultSet);
        }

        return roleList;
    }
3.
     //查询角色列表
    public List<Role> getRoleList();
4.
    public class RoleServiceImpl implements RoleService {
    private RoleDao roleDao;
    public  RoleServiceImpl(){
        roleDao=new RoleDaoImpl();
    }
    //获取角色列表
    @Override
    public List<Role> getRoleList() {
        Connection connection=null;
        connection= BaseDao.getConnection();
        List<Role> roleList=null;
        try {
            roleList = roleDao.getRoleList(connection);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            BaseDao.closeResource(connection,null,null);
        }
        return roleList;
    }
}

UserServlet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值