项目介绍:仿黑马旅游网,项目不是用maven构建的项目,数据库连接池使用的是c3p0不是druid,操作操作sql用的不是jdbcTemplate而是Apache的DBUtlis工具,json工具用的是阿里的fastjson,redis并没有用到,后期学习了但是,确实不错!后期对项目进行了完善,其实只要认真学完了黑马教程的这期案例,尽管黑马教程后面没有完善,但是自己实现并不困难,后期所有的分析设计都和前面的大同小异。
我的完善:
index.html
人气旅游最新旅游主题旅游的完善
国内游(境外游差别不大没有展示)
对导航栏下的出境游、抱团定制、全球自由行进行了数据的填充
( 这些数据的来源都是利用python爬虫从第三方网站爬取所获得的,非手动写入数据库而来的。)
收藏排行榜、收藏排行榜下的线路名称、金额搜索特定功能的实现
我的收藏
项目总结
设计模式
- 三层架构
前端 html 后台servlet 前端和后台的交互ajax异步技术
视图层(web层) 业务逻辑层(service层) 访问层(dao层)
注册模块
-
前端完成表单格式的校验,利用Regexp进行格式的校验比如用户名长度特殊字符邮箱的命名格式等,并且为每个input组件绑定onblur监听事件若格式不合法及时提示,序列化表单进行ajax异步提交。
-
序列化$(form).serialize():input组件必须要有name属性,序列化实质是将表单转化为形似json格式的数据,后台提取的时候也很方便利用request.getParameterMap Map<String, String[]>然后教程里面用的BeanUtils.populate(Bean,HashMap)进行的封装。
-
激活邮件发送的实现:qq邮箱授权码的获取 进入个人QQ邮箱首页选择设置—账户
- 开启账户下的pop3和smtp服务,需要用手机发送一条信息到指定的号码之后就可以获取到授权码。
Filter实现用户自动登录(AutoLoginFilter)
private IUserDao userDao = null;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession();
UserBean user = (UserBean) session.getAttribute("user");
Cookie cookie = null;
if (user == null) {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if (c.getName().equals("AUTO_LOGIN")) {
cookie = c;
}
}
}
}
if (cookie != null) {
String[] userInfo = cookie.getValue().split("-");
UserBean u = userDao.findByUserNameAndPwd(userInfo[0], userInfo[1]);
if (u != null) {
session.setAttribute("user", u);
}
}
chain.doFilter(request, resp);
}
public void init(FilterConfig config) throws ServletException {
userDao = new UserDaoImpl();
}
注意点:session一次会话有效,一次会话指的是从浏览器的打开到关闭,自动登录逻辑就是利用客户端浏览器可以存放cookie的这一特性;首先判断当前session中是否有user,如果有说明用户已经登录用户的信息可以直接从session中获取;如果没有那么cookie就发挥作用了,判断本地cookie是否保存了用户的信息,如果保存了,利用dao层的相关方法对用户名密码进行判断,合法后存入session,自动登录完成。
chain.doFilter()请求和响应的分界线,doFilter之前可以对请求进行处理,之后可以对响应进行处理
分页功能的实现(仿百度前五后四)
// 1.1 处理页码 先处理两端然后再处理中间
var pn = '<li><a href="javascript:load(1)">首页</a></li>\n';
if (curPage - 1 < 1) {
pn += '<li οnclick="javascript:load(1)" class="threeword"><a href="javascript:;">上一页</a></li>';
} else {
pn += '<li οnclick="javascript:load('+(curPage-1)+')" class="threeword"><a href="javascript:;">上一页</a></li>';
}
// 1.2 前五后四 页面逻辑
var begin;
var end;
if (data.totalPage < 10)