
目录
源码我已放到github上了,在此文档下方
第一步:导入
第二步:试运行
第三步:技术选项
1. web层
1. service层
1. dao层
第四步:创建数据库
第五步:功能编写
发送邮件功能
编写baseServlet
将提示信息抽取到一个RouteInfo类中
分页展示:将后端分页数据抽取到PageBean中,前台仿百度左5右4的原则展示
收藏排行榜:
首先更新收藏表的count列
获取PageBean对象
我的收藏
热门排行榜
首页真实数据填充
人气旅游
最新旅游
国内游
境外游
源码链接
源码我已放到github上了,在此文档下方 第一步:导入
项目所需maven坐标
工具类
静态页面
本项目所需依赖坐标如下
junit junit3.8.1 test javax.servlet javax.servlet-api3.1.0 provided mysql mysql-connector-java8.0.23 compile com.alibaba druid1.0.9 org.springframework spring-core5.0.0.RELEASE compile org.springframework spring-jdbc5.0.0.RELEASE compile org.springframework spring-tx5.0.0.RELEASE compile org.springframework spring-beans5.0.0.RELEASE compile commons-logging commons-logging1.1.1 compile commons-beanutils commons-beanutils1.9.2 compile com.fasterxml.jackson.core jackson-databind2.3.3 com.fasterxml.jackson.core jackson-core2.3.3 com.fasterxml.jackson.core jackson-annotations2.3.3 javax.mail javax.mail-api1.5.6 com.sun.mail javax.mail1.5.3 redis.clients jedis2.7.0 junit junit4.13.1 test
该项目的结构如下
在导入maven坐标的时候要注意,自己电脑上是否有本地仓库,配置文件里是否设置了中央仓库地址
找到conf个目录里的settings.xml文件设置即可
设置本地仓库路径
在
第二步:试运行
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
配置tomcat启动配置
第三步:技术选项 1. web层1. service层Servlet:前端的控制器,前后端交互必备
html:视图
Filter:过滤器
BeanUtils:封装数据
Jackson:json序列化工具,实现异步交互
1. dao层Javamail:java发送邮件工具
Redis:nosql内存数据库
Jedis:java的redis客户端
第四步:创建数据库Mysql:数据库
Druid:数据库连接池
JdbcTemplate:jdbc的工具
sql语句我也放到github上了需要自行去取
第五步:功能编写这里我主要介绍一下部分功能要点,需要源码的,直接在文档底部找到github链接进去获取即可
发送邮件功能一定要在MailUtils工具类中填写正确的授权码
授权码获取方式如下:QQ邮箱
点击设置 --> 账户 找到如图所示的服务开启即可
编写baseServlet继承HttpServlet重写service方法
目的:简化Servlet的数量
//重写HttpServlet中的服务方法(service方法),用于接收用户的请求用反射技术分发不同功能的方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("baseServlet被执行了!!!");
//1.获取请求路径
String requestURI = req.getRequestURI(); ///travel/user/add
//System.out.println(requestURI);
//2.获取方法名称 /user/add
String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1); //add
//System.out.println(methodName);
try {
//谁调用的当前方法this就是谁
// System.out.println(this); //cn.itcast.travel.web.servlet.UserServlet@7dd86009
//3.使用反射技术调用方法,不要使用忽略权限修饰符的方法
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//4.执行方法,不要使用暴力反射
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
将提示信息抽取到一个RouteInfo类中
public class ResultInfo implements Serializable {
private boolean flag;//后端返回结果正常为true,发生异常返回false
private Object data;//后端返回结果数据对象
private String errorMsg;//发生异常的错误消息
//无参构造方法
public ResultInfo() {
}
public ResultInfo(boolean flag) {
this.flag = flag;
}
public ResultInfo(boolean flag, String errorMsg) {
this.flag = flag;
this.errorMsg = errorMsg;
}
public ResultInfo(boolean flag, Object data, String errorMsg) {
this.flag = flag;
this.data = data;
this.errorMsg = errorMsg;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
分页展示:将后端分页数据抽取到PageBean中,前台仿百度左5右4的原则展示
PageBean代码如下:
package cn.itcast.travel.domain; import java.util.List; public class PageBean{ private int totalCount; //总记录数 private int totalPage; //总页码 private int pageSize; //每页显示的条数 private int currentPage; //当前页码 private List list; //数据集合 public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public List getList() { return list; } public void setList(List list) { this.list = list; } }
前台展示关键代码如下:
//计算循环的开始和结束索引
var begin; //开始索引
var end; //结束索引
//计算开始索引值
//要显示10个页码
if(pb.totalPage < 10){
//总页码不足10页
begin = 1;
end = pb.totalPage;
} else {
//总页码超过10页,左5右4
begin = pb.currentPage - 5; //开始页码 = 当前页码 - 5个页码
end = pb.currentPage + 4;
//如果前边不够5个则后边补齐10个
//减去5个页码之后如果开始索引小于1了,那么开始索引就从1开始,结束位置就从10开始
if (begin < 1){
begin = 1;
end = begin + 9; //补齐后边9个
}
//如果后边不够5个则前边补齐10个
//如果结束位置加上4个页码后大于总页码了,那么开始位置就要补齐10个,结束位置就等于总页码
if(end > pb.totalPage){
end = pb.totalPage;
begin = end - 9; //补齐前边10个
}
}
收藏排行榜:
RouteServlet中的favoriteRank代码如下
public void favoriteRank(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String currentPageStr = request.getParameter("currentPage");
String pageSizeStr = request.getParameter("pageSize");
//2.将获取到的值转为int类型
int pageSzie;
if(pageSizeStr != null && pageSizeStr.length() > 0){ //非空验证
pageSzie = Integer.parseInt(pageSizeStr);
} else {
pageSzie = 8;
}
int currentPage;
if(currentPageStr != null && currentPageStr.length() > 0 ){ //非空验证
currentPage = Integer.parseInt(currentPageStr);
} else {
currentPage = 1;
}
Map parameterMap = request.getParameterMap(); //获取模糊查询参数
PageBean pageBean = routeService.findRouteByCount(currentPage,pageSzie,parameterMap);
//将获取到的pageBean对象数据序列化为json发送到前台
writevalue(pageBean,response);
}
首先更新收藏表的count列
我的思路是:查询tab_favorite获得rid封装到类型为Route的list集合当中
FavoriteDao代码如下
public ListgroupRid() { String sql = "SELECt f.`rid`,COUNT(*) count FROM tab_favorite f WHERe f.`rid` = rid GROUP BY rid"; List query = jdbcTemplate.query(sql, new BeanPropertyRowMapper (Route.class)); return query; }
RouteDao代码如下
public void updateRouteCount(List获取PageBean对象routes) { String sql = "update tab_route set count = ? where rid = ?"; for (int i = 0; i < routes.size(); i++) { jdbcTemplate.update(sql,routes.get(i).getCount(),routes.get(i).getRid()); } }
RouteService代码如下
public PageBeanfindRouteByCount(int currentPage, int pageSzie, Map parameterMap) { //创建PageBean对象 PageBean pageBean = new PageBean<>(); //向pageBean添加现有数据 pageBean.setCurrentPage(currentPage); pageBean.setPageSize(pageSzie); //获取总记录数 int totalCount = routeDao.findTotalCount(parameterMap); //计算开始索引 int start = (currentPage -1) * pageSzie; List dataByPage = routeDao.findDataByPage(start, pageSzie, parameterMap); //计算总页码 int totalPage = totalCount % pageSzie == 0 ? totalCount / pageSzie : (totalCount / pageSzie) + 1; //向pageBean中添加获取到的数据 pageBean.setTotalPage(totalPage); pageBean.setTotalCount(totalCount); pageBean.setList(dataByPage); return pageBean; }
RouteDao代码如下
@Override
public int findTotalCount(Map parameterMap) {
String sql = "select count(*) from tab_route where count > 0";
StringBuilder sb = new StringBuilder(sql);
List
我的收藏
关键代码如下
@Override
public PageBean myFavorite(int uid, int currentPage, int pageSize) {
//1.创建PageBean对象
PageBean pageBean = new PageBean<>();
//添加现有数据到pageBean中
pageBean.setCurrentPage(currentPage);
pageBean.setPageSize(pageSize);
//2.调用FavoriteDao中的findRidByUid方法
List rids = favoriteDao.findRidByUid(uid);
if(rids == null){ //如果线路id集合为空,则直接返回null
return null;
}
int totalCount = routeDao.findTotalCount(rids);
//计算开始位置
int start = (currentPage - 1) * pageSize;
//3.获得route对象数据集合
List routes = routeDao.gainRoutes(rids,start,pageSize);
//4.计算总页码
int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : (totalCount / pageSize) + 1;
//5.向PageBean中添加数据
pageBean.setTotalPage(totalPage);
pageBean.setList(routes);
pageBean.setTotalCount(totalCount);
return pageBean;
}
热门排行榜
查询收藏次数降序排列后的前五条记录
关键代码如下
public List首页真实数据填充findRouteByCid(int cid) { List routes = null; try { String sql = "SELECt * FROM tab_route WHERe cid = ? ORDER BY COUNT DESC LIMIT 5"; routes = jdbcTemplate.query(sql, new BeanPropertyRowMapper (Route.class), cid); } catch (DataAccessException e) { } return routes; }
主题旅游关键代码如下
@Override
public List findThemeTop4() {
String parameter = "%佛%";
List routes = null;
try {
String sql = "SELECt * FROM tab_route WHERe rname like ? ORDER BY COUNT DESC LIMIT 4";
routes = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Route.class), parameter);
} catch (DataAccessException e) {
}
return routes;
}
人气旅游
查询收藏次数降序排列后的前4条记录
最新旅游查询上架时间降序排列后的前4条记录
国内游查询route表的cid=5的记录6条即可
境外游查询route表的cid=4的记录6条即可
源码链接
https://github.com/520study520/heima_travel
我的这些思路和作品可能有很多不足,望大家在评论区指点一下我!!!感谢Thanks♪(・ω・)ノ
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)