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文件