JavaWeb

1、Book

学习JavaWeb后根据文档独立完成了这个书城项目,前端的页面设计不算好看,但在服务器端编写设计中受益颇大,过程中让我更深入地掌握了Java后端开发的思想,和开发的逻辑原理等。

2、开发环境

  1. IDEA2021.3.1
  2. Mysql5.5
  3. Tomcat8.0.5
  4. jdk1.8

3、项目总体介绍

项目包括用户的注册登录模块、购物车模块、结算模块、用户订单查看模块主页浏览图书模块、以及管理层的订单管理模块、图书管理模块等

1.项目前端页面搭建使用jsp页面、css样式、js脚本,用Jquery进行事件绑定。
2.项目后端采用JavaEE三层架构模式,其中用Servlet进行Web层开发,用Druid数据库连接池和jdbcUtils进行Dao层开发,采用三层可以降低代码耦合度,便于后期功能扩展和维护,大大降低维护成本。
3.还用到Fliter服务器组件进行管理层和普通用户层地拦截过滤,并且用Fliter进行统一地事务绑定,解决繁琐的单一绑定。
4.项目引入了谷歌的kaptcha验证码进行注册的验证,解决了表单的重复提交问题。
5.商品的浏览页面采用了分页技术,从底层自己编写实现分页的代码,更深的了解了分页的原理过程。

4、系统部分模块的实现流程介绍

javaweb技术体系
在这里插入图片描述
订单模块功能实现
在这里插入图片描述
图书模块分页浏览实现
在这里插入图片描述
价格区间搜索实现
在这里插入图片描述

5、部分代码展示

利用反射的灵活性对Servlet程序进行优化抽取,降低维护成本

public abstract class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决POST请求中文乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html; charset=UTF-8");//解决响应乱码
        String action = req.getParameter("action");
        //代码进一步优化,避免以后User模块添加新功能,如:修改密码,绑定手机号等业务功能时
        //还需要改动doPost追加大量else if,利用反射可以让开发者只专注于开发新功能方法代码
        try {
            //获取action业务 鉴别字符串,获取相应业务 方法反射对象
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //反射调用目标业务方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);//把异常抛给Filter过滤器
        }
    }
}

Dao层对数据库基本的操作进行抽取为BaseDao

public abstract class BaseDao {
    //使用DbUtils操作数据库的增删改查
    private QueryRunner queryRunner = new QueryRunner();

    /**
     * update() 用来执行:insert,pdate,delete语句
     * @param sql
     * @param args 可变长参数
     * @return 如果返回-1说明执行失败,其它表示影响行数
     */
    public int update(String sql,Object ... args){

        System.out.println("BaseDao 程序在【"+Thread.currentThread().getName()+"】中");

        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.update(connection,sql,args);
        } catch (SQLException e) {
            e.printStackTrace();
            //异常可以捕获,但是 一定往外抛,这样任何位置出现异常都能回滚事务!
            throw new RuntimeException(e);
        }
    }
    /**
     * 查询返回一个 javaBean的sql语句
     * @param type  返回的对象类型
     * @param sql   执行的sql语句
     * @param args  sql对应的参数值
     * @param <T>   返回类型的泛型,多表通用,多实体类通用
     * @return 返回一个
     */
    public <T> T queryForOne(Class<T> type,String sql,Object ... args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.query(connection,sql,new BeanHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();        
            throw new RuntimeException(e);
        }
    }
    //查询返回多个 javaBean的sql语句
    public <T>List<T> queryForList(Class<T> type, String sql, Object ... args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.query(connection,sql,new BeanListHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    //执行返回一行一列的SQL语句
    public Object queryForSingleValue(String sql, Object ... args){
        Connection connection = JdbcUtils.getConnection();
        try {
            Object object = queryRunner.query(connection, sql, new ScalarHandler(), args);
            return object;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}

6、书城部分剪影

【1】登录后书城首页
在这里插入图片描述

【2】注册
在这里插入图片描述
【3】购物车
在这里插入图片描述
【4】我的订单
在这里插入图片描述
【5】订单管理
在这里插入图片描述
【7】图书管理
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值