Create Dynamic Pagination using Java Spring Boot, Hibernate and MySQL

[13872 views]




Prerequisite

  • Eclipse IDE or Spring Tool Suite (STS)
  • Mysql installed

We will make a Small application for demonstrating dynamic pagination by dividing large number of data into mutlitple pages with some random data in MySQL using Eclipse IDE with STS plugin installed. Let's Start

  1. Create a Spring Boot project
    1. Click File -> New Project -> Spring Starter Project

    2. Spring Starter Project

    3. After filling the given details click Next


    4. Spring Boot Project

    5. Add JPA, MySQL and Web as dependencies and click Finish

    6. Wait until complete Project is imported successfully


  2. Add Packages, Classes, Jsp pages and xml files in your project as shown in the image below:

      Spring Boot Project hierarchy


  3. HomeController.java


    package com.tutorial.controller; import java.util.LinkedHashSet; import java.util.Set; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.tutorial.model.User; import com.tutorial.repository.UserRepository; @Controller public class HomeController { private static final int PAGE_SIZE = 3; // Number of rows to contain per page private long totalUsersCount; // number of rows in Database @Autowired UserRepository userRepo; private PageRequest gotoPage(int page) { PageRequest request = new PageRequest(page, PAGE_SIZE, Sort.Direction.DESC, "id"); return request; } @RequestMapping(value = "/", method = RequestMethod.GET) public String index(HttpSession session, Model model, @RequestParam(value = "pageNo", required = false, defaultValue = "0") String pageNo) { int lastPageNo; int gotoPageNo = Integer.parseInt(pageNo); Set < User > allUsers = new LinkedHashSet < User > (); //session.setAttribute("currentPageNo", 0); for (User u: userRepo.findAll(gotoPage(gotoPageNo))) // fetches rows from Database as per Page No { allUsers.add(u); } totalUsersCount = userRepo.count(); //total no of users if (totalUsersCount % PAGE_SIZE != 0) lastPageNo = (int)(totalUsersCount / PAGE_SIZE) + 1; // get last page No (zero based) else lastPageNo = (int)(totalUsersCount / PAGE_SIZE); model.addAttribute("lastPageNo", lastPageNo); model.addAttribute("users", allUsers); return "index"; } }


  4. User.java


    package com.tutorial.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Integer id; @Column(name = "FirstName") private String firstName; @Column(name = "LastName") private String lastName; @Column(name = "country") private String country; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }


  5. UserRepository.java


    package com.tutorial.repository; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import com.tutorial.model.User; @Repository public interface UserRepository extends CrudRepository < User, Long > { public Iterable < User > findAll(Pageable page); }


  6. PaginationTutorialApplication.java


    package com.tutorial; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication public class PaginationTutorialApplication { public static void main(String[] args) { SpringApplication.run(PaginationTutorialApplication.class, args); } }


  7. ServletInitializer.java


    package com.tutorial; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(PaginationTutorialApplication.class); } }
  8. application.properties


    spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://localhost:3306/tutorial spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.mvc.view.prefix= /WEB-INF/jsp/ spring.mvc.view.suffix= .jsp spring.jpa.show-sql = true

  9. index.jsp


    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Pagination Tutorial</title> </head> <body> <table > <tr > <th>ID</th> <th>First Name</th> <th>Last Name</th> <th>Country</th> </tr> <c:forEach items="${users}" var="user"> <tr > <td>${user.id }</td> <td>${user.firstName }</td> <td>${user.lastName }</td> <td>${user.country }</td> </tr> </c:forEach> </table> <br> <br> <c:forEach var="i" begin="0" end="${lastPageNo-1 }" > <a href="/?pageNo=${i }">${i+1 }</a> <!-- Displaying Page No --> </c:forEach> </body> </html>


  10. mvc-dispatcher-servlet.xml


    <?xml version="1.0" encoding="UTF-8"?> <beans :xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" > <context:component-scan base-package="com.tutorial.controller"></context:component-scan> <jpa:repositories base-package="com.tutorial.repository" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven/> </beans>


  11. pom.xml


    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:</div> <table> <tr> <td><div> <a href="#" id="upvote"><img alt="Solution Worked" src="/resources/images/upvote.jpg" width="80"> 29 Upvotes</a> </div></td> <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td> <td><div> <a href="#" id="downvote"><img alt="Solution Didn't Worked" src="/resources/images/downvote.jpg" width="80"> 15 Downvotes</a> </div></td> <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td> </tr> </table> <br> <div class="card-footer text-muted" align="right"> Updated on 23 FEBRUARY, 2021 by <a href="/author/1">Shaddy</a> </div> <div> </div> <br> <!-- EndOfContent-ATech --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6110005078124306" data-ad-slot="2597659780" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <br> <h3 class="not-tablet" style="text-align:center;">Clear Any Java Interview by Reading our Ebook Once.</h3> <h5 style="text-align:center;"><a href="/restricted/payment/file/Java-Interview-Questions-atechdaily.pdf?dld=26C"><button class="btn btn-success btn-lg">Download Java Interview eBook</button></a></h5><br> <h4 style="text-align:center;">Can you clear Java Interview?</h4> <h5 style="text-align:center;"><a href="/quiz/Java"><button class="btn btn-success btn-lg">Take Our Java Quiz</button></a></h5> <br> <br> <div class="modal-body" id="getCode" style="border: 1px solid black;" > <h3>Search Engine Powered by Artificial Intelligence:</h3><br> <h4 style="text-align: center;"><script async src="https://cse.google.com/cse.js?cx=0349454d8f798210d"></script> <div class="gcse-search"></div></h4> </div> <br> <div class="col-md-16 "> <h4 style="margin-bottom:1em;">Comments </h4> <div id="comment_form"> <div> <input type="text" name="name" id="name" value="" placeholder="Name" required="required"> </div> <div> <input type="email" name="email" id="email" value="" placeholder="Email" required="required"> </div> <div> <textarea rows="5" name="comment" id="comment" placeholder="Comment" required="required"></textarea> </div> <div class="g-recaptcha" data-sitekey="6LchJakjAAAAAKyp7Jj4preXm7sjNTEAh0Sj1qNE"></div> <div> <input id="addCommentAjax" type="submit" name="submit" value="Add Comment"> </div> <span id="loadingIcon"></span> </div> <div class="card paper"> <summary style="padding:1em;"><span id="commentSizeAjax">3</span> comment</summary> <ul class="list-group"> <li class="list-group-item "> <!-- <span class="circle"> <img src="imagestoragelocation" alt="user"> </span> --> <span class="title" style="margin-left:0px;"> Mishan <time> 19 APRIL 2020 21:31:41</time> <p>Very Help full website for a programmer and students</p> </span> <ul class="actions" href="#"> <!-- <li><a class="reply" href="#">Reply</a></li>--> </ul> </li> <li class="list-group-item "> <!-- <span class="circle"> <img src="imagestoragelocation" alt="user"> </span> --> <span class="title" style="margin-left:0px;"> Tejas <time> 20 APRIL 2020 21:31:41</time> <p>Good work buddy.. keep it up</p> </span> <ul class="actions" href="#"> <!-- <li><a class="reply" href="#">Reply</a></li>--> </ul> </li> <li class="list-group-item "> <!-- <span class="circle"> <img src="imagestoragelocation" alt="user"> </span> --> <span class="title" style="margin-left:0px;"> Hendi Santika <time> 21 APRIL 2020 21:31:41</time> <p>Nice article. I think it would be great if You put the code in github repository. Thanks </p> </span> <ul class="actions" href="#"> <!-- <li><a class="reply" href="#">Reply</a></li>--> </ul> </li> </ul> <div id="latestComment"> </div> </div> <br> <br> </div> <br> <br> <div id="fixedElement"> <br><br> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6110005078124306" data-ad-slot="2597659780" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <!-- Sidebar Widgets Column --> <div class="col-md-3"> <br> <amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-6110005078124306" data-ad-slot="2989661582" data-auto-format="rspv" data-full-width=""> <div overflow=""></div> </amp-ad> <br><br> <!-- Search Widget --> <div class="card my-4"> <h5 class="card-header">Search Anything:</h5> <div class="card-body"> <form method="get" action="/search" id="search_form" onsubmit="search()"> <div class="input-group"> <input id="q" type="text" class="form-control" placeholder="Search anything..." name="q"> <span class="input-group-btn"> <button class="btn btn-secondary" id="searchBtn" type="submit">Search</button> </span> </div> </form> </div> </div> <script defer> var input = document.getElementById("q"); function search(){ var input = document.getElementById("q"); var action_src = "/search/" + input.value.replace(/[^a-zA-Z\d ]/g, "") ; var search_form = document.getElementById('search_form'); search_form.action = action_src ; } function productSearch(){ var input = document.getElementById("q2"); var action_src = "/search/" + input.value.replace(/[^a-zA-Z\d ]/g, "") ; var product_form = document.getElementById('product_form'); product_form.action = action_src ; } </script> <br> <div class="card my-4"> <h5 class="card-header" style="color:#fc5f48">Sponsored Deals ends in <span id="time"></span></h5> <div class="card-body"> <amp-ad width="100vw" height="320" type="adsense" data-ad-client="ca-pub-6110005078124306" data-ad-slot="4319791871" data-auto-format="rspv" data-full-width=""> <div overflow=""></div> </amp-ad> <br> <br> <hr> <br> <br> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6110005078124306" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-ef+6k-30-ac+ty" data-ad-client="ca-pub-6110005078124306" data-ad-slot="5413941104"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="card my-4"> <h5 class="card-header">E-Books & Study Notes:</h5> <br> <a href="/restricted/payment/file/algorithm-flowchart-notes.pdf?pr=11110&dld=4BE"><img src="/resources/images/algorithm_flowchart_notes.jpg"></a> <br><br> <hr> <h5 style="text-align:center;"><a id="pythonBasics" href="/restricted/payment/file/Java-Interview-Questions-atechdaily.pdf?dld=23D"><button class="btn btn-success btn-lg">Get Most Frequently Asked Java Interview Questions</button></a></h5> <br><br> <hr> <h5 style="text-align:center;"><a id="pythonBasics" href="/restricted/payment/file/python-basics.pdf?pr=11110&dld=5BD"><button class="btn btn-success btn-lg">Get Simplest Python Programming Notes</button></a></h5> <br> </div> </div> <div class="card my-4"> <h5 class="card-header">Technical Quizzes Specially For You:</h5> <div class="card-body"> <ul style="padding: 0px;"> <li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/quiz/algorithms-pseudocode">Algorithms</a></li><br> <li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/quiz/Java">Java</a></li><br> <li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/quiz/Python">Python</a></li><br> </ul> <br><br> </div> </div> <br> <div class="card my-4"> <h5 class="card-header">Online Free Tools:</h5> <div class="card-body"> <ul style="padding: 0px;"> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/java-ide-online.html">Java IDE Online</a></li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/Python-ide-online.html">Python IDE Online</a></li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/json-formatter">JSON Formatter/Minifier Online</a></li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/case-converter">Case Converter</a></li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/reverse-string">Reverse String</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/htmlencode">HTML Encoder</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/htmldecode">HTML Decoder</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/urlencode">URL Encoder</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/urldecode">URL Decoder</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/decimal-to-binary">Decimal To Binary</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/binary-to-decimal">Binary To Decimal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/decimal-to-octal">Decimal To Octal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/binary-to-octal">Binary To Octal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/decimal-to-hexa">Decimal To Hexadecimal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/hexa-to-decimal">Hexadecimal To Decimal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/hexa-to-binary">Hexadecimal To Binary</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/octal-to-decimal">Octal To Decimal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/octal-to-hex">Octal to Hexadecimal</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/octal-to-binary">Octal to Binary</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/calculate-string-length">Calculate String Length</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/remove-spaces">Remove Spaces</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/remove-line-breaks">Remove Line Breaks</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/remove-empty-lines">Remove Empty Lines</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/remove-duplicate-lines">Remove Duplicate Lines</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/word-counter">Word Counter</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/replace-space-with-hyphen">Replace Space with hyphen</a> </li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/check-armstrong-number">Check Armstrong number</a></li><br></h5> <h5><li class="fa fa-caret-right" style="padding: 5px;">&nbsp;<a href="/tools/sentence-to-url">Text to URL</a></li><br></h5> </ul> </div> </div> <!-- Deal timer script --> <script defer> function countdown(minutes) { var seconds = 60; var mins = minutes function tick() { //This script expects an element with an ID = "counter". You can change that to what ever you want. var counter = document.getElementById("time"); var current_minutes = mins-1 seconds--; counter.innerHTML = current_minutes.toString() + ":" + (seconds < 10 ? "0" : "") + String(seconds); if( seconds > 0 ) { setTimeout(tick, 1000); } else { if(mins > 1){ countdown(mins-1); } } } tick(); } countdown(9); </script> <div class="card my-4"> <h5 class="card-header"> <strong>Search Tags</strong> </h5> <div class="card-body"> <ul style="padding:0px;"> <h4>Paginate in Java Spring Web Application</h4> <h4>Steps to add pagination in Java Spring Hibernate Web Application</h4> <h4>Spring Web MVC Pagination Example</h4> </ul> </div> </div> <div class="card my-4"> <h5 class="card-header"> <strong>You Might Also Like</strong> </h5> <div class="card-body"> <ul style="padding:0px;"> <li class="fa fa-caret-right" style="padding:5px;">&nbsp;<a href="/posts/merge-arrays-in-java-without-using-any-predefined-method">Merge Arrays in Java without using any predefined method</a> </li> <li class="fa fa-caret-right" style="padding:5px;">&nbsp;<a href="/posts/CRUD-operations-Tutorial-using-Java-Spring,-Hibernate-and-MySQL">CRUD operations Tutorial using Java Spring, Hibernate and MySQL</a> </li> <li class="fa fa-caret-right" style="padding:5px;">&nbsp;<a href="/posts/java-program-to-count-letters-digits-spaces-and-other-characters-from-a-string">Java Program to Count Letters, Digits, Spaces And Other Characters From A String</a> </li> <li class="fa fa-caret-right" style="padding:5px;">&nbsp;<a href="/posts/how-to-write-buzzfizz-program-in-java">How To Write BuzzFizz Program in Java</a> </li> <li class="fa fa-caret-right" style="padding:5px;">&nbsp;<a href="/posts/covariant-return-type-in-java">Covariant return type in Java</a> </li> </ul> </div> </div> <div id="fixedElement"> <br><br> <!-- divmd2-atech --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6110005078124306" data-ad-slot="8440945536" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <!-- /.row --> </div> <!-- /.container --> <br> <!-- Footer --> <footer class="py-5 bg-dark" > <div class="container"> <p class=" m-0 text-center text-white"><a href="/privacy-policy">Privacy Policy</a> & <a href="/terms-of-service">Terms Of Condition</a> & <a href="/Affliate-Disclosure.html">Affliate Disclosure</a>&nbsp;&nbsp;&nbsp;Copyright &copy; ATechDaily 2020-24</p> </div> <!-- /.container --> </footer> <!-- Bootstrap and jquery script link --> <script> $(document).ready(function() { setTimeout(function() { $.getScript("https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js"); if (localStorage.getItem('cookieconsent')===null) { document.body.innerHTML += '\ <div class="cookieconsent" style="position:fixed;padding:20px;left:0;bottom:0;background-color:#000;color:#FFF;text-align:center;width:100%;z-index:99999;">\ This site uses cookies. By continuing to use this website, you agree to their use. \ <a href="#" style="color:#CCCCCC;"><b>I Understand</b></a>\ </div>\ '; document.querySelector('.cookieconsent a').onclick = function(e) { e.preventDefault(); document.querySelector('.cookieconsent').style.display = 'none'; localStorage.setItem('cookieconsent', true); }; } }, 3000); }); </script> <script> var upvoteClicked="0"; var downvoteClicked="0"; var addCommentClicked="0"; var nodeDiv = document.createElement("div"); var node = document.createElement("ins"); node.style = 'display:block; text-align:center;'; node.setAttribute('class','adsbygoogle'); node.setAttribute('data-ad-client','ca-pub-6110005078124306'); node.setAttribute('data-ad-slot','4825133188'); node.setAttribute('data-ad-format','fluid'); node.setAttribute('data-full-width-responsive','fluid'); node.setAttribute('data-ad-layout','in-article'); var scriptNode=document.createElement("script"); scriptNode.text= '(adsbygoogle = window.adsbygoogle || []).push({});'; nodeDiv.appendChild(node); nodeDiv.appendChild(scriptNode); var parentElement=document.getElementById('postdesc'); var el = document.querySelectorAll('#postdesc p'); for(var i = 1; i < el.length; i++) { if(i%3==0){ parentElement.insertBefore(nodeDiv.cloneNode(true),el[i]); } } $(document).ready(function() { var upvoteHtml='<img alt="Solution Worked" src="/resources/images/upvote.jpg" width="80">'; var downvoteHtml='<img alt="Solution Worked" src="/resources/images/downvote.jpg" width="80">'; $('#upvote').click(function(e){ e.preventDefault(); if(upvoteClicked === "0") { $.ajax({ type:'POST', url:'/ajaxUpvote/7', success: function(result){ $('#upvote').html(upvoteHtml+" "+result+" Upvotes"); }, error: function(result) { console.log(result); } }); upvoteClicked='1'; } }); $('#downvote').click(function(e){ e.preventDefault(); if(downvoteClicked === "0") { $.ajax({ type:'POST', url:'/ajaxDownvote/7', success: function(result){ $('#downvote').html(downvoteHtml+" "+result+" Downvotes"); } }) downvoteClicked="1"; } }); $('#addCommentAjax').click(function(event){ var name=$('#name').val(); var comment=$('textarea').val(); var email=$('#email').val(); var intials =name.charAt(0); var profileImage = $('#profileImage').text(intials); event.preventDefault(); if(name!="" && comment!="" && email!="" && validateEmail(email) && addCommentClicked==="0"){ $.ajax({ type:'POST', url:'/ajax/posts/7/addComment', data:{name:name,email:email,comment:comment,'g-recaptcha-response':grecaptcha.getResponse()}, dataType: 'json', beforeSend:function(){ $('#loadingIcon').html('<span style="font-size:30px; text-align:center;"><i class="fa fa-spinner fa-spin"></i> &nbsp;Commenting</span>'); }, success: function(comments){ $('#loadingIcon').html(""); var newHtml="<ul class='list-group'><li class='list-group-item '><span class='title' style='margin-left:0px;'>"+comments.created_by+" <time>"+comments.created_at+"</time> <p>"+comments.description +"</p></span></li></ul>"; $('#latestComment').html(newHtml); $("#addCommentAjax").attr("disabled", true); } }); addCommentClicked="1"; document.getElementById("#addCommentAjax").disabled = true; } else if(name=="" || comment==""){ alert("Name or Comment can't be blank") } else { alert("Please Enter Valid Email Address"); } }); function validateEmail(email) { var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(email); } function setCookie(name,value,days) { var expires = ""; if (days) { var date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + (value || "") + expires + "; path=/"; } function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } }); </script> <!-- <div class="modal fade" id="donateModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title" id="myModalLabel">Improve Your Search with AI:</h4> <button type="button" class="close" data-dismiss="modal" aria-label="Close" id="donateClosemodal"><span aria-hidden="true">&times;</span></button> </div> <div class="modal-body" id="getCode" > Let's deep drive your search by using below <b>AI Search Tool</b> and get more accurate information:<br> <h4 style="text-align: center;"><script async src="https://cse.google.com/cse.js?cx=0349454d8f798210d"></script> <div class="gcse-search"></div></h4> </div> </div> </div> </div> <script> window.addEventListener("scroll", openModal); function openModal() { var cardFooterElement = $('.card-footer').offset(); if (window.pageYOffset > cardFooterElement.top-100){ window.removeEventListener("scroll", openModal); $('#donateModal').modal('toggle')}; }; $('#donateClosemodal').click(function() { $('#donateModal').modal('toggle'); }); </script> --> </body> </html>