SMBMS

SMBMS(Supermarket Billing Management System )

1. 项目架构

graph LR id1[SMBMS] id2[登录注销] id3[用户管理] id4[订单管理] id5[供应商管理] id6[增] id7[删] id8[改] id9[查] id10[ ] id11[数据库] id1 --> id2 id1 --> id3 id1 --> id4 id1 --> id5 id10 --> id6 id10 --> id7 id10 --> id8 id10 --> id9 id3 --> id10 id4 --> id10 id5 --> id10 id6 --> id11 id7 --> id11 id8 --> id11 id9 --> id11

2. 项目搭建的准备工作

  1. 搭建一个Maven Web项目

  2. 配置Tomcat

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

  4. 导入项目中需要用到的Jar包:jsp,Servlet,mysql驱动,jstl,standard

  5. 创建项目包结构

  6. 编写实体类

    ORM映射:表 -- 类映射

  7. 编写基础公共类

    1. 数据库配置文件(db.properties)
    driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
    username = root
    password = 123456
    
    1. 编写数据库公共类
    package com.wang.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();
            //通过类加载器读取对应的资源
            //由于getResourceAsStream中调用了private方法,此处必须用反射来读配置文件
            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() {
            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,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {
            //预编译的sql,在后面直接执行就可以了,不用传参
            preparedStatement = connection.prepareStatement(sql);
    
            //给预编译的sql传参数
            for (int i = 0; i < params.length; i++) {
                //setObject方法,占位符从1开始,但是我们的数组是从0开始的,因此下面写 i+1
                preparedStatement.setObject(i + 1,params[i]);
            }
    
            resultSet = preparedStatement.executeQuery();
            return resultSet;
        }
    
        //编写增删改公共方法
        public static int execute(Connection connection,PreparedStatement preparedStatement) throws SQLException {
            preparedStatement = connection.prepareStatement(sql);
    
            //给预编译的sql传参数
            for (int i = 0; i < params.length; i++) {
                //setObject方法,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 e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
    
            if (preparedStatement != null){
                try {
                    preparedStatement.close();
                    //GC回收
                    preparedStatement = null;
                } catch (SQLException e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
    
            if (connection != null){
                try {
                    connection.close();
                    //GC回收
                    connection = null;
                } catch (SQLException e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
            
            return flag;
        }
    
    }
    
    1. 编写字符编码过滤器并注册
    package com.wang.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 request,ServletResponse response,FilterChain chain) throws IOException,ServletException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
    
            chain.doFilter(request,response);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    <!--字符编码过滤器-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.wang.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <!--所有的url都会被过滤-->
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  8. 导入静态资源

3. 登陆功能实现

graph LR id1[用户] id2[登录界面<br>用户名<br>密码] id3[判断是否登陆成功] id4[失败] id5[成功] id6[后台首页] id7[数据库] id8[Dao] id1 --> id2 id2 --login.dao--> id3 id3 --> id4 id4 --提示登录失败--> id2 id3 --> id5 id5 --跳转到后台首页--> id6 id6 --> id1 id3 --> id8 id8 --> id3 id7 --> id8 id8 --> id7

1. 编写前端页面

2. 设置首页

<!--设置欢迎页面-->
<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>

3. 编写Dao层,用户登录的接口

package com.wang.dao.user;

import com.wang.pojo.User;

import java.sql.Connection;
import java.sql.SQLException;

public interface UserDao {

    //得到登录的用户
    public User getLoginUser(Connection connection,String userCode) throws SQLException;

}

4. 编写Dao接口的实现类

package com.wang.dao.user;

import com.wang.dao.BaseDao;
import com.wang.pojo.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDaoImpl implements UserDao {
    @Override
    public User getLoginUser(Connection connection,String userCode) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        User user = null;

        if (connection != null) {
            String sql = "select * from smbms_user where userCode = ?";
            Object[] params = {userCode};

           rs = BaseDao.execute(connection,sql,params,rs,pstm);

           if (rs.next()) {
               user = new User();
               user.setId(rs.getInt("id"));
               user.setUserCode(rs.getString("userCode"));
               user.setUserName(rs.getString("userName"));
               user.setUserPassword(rs.getString("userPassword"));
               user.setGender(rs.getInt("gender"));
               user.setBirthday(rs.getDate("birthday"));
               user.setPhone(rs.getString("phone"));
               user.setAddress(rs.getString("address"));
               user.setUserRole(rs.getInt("userRole"));
               user.setCreatedBy(rs.getInt("createdBy"));
               user.setCreationDate(rs.getTimestamp("creationDate"));
               user.setModifyBy(rs.getInt("modifyBy"));
               user.setModifyDate(rs.getTimestamp("modifyDate"));
           }
           BaseDao.closeResource(null,pstm,rs);

        }

        return user;

    }
}

5. 业务层接口

package com.wang.service.user;

import com.wang.pojo.User;

public interface UserService {

    //用户登录
    public User login(String userCode,String password);

}

6. 业务层实现

package com.wang.service.user;

import com.wang.dao.BaseDao;
import com.wang.dao.user.UserDao;
import com.wang.dao.user.UserDaoImpl;
import com.wang.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;

        try {
            connection = BaseDao.getConnection();
            //通过业务层调用对应的具体的数据库操作
            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","1234567");
        System.out.println(admin.getUserPassword());
    }

}

7. 编写Servlet

package com.wang.servlet.user;

import com.wang.pojo.User;
import com.wang.service.user.UserServiceImpl;
import com.wang.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:控制层,调用业务层代码
    @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");

        //和数据库中的密码进行对比,调用业务层
        UserServiceImpl userService = new UserServiceImpl();
        //这里已经把登录的人给查出来了
        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,IOException {
        doGet(req,resp);
    }
}

8. 注册Servlet

<!--Servlet-->
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.wang.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
</servlet-mapping>

9. 测试访问,确保以上功能都能实现

4. 登录功能优化

注销功能:

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

package com.wang.servlet.user;

import com.wang.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,IOException {
        //移除用户的Session
        req.getSession().removeAttribute(Constants.USER_SESSION);
        //返回登录页面
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req,resp);
    }
}

注册xml

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

登录拦截优化

编写过滤器并注册

package com.wang.filter;

import com.wang.pojo.User;
import com.wang.util.Constants;

import javax.servlet.*;

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,ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //过滤器,从session中获取用户
        User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);

        //已经被移除或者被注销了,或者未登录
        if (user == null) {
            response.sendRedirect("/smbms/error.jsp");
        }else {
            chain.doFilter(req,resp);
        }
    }

    @Override
    public void destroy() {

    }
}
<!--用户登录过滤器-->
<filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>com.wang.filter.SysFilter</filter-class>
</filter>
<!--所有的访问jsp目录下的资源都会被过滤-->
<filter-mapping>
    <filter-name>SysFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
</filter-mapping>

5. 密码修改

1. 导入前端素材

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

3. UserDao接口

//修改当前用户的密码
public int updatePwd(Connection connection,int id,int password) throws SQLException;

4. UserDao实现类

//修改当前用户的密码,返回受影响的行数
@Override
public int updatePwd(Connection connection,int password) throws SQLException {

    PreparedStatement pstm = null;
    int execute = 0;

    if (connection != null) {
        String sql = "update smbms_user set userPassword = ? where id = ?";
        Object params[] = {password,id};
        execute = BaseDao.execute(connection,pstm);
        BaseDao.closeResource(null,null);
    }

    return execute;

}

5. UserService接口

//根据用户ID修改密码
public boolean updatePwd(int id,int pwd);

6. UserService实现类

@Override
public boolean updatePwd(int id,int pwd) {
    Connection connection = 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);
    }
    return flag;
}

7. 记得实现复用,需要提取出方法!

package com.wang.servlet.user;

import com.mysql.jdbc.StringUtils;
import com.wang.pojo.User;
import com.wang.service.user.UserService;
import com.wang.service.user.UserServiceImpl;
import com.wang.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;

//实现Servlet服用
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req,IOException {
        String method = req.getParameter("method");
        if (method.equals("savepwd") && method != null) {
            this.updatePwd(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req,resp);
    }

    public void updatePwd(HttpServletRequest req,HttpServletResponse resp) {
        //从Session里面拿ID
        Object o = req.getSession().getAttribute(Constants.USER_SESSION);
        String newpassword = req.getParameter("newpassword");

        boolean flag = false;

        if (o != null && !StringUtils.isNullOrEmpty(newpassword)) {
            UserService userService = new UserServiceImpl();
            flag = userService.updatePwd(((User) o).getId(),newpassword);
            if (flag) {
                req.setAttribute("message","修改密码成功,请退出,使用新密码登录");
                //密码修改成功,移除当前Session
                req.getSession().removeAttribute(Constants.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();
        }
    }
}

8. 注册Servlet

<servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.wang.servlet.user.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>

6. 优化密码修改:使用AJAX

1. 引入阿里巴巴的fastjson

2. 后台代码修改

//验证旧密码,session中有用户的密码
public void pwdModify(HttpServletRequest req,HttpServletResponse resp) {
    //从Session里面拿ID
    Object o = req.getSession().getAttribute(Constants.USER_SESSION);
    String oldpassword = req.getParameter("oldpassword");

    //万能的map: 结果集
    Map<String,String> resultMap = new HashMap<>();

    if (o == null) {
        //Session失效了,Session过期了
        resultMap.put("result","sessionerror");
    } else if (StringUtils.isNullOrEmpty(oldpassword)) {
        resultMap.put("result","error");
    } else  {
        //Session用户的密码
        String userPassword = ((User) o).getUserPassword();
        if (oldpassword.equals(userPassword)) {
            resultMap.put("result","true");
        } else {
            resultMap.put("result","false");
        }
    }

    try {
        //限定响应返回的格式为json
        resp.setContentType("application/json");
        PrintWriter writer = resp.getWriter();
        //JSONArray 阿里巴巴的JSON工具类转换格式
        /*
        把resultMap转为JSON格式
         */
        writer.write(JSONArray.toJSONString(resultMap));
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

7. 用户管理实现

1. 思路

graph LR id1[用户] id2[Servlet<br>1.处理请求<br>2.调用业务<br>3.返回页面] id3[用户列表] id4[角色列表] id5[分页<br>pageSize&#40固定的&#41<br>总数&#40从数据库里查&#41] id6[Service] id7[Dao] id8[数据库] id1 --发起请求--> id2 id2 --返回前端页面--> id1 id2 --> id3 id2 --> id4 id2 --> id5 id3 --> id6 id4 --> id6 id5 --> id6 id6 --> id7 id7 --> id8

2. 导入分页的工具类

3. 用户列表页导入

  1. userlist.jsp
  2. rollpage.jsp

4. 获取用户数量

  1. UserDao
//根据用户名或者角色查询用户总数
public int getUserCount(Connection connection,String username,int userRole) throws SQLException;
  1. UserDaoImpl
//根据用户名或者角色查询用户总数
@Override
public int getUserCount(Connection connection,int userRole) throws SQLException {

    PreparedStatement pstm = null;
    ResultSet rs = null;
    int count = 0;

    if (connection != null) {
        StringBuffer sql = new StringBuffer();
        sql.append("select count(1) as count from smbms_user as u,smbms_role as r where u.userRole = r.id");
        //存放我们的参数
        ArrayList<Object> list = new ArrayList<>();

        if (!StringUtils.isNullOrEmpty(username)) {
            sql.append(" and u.userName like ?");
            list.add("%" + username + "%");     //index = 0
        }

        if (userRole > 0) {
            sql.append(" and u.userRole like ?");
            list.add(userRole);     //index = 1
        }

        //把list转为数组
        Object[] objects = list.toArray();

        rs = BaseDao.execute(connection,sql.toString(),objects,pstm);

        if (rs.next()) {
            //从结果集中获得最终的结果
            count = rs.getInt("count");
        }

        BaseDao.closeResource(null,rs);

    }

    return count;
}
  1. UserService
//查询记录数
public int getUserCount(String username,int userRole);
  1. UserServiceImpl
//查询记录数
@Override
public int getUserCount(String username,int userRole) {

    Connection connection = null;
    int userCount = 0;

    try {
        connection = BaseDao.getConnection();
        userCount = userDao.getUserCount(connection,userRole);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        BaseDao.closeResource(connection,null);
    }

    return userCount;
}

5. 获取用户列表

  1. UserDao
//通过条件查询-userlist
public List<User> getUserList(Connection connection,String userName,int userRole,int currentPageNo,int pageSize) throws SQLException;
  1. UserDaoImpl
//通过条件查询-userlist
@Override
public List<User> getUserList(Connection connection,int pageSize) throws SQLException {

    PreparedStatement pstm = null;
    ResultSet rs = null;
    ArrayList<User> userList = new ArrayList<>();

    if (connection != null) {
        StringBuffer sql = new StringBuffer();
        sql.append("select u.*,r.roleName userRoleName from smbms_user as u join smbms_role as r on u.userRole = r.id");
        //存放我们的参数
        ArrayList<Object> list = new ArrayList<>();

        if (!StringUtils.isNullOrEmpty(userName)) {
            sql.append(" and u.userName like ?");
            list.add("%" + userName + "%");     //index = 0
        }

        if (userRole > 0) {
            sql.append(" and u.userRole like ?");
            list.add(userRole);     //index = 1
        }

        //在数据库中,分页使用limit   startIndex,pageSize;   总数
        //0,5
        //6,5
        //(当前页-1)*页面大小

        sql.append("order by creationDate desc limit ?,?");
        currentPageNo = (currentPageNo - 1) * pageSize;
        list.add(currentPageNo);
        list.add(pageSize);

        Object[] params = list.toArray();
        rs = BaseDao.execute(connection,pstm);
        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(rs.getString("userRoleName"));
            userList.add(_user);
        }
        BaseDao.closeResource(null,rs);

    }
    return userList;
}
  1. UserService
//根据条件查询用户列表
public List<User> getUserList(String queryUserName,int queryUserRole,int pageSize);
  1. UserServiceImpl
//根据条件查询用户列表
@Override
public List<User> getUserList(String queryUserName,int pageSize) {
    Connection connection = null;
    List<User> userList = null;

    try {
        connection = BaseDao.getConnection();
        userList = userDao.getUserList(connection,queryUserName,queryUserRole,currentPageNo,pageSize);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        BaseDao.closeResource(connection,null);
    }

    return userList;

}

6. 获取角色操作

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

RoleDao

public interface RoleDao {
    //获取角色列表
    public List<Role> getRoleList(Connection connection) throws SQLException;
}

RoleDaoImpl

package com.wang.dao.role;

import com.wang.dao.BaseDao;
import com.wang.pojo.Role;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class RoleDaoImpl implements RoleDao{
    //获取角色列表
    @Override
    public List<Role> getRoleList(Connection connection) throws SQLException {

        PreparedStatement pstm = null;
        ResultSet rs = null;
        List<Role> roleList = null;

        if (connection != null) {
            String sql = "select * from smbms_role";
            Object[] params = null;
            rs = BaseDao.execute(connection,pstm);

            while (rs.next()) {
                Role _role = new Role();
                _role.setId(rs.getInt("id"));
                _role.setRoleName(rs.getString("roleName"));
                _role.setRoleCode(rs.getString("roleCode"));
                roleList.add(_role);
            }
            BaseDao.closeResource(null,rs);
        }
        return roleList;
    }
}

RoleService

package com.wang.service.role;

import com.wang.pojo.Role;

import java.util.List;

public interface RoleService {
    //获取角色列表
    public List<Role> getRoleList();
}

RoleServiceImpl

package com.wang.service.role;

import com.wang.dao.BaseDao;
import com.wang.dao.role.RoleDao;
import com.wang.dao.role.RoleDaoImpl;
import com.wang.pojo.Role;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class RoleServiceImpl implements RoleService{

    //引入Dao
    private RoleDao roleDao;
    public RoleServiceImpl() {
        roleDao = new RoleDaoImpl();
    }

    @Override
    public List<Role> getRoleList() {
        Connection connection = null;
        List<Role> roleList = null;
        try {
            connection = BaseDao.getConnection();
            roleList = roleDao.getRoleList(connection);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            BaseDao.closeResource(connection,null);
        }
        return roleList;
    }
}

7. 用户显示的Servlet

  1. 获取用户前端的数据(查询)

  2. 判断请求是否需要执行,看参数的值判断

  3. 为了实现分页,需要计算出当前页面和总页面,页面参数

//重点,难点
public void query(HttpServletRequest req,HttpServletResponse resp) {

    //查询用户列表

    //从前端获取数据
    String queryUserName = req.getParameter("queryname");
    String temp = req.getParameter("queryUserRole");
    String pageIndex = req.getParameter("pageIndex");
    int queryUserRole = 0;

    //获取用户列表
    UserServiceImpl userService = new UserServiceImpl();
    List<User> userList = null;
    //第一次走这个请求,一定是第一页,页面大小是固定的
    //可以把这个写在配置文件中,方便后期修改
    int pageSize = 5;
    int currentPageNo = 1;

    if (queryUserName == null) {
        queryUserName = "";
    }
    if (temp != null && !temp.equals("")) {
        queryUserRole = Integer.parseInt(temp);     //给查询赋值
    } if (pageIndex != null) {
        currentPageNo = Integer.parseInt(pageIndex);
    }

    //获取用户的总数(分页:上一页,下一页)
    int totalCount = userService.getUserCount(queryUserName,queryUserRole);
    //总页数支持
    PageSupport pageSupport = new PageSupport();
    pageSupport.setCurrentPageNo(currentPageNo);
    pageSupport.setPageSize(pageSize);
    pageSupport.setTotalCount(totalCount);

    int totalPageCount = pageSupport.getTotalPageCount();

    //控制首页和尾页
    //如果页面要小于1了,就显示第一页的东西
    if (totalPageCount < 1) {
        currentPageNo = 1;
    } else if (currentPageNo > totalPageCount){
        //当前页面大于最后一页
        currentPageNo = totalPageCount;
    }

    //获取用户列表展示
    userList = userService.getUserList(queryUserName,pageSize);
    req.setAttribute("userList",userList);

    //展示角色列表
    RoleServiceImpl roleService = new RoleServiceImpl();
    List<Role> roleList = roleService.getRoleList();
    req.setAttribute("roleList",roleList);
    req.setAttribute("queryUserName",queryUserName);
    req.setAttribute("queryUserRole",queryUserRole);

    //展示分页
    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();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&amp;FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = &quot;hello&quot;; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let&#39;s briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越