100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 项目03--当当网源码解读

项目03--当当网源码解读

时间:2021-09-27 19:57:44

相关推荐

项目03--当当网源码解读

最近读了当当网的源码,收获很多,利用这篇博文和大家分享分享心得。

一开始,我将源码导入eclipse的时候,jsp文件大面积出错,原因是jdk版本不匹配,将原项目的jdk删除,重新设置自己eclipse版本的jdk即可。

首先我们来看整个项目的 Project Explorer :

接下来我们先简单的分析一下整个项目:

前端分析:

(1)前端页面采用 js + css + jsp 共同完成,css 主要用于网页中样式的定义,用于美化网页,js 主要是实现简单的表单验证和美化静态页面。前端主要是 结构+样式+行为,而 css 就负责样式, js 负责行为。

(2)前端设计的时候,有 error.jsp,表示一旦出错,交互友好。在jsp页面中用到了struts2的标签库.

(3)jsp文件按照模块分了4个包,cart(购物车)、main()、order(订单)、user(用户)。

①user模块包括用户注册和用户登录,注册分为填写信息,验证邮箱和注册成功。

②order模块包括填写订单、输入地址、生成订单。

③cart模块包括了购物车的所有信息。

④main模块包括了主要的浏览书籍的界面,按照最新排序查询,按照最热排序查询,自动推荐等功能。

(4) js 文件主要用到了 jquery 和 ajax. ajax 实现异步更新页面数据,jquery 是一个轻量级的 js 库,实现更方便的处理 html, 并实现动画效果。

js 文件实现了最简单的表单验证:

① 页面填入的各项信息不能为空

② 各项验证不能全通过则点击按钮无效

③ 信息格式是否正确,是否为空,是否已经存在

验证的方式有很多,最常见的是利用正则表达式进行验证。这些都是直接在前台页面就进行了初步验证,不用和后台和数据库交互。

(5)css文件做的是样式,即字体,布局,颜色,边框等,给每一个页面都要进行样式设计与设置,使页面呈现出来较为酷炫的效果,直接设置就行。

(6)配置文件:

①web.xml中配置了struts2。

②mytag.tld文件是tag标签的配置文件,配置了tag标签后才能在jsp中调用。

后台分析:

(1)配置文件:

struts.xml这个配置文件中配置了一些共用的拦截器,异常处理和 action .

db.properties配置文件中配置了连接数据库的基本参数。

(2)我主要是做后台的,所以现在开始我们来分析最核心的后台框架以及设计思想。

先戳图:

整个处理过程如下:

(1)页面发送请求到 struts.xml 配置文件。

(2)配置文件根据action的对应关系去找到相应的action类。

(3)Dao层利用sql语言,通过entity实体层实现对数据的增删改查操作。

(4)action类中通过对dao层方法的转发以及调用实现对业务的处理,返回给struts.xml一个表示状态的字符串。

(5)struts.xml根据返回的字符串控制跳转到下一个要跳转的页面。

整个过程完成,struts2是一个基于MVC的web框架,其中Action是模型层(model),负责承载数据并返回代表状态的字符串。控制器是 FilterDispatcher,通过struts.xml来控制。

接下来,我们分析每一层的功能和写法:

1.dao层:

dao层主要负责操作数据库的数据,实现增删改查的功能。

在这个项目中,dao层又分为三层,分别是:DAO接口,DAOImpl实现和DAOFactory。

注意,写接口的时候每个方法都要抛出异常,涉及到查询的时候最好将数据类型写成List,方便后期循环遍历查询或者显示。

DAOImpl是通过sql语句来实现增删改查的。涉及到连接数据库,获得结果集等,连接数据库后就可以执行插入删除等操作。

2.entity层:

entity层主要是数据库中表的映射,dao层与数据库交互的时候就是通过entity层来实现的。

这里就提到了关于数据库中表的设计:

(1)凡是涉及到时间的属性数据类型都是long型,注意要在entity中对long型的时间的输出格式进行处理:

//表示输出为系统默认的输出yyy-MM-ddSimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");return sdf.format(new Date(publish_time));

如果你想输出为 yyyy年MM月dd日 的话使用日历 Calendar 把String类型的切成Calendar赋值举例:Calendar calendar = new GregorianCalendar(, 12-1, 21); System.out.println(sdf.format(calendar.getTime()));

(2)凡是涉及到价钱的属性数据类型都是double型。

(3)涉及到结果集的属性都要用List,方便后期循环遍历。

(2)布尔类型:需要将T或者F写进数据库,从数据库返回的是True或者false.即数据库中存的是T或者F,但是页面显示的是true或者false.

3.interceptor层:

本层主要写了一个拦截器,用来检查用户是否已经登录。

/***检查用户是否登录的套路:*先取得session中存的信息,存在一个Map中*检查session中是否存有用户的信息,如果有,表示已经登录*否则用户未登录*/

4.util层

本层包括四个 .java文件。

(1) DBConnection.java主要实现的功能是连接数据库:

/***jdbc连接数据库也就是那几步:*1.加载驱动*2.获取连接*3.获得结果集*4.关闭连接*/将加载驱动这一步写在static静态块中,保证程序一开始运行就加载驱动和db.properties配置文件。并在main中写测试函数,保证数据库连接成功!

(2)EmailCode.java主要用来解析用户输入的邮箱验证码,邮箱验证码是随机生成的,且包括两部分 uuid 和 id ,当用户输入的邮箱验证码和自动生成的相匹配,则邮箱验证成功!

随机生成的邮箱验证码如下(测试了3次):

(3)ImageUtil.java

ImageUtil是生成图片验证码的函数:

//图片验证码//java中利用Graphics类来实现绘制图形//整个验证码都是绘制粗来的,我们可以来分析,显示验证码的最外层图片是画出来的,验证码数字或者字符是利用随机数自动生成的//干扰线的位置、颜色等也都是利用随机数自动生成的。

一开始先定义这个图片验证码的元素组成

包括整个图片的长度和宽度,字体的大小,包含字符个数,以及字符随机生成的原库,还有干扰线的条数.

然后产生随机字符,产生随机干扰线,产生随机颜色。

(4)Md5Code.java

这个文件是对用户的密码进行加密的过程。

/***关于MD5算法:*用户的密码是利用MD5算法(或者其他类似算法)经哈希运算后存储到文件系统或者数据库系统中*当用户登录时输入密码时,系统会将用户密码进行MD5哈希运算,再和数据库中保存的MD5值进行比较,从而确认密码的输入是否正确*这样可以避免用户的密码被具有管理员权限的人知道*优点是从MD5值反推原密码非常困难,几乎是不可能的。*也可用来校验文件的完整性*/

5.最后我们来看action层:

action层分模块,cart(购物车模块),main(主功能模块),order(订单模块),user(用户模块)。

(1)BaseAction:BaseAction是公共基类,用来负责处理将所有从界面传过来的的信息保存在request和session中.从页面传进来一个Map<String, Object>的session对象,这个函数负责用set方法存储在服务器session中从页面传进来一个request对象,这个函数负责用set方法将request存储在服务器request上。

(2)cart(购物车模块):

分析:

/**

*整个cart模块的分析

*1.CartService是一个接口,用来声明对购物车所作的常用操作

*2.SessionCartServiceImpl实现了CartService接口,实现了接口中的所有方法

*3.CartFactory是一个工厂

*4.CartAction是界面和后台交互的地方,接收界面的请求,转发请求,调用dao层实现相应的功能

*5.CartItem是一个model

*注意:购物车应存在session中,当用户确认购买时,再将购物车信息生成一个订单(order),以订单形式复制到数据库中进行存储。

*/

(3)order(订单模块):

/**

*订单提交过程:

*1.检查购物车,若购物车中无商品,返回empty,不提交

*2.若购物车中有商品,则需要提交

* 2.1 根据用户id获得购物车实例(session中购物车信息)

* 2.2 创建订单对象(order),将session中购物车的信息复制到订单中,一条一条赋值

* 2.3 查看数据库中是否存有订单信息,若没有,则将order的信息和地址信息存入数据库

* 2.4 清空session中的购物车信息

*/

OrderConfirmAction.java完成的功能如下:

//如果购物车为空,提示错误信息,无法确认订单//如果购物车不为空,返回确认订单成功,并计算订单总价

(4) user (用户模块):

①用户登录 LoginAction.java:

//用户名是邮箱名,登录时只需要验证邮箱和密码是否匹配即可//根据dao层方法验证email和密码是否正确,不正确返回login_form.jsp//密码的验证需要调用Md5验证类,判断新登录的密码是否和原来存的密码的Md5值相同//邮箱验证在这个函数中,只判断了是否为空。调用了另外写的邮箱验证函数来判断。//如果用户名和邮箱验证成功,则需要更新最后登录时间和ip,将新的Model写进session中和数据库中,并返回状态字符串。//退出登录的时候,需要清除session中存的信息//session的生命周期在用户退出登录这一刻结束。

② 邮箱验证:

//邮箱验证函数//当用户登录时输入邮箱时,点击邮箱验证,会随机生成一个对应的邮箱验证码a,用户输入邮箱验证码b时,系统会进行解析,若解析结果和a匹配,则邮箱验证成功!

④ 注册验证:

注册的时候,要将密码进行加密。注册后要将新用户的信息加入数据库和session中。

到这里为止,当当网的源码分析就基本上告一段落了,整个系统层次分明,综合利用了很多基础的知识点。安全验证方面做得还算完善。通过阅读分析这个源码,我对于struts2框架的应用更加熟练,共勉!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。