1、Book
学习JavaWeb后根据文档独立完成了这个书城项目,前端的页面设计不算好看,但在服务器端编写设计中受益颇大,过程中让我更深入地掌握了Java后端开发的思想,和开发的逻辑原理等。
2、开发环境
- IDEA2021.3.1
- Mysql5.5
- Tomcat8.0.5
- 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】图书管理