JavaWeb 简单仓库管理系统 Jsp+Servlet+Druid...

学完JavaWeb,在开始Spring全家桶之前,用Jsp这门技术,实践一下,简单运用,随意指点。
项目技术栈:Jsp+Servlet+Druid+Bootstrap+jQuery+JDBCTemple,分页模糊查询。

1. 登陆:

在这里插入图片描述

  • 主要是验证码的后台生成,与用户点击验证码时进行“看不清换一张”功能。
/**
 * 验证码接口
 *  随机生成验证码  存到session 内
 *
 */
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("pragma", "no-cache");
        response.setHeader("cache-control", "no-cache");
        response.setHeader("expires", "0");
        int width = 80;
        int height = 30;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, width, height);
        String checkCode = getCheckCode();
        request.getSession().setAttribute("CHECKCODE_SERVER", checkCode);
        g.setColor(Color.YELLOW);
        g.setFont(new Font("黑体", Font.BOLD, 24));
        g.drawString(checkCode, 15, 25);
        ImageIO.write(image, "PNG", response.getOutputStream());
    }

    /**
     * 产生四位随机验证码字符串
     * @return
     */
    private String getCheckCode() {
        String base = "0123456789ABCDEFGabcdefg";
        int size = base.length();
        Random r = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 1; i <= 4; i++) {
            int index = r.nextInt(size);
            char c = base.charAt(index);
            sb.append(c);
        }
        return sb.toString();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

  • 登陆逻辑处理,后台页面重定向。
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String verifycode = request.getParameter("verifycode");
        HttpSession session = request.getSession();
        String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
        session.removeAttribute("CHECKCODE_SERVER");
        if (!verifycode.equalsIgnoreCase(checkcode_server)) {
            request.setAttribute("login_msg", "验证码错误!");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        Map<String, String[]> map = request.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user, map);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        UserServiceImp userServiceImp = new UserServiceImp();
        User login = userServiceImp.login(user);
        CargoServiceImp userService = new CargoServiceImp();
        if (login != null) {
            session.setAttribute("user", login);
            response.sendRedirect(request.getContextPath() + "/findCargsByPageServlet");
        } else {
            request.setAttribute("login_msg", "用户名或密码错误!");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  • 前端换一张,功能即Js更改图片的URL,为了防止浏览器缓存图片,即给每个图片加一个唯一标识,即每次不同的。即时间戳。
	<script>
        $(function () {
            $("#img").click(function () {
                this.src="${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();
            })
        })
	</script>

2.主界面展示,基于分页、模糊查询

在这里插入图片描述

  • 主要从数据拿到的数据进行两次封装、第一次封装为货物的JavaBean,第二次封装为分页查询的PageBean。
  • 对于不同的条件,进行模糊查询。返回PageBean。
    /**
     * 返回查询条件下 的总数量
     *   当ID = 1 , 查询货物名称条件下的数量
     *   当id = 2 查询货物序号下的数量
     *   当id = 3 查询货物在小于一定量下的数量
     * @param id
     * @param cargoSelect
     * @return
     */
    @Override
    public int selectCount(int id, String cargoSelect) {

        StringBuffer sql = new StringBuffer("select count(*) from cargo where 1=1 ");
        /**
         * 基于原模板sql 进行封装
         *  StringBuffer 进行字符串拼接
         *  自动拆箱  故可以直接返回Integer
         */
        if (id == 1) {
            sql.append(" and cargo_name like ");
            sql.append("'%" + cargoSelect + "%'");
            return template.queryForObject(sql.toString(), Integer.class);
        } else if (id == 2) {
            sql.append(" and cargo_id like ?");
            cargoSelect = "*" + cargoSelect + "*";
            return template.queryForObject(sql.toString(), Integer.class, cargoSelect);
        } else if (id == 3) {
            sql.append(" and cargo_amount < ?");
            return template.queryForObject(sql.toString(), Integer.class, Integer.parseInt(cargoSelect));
        } else {
            return template.queryForObject(sql.toString(), Integer.class);
        }
    }

    /**
     * 在不同的模糊查询条件下
     *      查询每个Page数量下Cargo对象
     *      封装为List<Cagro>对象
     *      返回
     * @param start
     * @param rows
     * @param id
     * @param cargoSelect
     * @return
     */
    @Override
    public List<Cargo> selectLimit(int start, int rows, int id, String cargoSelect) {
        StringBuffer sql = new StringBuffer("select * from cargo where 1=1 ");

        if (id == 1) {
            sql.append(" and cargo_name like  ");
            sql.append("'%" + cargoSelect + "%'");
            sql.append(" limit ?,?");
            return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), start, rows);
        } else if (id == 2) {
            sql.append(" and cargo_id like  ");
            sql.append("'%" + cargoSelect + "%'");
            sql.append(" limit ?,?");
            return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), start, rows);
        } else if (id == 3) {
            sql.append(" and cargo_amount < ? limit ?,?");
            return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), Integer.parseInt(cargoSelect), start, rows);
        } else {
            sql.append("  limit ?,? ");
            return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), start, rows);
        }
    }

3. 添加货物

在这里插入图片描述

  • 利用BeanUtils进行数据封装,调用dao层进行数据访问。
/**
 * 添加货物信息
 */
@WebServlet("/addCargoServlet")
public class AddCargoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map<String, String[]> parameterMap = request.getParameterMap();
        Cargo cargo = new Cargo();
        try {
            BeanUtils.populate(cargo, parameterMap);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        CargoServiceImp cargoServiceImp = new CargoServiceImp();
        cargoServiceImp.add(cargo);
        response.sendRedirect(request.getContextPath() + "/findCargsByPageServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

4. 删除货物

在这里插入图片描述

  • 即是获得前端传来的需删除的货物编号/货物编号数组,调用dao层进行处理。
    @Override
    public void deleteById(int id) {
        String sql = "delete from cargo where cargo_id = ?";
        template.update(sql, id);
    }

在这里插入图片描述

  • 这里是做一个全选的功能,即是在点击最上面的,实现全选功能。思路是,即当点击最上面的选择框时,后面的所有的选择框和上面的保持一致。
  • 这里要注意的第一个点是,在jQuery中,操作固有属性用的时prop,操作自定义属性多用attr
  • 如果这里用attr去操作checked属性得到的值将会是undefined
        $(function () {
            $("#firstCb").click(function () {
                $("input[name='cid']").prop("checked",$("#firstCb").prop("checked"));
            })
        })

Jsp结束。

dr.end

  • 14
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 164
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 164
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值