一、核心技术
1、Web层
1>servlet:前端控制器
2>html :视图
3>Filter :过滤器–>解决乱码问题
4>BeanUtil:数据封装
5>Jackson:json序列化工具,ajax一步提交表单,完成校验
2、Service层
1>Javamail:java发送邮件工具
2>Redis:NoSQL内存数据库
3>Jedis:Java的redis客户端
3、Dao层
1>MySQL:数据库
2>Druid:数据库连接池
3>JDBCTmplate:jdbc的工具
二、项目核心需求
注册:
1、密码、用户名、邮箱、验证码等的校验
2、需要给正在注册的客户发一封激活邮件,用户在邮箱点击激活后,账户才能被激活(激活实际上就是将用户表中的用户状态改成已被激活状态)
登录
1、查看用户是否存在
2、查看用户状态是否是已激活状态
3、查看用户名和密码以及验证码是否匹配
4、登陆成功跳转至登陆成功的页面
5、登录不成功则给出不同的错误信息
6、进入页面以后,页面上面会展示一个带着用户名的欢迎信息
退出
1、销毁Session—>getSession.invalidate()
2、跳转到登录页面
分类数据的展示
即显示以下页面
旅游路线的分页展示
根据id查询不同的旅游路线
旅游线路名称查询
旅游的详情页展示
三、技术实现
注册
分析如下:
技术:
1、使用ajax异步提交表单,在提交表单之前先校验各个注册信息是否正确,用正则表达式来校验,如密码是否少于八位,邮箱格式是否正确等
2、假设出现输入的密码位数不符合标准或者邮箱格式不正确等错误,则直接让输入框边框变成红色,在这里校验的时候调用CSS,假设不正确将边框调成红色,正确则返回true即可
3、设置响应头,假设注册时输入的所有信息符合要求但中间出现一些其他错误,设置一个响应头,让响应头输出相应错误信息
登录
分析如下
登录这一块其实整个都是与数据库的交互,只要掌握JDBC编程以及servlet的交互就可以很好处理这一块功能
退出
我们想要的效果是点击退出,直接退到登录页面再次退回到之前登陆完成的页面内时不会由之前账户的信息,这个是就是需要销毁Sesson,所以只需要调用Session’中的getSession.invalidate()这个方法,让Session自杀即可
分页信息的展示
分析如下
因为所有页面都是用html来做的,不能直接从servlet域直接获取数据,所以表单提交都是要用异步提交的方式来提交,这里解释一个问题,就是为什么只用htm而不用jsp,因为这是一个面向用户的页面,响应必须要快,而html要比jsp的响应快很多所以这选择了html做整个功能实现
因为每一次查看数据的时候都会重新申请查看数据,对数据库的压力十分大,所以需要对数据库这一块进行优化,选择用redis来进行优化,分析过程如下
而我希望存储的顺序就是将来访问的顺序,所以选择用了redis中的sortedset,这个时候需要先获取jedis来管理redis,具体是实现在这里我附上部分的代码
public List<Category> findAll() {
//1.从redis中查询
//1.1获取jedis客户端
Jedis jedis = JedisUtil.getJedis();
//1.2可使用sortedset排序查询
Set<String> categorys = jedis.zrange("category", 0, -1);
List<Category> cs = null;
//2.判断查询的集合是否为空
if (categorys == null || categorys.size() == 0) {
System.out.println("从数据库查询....");
//3.如果为空,需要从数据库查询,在将数据存入redis
//3.1 从数据库查询
cs = categoryDao.findAll();
//3.2 将集合数据存储到redis中的 category的key
for (int i = 0; i < cs.size(); i++) {
jedis.zadd("category", cs.get(i).getCid(), cs.get(i).getCname());
}
} else {
System.out.println("从redis中查询.....");
//4.如果不为空,将set的数据存入list
cs = new ArrayList<Category>();
for (String name : categorys) {
Category category = new Category();
category.setCname(name);
cs.add(category);
}
}
return cs;
}
中间步骤
减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
根据id查询不同的路线
这一块也是数据库交互问题
旅游详情页
旅游的收藏功能
当页面加载完成后,发送ajax请求,获取用户是否收藏的标记
根据标记,展示不同的按钮样式
至此这个项目就完结
项目源码:
https://github.com/Fancccy/TravelWeb