Setup and Load Data in jTable using Servlets and JSP

DEMO DOWNLOAD Articles on jTable in Java Web Applications jQuery jTable plugin in Java Web Applications - An Introduction Setup ...





This article is a part of the series of articles written on how to implement AJAX based crud operations and other cool features jTable plugin offers, in Java Web Applications (using Servlets and JSP's - Simple MVC Model 2 Approach). In this post, I am going to explain how to setup jTable and dependant libraries in Java Web Project and display data coming from CSV file. 

1. First of all download all the libraries required for the setup,
jTable offers you several cool themes and you can select the one that will suit your website. jTable uses jQuery UI dialog that pops up when the user clicks on add, edit or update record buttons. If you choose to use any one of the metro themes offered by jTable you can use jQuery UI themeroller to customize it according to the color of the table and then download it. For example, I am going to use 'Crimpson' metro theme here, and therefore I edited and downloaded 'Blitzer' jquery UI theme.

2. Now add necessary files from the download as shown in the project structure below,

3. We are done with the setup. To start with let us try to display an empty table with no data. Create a jsp page under WebContent folder and add below code to it.

index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Setup and Load Data to jTable using Servlets and JSP</title>
<!-- Include one of jTable styles. -->
<link href="css/metro/crimson/jtable.css" rel="stylesheet" type="text/css" />
<link href="css/jquery-ui-1.10.3.custom.css" rel="stylesheet" type="text/css" />
<!-- Include jTable script file. -->
<script src="js/jquery-1.8.2.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.10.3.custom.js" type="text/javascript"></script>
<script src="js/jquery.jtable.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        //initialize jTable
        $('#PersonTableContainer').jtable({
            title: 'Table of people',
            actions: {
                listAction: 'CRUDController?action=list',
                createAction:'CRUDController?action=create',
                updateAction: 'CRUDController?action=update',
                deleteAction: 'CRUDController?action=delete'
            },
            fields: {
                customerid: {
                    key: true,
                    list: false
                },
                customername: {
                    title: 'Customer Name',
                    width: '30%'
                },
                email: {
                    title: 'Email',
                    width: '30%'
                },
                phone: {
                    title: 'Phone',
                    width: '20%',
                    create: false,
                    edit: false
                },
                city: {
                    title: 'City',
                    width: '20%',
                    
                }
                
            }
        });        
    });
</script>
</head>
<body>
<div style="width:60%;margin-right:20%;margin-left:20%;text-align:center;">
<h1>Setup and Load Data in jTable using Servlet and JSP</h1>
<h4>Demo by Priya Darshini, Tutorial at www.programming-free.com</h4>
<div id="PersonTableContainer"></div>
</div>
</body>
</html>

When you run the JSP page, you will now see an empty table such as the one shown below, since we have not written server side code to fetch data yet. Note that in the above code we have not written any markup for html table and all we have is a div that acts as a placeholder for the table to be created by the jTable plugin. We have defined an option called 'actions' for the method 'jtable', to provide the action urls for create, delete, update and list server side functions. Another option 'field' defines the field names that represents columns in the data source.


4. Next let us move on to write logic to fetch data from a csv file. The sample csv file I am using here consists of ten records of the following structure,

ID|Customer Name|Email|Phone Number|City

Create a model class, that will have getters and setters for the above fields present in the data source,

Customers.java
package com.programmingfree.model;

public class Customers {

 public Customers(String customerid,String customername,String email,String phone,String city){
  this.customerid=customerid;
  this.customername=customername;
  this.email=email;
  this.phone=phone;
  this.city=city;
 }
 private String customerid;
 private String customername;
 private String email;
 private String phone;
 private String city;
 
 public void setCustomerid(String customerid) {
  this.customerid = customerid;
 }
 public String getCustomerid() {
  return customerid;
 }
 public void setCustomername(String customername) {
  this.customername = customername;
 }
 public String getCustomername() {
  return customername;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public String getEmail() {
  return email;
 }
 public void setPhone(String phone) {
  this.phone = phone;
 }
 public String getPhone() {
  return phone;
 }
 public void setCity(String city) {
  this.city = city;
 }
 public String getCity() {
  return city;
 }
}

5. Create a data access object class that will do the actual work of getting data from the data source,

DataManipulation.java
package com.programmingfree.dao;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;
import com.programmingfree.model.*;

public class DataManipulation {
 
 public static List<Customers> getAllCustomers() throws IOException{
  List<Customers> lstCustomer=new ArrayList<Customers>();
  String csvFilename = "customer.csv";
      InputStream is =  Thread.currentThread().getContextClassLoader().getResourceAsStream(csvFilename);
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      CSVReader csvReader = new CSVReader(br,'|');
      String[] row = null;
      while((row = csvReader.readNext()) != null) {  
         lstCustomer.add(new Customers(row[0],row[1],row[2],row[3],row[4])); 
      }
  return lstCustomer;
 }
}

Note that I have used OpenCsv java library here, that simplifies the job of reading content from source csv file. I have placed the source csv file(customer.csv) under Project/src folder. CsvReader class has a constructor that takes file and delimiter as input and returns a string array.

6. Now let us create a Servlet that acts as a Controller and dispatches request from the view to the Dao class and sends back response to the view.

CRUDController.java
package com.programmingfree.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
import com.programmingfree.dao.DataManipulation;
import com.programmingfree.model.Customers;


@WebServlet("/CRUDController")
public class CRUDController extends HttpServlet {
 private static final long serialVersionUID = 1L;

    
    public CRUDController() {
        
    }


 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  if(request.getParameter("action")!=null){
   String action=(String)request.getParameter("action");
   if(action.equals("list")){
    try{
    List<Customers> lstCustomer=new ArrayList<Customers>();
   
    //Fetch Data from CSV file
    lstCustomer=DataManipulation.getAllCustomers();
    
    //Convert Java Object to Json
    Gson gson = new Gson();
    JsonElement element = gson.toJsonTree(lstCustomer, new TypeToken<List<Customers>>() {}.getType());
    JsonArray jsonArray = element.getAsJsonArray();
    String listData=jsonArray.toString();
    
    //Return Json in the format required by jTable plugin
    listData="{\"Result\":\"OK\",\"Records\":"+listData+"}";     
    response.setContentType("application/json");
    response.getWriter().print(listData);
    System.out.println(listData);
    }catch(Exception ex){
     String error="{\"Result\":\"ERROR\",\"Message\":"+ex.getStackTrace()+"}";
     response.getWriter().print(error);
    }
    
   }
  }
 }

 
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doGet(request,response);
 }

}

In the servlet, we are populating a list of type "Customers"(Model) using getAllCustomers() static method that we defined previously in the DataManipulation class. Then we are converting this List (Java Object) to Json(Javascript object Notation) format using Google json library. Note that jTable accepts data only in Json format and all crud based actions those are used by jTable should return json in the format as in the following sample,

{
 "Result":"OK",
 "Records":[
  {"PersonId":1,"Name":"Benjamin Button","Age":17,"RecordDate":"\/Date(1320259705710)\/"},
  {"PersonId":2,"Name":"Douglas Adams","Age":42,"RecordDate":"\/Date(1320259705710)\/"},
  {"PersonId":3,"Name":"Isaac Asimov","Age":26,"RecordDate":"\/Date(1320259705710)\/"},
  {"PersonId":4,"Name":"Thomas More","Age":65,"RecordDate":"\/Date(1320259705710)\/"}
 ]
}


Result property can be "OK" or "ERROR". If it is "OK", Records property must be an array of records. If it is "ERROR", a Message property can explain reason of the error to show to the user.

7. Edit web.xml file to create servlet mapping for our Controller servlet to work with the url pattern '/CRUDController'.

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>jTableJavaExample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
<servlet>
    <servlet-name>CRUDController</servlet-name>
    <servlet-class>com.programmingfree.controller.CRUDController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CRUDController</servlet-name>
    <url-pattern>/CRUDController</url-pattern>
</servlet-mapping>
</web-app>

8. Finally we have to call the 'load' method in the jsp page that we created before. We just initialized it before. For the JSP to fire AJAX call to server listaction method 'load' method needs to be called after table initialization code as shown below,

index.jsp
<script type="text/javascript">
    $(document).ready(function () {
        $('#PersonTableContainer').jtable({
            title: 'Table of people',
            actions: {
                listAction: 'CRUDController?action=list',
                createAction:'CRUDController?action=create',
                updateAction: 'CRUDController?action=update',
                deleteAction: 'CRUDController?action=delete'
            },
            fields: {
                customerid: {
                    key: true,
                    list: false
                },
                customername: {
                    title: 'Customer Name',
                    width: '30%'
                },
                email: {
                    title: 'Email',
                    width: '30%'
                },
                phone: {
                    title: 'Phone',
                    width: '20%',
                    create: false,
                    edit: false
                },
                city: {
                    title: 'City',
                    width: '20%',
                    
                }
                
            }
        });
        $('#PersonTableContainer').jtable('load');
    });
</script>

Note that we have implemented server side logic only to load table with data and we have not yet handled create, update and delete operations. I will update the code for AJAX based crud operations in my next article.

That is all! We are good to run the application to see data loaded from CSV file as shown below,





Please leave your comments and queries about this post in the comment sections in order for me to improve my writing skills and to showcase more useful posts. Thanks for reading!!

Subscribe to GET LATEST ARTICLES!


Related

jTable 2619437573149789941

Post a Comment

  1. Realy I love this..thank u very much for sharing this.....

    ReplyDelete
  2. hey priya, it was really very good tutorial, can you please help me exporting this project in netbeans, i never used eclipse. :( Please.

    email: dtiwari18@gmail.com

    ReplyDelete
    Replies
    1. Hi,

      You can try this,

      https://netbeans.org/kb/docs/java/import-eclipse.html

      Hope this helps!

      Thanks,
      Priya

      Delete
  3. Good, but what if I need more complex fields than simple strings? Put the case I have a list of customers, which have some properties and foreign keys which points to other objects.
    Is it possible to build the form which edits/creates the records of the table?
    Thanks

    ReplyDelete
  4. Thanks for the great tutorial. Could you be having an example of CRUD with twitter bootstrap and servlets?

    ReplyDelete
  5. Great tutorial...this save my days..Thanks alot..=)

    ReplyDelete
  6. My json response looks like below and it doesn't work

    {"records":[{"Desc":"APPLICATION FORM","ctrlId":2,"ctrlName":"SSN Application"}],
    "result":"OK"}

    ReplyDelete
    Replies
    1. Looks like the property names are case sensitive. Only "Result" and "Records" will work.
      I'm using struts and the "result" is becoming all lower case "result"in the json response.

      I edited the jtable.js to replace Result to result and Records to records then it worked.

      Delete
    2. Hi sahoo,

      Glad that you got it working finally :) You can also have a request placed at jtable.org to add your fix so others who use struts might take advantage of your solution. Thank you so much for the information and I appreciate your effort to take some time and post it here.

      Thanks,
      Priya

      Delete
  7. I got around the problem using another way.
    On the pojo class that I'm using for the data record, I use @JASON(name="Record"), to force the JSON handler to use the custom name instead of the default and that did the trick.

    ReplyDelete
  8. Hi how to implement paging in this jtable.I am not clear about actually what to return from servlet to json to implement page in this jtable

    ReplyDelete
    Replies
    1. Did you check this?

      http://www.programming-free.com/2014/02/jtable-pagination-in-java-web.html

      Delete
  9. Hi Priya, greetings from México. How I can customize messages of jTable to Spanish?

    ReplyDelete
    Replies
    1. Hi,

      The latest version of jTable (v 2.3.1) has an option to localize jTable messages.

      http://jtable.org/Demo/TurkishLocalization

      Hope this helps!

      Delete
  10. Hi, very good tutorial but i have a little issue, I'm trying to follow all the steps using NetBeans but the interaction between jsp and servlet doesn't happen, I've tried to fix the file web.xml but it still doing nothing.

    I'd really appreciated some help. Thank you

    ReplyDelete
  11. Hi Priya,
    The document is really Excellent !!!. I extend my sincer thanks for uploading the same for new developer like me and it will help us to upgrade our knowledge.
    I am trying to do the exact replica in my system. The web site unable to launch as it is giving runtime error. The issue is with @WebServlet. The system is giving run time error like "Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)". I am unable to fix the issue. Can you please throw some lite and help if you please?

    Regards Milind

    ReplyDelete
    Replies
    1. Hi,

      We have used deployment descriptor (web.xml) in this application. @WebServlet is an annotation that is meant to replace deployment descriptor. So, you can safely remove this annotation from your servlet. Do not have both web.xml and @WebServlet annotation at the same time.

      Hope this helps!

      Thanks,
      Priya

      Delete
  12. Hi Priya,
    Awesome article and code. Can you please tell us how can we configure the colors used in the grid and also the size of the grid.

    ReplyDelete
  13. how we can validate jtable feilds...please help

    ReplyDelete
    Replies
    1. Hi,

      You can use jquery validation plugin. Check this out.

      http://www.jtable.org/Demo/UsingWithValidationEngine1

      Thanks,
      Priya

      Delete
  14. Hi Priya,

    Great tutorial. My question is how do I force format field in jTable that stores XML data strings? The viewing browser ignores the tags and will not display the table content properly. Any help is greatly appreciated-

    Thanks,
    JC

    ReplyDelete
  15. Hey Hello priya,
    Can u give me an example which shows the different images on index page n after selecting a particular image it should show the black and white pixels from that image n the size of image but on the same page(ajax).Can u please help me.?
    my id - deshmukhmayuri@hotmail.com

    ReplyDelete
  16. How do i include the add new record button at the top of the table

    ReplyDelete
  17. Hi Priya
    I am not be able to code for options: '/Demo/GetCityOptions' action to work with struts 2, kind send the action code in java for populating data in combo box for adding and editing records

    Vipin

    ReplyDelete
  18. Hi Priya this is awesome , but iam trying every step and i did it all , and i downloaded the demo and still doesn't working , can u help me please , i really need this .
    thank u

    ReplyDelete
  19. I am unable to override server error message ("An error occured while communicating to the server.") to my custom error message in my application. i am currently using struts 1.3 (
    String message = "Exception: my custom";
    String error = "{\"Result\":\"ERROR\",\"Message\":"+message+ "}";
    response.getWriter().print(error);)

    always showing error - An error occured while communicating to the server.
    Could you please on this. i have to override my current error to view end user.

    Thanks
    Ramanujadasu

    ReplyDelete
  20. Hello Priya,
    I am unable to load data through server to jsp page using jtable.
    When I try to run the things in the debug mode, I found that call to the servlet is not being made & I get the error dialog as Error Occurred While Communing with the server.

    My structure is Web Content->Pages->test.jsp. Js pages are include by the following relative path ../Js/*.js
    Web Content->Js (where all js pages are stored)

    But the interesting thing is that when I copy paste the same jsp file in the Web Content folder & change the path of the js file(Js/*.js) all works fine even data is being populated in the jtable.

    Can you please help me to resolve this thing. I am not able to understand this thing ( If jsp file is present inside the Web Content-> Pages folder servlet call not being made)

    Thanks in advance

    ReplyDelete
  21. I am unable to run this application on Tomcat server on Eclipse. Reply

    ReplyDelete
  22. Hello Priya,
    In your tutorial, you directly write out to response. Can I use forward to another jsp instead? My code is as below:
    listData="{\"Result\":\"OK\",\"Records\":"+listData+"}";
    response.getWriter().write(listData);

    RequestDispatcher dispatcher = request.getRequestDispatcher("test.jsp");
    dispatcher.forward(request, response);
    Thanks in advance

    ReplyDelete
  23. Hi,
    Do you know where I can download this example? The download link above is not working.
    Thanks

    ReplyDelete
  24. Hi Priya,

    How can I put select options instead of data field? How can I convert this to java?


    var countries = _repository.CountryRepository.GetAllCountries(continentalId).Select(c => new { DisplayText = c.CountryName, Value = c.CountryId }).OrderBy(s => s.DisplayText);


    Thanks!

    ReplyDelete
  25. Hello, does anyone know how to change the layout of Edit and Create HTML of JTable framework ?

    ReplyDelete
  26. Good, but what if I need more complex fields than simple strings or Int? Put the case I have a list of customers, which have some properties and foreign keys which points to other objects.
    Is it possible to build the form which edits/creates the records of the table?
    e.g
    public class Myclass
    {
    String name;
    student stu;
    int number;

    }

    student has two fields{
    int stuId;
    string StuName;
    }


    Here How can i put that student type fields in my MYCLASS jtable representation ,,
    is there any need to iterate it>???????
    Thanks

    ReplyDelete
  27. This comment has been removed by the author.

    ReplyDelete
  28. This comment has been removed by the author.

    ReplyDelete
  29. Hello, how to bind using a managed bean for an xhtml JSF webapp, example:





    Number
    #{u.caseno}



    ReplyDelete
  30. Nice tutorial. The ads on your blog sometimes cause this page to reload endlessly, causing the page to freeze during scrolling on Chrome.

    ReplyDelete
  31. Hi,
    Thanks for the tutorial, but I'am getting a empty table without any records, it is printing exact number of rows as in the database, but the table is empty. Data prints correctly when printed using system.out. Please help me resolve this Problem,
    Thanks in advance.

    ReplyDelete
  32. Really useful information. Thank you so much for sharing.It will help everyone.Keep Post. RPA training in chennai | RPA training in Chennai with placement

    ReplyDelete
  33. Outstanding blog thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us.
    best training insitute for machine learning
    machine learning classroom training in chennai
    machine learning with python course in chennai
    best machine learning institutes in chennai

    ReplyDelete
  34. Hello, I read your blog occasionally, and I own a similar one, and I was just wondering if you get a lot of spam remarks? If so how do you stop it, any plugin or anything you can advise? I get so much lately it’s driving me insane, so any assistance is very much appreciated.
    Android Course Training in Chennai | Best Android Training in Chennai
    Datascience Course Training in Chennai | Best Data Science Training in Chennai

    ReplyDelete
  35. Very nice post here thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.

    Check out : hadoop training in chennai cost
    hadoop certification training in chennai
    big data hadoop course in chennai with placement
    big data certification in chennai

    ReplyDelete
  36. How to implement selected single rows with color using jtable in MVC?
    e.g - Display the selected login user in the user list model page.

    ReplyDelete
  37. Thanks for sharing such a Wonderful blog. This is such a exact information i am been searching for. Keep post

    Check Out:
    react js tutorial
    it courses in chennai
    react js classes near me

    ReplyDelete
  38. Thanks a lot..it was really helpful...

    ReplyDelete
  39. Many interesting stuff here. Keep posting. Also check Mit Sat Requirements 2021

    ReplyDelete
  40. Thank you for sharing such informative content! I found it to be incredibly useful and learned a lot from it. Keep up the great work and looking forward to reading more from you in the future.

    Defi Development Company

    ReplyDelete
  41. Trump Tower is a luxurious property in Sector-65, Gurgaon located on Golf Course Extension Road which is known for its luxury residential projects in Gurgaon. It offers 3BHK/4BHK apartments with a beautiful combination of comfortable living and contemporary architecture. Trump tower residential projects Gurgaon is spread over a wide range of size from 327.48 sq. metre to 562.06 sq. Metres. This project is RERA-registered, and it has a registration number of HRERA-375(2017) making it best residential property in Gurgaon.
    Visit:- https://sheerbulls.com/properties/residential

    ReplyDelete

  42. Protect yourself from cyber threats with Indian cyber security solutions: Arm yourself with the tools and techniques you need to protect yourself from cyber criminals. India Cyber ​​​​​​Security Solutions offers comprehensive ethical hacking training covering the latest methodologies and industry best practices. Protect data, keep networks secure and become a cybersecurity expert with us.

    ReplyDelete
  43. Charged up the power of ethical hacking
    With Indian Cyber Security Solutions. Our comprehensive training program equips you with the skills to safeguard against cyber threats. Learn from expert instructors and become a certified ethical hacker, defending the digital realm ethically and responsibly. Join us today!

    ReplyDelete
  44. i really liked your blog it is really helpfull for me thank you for this information
    https://www.3kip.in/

    ReplyDelete
  45. "Absolutely love the insightful perspective shared in this blog! 🌟 The author's concise yet powerful style makes complex ideas easy to grasp. Can't wait to read more. 👏
    inidantradebird.
    website : https://www.indiantradebird.com/product/magnetic-roller-separator

    ReplyDelete
  46. Thank you so much. Wonderful information and really very much useful. Thanks for sharing and keep updating Thank You so much for sharing this information. Thank you so much again. MS Word Full Course Free ( A to Z ) Tech . . . .

    ReplyDelete
  47. Thank you for sharing such informative content! I found it to be incredibly useful and learned a lot from it. Keep up the great work and looking forward to reading more from you in the future.
    TEREA KAZAKHSTAN

    ReplyDelete
  48. "Thank you immensely for providing this wonderful and highly valuable information. Your sharing is greatly appreciated, and please continue to keep us updated. Thanks again for sharing this valuable information." Tugboat Super

    ReplyDelete
  49. Absolutely, it's definitely possible to build forms that handle more complex fields, such as lists or properties with foreign keys. In fact, many web applications deal with complex data structures and relationships. Disposable Vape

    ReplyDelete
  50. Thank you for this very insightful post. I always appreciate high-quality content like what you've shared here. It's an excellent and innovative idea, providing valuable information of various kinds. Terea

    ReplyDelete
  51. Thank you very much! This information is fantastic and incredibly useful. Thanks for sharing, and please keep updating. Once again, thank you so much for sharing this valuable information! Vape Emirates

    ReplyDelete
  52. Certainly, it is entirely feasible to create forms capable of handling more intricate fields, including lists or properties with foreign keys. In reality, numerous web applications grapple with complex data structures and relationships. Vape Dubai

    ReplyDelete
  53. Certainly, it is entirely feasible to create forms that can manage more intricate fields, including lists or properties with foreign keys. In fact, many web applications handle complex data structures and relationships. IQOS Lil Solid 2.0

    ReplyDelete
  54. "Thank you so much for sharing this incredibly valuable information. Your contributions are deeply appreciated, and we look forward to more updates. Thanks again for providing this valuable insight." Uwell Caliburn

    ReplyDelete
  55. Hello! I occasionally read your blog, and I run a similar one. I was curious if you receive a significant amount of spam comments? If you do, do you have any methods or plugins you can recommend to prevent them? I've been inundated with spam lately, and it's been quite frustrating. Any guidance would be greatly appreciated. Vape Shop Near to Me

    ReplyDelete
  56. Thanks for this very informative post. I always appreciate high-quality content like this. It's an excellent and innovative idea with valuable information of various kinds. Elf Bar Dubai

    ReplyDelete
  57. The content indeed stands out with its blend of captivating information and visual appeal. It's a pleasure to come across such a well-crafted piece that seamlessly combines knowledge and aesthetics. The author's effort and dedication shine through, making this blog a standout platform. Disposable Vape

    ReplyDelete
  58. Keep up the excellent work, and here's to more intriguing and engaging content in the future. Kudos to the creator for making learning an enjoyable and visually pleasing experience! Elf Bar Duba

    ReplyDelete

  59. "Thank you for this wonderful post. I always appreciate high-quality content like this. It's an excellent and innovative idea with a wide range of valuable information." Juul Pods

    ReplyDelete

  60. I appreciate you sharing this informative content! It was incredibly valuable, and I gained a lot from it. Keep up the excellent work, and I look forward to reading more from you in the future.
    Elf Bar

    ReplyDelete
  61. This post is truly wonderful, and I'm grateful for it. I consistently enjoy such high-quality content. The ideas presented here are excellent, and they provide a diverse range of valuable information. IQOS Iluma IQOS

    ReplyDelete
  62. The ideas and information presented here are truly excellent. They cover a wide range of valuable topics, which makes this post even more valuable. It's a testament to the author's knowledge and ability to provide engaging and informative content. vape Shop

    ReplyDelete
  63. I'm delighted to hear that you found the content informative and useful. It's always a pleasure to share knowledge and insights with readers like you. Your encouraging words inspire me to continue providing valuable information in the future. I'll definitely keep up the great work and look forward to bringing you more informative content. Terea Dubai
    IQOS Iluma Prime

    ReplyDelete

  64. Your generous provision of this fantastic and incredibly valuable information is immensely appreciated. Your sharing has been a great help, and I encourage you to continue keeping us informed. Once more, thank you for sharing this invaluable information. Yuoto Vape Dubai

    ReplyDelete

  65. I appreciate your post, and thank you for it. I always appreciate excellent content like what you've shared here. Your ideas and the valuable information you've presented are truly fantastic. vape shops near me

    ReplyDelete
  66. Thank you for this excellent post! I always appreciate such valuable and diverse content. It's a fantastic idea with a wide range of valuable information. terea iqos

    ReplyDelete
  67. "Thank you for this very informative post. I consistently appreciate high-quality content like this. It's an excellent and innovative concept with a wealth of valuable information in various forms." Pod Salt

    ReplyDelete
  68. This is a very nice post; thank you for sharing it. I consistently appreciate such superb content in these posts. It's an excellent and cool concept, filled with various valuable insights. Terea Kazakhstan

    ReplyDelete
  69. "Thank you so much for sharing this fantastic and incredibly valuable information. Your generosity in sharing is greatly appreciated, and please keep us posted with updates. Once again, thanks for sharing this invaluable information." terea silver

    ReplyDelete
  70. Thank you for this very nice post. I always appreciate high-quality content like this. It's an excellent and innovative idea with valuable information of various kinds. vape dubai

    ReplyDelete
  71. Quoting and citing sources plays a crucial role in content sharing and blogging. It not only acknowledges the original author but also delivers valuable information to your readers.
    Terea Dubai

    ReplyDelete
  72. Your kind contribution of this fantastic and incredibly valuable information is highly appreciated. Your sharing has been a tremendous help, and I encourage you to keep us informed in the future. Once again, thank you for sharing this priceless information. Juul Pod

    ReplyDelete
  73. This comment has been removed by the author.

    ReplyDelete
  74. great post.

    https://quikdox.com/how-to-create-will-online

    ReplyDelete
  75. Hi!
    Hi!
    This was a fantastic read! Personalizing a blog is such a crucial aspect of building a unique online presence, and these tips were spot on. I especially loved the insights about creating a distinct voice and incorporating personal stories – it’s amazing how much more engaging a blog becomes when readers can relate on a personal level.

    I’ve found that another effective way to personalize a blog is by consistently using a specific style of imagery or graphics. It not only makes the blog visually appealing but also reinforces the brand identity. Would love to hear your thoughts on that!

    Thanks for sharing these inspiring examples. Looking forward to implementing some of these ideas on my own blog!
    Best Regarding
    ATF Global Advisor
    https://atfglobals.com/

    ReplyDelete
  76. Thanks for posting such an informative and useful post.
    Java classes in Pune

    ReplyDelete
  77. LPVS is a French company located in Normandy, specialized in bubble wrap. It produces on site a wide range of bubble wrap and packaging for your objects, to ensure their protection during your shipments or during your moves.
    For more information visit our website:
    https://www.lpvs.fr/

    ReplyDelete
  78. Thanks for sharing this useful information! Hope that you will continue with the kind of stuff you are doing.
    Multi Art

    ReplyDelete
  79. For a more dynamic approach, use AJAX to asynchronously fetch data from the Servlet and update the JTable without reloading the page.https://hexacorp.com/google-cloud-cost-optimization

    ReplyDelete

  80. In today's fitness scene, many enthusiasts incorporate aquatic training into their workout routines to enhance their physical endurance, capacity, and strength. Prior to engaging in activities involving aquatic environments, it is essential to undergo aquatic safety training to prevent any potential accidents. West Coast Water Safety is an Aquatic Safety Training Academy for lifeguards, beach inspectors, hotel workers, rescue training for group 3 categorised pools, and beach skill sessions for school pupils, among other things.

    Acquiring the skill of swimming can enhance an individual's ability to prevent accidents in or around water. Nevertheless, ensuring water safety involves more than just knowing how to swim. It is essential to undergo aquatic safety training as drowning incidents happen frequently in home pools and hot tubs. Lifeguards, beach inspectors, and hotel staff are encouraged to enroll in aquatic safety training and beach skill workshops for school children offered by West Coast Water Safety, which will help them enhance their skills and knowledge for ensuring safety on beaches and in oceans.

    ReplyDelete
  81. Caluanie Muelear Oxidize Chemical Online: This product is used for crushing and processing precious metals and semiprecious stones. It is used for processing precious and semiprecious stones, crushing metals in the chemical industr colorless liquid

    ReplyDelete
  82. Satta King 786 Sattaking Satta King Online Satta King Up Satta King Delhi Satta King Chart Gali Disawar Satta King News Satta Matka Satta King Disawar Satta King Gali Visit satta king 786

    ReplyDelete
  83. Protect your skin from the ravages of aging. Restore a youthful glow to your appearance. Click here! anti-aging skin care

    ReplyDelete
  84. Unlock creativity with AI-Prompt.fr's AI Prompt Generator. Discover how our tool can inspire writers, artists, and musicians with tailored prompts. visit ai prompt maker

    ReplyDelete
  85. The best testosterone booster male hormone supplement is available over the counter. visit testosterone hormone supplements

    ReplyDelete
  86. Get harder with erection problem cure for ED symptoms needing instant male enhancement pills. visit cure to ed

    ReplyDelete
  87. This comment has been removed by the author.

    ReplyDelete
  88. Your blog is a treasure trove of valuable insights and engaging content! The way you present information is both captivating and informative, making it a must-read for anyone seeking to expand their knowledge. I truly appreciate the effort you put into creating such well-researched and thought-provoking posts. I invite you to read my blogs also: https://www.importglobals.com/india-Import-data where I share unique perspectives and helpful tips on different subjects. Keep up the amazing work!

    ReplyDelete
  89. Thank you for creating this blog! It's packed with valuable insights and information. Your effort is much appreciated, and it's a great resource for anyone seeking to learn more. Keep up the fantastic work! for more details visit our website https://in.herbspro.com/

    ReplyDelete
  90. The Five Behaviors of a Cohesive Team program helps teams develop trust, engage in constructive conflict, commit to decisions, hold one another accountable, and focus on collective results. By applying the principles of The Five Behaviors model, organizations can foster a more collaborative and effective team environment. For more details on this program.
    Visit The Five Behaviors of a Cohesive Team : https://strengthscape.com/fivebehaviorsprogram/

    ReplyDelete
  91. Trying to find disposable vapes in Dubai? I recommend browsing the Disposable Vape selection on Vapor Hub – they’ve got some excellent options.

    ReplyDelete
  92. Finding good disposable vapes in Dubai can be tough, but I found a great option on Dubai Vape Hub. The collection there covers a lot of popular brands.

    ReplyDelete
  93. For anyone in the UAE looking to buy HEETS, check out the IQOS Terea Kazakhstan HEETS on Dubai Vape Hub – they have a great range, and ordering was super easy!

    ReplyDelete
  94. If you're in the UAE and looking for genuine IQOS Terea HEETS, check out the IQOS Terea Kazakhstan HEETS on Vapor Hub. The quality is excellent, and they offer quick delivery – highly recommended for IQOS users in Dubai!

    ReplyDelete
  95. For those in search of a leading software engineer in Bangladesh, Engr. Saad offers a distinguished record of excellence across diverse software projects. With deep expertise in advanced technologies and a strong commitment to quality, he is an ideal partner for complex development initiatives. To learn more about his professional services, please visit Engr. Saad’s website!

    ReplyDelete
  96. If you're looking for the best software company in Bangladesh, Triangle Tech stands out for its innovative solutions and expert team. They offer a range of services tailored to meet diverse business needs, from software development to digital transformation. Check out Triangle Tech to learn more about how they can help your business grow with cutting-edge technology!

    ReplyDelete
  97. Elf Bar BC5000 Disposable Vape - 5000 Puffs, 20mg - Premium Choice in UAE"
    Comment: The Elf Bar BC5000 is an excellent choice for vapers in the UAE, offering up to 5000 puffs with a smooth 20mg nicotine strength. Known for its high quality and rich flavor, it’s ideal for anyone seeking a long-lasting, reliable disposable vape. Discover more about why the Elf Bar BC5000 is among the best options available here!

    ReplyDelete
  98. Premium 30ml Salt Nicotine E-Juice – Best Selection in UAE"
    Comment: For vapers looking for quality salt nicotine e-juice in the UAE, this collection offers a fantastic variety of 30ml options with smooth flavors and satisfying nicotine strength. Perfect for a refined vaping experience, these e-juices are ideal for those seeking quality and taste in every puff. Explore the full range of 30ml Salt Nicotine E-Juice here!

    ReplyDelete
  99. Pod Salt Nexus 12000 Puffs Disposable Vape – 20mg Best Choice in UAE"
    Comment: The Pod Salt Nexus is an exceptional disposable vape offering an impressive 12000 puffs with a smooth 20mg nicotine hit. It’s perfect for users seeking a long-lasting, high-quality disposable option with great flavor. Discover why the Pod Salt Nexus is a top choice for vapers in the UAE here!

    ReplyDelete
  100. Al Fakher 8000 Disposable Vape - 8000 Puffs - Exceptional Experience"
    Comment: For those who want an immersive vaping experience, the Al Fakher 8000 offers big clouds and exceptional flavor in every puff. Perfect for vape enthusiasts who want quality and consistency. Learn more about it here!

    ReplyDelete
  101. The New Pod Salt Nexus disposable vape is a remarkable option for vapers seeking convenience and longevity, offering an impressive 12000 puffs. With its rich flavors and smooth nicotine delivery, this vape is perfect for those who want a satisfying experience without the hassle of refilling. Check out the Pod Salt Nexus and elevate your vaping experience here!

    ReplyDelete
  102. If you're a JUUL fan in Dubai, finding reliable pods can be tough. I recently came across the JUUL 2 Pods on Dubai Vape Hub, and they have a great selection. Perfect for anyone looking for convenience and quality!

    ReplyDelete
  103. If you’re in Dubai and looking for JUUL 2 pods, check out the JUUL 2 Pods on Vapor Hub. Great quality and super convenient for JUUL users in the UAE!

    ReplyDelete
  104. For a smooth, long-lasting experience, the Al Fakher Crown Bar 15000 Puffs is a top pick! It's great to see a high-capacity vape available in the UAE for enthusiasts.

    ReplyDelete
  105. If you’re into fruity and powerful disposables, check out the Al Fakher Pro 8000 Puffs. This model brings solid flavors for extended use and is perfect for UAE residents.

    ReplyDelete
  106. Craving a strawberry twist? The Al Fakher Strawberry Punch Disposable Vape 8000 Puffs has an impressive strawberry flavor profile that makes every puff enjoyable.

    ReplyDelete
  107. For those who love a classic minty flavor, try the Al Fakher Gum Mint 8000 Puffs on Vapor Hub Dubai. It’s refreshing and perfect for on-the-go use!

    ReplyDelete
  108. Fans of Al Fakher’s iconic Two Apple blend will enjoy the Al Fakher Two Apple Disposable 8000 Puffs. A classic flavor now available in a convenient format.

    ReplyDelete
  109. For a sleek and flavorful pod option, consider the Myle V5 Meta Pods in Dubai. They’re convenient and offer rich flavor choices for a quality experience.

    ReplyDelete
  110. If you miss that familiar tobacco flavor, try the Juul Virginia Tobacco Pods for an authentic taste. Available in the UAE!

    ReplyDelete
  111. For long-lasting puffs, the VNSN Quake Pro Disposable Vape 14000 Puffs is a reliable choice that’s easily accessible in Dubai.

    ReplyDelete
  112. If you're after a powerful disposable, the Tugboat T12000 Puffs delivers big on both flavor and durability for vapers in the UAE.

    ReplyDelete
  113. For a quick, compact option, check out the Pod Salt Go Disposable 2500 Puffs on Vapor Hub. It’s portable and perfect for a quick vape session.

    ReplyDelete
  114. The Tugboat EVO Disposable Vape 4500 Puffs offers a variety of flavors and excellent convenience for UAE users.

    ReplyDelete
  115. If you're into rich flavors with longevity, the Tugboat XXL Disposable Vape Pods is a fantastic pick available in Dubai.

    ReplyDelete
  116. For a unique twist, try the Vozol Gear Shisha 25000 Puffs with shisha-inspired flavors that bring a unique experience to UAE vapers.

    ReplyDelete
  117. Looking for a disposable with a variety of flavors? Try the VGOD Stig Disposable Vape, which offers plenty of choices for every taste in Dubai.

    ReplyDelete
  118. Discover a satisfying, tobacco-free option with VELO Nicotine Pouches, available in Dubai for those who want a clean and effective experience.

    ReplyDelete
  119. The Zyn Nicotine Pouches are a great smokeless choice for nicotine lovers in the UAE looking for discreet use.

    ReplyDelete
  120. For a unique pouch experience, try the White Fox Nicotine Pouches on Vapor Hub, offering high quality and a fresh experience.

    ReplyDelete
  121. If you're looking for a new HEETS flavor, the IQOS Terea Indonesian brings exotic flavors to the UAE for IQOS users.

    ReplyDelete
  122. The new IQOS ILUMA One Kit is a sleek choice for UAE residents looking for advanced tobacco heating technology.

    ReplyDelete
  123. Check out the latest in IQOS technology with the IQOS ILUMA I One 2024 available in Dubai, designed for modern convenience.

    ReplyDelete
  124. For those after a complete set, the IQOS ILUMA One Kit provides all essentials in one for UAE users wanting a premium experience.

    ReplyDelete
  125. If you prefer high-end IQOS, check out the IQOS ILUMA Prime for quality and sleek design, now available in Dubai.

    ReplyDelete
  126. For a premium experience, try the IQOS ILUMA I Prime, an elegant addition to any UAE IQOS collection.

    ReplyDelete
  127. For a wide selection of disposables, check out the Disposable Vape category on Vapor Hub, which offers options for every flavor preference.

    ReplyDelete
  128. The Nicotine Pouches category on Vapor Hub provides a smokeless alternative for nicotine enthusiasts in Dubai.

    ReplyDelete
  129. For IQOS ILUMA fans, explore the IQOS ILUMA Terea collection, featuring innovative tobacco products suited for UAE users.

    ReplyDelete
  130. The HEETS Terea category offers an array of unique flavors for HEETS users across the UAE.

    ReplyDelete
  131. Fans of the Kazakhstan edition can check out the HEETS Kazakhstan collection for a variety of rich flavors in Dubai.

    ReplyDelete
  132. This comprehensive blog on DISC is a remarkable guide for anyone eager to enhance their understanding and implementation of DISC principles. Its balanced blend of theory and practice offers readers a clear pathway to applying DISC insights effectively in various settings, from personal growth to organizational success. The thoughtful integration of real-world examples enriches the learning experience, making complex concepts accessible and relatable. Strengthscape has truly outdone itself with this insightful and expertly crafted resource, catering to both beginners and seasoned practitioners. Whether you're looking to refine your leadership skills, improve team dynamics, or pursue DISC certification, this blog is an invaluable resource. Don’t miss out on this opportunity to elevate your knowledge – dive into the details here: https://strengthscape.com/understanding-disc/

    ReplyDelete
  133. This article highlights a crucial shift in the recruitment process—embracing psychometric tests for better decision-making. I completely agree that these tests help filter candidates effectively and align them with job requirements. Digital testing platforms are a game-changer, providing automated insights that save time and increase accuracy. Looking forward to seeing how these innovations continue to shape the hiring landscape in India. Read more about this at https://strengthscape.com/psychometric-test-india/

    ReplyDelete
  134. Thanks a lot for sharing your valuable information.
    see more

    ReplyDelete
  135. What an insightful post! I loved how you tackled [specific topic]. Your points were well-articulated and thought-provoking. Thank you for sharing such valuable information! Looking forward to more. Best Vape Shop Dubai

    ReplyDelete
  136. "Wow, this post is such a gem! 🌟 I love how you explained everything so clearly. 📚 Your tips are super helpful, and I can't wait to try them out! 💡 Keep up the amazing work, and thank you for sharing your knowledge with us. 🙌 Looking forward to reading more of your content! 😊"

    ReplyDelete

emo-but-icon

SUBSCRIBE


item