黑马旅游网(二)
- 1.实现的功能和用到的技术
- 1.1实现的功能
- 1.2用到或者涉及到的技术
- 2. 根据文档配置环境
- 3.简单的对项目进行解释
- 3.1简单通俗的讲解后端
- 3.2简单通俗的讲解前端:
- 3.3以分页详细通俗的解释
- 3.3.1数据库分析
- 3.3.2后端分析
- 3.3.3前端分析
- 3.3.4 整体讲解步骤,
- 4.简单的优化
1.实现的功能和用到的技术
1.1实现的功能
用户相关:用户注册+用户登陆+用户退出+用户激活
路线相关:分页查询+旅游线路的详细信息+用户收藏
1.2用到或者涉及到的技术
html+css+jq+Maven+redis+mysql+java+bootstarp+ajax
2. 根据文档配置环境
文档基本都讲解了配置pom,我连接的基本和详解相似,只是我的mysql驱动的
所以需要修改
我用的是8085端口,也需要自己改
基本修改的就这些
3.简单的对项目进行解释
3.1简单通俗的讲解后端
domain层:就是封装类,把信息一个个的封装成类。
dao层:就是提取数据库存的信息,里面的接口就是简单的介绍下功能,然后类实现它的方法,写接口的目的在于更加模块化开发,增加耦合度。然后根据domain封装的类,把查询的数据存到类里面。
service层:根据需求对dao层取到的东西进行整理。
util层:一些封装的工具
servlet层:把后端数据转成json传到前端。
3.2简单通俗的讲解前端:
前端主要的功能就是把后端提取到的数据通过ajax动态的显示在页面上。
3.3以分页详细通俗的解释
主要讲解国内游的分页实现:
这个其实是第一阶段的内容,我主要以第一阶段的进行详细的讲解:
只实现分页,并未实现搜索,
根据图片所示:
我们要进行分页,首先需要知道总的记录数,总页数,当前页,每页展示的条数。然后把查到的数据用List集合储存,通过servlet传到前端,再由前端进行数据拼接显示。
3.3.1数据库分析
主要用到:
3.3.2后端分析
首先从数据库提取数据,首先用来封装类的文件domain下的PageBean这个类,`
/**
* 分页对象
*/
public class PageBean<T> {
private int totalCount;//总记录数
private int totalPage;//总页数
private int currentPage;//当前页码
private int pageSize;//每页显示的条数
private List<T> 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 getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
dao层
public class RouteDaoImpl implements RouteDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public int findTotalCount(int cid) {
String sql = "select count(*) from tab_route where cid = ?";
return template.queryForObject(sql,Integer.class,cid);
}
@Override
public List<Route> findByPage(int cid, int start, int pageSize) {
String sql = "select * from tab_route where cid = ? limit ? , ?";
return template.query(sql,new BeanPropertyRowMapper<Route>(Route.class),cid,start,pageSize);
}
}
Route类就是把tab_route数据库进行的封装类。
service层
public class RouteServiceImpl implements RouteService {
private RouteDao routeDao = new RouteDaoImpl();
@Override
public PageBean<Route> pageQuery(int cid, int currentPage, int pageSize) {
//封装PageBean
PageBean<Route> pb = new PageBean<Route>();
//设置当前页码
pb.setCurrentPage(currentPage);
//设置每页显示条数
pb.setPageSize(pageSize);
//设置总记录数
int totalCount = routeDao.findTotalCount(cid);
pb.setTotalCount(totalCount);
//设置当前页显示的数据集合
int start = (currentPage - 1) * pageSize;//开始的记录数
List<Route> list = routeDao.findByPage(cid,start,pageSize);
pb.setList(list);
//设置总页数 = 总记录数/每页显示条数
int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize :(totalCount / pageSize) + 1 ;
pb.setTotalPage(totalPage);
return pb;
}
}
里面调用了dao层的方法,返回的pb拥有当前页码,每页显示条数,
总记录数,当前页显示的数据集合,设置总页数
service层:
public void pageQuery(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接受前端传过来的参数
String currentPageStr = request.getParameter("currentPage");
String pageSizeStr = request.getParameter("pageSize");
String cidStr = request.getParameter("cid");
int cid = 0;//类别id
//2.处理参数
if(cidStr != null && cidStr.length() > 0){
cid = Integer.parseInt(cidStr);
}
int currentPage = 0;//当前页码,如果不传递,则默认为第一页
if(currentPageStr != null && currentPageStr.length() > 0){
currentPage = Integer.parseInt(currentPageStr);
}else{
currentPage = 1;
}
int pageSize = 0;//每页显示条数,如果不传递,默认每页显示5条记录
if(pageSizeStr != null && pageSizeStr.length() > 0){
pageSize = Integer.parseInt(pageSizeStr);
}else{
pageSize = 5;
}
//3. 调用service查询PageBean对象
PageBean<Route> pb = routeService.pageQuery(cid, currentPage, pageSize);
//4. 将pageBean对象序列化为json,返回
writeValue(pb,response);
}
writeValue是封装的方法。
最后把pb用ajax传到前端动态的显示在页面上
整体来说后端做的工作就是接受前端发送的参数,然后进行查询出信息,用json的格式返回给前端
3.3.3前端分析
主要是对route_list.html进行分析
主要对js进行讲解:
$(function () {
var search = location.search;
//alert(search);//?id=5
// 切割字符串,拿到第二个值
var cid = search.split("=")[1];
//当页码加载完成后,调用load方法,发送ajax请求加载数据
load(cid);
});
function load(cid ,currentPage){
//发送ajax请求,请求route/pageQuery,传递cid
$.get("route/pageQuery",{cid:cid,currentPage:currentPage},function (pb) {
console.log(pb)
//解析pagebean数据,展示到页面上
//1.分页工具条数据展示
//1.1 展示总页码和总记录数
$("#totalPage").html(pb.totalPage);
$("#totalCount").html(pb.totalCount);
/*
<li><a href="">首页</a></li>
<li class="threeword"><a href="#">上一页</a></li>
<li class="curPage"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li><a href="#">6</a></li>
<li><a href="#">7</a></li>
<li><a href="#">8</a></li>
<li><a href="#">9</a></li>
<li><a href="#">10</a></li>
<li class="threeword"><a href="javascript:;">下一页</a></li>
<li class="threeword"><a href="javascript:;">末页</a></li>
*/
var lis = "";
var fristPage = '<li οnclick="javascipt:load('+cid+')"><a href="javascript:void(0)">首页</a></li>';
//计算上一页的页码
var beforeNum = pb.currentPage - 1;
if(beforeNum <= 0){
beforeNum = 1;
}
var beforePage = '<li οnclick="javascipt:load('+cid+','+beforeNum+')" class="threeword"><a href="javascript:void(0)">上一页</a></li>';
lis += fristPage;
lis += beforePage;
//1.2 展示分页页码
/*
1.一共展示10个页码,能够达到前5后4的效果
2.如果前边不够5个,后边补齐10个
3.如果后边不足4个,前边补齐10个
*/
// 定义开始位置begin,结束位置 end
var begin; // 开始位置
var end ; // 结束位置
//1.要显示10个页码
if(pb.totalPage < 10){
//总页码不够10页
begin = 1;
end = pb.totalPage;
}else{
//总页码超过10页
begin = pb.currentPage - 5 ;
end = pb.currentPage + 4 ;
//2.如果前边不够5个,后边补齐10个
if(begin < 1){
begin = 1;
end = begin + 9;
}
//3.如果后边不足4个,前边补齐10个
if(end > pb.totalPage){
end = pb.totalPage;
begin = end - 9 ;
}
}
for (var i = begin; i <= end ; i++) {
var li;
//判断当前页码是否等于i
if(pb.currentPage == i){
li = '<li class="curPage" οnclick="javascipt:load('+cid+','+i+')"><a href="javascript:void(0)">'+i+'</a></li>';
}else{
//创建页码的li
li = '<li οnclick="javascipt:load('+cid+','+i+')"><a href="javascript:void(0)">'+i+'</a></li>';
}
//拼接字符串
lis += li;
}
var nextNum = pb.currentPage + 1;
if(nextNum >= 103){
nextNum = 103;
}
var nextPage = '<li οnclick="javascipt:load('+cid+','+nextNum+')" class="threeword"><a href="javascript:void(0)">下一页</a></li>';
var lastPage = '<li οnclick="javascipt:load('+cid+','+pb.totalPage+')"><a href="javascript:void(0)">末页</a></li>';
lis += nextPage;
lis += lastPage;
/* for (var i = 1; i <= pb.totalPage ; i++) {
var li;
//判断当前页码是否等于i
if(pb.currentPage == i){
li = '<li class="curPage" οnclick="javascipt:load('+cid+','+i+')"><a href="javascript:void(0)">'+i+'</a></li>';
}else{
//创建页码的li
li = '<li οnclick="javascipt:load('+cid+','+i+')"><a href="javascript:void(0)">'+i+'</a></li>';
}
//拼接字符串
lis += li;
}*/
//将lis内容设置到 ul
$("#pageNum").html(lis);
/*
<li>
<div class="img"><img src="images/04-search_03.jpg" alt=""></div>
<div class="text1">
<p>【减100元 含除夕/春节出发】广州增城三英温泉度假酒店/自由行套票</p>
<br/>
<p>1-2月出发,网付立享¥1099/2人起!爆款位置有限,抢完即止!</p>
</div>
<div class="price">
<p class="price_num">
<span>¥</span>
<span>299</span>
<span>起</span>
</p>
<p><a href="route_detail.html">查看详情</a></p>
</div>
</li>
*/
//2.列表数据展示
var route_lis = "";
for (var i = 0; i < pb.list.length; i++) {
//获取{rid:1,rname:"xxx"}
var route = pb.list[i];
var li = '<li>\n' +
' <div class="img"><img src="'+route.rimage+'" style="width: 299px;"></div>\n' +
' <div class="text1">\n' +
' <p>'+route.rname+'</p>\n' +
' <br/>\n' +
' <p>'+route.routeIntroduce+'</p>\n' +
' </div>\n' +
' <div class="price">\n' +
' <p class="price_num">\n' +
' <span>¥</span>\n' +
' <span>'+route.price+'</span>\n' +
' <span>起</span>\n' +
' </p>\n' +
' <p><a href="route_detail.html">查看详情</a></p>\n' +
' </div>\n' +
' </li>';
route_lis += li;
}
$("#route").html(route_lis);
//定位到页面顶部
window.scrollTo(0,0);
});
}
这个是直接执行函数里面有个load方法直接执行了
详细讲解load里面的内容:
第一部分:
通过ajax把cid和currentPage传到后端,然后获取后端发送到前端的pb,
把总页码和总记录数显示到页面上
这个就是页面的,对应HTML就是
通过id动态生成的
第二部分:这个是原来的html页面我现在要动态生成这个页面。
如代码所示:
····首先第一部分
动态设置上一页和首页
···首页:只传了cid ,根据RouteServlet可以得到currentPage = 1 ,pageSize等于5,所以查询到的是首页的
···上一页:把currentPage-1,然后就查询到了上一页。
一共展示10个页码,能够达到前5后4的效果
2.如果前边不够5个,后边补齐10个
3.如果后边不足4个,前边补齐10个
具体的代码逻辑注释已经写好,
这个就是把当前页数设置class
下一页和末页我也优化了
页面展示
这是我获取到的pb,然后根据List动态加到页面上。
然后添加到ul里面
每一次点击就可以在后端把数据分类好。然后动态显示到页面上。
3.3.4 整体讲解步骤,
当前页为第2页
传的cid 和 2
发送ajax 路径为route/pageQuery对应
···RouteServlet
然后调用service层RouteServiceImpl的pageQuery方法
里面调用的是dao层的RouteDaoImpl里的findTotalCount,findByPage方法
然后查询到数据。
4.简单的优化
1.登陆时需要验证码
2.修复了一些bug
3.下页和末页完善了
更多推荐
Java web - 黑马旅游网(加使用文档总结)
发布评论