【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)

简介: 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)

3.6.6 轮播图的基本实现

上一节中,轮播图已经做了一大半,我今天上午抽空把剩下的代码写完了。现在就大概说一下思路吧。

实现上一张和下一张的效果,基本上就是改变ul的margin-left值。为了保证无缝滚动,我们需要在5张图片的首部和尾部各加一张图片。像这样:

<ul>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="5.jpg "/>
    </a>
  </li>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="1.jpg "/>
    </a>
  </li>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="2.jpg "/>
    </a>
  </li>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="3.jpg "/>
    </a>
  </li>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="4.jpg "/>
    </a>
  </li>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="5.jpg "/>
    </a>
  </li>
  <li class='fl'>
    <a href="javascript:void(0)">
       <img src="1.jpg "/>
    </a>
  </li>
</ul>


接下来,编写移动图片的方法,为了控制下一张和上一张,我们定义一个索引变量index就可以啦。

var index = 0;

获取图片的宽度的数量

var imgwidth = $('.banner .content ul li').width(); //获取轮播图片的宽度
var len =  $('.banner .content ul li').length - 2//获取总共的图片数量

移动图片的方法

function movePicture(){
  $('.banner .content ul').animate({'margin-left':-imgwidth * (index+1)},1000,function(){
    if(index == len){
      $(this).css('masrgin-left',-imgwidth);
      index = 0;
    }
    if(index == -1){
      $(this).css('margin-left',-imgwidth * len);
      index = len - 1;
    }
  });
}


最后,给按钮绑定事件:

rightBtn.on('click',function(){
  index ++;
  movePicture();
});
leftBtn.on('click',function(){
  index --;
  movePicture();
});


3.6.7 按钮的节流控制

接下来要做一个简单的前台节流,意思就是说,如果有用户闲得无聊,在那拼命的点击下一张的按钮,那么每一次点击都会触发movePicture函数,这个时候,你就会看到图片在那乱跳。


所以,为了避免这种用户的操作,我们需要用js来做一个节流,额,好像是叫节流。我记不太清了。意思就是说,比如你在一秒钟内连续点击了8次,那么我就认为这8次中只有1次是有效的,其他的点击都是误操作。


这样的话,无论你怎么狂点鼠标,我都只调用一次movePicture函数。


首先,我们定义一个空的定时器。


var timer = null; 

思路为:

每当我触发按钮的点击事件,就把当前的定时器timer清零,然后又马上给他设置定时内容,比如500毫秒后才进行移动操作。也就是说,如果你狂点鼠标,那么定时器就会被马上清零,然后进入定时器的等待状态。必须要等你满了500毫秒,才进行下面的操作。


原理就是这么简单,这个方式也经常用于登陆按钮上。比如,当你网速很慢的时候,点击登陆,网页没有立即给你跳转页面。有些用户闲着无聊,就在那狂点鼠标,不知道你有没有这么做过呢?


如果没有做好节流,那么就会有大量的请求传递到服务器,会给服务器造成很大的压力。


差不多就是这个意思,上代码:


rightBtn.on('click',function(){
  clearTimeout(timer); //定时器清零
  timer = setTimeout(function(){
    index ++;
    movePicture();
  },500);
});
leftBtn.on('click',function(){
  clearTimeout(timer); //定时器清零
  timer = setTimeout(function(){
    index --;
    movePicture();
  },500);
});


不论我鼠标怎么狂点,它每次都只移动一张图片。


好了,轮播图差不多就聊到这里吧,你可以自己去慢慢完善,时间关系我就不扩展太多了。剩下的就交给你自己去玩耍了,比如,我能不能做一个定时轮播呢,每个5秒钟就自动切换到下一张。


我就不写了。


3.6.8 整合资源文件

现在,我们把这个已经做好的banner区域搬到项目里。


在WebContent目录下新增一个static文件夹,这里存放各种静态资源文件。


59.png


比如img,js,css等

60.png


因为刚才的页面中用到了百度资源库里的jQuery文件:

http://libs.baidu.com/jquery/2.0.0/jquery.min.js

现在我们直接将这个url用浏览器打开。


61.png

全部复制。

然后在js文件夹中新建一个jQuery.js文件。

现在,将刚才复制的内容原封不动地拷贝进去。

ctrl + s 保存。

OK,jQuery文件已经有了,接下来,我们将素材图片拷贝到img文件夹中。这样,资源文件就全部准备好了。


62.png

3.6.7 引用资源文件

在整合好资源文件后,如何将这些资源文件导入我们的index.jsp呢?这是一个问题。

我们将html代码和css样式拷贝到index.jsp中,看看效果。

63.png

图片都没有显示出来。


那么,如何改变img的src,使他能够成功引到/Article/WebContent/static/img 里面的图片呢?


我提供一种比较方便的办法,就是在jsp页面中写Java代码,让Java来获取项目的根路径,然后通过绝对路径的方式引入资源文件。


我们在jsp页面的开头加上以下代码:

<%
  String path = request.getContextPath();
  int port = request.getServerPort();
  String basePath  = null;
  if(port==80){
    basePath = request.getScheme()+"://"+request.getServerName()+path;
  }else{
    basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
  }
  request.setAttribute("basePath", basePath);
%>

request就是所谓的JSP九大隐式对象中的一员,其实JSP就是Servlet,你可能学过Servlet,那么应该很清楚request是什么意思。以后我会单独来讲解一下关于JSP的东西,现在先继续往下说吧。


request.setAttribute(“basePath”, basePath) 表示将得到的basePath(项目根路径)存放到request作用域中,你可以把request看做一个HashMap,或者一个JSON对象,都可以。


反正,这句话一写,就说明request作用域中已经有了basePath,我们在JSP页面的其他地方就可以获取到了。


<div class="banner">
  <div class='content'>
    <ul>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/5.jpg "/>
        </a>
      </li>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/1.jpg "/>
        </a>
      </li>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/2.jpg "/>
        </a>
      </li>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/3.jpg "/>
        </a>
      </li>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/4.jpg "/>
        </a>
      </li>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/5.jpg "/>
        </a>
      </li>
      <li class='fl'>
        <a href="javascript:void(0)">
          <img src="${basePath}/static/img/1.jpg "/>
        </a>
      </li>
    </ul>
    <span class='banner_left'><i class='btn_left'></i></span>
    <span class='banner_right'><i class='btn_right'></i></span>
</div>


这样就能访问到了。

刚才还忘了一样东西,就是左右按钮的图片,也把它拷贝进来。

64.png


引入

.btn_left ,.btn_right{
  display: inline-block;
  width: 21px;
  height: 150px;
  background: url(${basePath}/static/img/banner_tb.png) no-repeat;
  position: absolute;
  left: -38px;
  top: 90px;
  opacity: 0;
  transition: all ease 0.6s;
  cursor: pointer;
}


顺便把banner图往上一点:

.banner {
  height: 400px;
    margin-top: 2px;
    overflow: hidden;
}


把js代码也全部拷贝过来吧。

var leftBtn = $('.btn_left').eq(0); //左按钮
var rightBtn = $('.btn_right').eq(0);//右按钮
var ul = $('.banner .content ul').eq(0); 
var index = 0;
var timer = null; 
var imgwidth = $('.banner .content ul li').width(); //获取轮播图片的宽度
var len =  $('.banner .content ul li').length - 2//获取总共的图片数量
rightBtn.on('click',function(){
  clearTimeout(timer); //定时器清零
  timer = setTimeout(function(){
    index ++;
    movePicture();
  },500);
});
leftBtn.on('click',function(){
  clearTimeout(timer); //定时器清零
  timer = setTimeout(function(){
    index --;
    movePicture();
  },500);
});
function movePicture(){
  $('.banner .content ul').animate({'margin-left':-imgwidth * (index+1)},1000,function(){
    if(index == len){
      $(this).css('masrgin-left',-imgwidth);
      index = 0;
    }
    if(index == -1){
      $(this).css('margin-left',-imgwidth * len);
      index = len - 1;
    }
  });
}


发现一个小BUG,当我一直点击下一张,移动到最后一张图片的时候(也就是第一张图片,因为我们在末尾加上了第一张图片),第二张图片(有的苹果那张)没有自动衔接上去。

这是咋回事呢?

有BUG不要怕,去找原因就行了。

经过检查,我发现了一个单词的拼写错误:


65.png


原来是margin-left写错了。

OK,更正后就正确了,我顺便把demo页面也改好了。

function movePicture(){
  $('.banner .content ul').animate({'margin-left':-imgwidth * (index+1)},1000,function(){
    if(index == len){
      $(this).css('margin-left',-imgwidth);
      index = 0;
    }
    if(index == -1){
      $(this).css('margin-left',-imgwidth * len);
      index = len - 1;
    }
  });
}


改正就行了,额,小细节不要在意。。。

banner图这样就差不多了,下一节开始做登陆功能。我先把页面画好,以后页面的绘制我就不介绍得这么详细了,重点还是以Java为主。

免责声明: 博客中所有的图片素材均来自百度搜索,仅供学习交流,如有问题请联系我,侵立删,谢谢。

相关文章
|
11月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
11月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1273 0
|
11月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
404 0
|
12月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
782 0
|
12月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
1564 4
|
12月前
|
前端开发 JavaScript Java
Java 项目实战城市公园信息管理系统开发流程与实用功能实现指南
本系统基于Java开发,采用Spring Boot后端框架与Vue.js前端框架,结合MySQL数据库,构建了一个高效的城市公园信息管理系统。系统包含管理员、用户和保洁人员三大模块,涵盖用户管理、园区信息查询、订票预约、服务管理等功能,提升公园管理效率与服务质量。
316 6
|
12月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
679 1
|
12月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
510 2
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
741 46
|
设计模式 人工智能 前端开发
现代 Java 实现数字华容道与石头迷阵游戏的项目实战及项目开发指南
本项目基于Java 17+,采用JavaFX与MVC架构,实战开发数字华容道/石头迷阵游戏。内容涵盖技术选型、核心逻辑、现代GUI设计、动画实现及项目打包发布,结合sealed class、record等新特性,打造简洁可维护的游戏代码结构。
422 0