web_ajax综合练习

Javaweb-综合练习

第1章 项目介绍

后台管理p2p_management

实现登录,退出产品管理(产品添加,产品查询,产品修改)

前台管理p2p_home

客户注册,登录,邮箱认证

帐户中心产品查询帐户信息查询产品购买


技术架构:jsp+servlet+javabean+mysql+redis+filter

新的知识点:

1. 数据库操作的事务管理

2. Javamail

3. Beanutils工具它可以将请求参数直接封装成实体对象

本次综合练习,主要是以ajax操作为主。

第2章 项目环境搭建

1. eclipse中项目环境搭建


搭建package结构


2. 关于数据库

五张表

1. user表,它是后台用户表

2. product表,产品表

3. account表 客户帐户表

4. product_account客户购买产品表

5. customer客户表


第3章 功能实现

]3.1 [endif]p2p_management功能实现

[if !supportLists]3.1.1 [endif]简单登录与退出

[if !supportLists]3.1.1.1 [endif]登录操作

登录页面login.html

步骤1:创建一个User类它与表user对应


步骤2:创建UserServlet


步骤3:将login.html页面转换为login.jsp


步骤4:在servlet中完成用户登录操作

1.先获取username,password

2.完成验证操作

3.调用service完成操作

4.在service中调用dao完成操作


操作数据库使用的是c3p0连接池与dbutils工具,提供了一个JdbcUtils



步骤5:从数据库中查询出user,判断是否登录成功,进行页面跳转


[if !supportLists]3.1.1.2 [endif]用户未登录不能访问/views/hom.jsp

可以使用filter来完成操作



注意:上面的filter配置它只能对REQUEST请求拦截,我们也需要对FORWARD拦截



[if !supportLists]3.1.1.3 [endif]退出操作

1.在home.jsp页面显示登录用户的名称


2.退出操作

我们退出时,一定要将session销毁,在将页面关闭。

我使用ajax操作来完成。

步骤1:创建home.js文件,在home.jsp页面导入

步骤2:修改home.jsp页面

步骤3:在home.js文件中创建一个函数shutdown()来完成关闭操作

[if !supportLists]3.1.2 [endif]产品管理-产品查询

关于产品信息的查询,我们使用ajax来完成操作,并且没有分页。

思路:

1.当home.jsp页面加载时就会向服务器发送请求来获取产品信息

2.服务器端在servlet中处理请求,调用service,dao完成产品信息查询,并将信息转换成json响应到浏览器端

3.在浏览器中得到服务器响应的数据(json),对数据进行处理,展示在home.jsp页面上。

[if !supportLists]3.1.2.1 [endif]步骤1:创建Product模型


[if !supportLists]3.1.2.2 [endif]步骤2创建服务器端的servlet ,service,dao


在service包中创建IProductService 与其实现ProductServiceImpl  

在dao包中创建IProductDAO 与其实现ProductDAOImpl

[if !supportLists]3.1.2.3 [endif]步骤3在home.js中完成页面加载时向服务器发送请求,获取产品信息



[if !supportLists]3.1.2.4 [endif]步骤4.在服务器端查询所有产品信息,并转换成json响应到浏览器




[if !supportLists]3.1.2.5 [endif]步骤5:在浏览器端处理json数据,展示在页面上

在home.jsp页面上添加一个


将json数据处理后转换成的html代码显示在pbody中就可以。


[if !supportLists]3.1.3 [endif]产品管理-产品添加

产品添加思路:

在home.jsp页面上点击添加按钮,弹出一个窗口,在窗口中录入相关产品信息,将信息发送到服务器端,在servlet中调用service,dao,完成将数据插入到product表中,最后我们要在调用查询所有产品操作,将添加的产品显示出来。


[if !supportLists]3.1.3.1 [endif]步骤1:在home.jsp页面上点击添加按钮弹出窗口

1.修改home.jsp页面上的按钮

2.在home.jsp中添加弹出层


3.在home.js中添加js代码


4.在弹出的窗口中创建一个表单


[if !supportLists]3.1.3.2 [endif]步骤2:添加产品信息,将信息发送到服务器端完成添加操作

1.在home.js中完成点击添加按钮,获取添加的表单的数据

我们可以使用前面讲过的关于jquery插件。



[if !supportLists]3.1.3.3 [endif]步骤3在服务器端完成添加操作

使用beanutils来完成请求参数封装

1.导入jar包


2.使用beanutils将请求参数封装到bean对象中


参数1是bean对象  

参数2是我们的请求参数的Map集合,一般我们使用时都是使用request.getParameterMap()方法获取。

注意:要想将请求参数封装到bean对象中,必须让bean属性与请求参数的名称对应。


这些参数与Product类中的bean属性名称相同

完成服务器端添加操作

Servlet


Service


Dao


[if !supportLists]3.1.3.4 [endif]步骤4添加完成后,在查询产品在页面上显示


[if !supportLists]3.1.4 [endif]产品管理-产品修改

对于修改操作就是进行查询,回显示数据后在修改。

[if !supportLists]3.1.4.1 [endif]步骤1:给home.jsp页面上的编辑添加连接,点击进行产品的查询

给编辑添加连接


创建了一个findById函数来完成根据产品id查询产品操作


注意:点击编辑后要弹出一个窗口



注意:要对添加操作中的弹窗进行修改,添加一个id进行操作

[if !supportLists]3.1.4.2 [endif]步骤2在服务器端完成根据id查询产品操作

Servlet


Dao


[if !supportLists]3.1.4.3 [endif]步骤3在home.jsp页面上显示查询到的产品信息

对每一个文本框添加id



[if !supportLists]3.1.4.4 [endif]步骤4修改操作

浏览器端操作


注意:参数中一定要携带id

服务器端操作

Servlet


dao


[if !supportLists]3.2 [endif]p2p_home功能实现

[if !supportLists]3.2.1 [endif]用户管理-注册操作

注册操作它不仅是添加客户信息,还要在注册时,为客户生成一个帐户。简单说,我们在进行客户注册操作时,要insert两条记录,一条是customer表中添加数据,代表的是客户信息,还需要向account表中插入数据,当创建一个客户时,也会为其生成一条帐户信息。

(本项中,没有使用支付宝,微信操作)去进行转账操作,只是简单的自己生成了帐户信息。

[if !supportLists]3.2.1.1 [endif]步骤1:修改register.html页面,当点击注册按钮时向服务器发送请求

1.修改手机号为邮箱地址

2.给注册按钮添加事件,点击它完成向服务器发送请求操作



[if !supportLists]3.2.1.2 [endif]步骤2:服务器端完成注册操作

注意:注册时要向customer与account表中插入数据,我们需要进行事务控制。

Servlet创建


Domain



[if !supportLists]3.2.1.3 [endif]步骤3:完成添加客户操作

关于JdbcUtils工具


Service操作


Dao操作


[if !supportLists]3.2.1.4 [endif]步骤4:完成添加帐户操作

注意:添加客户时要保证它的email与c_name是唯一的。


添加帐户信息


[if !supportLists]3.2.1.5 [endif]步骤5:判断客户名称与邮箱唯一 ,并响应数据到浏览器


为了方便在浏览器端判断是否成功,我们可以设置一个json类型的返回结果。



[if !supportLists]3.2.1.6 [endif]步骤6:解决前端js校验

非空校验



规则校验



[if !supportLists]3.2.2 [endif]用户管理-登录操作

注意:在登录时,我们录制客户名称或邮箱地址都可以完成登录。

[if !supportLists]3.2.2.1 [endif]步骤1:在登录页面上显示图片验证码

将资料中的CheckImageServlet复制到utils包下在web.xml文件中配置


在login.html页面上添加


点击图片验证码切换图片



[if !supportLists]3.2.2.2 [endif]步骤2:完成点击立即登录操作,将信息发送到服务器端

注意:在页面上需要给用户名密码验证码添加name属性



[if !supportLists]3.2.2.3 [endif]步骤3:在服务器端完成登录操作,并响应数据到浏览器端

获取请求参数,判断验证码是否正确


调用service完成登录操作



在浏览器端处理服务器的响应数据


注意:在login.html页面上我们进行了修改


[if !supportLists]3.2.2.4 [endif]步骤4:完成邮箱登录

在登录程序中添加一段来判断是否是邮箱


[if !supportLists]3.2.2.5 [endif]步骤5:在服务器端进行校验



[if !supportLists]3.2.2.6 [endif]步骤6:关于密码md5加密问题

Java加密


在mysql中对密码进行加密

UPDATE customer SET PASSWORD=MD5('123');

[if !supportLists]3.2.2.7 [endif]步骤7登录后,跳转到space.html页面加载客户帐户信息

给space.html页面中导入一个space.js文件,在space.js文件中


这个函数是页面加载完成后执行。我们就可以在函数中向服务器发送请求,来获取客户的帐户信息在页面上显示

1.向服务器发送请求


2.在服务器端判断客户是否登录


3.客户登录,查询客户的帐户信息


注意:在JsonResult中双封装了一个content信息,它主要是用于封装查询的对象,例如Account对象。

4.在页面上处理帐户信息显示

首先在space.html页面上添加了id,在js代码中进行了处理



[if !supportLists]3.2.3 [endif]用户管理-邮箱认证

邮箱认证主要就是修改customer表中的email_status字段值修改为1

第一部分:点击”认证”弹出窗口,在窗口中显示用户注册时的邮箱,可以在点击按钮向服务器发送请求,服务器端要向邮箱发送一封邮件。

第二部分:完成邮箱认证操作


[if !supportLists]3.2.3.1 [endif]步骤1:点击认证弹出窗口

在space.html页面上添加了模态框代码

在”认证”上添加


在space.js文件中


接下来我们修改模态框




[if !supportLists]3.2.3.2 [endif]步骤2:完成服务器端客户信息查询,在文本框中显示客户的邮箱地址


浏览器端处理


关于客户邮箱认证时显示问题处理

在整个space.html页面加载后,处理邮箱认证显示


注意:服务器端在查询帐户信息时,将客户信息也封装到Account对象中。


[if !supportLists]3.2.3.3 [endif]步骤3:完成邮件的发送操作

服务器端发送邮件



[if !supportLists]3.2.3.4 [endif]步骤4:邮箱认证

主要就是修改customer表中的email_status字段值为1.

前台给“认证”按钮添加事件,点击它向服务器发送请求,携带着邮箱与录入验证码,在服务器端完成认证操作。





[if !supportLists]3.2.4 [endif]帐户中心-产品购买

产品购买,我们首先要对产品进行查询。我们在p2p_home中要查询产品信息,在p2p_management工程中已经提供了产品的crud操作,会使用跨域来完成数据查询。可以使用jquery提供的getJson操作

对于产品的购买,我们怎样操作?

1.用户的帐户表中的信息一定要改变

2.product_account表,这张表中记录的是客户的投资信息。

注意:在product_account表中我们还需要添加两个字段,一个是money代表投资金额 ,还需要记录本次交易收益interest


[if !supportLists]3.2.4.1 [endif]步骤1:跨域查询产品信息在moto.html页面上展示产品

在moto.js中完成向p2p_management工程发送请求,查询所有产品信息


在p2p_management的ProductServlet的findAll方法中修改



[if !supportLists]3.2.4.2 [endif]步骤2:在moto.html页面上展示产品信息

我们使用一个jquery的插件来实现产品信息的滚动展示。

1.导入自动滚动jquery插件相关的css与js文件



2.在页面上进行修改


    • 3.在moto.js文件中拼装html代码时



      [if !supportLists]3.2.4.3 [endif]步骤3:moto.html页面上产品购买信息生成

      1.点击我要购买时在页页面上展示产品信息



      2.在moto.html页面上展示当前要购买的产品的相关数据及计算收益信息

      预期收益=本金*预期收益率/100/12*limit



      [if !supportLists]3.2.4.4 [endif]步骤4:完成购买操作

      将投资的金额与产品信息传递到服务器,在服务器端进行操作,来完成购买。

      修改帐户信息,向product_account表中插入数据。注意:在操作前,要判断当前用户是否登录,要判断帐户的余额是否充足。

      1.向服务器发送我们的投资请求



      2.在服务器端完成操作

      因为我们需要修改account表中数据,还需要向product_account表中插入数据,它们是需要进行事务控制的。




      [if !supportLists]3.2.5 [endif]帐户中心-产品投资查询

      [if !supportLists]3.2.5.1 [endif]步骤1:产品投资查询分析

      对于产品投资查询,我们主要是完成用户资产的信息查询。

      我们要查询的信息,包括当前客户的帐户信息,购买的理财产品信息。

      对于帐户信息,我们要查询account表。

      对于购买的产品信息,包括product表 product_account表 customer表




      问题:怎样去完成查询以上信息操作,查询到信息后,怎样响应到浏览器端?

      关于帐户信息可以从select * from account where cid=?就可以查询到。

      表格中的数据要从product_account, customer,product表中查询出来。




      服务器给我们返回的数据应该是json类型。

      JsonResult来封装返回的数据就可以。JsonResult中定义了一个content对象,它是Object类型。



      [if !supportLists]3.2.5.2 [endif]步骤2:前端向服务器发送请求来查询投资信息



      Servlet中操作


      Service中操作


      [if !supportLists]3.2.5.3 [endif]步骤3在dao中查询购买的产品相关信息


      在service中将查询的结果进行了处理



      [if !supportLists]3.2.5.4 [endif]步骤4:在页面上展示投资产品及帐户相关信息


      [if !supportLists]3.2.5.5 [endif]步骤5:展示购买理财产品是否到期,处理页面上时间显示问题

      关于时间显示问题,在页面上修改


      在页面上展示当前产品是否到期

      可以在服务器端完成,在ProductAccount类中添加一个属性。




      [if !supportLists]3.3 [endif]项目优化与增强

      [if !supportLists]3.3.1 [endif]监听投资到期


      帐户表中的interest它记录的当前用户的总收益情况。

      做一个定时处理程序,在每天晚上0点来扫描投资信息,如果当前投资到期了,将这次投资的收益添加到帐户的interest上。会使用到Listener.



      具体功能实现



      [if !supportLists]3.3.2 [endif]架构优化

      [if !supportLists]3.3.2.1 [endif]Servlet优化


      [if !supportLists]3.3.2.2 [endif]Service与dao获取优化

      使用工厂模式来完成优化。结合着配置文件来减化操作。


      我们的思路:将关于service与dao的相关类都配置在xml文件中,结合java中反射与工厂模式来完成service与dao的获取。




      在使用dom4j是报这样一错,


      原因是dom4j与xpath语法结合时,需要在单独导入一个jar包



      在servlet中要使用service对象,而我们获取bean.xml文件的路径是通过ServletContext对象来获取classes目录


      在service中要获取dao对象,而在service中获取bean.xml文件的路径


      [if !supportLists]3.3.3 [endif]Redis缓存优化

      我们可以将产品信息保存到redis中。以后每一次查询都从redis中获取产品信息。

      不用每一次都与数据库交互。

      我们可以将关于产品信息的json串存储到redis中,以后从redis中获取就可以。


      在查询理财产品时,先从redis中获取,如果没有在从数据库中查询出来,在保存到redis中


      当我们的产品修改了或添加了,就需要修改redis中的数据。


      [if !supportLists]第4章 [endif]项目部署

      [if !supportLists]4.1 [endif]克隆一份linux

      注意:关于克隆这份linux的网络问题。



      如果修改后还有问题,将DEVICE=eth0修改为DEVICE=eth1

      重启网络服务service network restart



      [if !supportLists]4.2 [endif]将mysql数据库导入,并生成war文件导入到tomcat中


      在开发环境下导出我们的数据库信息


      将p2p.sql文件内容在linux服务器的mysql中执行一下。



      [if !supportLists]4.2.1 [endif]关于项目导出成war文件

      1.c3p0连接池的配置信息需要修改


      2.所有的domain下的类都要实现java.io.Serializable


      3.需要修改RedisUtils中的redis的服务器ip



      [if !supportLists]4.3 [endif]使用nginx搭建tomcat集群,并实现session共享

      [if !supportLists]4.3.1 [endif]配置nginx实现反向代理并实现负载均衡

      在nginx下的conf目录 中有一个nginx.conf文件,修改这个文件



      [if !supportLists]4.3.2 [endif]实现session共享

      1.导入四个jar包到tomcat的lib下


      2.修改tomcat/conf/context.xml文件

      ©著作权归作者所有,转载或内容合作请联系作者
      • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
        沈念sama阅读 204,921评论 6 478
      • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
        沈念sama阅读 87,635评论 2 381
      • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
        开封第一讲书人阅读 151,393评论 0 338
      • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
        开封第一讲书人阅读 54,836评论 1 277
      • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
        茶点故事阅读 63,833评论 5 368
      • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
        开封第一讲书人阅读 48,685评论 1 281
      • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
        沈念sama阅读 38,043评论 3 399
      • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
        开封第一讲书人阅读 36,694评论 0 258
      • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
        沈念sama阅读 42,671评论 1 300
      • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
        茶点故事阅读 35,670评论 2 321
      • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
        茶点故事阅读 37,779评论 1 332
      • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
        沈念sama阅读 33,424评论 4 321
      • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
        茶点故事阅读 39,027评论 3 307
      • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
        开封第一讲书人阅读 29,984评论 0 19
      • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
        开封第一讲书人阅读 31,214评论 1 260
      • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
        沈念sama阅读 45,108评论 2 351
      • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
        茶点故事阅读 42,517评论 2 343

      推荐阅读更多精彩内容

      • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
        苏黎九歌阅读 13,733评论 0 38
      • [if !supportLists]1.1.1[endif]安装环境 redis是C语言开发,安装redis需要先...
        三万_chenbing阅读 574评论 0 1
      • 1月1日,特别的日子特别的时刻一群积极进取的小伙伴以及闺蜜相聚平安晖阳部,感谢重阳姐大爱邀约和大咖大头教练大爱分享...
        蒙拉丽莎的微笑阅读 328评论 0 0
      • 上次说到了,现在的app多如牛毛,而安装了太多应用,手机会提示内存不足。很多音乐的版权分属于不同的播放器,如果一个...
        冷藏幻想阅读 226评论 0 1
      • 我已入梦 梦里千帆逐波 浑浑噩噩的人生 无语向谁诉说 我已清醒 晨光优柔洒落 坎坎坷坷的日子 重复不停的过 我已成...
        我是深海精灵阅读 176评论 0 0