JavaWeb入门_模仿天猫整站Tmall_JavaEE实践项目_学习心得
tmall_javaee
技术栈 servlet + jsp + tomcat , 是java web入门非常好的练手项目
项目简介
本项目为java ee入门练手项目,没有使用 ssh , ssm 框架,而是使用 javaee 整套技术来作为解决方案,实现模仿天猫网站的各种业务场景。 之所以不使用框架,就是为了借助这个项目夯实 javaee 基础,并且在项目中借助反射等技术。
github 项目源码地址
项目用到的技术如下:
java:java se基础
前端:html
,css
,javascript
,jquery
j2ee:tomcat
,servlet
,jsp
,filter
数据库:mysql
表结构
建表sql 已经放在 github 项目的 /sql 文件夹下
表名 | 中文含义 | 介绍 |
---|---|---|
category | 分类表 | 存放分类信息,如女装,平板电视,沙发等 |
property | 属性表 | 存放属性信息,如颜色,重量,品牌,厂商,型号等 |
product | 产品表 | 存放产品信息,如led40ec平板电视机,海尔ec6005热水器 |
propertyvalue | 属性值表 | 存放属性值信息,如重量是900g,颜色是粉红色 |
productimage | 产品图片表 | 存放产品图片信息,如产品页显示的5个图片 |
review | 评论表 | 存放评论信息,如买回来的蜡烛很好用,么么哒 |
user | 用户表 | 存放用户信息,如斩手狗,千手小粉红 |
order | 订单表 | 存放订单信息,包括邮寄地址,电话号码等信息 |
orderitem | 订单项表 | 存放订单项信息,包括购买产品种类,数量等 |
一 | 多 |
---|---|
category-分类 | product-产品 |
category-分类 | property-属性 |
property-属性 | propertyvalue-属性值 |
product-产品 | propertyvalue-属性值 |
product-产品 | productimage-产品图片 |
product-产品 | review-评价 |
user-用户 | order-订单 |
product-产品 | orderitem-订单项 |
user-用户 | orderitem-订单项 |
order-订单 | orderitem-订单项 |
user-用户 | user-评价 |
以上直接看可能暂时无法完全理解,结合后面具体到项目的业务流程就明白了。
实体类设计
所谓的实体类,就是对于数据库中的表的互相映射的类。
这是一种 orm 的设计思想,即一个对象,对应数据库里的一条记录
举个例子,对于 评价 / review
的 实体类 和 表结构 设计如下:
已省略对应的 getter/setter 方法
dao 类设计
dao 是 data access object 的缩写,专门用于进行数据库访问的操作。
首先看一下数据库工具类
dbutil
这个类的作用是初始化驱动,并且提供一个 getconnection 用于获取连接,统一管理连接参数,方便后续操作。
categorydao
利用 dbutil 获取 connectoion ,再获取对应的 statement,利用 jdbc 从数据库取出数据,并构造成 bean 对象返回。
service 类
作为j2ee web 应用,一般会按照如图所示的设计流程进行
servlet -> service(业务类) -> dao -> database
在本模仿天猫整站 javaee 版本中,不使用 service 这一层。 原因是在 dao 进行了比较详细的设计,已经提供了很好的支持业务的方法。如果在 dao 上包裹一层 service 业务类,不过是在直接调用 dao 设计好的方法罢了。另外一个使用框架的项目会用到 service 层。
filter 配合 servlet
后台在系统设计的时候,并不是简单的每个功能对应一个 servlet ,而是使用了反射的技术,结合过滤器filter 进行了封装,使得开发配置以及维护成本降低了很多。
一个路径对应一个 servlet 的弊端
这里以分类进行举例:
分类管理需要:增加,删除,编辑,修改,查询 5 个功能,按照传统的在 web.xml 中配置 servlet 的思路,那么就需要 5 个 servlet 类,而后台需要做分类,产品,属性,产品图,用户,订单 6 中管理,就一共需要30 个 servlet,还要配置 web.xml 就会变得很乱。
解决的方法是把所有分类操作放在同一个 servlet ,对应不同的方法。
让我们来分析,如何做到访问 admin_category_list 的时候,categoryservlet 的 list() 方法会被调用:
- 假设访问路径是 /admin_category_x
- 过滤器 backservletfilter 进行拦截,判断访问的地址是否以/admin_开头
- 如果是,那么做如下操作
3.1 取出两个下划线之间的值 category
3.2 取出最后一个下划线之后的值 x
3.3 然后根据这个值,服务端跳转到 categoryservlet,并且把 x 这个值传递过去
- categoryservlet 继承了 basebackservlet,其 service 方法会被调用。 在 service 中,借助反射技术,根据传递过来的值 x,调用对应 categoryservlet 中的方法 x()
- 这样就实现了当访问的路径是 admin_category_list 的时候,就会调用 categoryservlet.x() 方法这样一个效果
换句话说:
如果访问的路径是 admin_category_add,就会调用 categoryservlet.add() 方法
如果访问的路径是 admin_category_delete,就会调用 categoryservlet.delete() 方法
backservletfilter
basebackservlet
github-basebackservlet 完整代码
basebackservlet 继承了 httpservlet 并重写了 service 方法,其核心代码如下:
另外还定义了增删查改等基础抽象方法,初始化了所有 dao 对象
上图已经注释的很清楚了,项目全部代码都放在 github 上了,欢迎查看。
categoryservlet
- 首先 categoryservlet 继承了 basebackservlet,而 basebackservlet 又继承了 httpservlet
- 服务端跳转过来之后,会访问 categoryservlet 会访问 service() 方法
- 父类 basebackservlet中重写了 service() 方法,所以流程就进入到了 service() 中
3.1 在 service() 方法中根据反射访问对应的方法
3.2 根据对应方法的返回值,进行服务端跳转、客户端跳转、或者直接输出字符串。
- 取到从 backservletfilter 中 request.setattribute() 传递过来的值 list
- 根据这个值 list,借助反射机制调用 categoryservlet 类中的 list() 方法,这样就达到了categoryservlet.list()方法被调用的效果
而后,list 方法使用 categorydao.list 查询出 category 对象集合,并跳转到 listcategory.jsp 显示
完整版的 listcategory.jsp 还包含4个公共文件,分别是 头部,导航,行业,页脚。
分类管理还有增加,编辑,修改,删除,分页,另外后台其他管理页面,前台页面。具体的需要浏览代码,篇幅原因就不展开了。
页面展示
本篇博客所讲不足整个项目的 1/10 ,有兴趣的朋友请移步 github 项目的地址 。
参考
里面除了本项目,还有 java 基础,前端,tomcat 及其他中间件等教程, 可以注册一个账户,能保存学习记录。
上一篇: 品评男女滴幽默小句段