此旅游网项目是前端和后台交互实现的。
它的功能:
(1)注册功能
(2)登录功能
(3)退出功能
(4)分类数据的展示
(5)旅游路线的分页展示
(6)旅游路线的名称查询
(7)旅游线路的详情展示
(8)旅游线路的收藏功能
===========================================================
技术分层:
将其分为三层,
1.Web层
2.Service层
3.Dao层
Web层调用Service层,Service调用Dao层。
Web层:
(1)Servlet:前端控制器
(2)Filter:过滤器,防止全局乱码
(3)html:视图
(4)BeanUtils:数据封装
(5)Jackson:json序列化工具
Service层:
(1)Javamail:java发送邮件工具
(2)Redis:nosql内存数据库
(3)Jedis:java的redis客户端
Dao层:
Mysql:数据库
Druid:数据库连接池
JdbcTemplate:jdbc的工具
===========================================================
本次项目用到了六张表
(1)tab_category
(2)tab_favorite
(3)tab_route
(4)tab_route_img
(5)tab_seller
(6)tab_user
表与表之间的关系如下图所示:
首先将六张表在数据库中建立起来
然后向表中插入数据
数据库里的表以及数据对应类及其属性,因此我们在entity中建立如下的实体类:
(1)Category:路线类型
(2)Favourite:收藏的路线
(3)PageBean:分页对象
(4)ResultInfo:登录返回信息
(5)Route:路线信息
(6)RouteImg:路线图片
(7)Seller:销售者
(8)User:用户
此项目中,我们需要提供一个工具的包
因此提供了以下的工具:
JDBCUtils:
1. 声明静态数据源成员变量
2. 创建连接池对象
3. 定义公有的得到数据源的方法
4. 定义得到连接对象的方法
5. 定义关闭资源的方法
JedisUtil:Jedis工具类
MailUtils: 发邮件的工具类
Md5Util:使用Md5消息摘要算法,将明文加密为密文。
UuidUtil:产生UUID随机字符串工具类
接下来我们就要一步一步去实现具体的功能。
1.注册功能
(1).注册页面:根据验证规则进行表单验证
(2).注册成功页面(注册成功跳转到的页面)
在此使用异步提交表单是为了获取服务器响应的数据。因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据
//页面载入事件
$(function () {
//当表单提交时,每一个方法都要校验一下
$("#registerForm").submit(function(){
//1.发送数据到服务器
//当表单提交时,每一个方法都要校验一下
if(checkUsername() && checkPassword() && checkEmail()){
//校验通过,发送ajax请求,提交表单的数据 username=zhangsan&password=123
$.post("user/regist",$(this).serialize(),function(data){
//处理服务器响应的数据 data {flag:true,errorMsg:"注册失败"}
if(data.flag){
//注册成功,跳转成功页面
location.href="register_ok.html";
}else{
//注册失败,给errorMsg添加提示信息
$("#errorMsg").html(data.errorMsg);
}
});
}
//2.不让页面跳转
return false;
//如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
});
注意:验证码存到session中 ,对比前端输入的验证码和后端输入的验证码。
然后我们就进行具体的后台代码的编写,具体的源码请看github链接。
2.邮件激活
第一步:接收激活码
若激活成功,跳转到登录页面:login.html
然后通过Jquery-ajax后台服务器发送异步请求
$.post(“loginServlet”,表单中的数据序列化成字符串)
则需要在对应的后台写对应的逻辑
3.发送邮件
(1).申请邮箱
(2).开启授权码
(3).在MailUtils中设置自己的邮箱账号和密码(授权码)
4.登录
LoginServlet中的编写代码的步骤:
(1)获取数据(用户名,密码)
(2)封装User对象
(3)调用Service进行查询
(4)判断用户是否激活
(5)判断用户是否登录成功
5.在我们还未处理接下来的步骤时,index页面中提示的用户姓名是一个固定的Admin,现在我们想将他变为动态的,谁登录,就显示谁的名字,因此我们将其变为动态的
$(function () {
//直接发送一个异步get提交
$.get("user/findUser",{},function (data) {
//接收服务器响应过来的User姓名{uid:xx,username:xx,password:xx,name=' '},替换成动态的
var msg = "欢迎回来,"+data.name;
$("#span_username").html(msg); //将msg绑定
});
5.退出
一旦登录,session中就有user对象。
实现步骤:
1.访问servlet,将session销毁
2.跳转到登录页面
request.getSession().invalidate(); //销毁session
6.然后我们观察:
发现每一个功能都对应一个Servlet,Servlet量太大,并且很繁琐,因此,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
如下图所示
首先建一个基类BaseServlet,让他继承HttpServlet
然后让抽取出来的用户模块和分类模块继承它。
在BaseServlet中完成方法的分发。
在模块中完成相应的方法,完成后不要忘了在页面中修改路径。
7.分类数据的展示
Servlet调用Service,Service调用Dao
分类的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,而且分类的数据不会经常产生变化,所有在此使用redis来缓存这个数据。提高了数据访问的效率。
8.旅游线路的分类展示
旅游线路表和分类表时一个多对一的关系
从redis中查询。
9.旅游线路的详情展示
当页面加载时,发送ajax请求,查询Route对象
10.旅游线路的收藏功能
当页面加载完成后,发送ajax请求,获取用户是否收藏的标记
根据标记,展示不同的按钮样式
结果:
总结:此次项目代码量较大,借鉴了很多原有的图片,数据等资源,一开始遇到了很多困难,通过与老师探讨和查阅资料慢慢的解决了,此项目最有特色的地方就是抽取,一开始,每一个方法对对应了一个Servlet,导致Servlet量很大,后来将其抽取为一个模块对应一个Servlet.
源码请看github链接:https://github.com/zhdfuture/TravelProgram