Airline Ticket Reservation Website (Java and mySQL)


--------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------
Create 3D Animation and Video In 3 Clicks...know more

1) Introduction:
Airline Ticket Reservation is a sample web application which could be use to search flights based on the specified airports (departure airport, arrival airport) and dates (departure date and return date).
2) References: 
- For basic DB preparations please refer to notes titled "Installation and Testing of MySQL DB from Java"
- For basic Java EE setup for Airline Ticket Reservation Project refer to notes titled "Build and Deployment of Java EE Web Application (Airline Ticket Reservation)"
3) Database Preparations:
i) Create a Database : airlinedb and set it current
mysql>CREATE DATABASE airlinedb;
USE airlinedb;
ii) Create table to store Sector information as described below
CREATE TABLE SECTOR (
DEPARTURE_AP VARCHAR(100),
ARRIVAL_AP VARCHAR(100),
DEPARTURE_DT DATE,
ARRIVAL_DT DATE,
DEPARTURE_TM TIME,
ARRIVAL_TM TIME,
SID INT,
PID INT,
PRIMARY KEY (SID)
)
Insert 5 sample records: 
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('NRT','LAX','2012-05-15','2012-05-15','10:05','19:01',1, 1);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('NRT','LAX','2012-05-15','2012-05-15','14:00','23:15',2, 2);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('NRT','LAX','2012-05-16','2012-05-16','14:00','23:15',3, 2);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('LAX','NRT','2012-05-25','2012-05-25','06:15','15:01',4, 1);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('LAX','NRT','2012-05-27','2012-05-27','08:05','17:31',5, 2);
iii) Create table to store Price information as described below
CREATE TABLE PRICE (
 PID INTEGER,
 BASIC DECIMAL(10,2),
 SURCHARGE DECIMAL(10,2),
 TAX DECIMAL(10,2),
 DISCOUNT DECIMAL(10,2),
 CURR VARCHAR(3),
 PRIMARY KEY (PID)
);
Insert 2 sample records: 
INSERT INTO PRICE (PID,BASIC,SURCHARGE,TAX,DISCOUNT,CURR) VALUES (1,1200,110,50,75,'USD');
INSERT INTO PRICE (PID,BASIC,SURCHARGE,TAX,DISCOUNT,CURR) VALUES (2,1800,200,145,105,'USD');
4) Java Source Preparations (refer above section 2 for creating web project):
- Add mySQL JDBC driver to the newly created Eclipse Web Project 
[/WEB-INF/lib/mysql-connector-java-5.1.18-bin.jar]
- Add below source files to the project and finally create war file and deploy it to JBoss
------------------------------------------------------------------------------
[Java Resources]
/controller/SearchController.java
/controller/SearchDAO.java
/model/Criteria.java
/model/Price.java
/model/Result.java
/model/Sector.java
[WebContent]
/resultView.jsp
/searchView.html
/image/airline.png
/WEB-INF/lib/mysql-connector-java-5.1.18-bin.jar
/WEB-INF/web.xml
------------------------------------------------------------------------------
-Project structure
























------------------------------------------------------------------------------
5) Output
- Use below url to access the application
http://localhost:8080/AirlineTicketReservation/
- Enter below criteria and press [Search] button
- System will display below results
6) Source Reference
/controller/SearchController.java
package controller;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Calendar;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.Criteria;
import model.Result;
public class SearchController extends HttpServlet {
         @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException {
               System.out.println("Calling doPost...");
               String fromAirport = req.getParameter("fromAirport");
               String toAirport = req.getParameter("toAirport");
               String fromDay = req.getParameter("fromDay");
               String fromMonth = req.getParameter("fromMonth");
               String fromYear = req.getParameter("fromYear");
              
               String toDay = req.getParameter("toDay");
               String toMonth = req.getParameter("toMonth");
               String toYear = req.getParameter("toYear");

               Criteria criteria = new Criteria();
               Calendar departureCalendar = Calendar.getInstance();
               departureCalendar.set(Integer.parseInt(fromYear), Integer.parseInt(fromMonth) - 1, Integer.parseInt(fromDay)); // month starts from 0 in Calendar
               Calendar returnCalendar = Calendar.getInstance();
               if (toYear.length() > 0 && toMonth.length() > 0 && toDay.length() > 0) {
                    returnCalendar.set(Integer.parseInt(toYear), Integer.parseInt(toMonth) - 1, Integer.parseInt(toDay));
               }

               criteria.setDepartureAirport(fromAirport);
               criteria.setArrivalAirport(toAirport);
               criteria.setDepartureDate(departureCalendar);
               criteria.setReturnDate(returnCalendar);
              
               System.out.println("From airport =" + fromAirport);
               System.out.println("To   airport =" + toAirport);
               Result[] resultsForward = null;
               Result[] resultsReturn = null;
              
               try {
                    resultsForward = new SearchDAO().getResultsForward(criteria);
                    System.out.println("Results Forward ["+ resultsForward +"] ");
                    resultsReturn = new SearchDAO().getResultsReturn(criteria);
                    System.out.println("Results Return ["+ resultsReturn +"] ");
               } catch (SQLException e) {
                    e.printStackTrace();
               }
              
               HttpSession session = req.getSession();
               session.setAttribute("ATTR_RESULTS_FORWARD", resultsForward);
               session.setAttribute("ATTR_RESULTS_RETURN", resultsReturn);
               RequestDispatcher dis = req.getRequestDispatcher("resultView.jsp");
               dis.forward(req, resp);
          }
}
/controller/SearchDAO.java
package controller;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import model.Criteria;
import model.Price;
import model.Result;
import model.Sector;
/**
 * Data Access Object to communicate with underlying data source.
 * @author santosh lawoo
 */
public class SearchDAO {
     static Connection connection = null;  
  /**
   * Method to return existing database connection, else returns new connection
   * @return database connection
   */
     public static Connection getConnection() {
          if (connection != null) {
                    return connection;
          } else {
                try {
                          Class.forName("com.mysql.jdbc.Driver");
                          connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/airlinedb",
                                        "root""");
                } catch (Exception ex) {
                          ex.printStackTrace();
                }
          }        
          return connection;
     }

     /**
      * Returns results containing sector information for forward flight
      * @param criteria the search conditions based on the User inputs
      * @return result array containing information on multiple sectors and related price
      * @throws SQLException
      */
     public Result[] getResultsForward(Criteria criteria) throws SQLException {
               PreparedStatement prepStmt = null;
               ResultSet rs = null;
                java.sql.Date departDt = new java.sql.Date(criteria.getDepartureDate().getTimeInMillis());
                ArrayList<Result> results = new ArrayList<Result>();               
                String selectStatement = "select * from SECTOR where DEPARTURE_AP = ? AND ARRIVAL_AP = ? AND DEPARTURE_DT = ? ";
                  prepStmt = getConnection().prepareStatement(selectStatement);
                  prepStmt.setString(1, criteria.getDepartureAirport());
                  prepStmt.setString(2, criteria.getArrivalAirport());
                  prepStmt.setDate(3, departDt);                     
                 rs = prepStmt.executeQuery();
               
                 while (rs.next()) {
                      Result result = new Result();
                      Sector sector = new Sector();
                      sector.setDepartureAirport(rs.getString("DEPARTURE_AP"));
                      sector.setArrivalAirport(rs.getString("ARRIVAL_AP"));
                      Calendar calendarDepart = Calendar.getInstance();
                      calendarDepart.setTime(rs.getDate("DEPARTURE_DT"));
                      sector.setDepartureDate(calendarDepart);
                      Calendar calendarArrival = Calendar.getInstance();
                      calendarArrival.setTime(rs.getDate("ARRIVAL_DT"));
                      sector.setArrivalDate(calendarArrival);
                      sector.setDepartureTime(String.valueOf(rs.getTime("DEPARTURE_TM")));
                      sector.setArrivalTime(String.valueOf(rs.getTime("ARRIVAL_TM")));
                      sector.setSid(rs.getLong("SID"));
                      sector.setPid(rs.getLong("PID"));
                      result.setSector(sector);
                      setPriceInfo(result);
                      results.add(result);
                 }         
            return (Result[]) results.toArray(new Result[results.size()]);
     }
    
     /**
      * Returns results containing sector information for return flight
      * @param criteria the search conditions based on the User inputs
      * @return result array containing information on multiple sectors and related price
      * @throws SQLException
      */
     public Result[] getResultsReturn(Criteria criteria) throws SQLException {
          PreparedStatement prepStmt = null;
          ResultSet rs = null;
      java.sql.Date returntDt = new java.sql.Date(criteria.getReturnDate().getTimeInMillis()); 
           ArrayList<Result> results = new ArrayList<Result>();           
           String selectStatement ="select * from SECTOR where DEPARTURE_AP = ? AND ARRIVAL_AP = ? AND DEPARTURE_DT = ? ";
             prepStmt = getConnection().prepareStatement(selectStatement);
             prepStmt.setString(1, criteria.getArrivalAirport());
             prepStmt.setString(2, criteria.getDepartureAirport());
             prepStmt.setDate(3, returntDt);                 
            rs = prepStmt.executeQuery();

            while (rs.next()) {
                 Result result = new Result();
                 Sector sector = new Sector();
                 sector.setDepartureAirport(rs.getString("DEPARTURE_AP"));
                 sector.setArrivalAirport(rs.getString("ARRIVAL_AP"));
                 Calendar calendarDepart = Calendar.getInstance();
                 calendarDepart.setTime(rs.getDate("DEPARTURE_DT"));
                 sector.setDepartureDate(calendarDepart);
                 Calendar calendarArrival = Calendar.getInstance();
                 calendarArrival.setTime(rs.getDate("ARRIVAL_DT"));
                 sector.setArrivalDate(calendarArrival);
                 sector.setDepartureTime(String.valueOf(rs.getTime("DEPARTURE_TM")));
                 sector.setArrivalTime(String.valueOf(rs.getTime("ARRIVAL_TM")));
                 sector.setSid(rs.getLong("SID"));
                 sector.setPid(rs.getLong("PID"));
                 result.setSector(sector);
                 setPriceInfo(result);
                 results.add(result);
            }      
       return (Result[]) results.toArray(new Result[results.size()]);
}
     /**
      * Method to add price information to the result, which already contains sector information
      * (No need to return updated result as java passes parameter by object's reference copy)
      * @param result to set price information
      * @throws SQLException
      */
     private void setPriceInfo(Result result) throws SQLException {
           PreparedStatement prepStmt = null;
           ResultSet rs = null;
   
           String selectStatement = "select * from PRICE where PID = ? ";
            prepStmt =
               getConnection().prepareStatement(selectStatement);
                 prepStmt.setLong(1, result.getSector().getPid());             
           rs = prepStmt.executeQuery();
            if (rs.next()) {
           Price price = new Price();
           price.setBasic(rs.getFloat("BASIC"));
           price.setSurcharge(rs.getFloat("SURCHARGE"));
           price.setTax(rs.getFloat("TAX"));
           price.setDiscount(rs.getFloat("DISCOUNT"));
           price.setCurr(rs.getString("CURR"));
           result.setPrice(price);
           }
      }
}
/model/Criteria.java
package model;
import java.util.Calendar;
/**
 * Model to hold Criteria information
 * @author santosh lawoo
 */
public class Criteria {
     private String departureAirport;
     private String arrivalAirport;
     private Calendar departureDate//arrivalDate wil be provided by system based on the sector
     private Calendar returnDate;// blank for one-way flights   
     /**
      * @return the departureAirport
      */
     public String getDepartureAirport() {
          return departureAirport;
     }
     /**
      * @param departureAirport the departureAirport to set
      */
     public void setDepartureAirport(String departureAirport) {
          this.departureAirport = departureAirport;
     }
     /**
      * @return the arrivalAirport
      */
     public String getArrivalAirport() {
          return arrivalAirport;
     }
     /**
      * @param arrivalAirport the arrivalAirport to set
      */
     public void setArrivalAirport(String arrivalAirport) {
          this.arrivalAirport = arrivalAirport;
     }
     /**
      * @return the departureDate
      */
     public Calendar getDepartureDate() {
          return departureDate;
     }
     /**
      * @param departureDate the departureDate to set
      */
     public void setDepartureDate(Calendar departureDate) {
          this.departureDate = departureDate;
     }
     /**
      * @return the returnDate
      */
     public Calendar getReturnDate() {
          return returnDate;
     }
     /**
      * @param returnDate the returnDate to set
      */
     public void setReturnDate(Calendar returnDate) {
          this.returnDate = returnDate;
     }
}
/model/Price.java
package model; 
/**
 * Model to hold Price information
 * @author santosh lawoo
 */
public class Price {    
     private float basic;
     private float surcharge;
     private float tax;
     private float discount;
     private String curr;    
     /**
      * @return the basic
      */
     public float getBasic() {
          return basic;
     }
     /**
      * @param basic the basic to set
      */
     public void setBasic(float basic) {
          this.basic = basic;
     }
     /**
      * @return the surcharge
      */
     public float getSurcharge() {
          return surcharge;
     }
     /**
      * @param surcharge the surcharge to set
      */
     public void setSurcharge(float surcharge) {
          this.surcharge = surcharge;
     }
     /**
      * @return the tax
      */
     public float getTax() {
          return tax;
     }
     /**
      * @param tax the tax to set
      */
     public void setTax(float tax) {
          this.tax = tax;
     }
     /**
      * @return the discount
      */
     public float getDiscount() {
          return discount;
     }
     /**
      * @param discount the discount to set
      */
     public void setDiscount(float discount) {
          this.discount = discount;
     }
     /**
      * @return the curr
      */
     public String getCurr() {
          return curr;
     }
     /**
      * @param curr the curr to set
      */
     public void setCurr(String curr) {
          this.curr = curr;
     }
}
/model/Result.java
package model;
/**
 * Model to hold Result information
 * @author santosh lawoo
 */
public class Result {    
     private Price price;
     private Sector sector;   
     /**
      * @return the sector
      */
     public Sector getSector() {
          return sector;
     }

     /**
      * @param sector the sector to set
      */
     public void setSector(Sector sector) {
          this.sector = sector;
     }

     /**
      * @return the price
      */
     public Price getPrice() {
          return price;
     }

     /**
      * @param price the price to set
      */
     public void setPrice(Price price) {
          this.price = price;
     }
/model/Sector.java
package model;
import java.util.Calendar;
/**
 * Model to hold Sector information
 * @author santosh lawoo
 */
public class Sector {
     private String departureAirport;
     private String arrivalAirport;
     private Calendar departureDate;
     private Calendar arrivalDate;
     private String departureTime;
     private String arrivalTime;
     private long sid;
     private long pid;    
     /**
      * @return the departureAirport
      */
     public String getDepartureAirport() {
          return departureAirport;
     }
     /**
      * @param departureAirport the departureAirport to set
      */
     public void setDepartureAirport(String departureAirport) {
          this.departureAirport = departureAirport;
     }
     /**
      * @return the arrivalAirport
      */
     public String getArrivalAirport() {
          return arrivalAirport;
     }
     /**
      * @param arrivalAirport the arrivalAirport to set
      */
     public void setArrivalAirport(String arrivalAirport) {
          this.arrivalAirport = arrivalAirport;
     }
     /**
      * @return the departureDate
      */
     public Calendar getDepartureDate() {
          return departureDate;
     }
     /**
      * @param departureDate the departureDate to set
      */
     public void setDepartureDate(Calendar departureDate) {
          this.departureDate = departureDate;
     }
     /**
      * @return the arrivalDate
      */
     public Calendar getArrivalDate() {
          return arrivalDate;
     }
     /**
      * @param arrivalDate the arrivalDate to set
      */
     public void setArrivalDate(Calendar arrivalDate) {
          this.arrivalDate = arrivalDate;
     }
     /**
      * @return the departureTime
      */
     public String getDepartureTime() {
          return departureTime;
     }
     /**
      * @param departureTime the departureTime to set
      */
     public void setDepartureTime(String departureTime) {
          this.departureTime = departureTime;
     }
     /**
      * @return the arrivalTime
      */
     public String getArrivalTime() {
          return arrivalTime;
     }
     /**
      * @param arrivalTime the arrivalTime to set
      */
     public void setArrivalTime(String arrivalTime) {
          this.arrivalTime = arrivalTime;
     }
     /**
      * @return the sid
      */
     public long getSid() {
          return sid;
     }
     /**
      * @param sid the sid to set
      */
     public void setSid(long sid) {
          this.sid = sid;
     }
     /**
      * @return the pid
      */
     public long getPid() {
          return pid;
     }
     /**
      * @param pid the pid to set
      */
     public void setPid(long pid) {
          this.pid = pid;
     }
/resultView.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="model.Result" %>
<%
Result[] resultsForward = (Result[])session.getAttribute("ATTR_RESULTS_FORWARD");
Result[] resultsReturn  = (Result[])session.getAttribute("ATTR_RESULTS_RETURN");
SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Result</title>
</head>
<body>    
     <table border = "1" align="center">
     <% if (resultsForward.length <= 0) { %>
        <tr>
            <td>
            <font size="3" color="GRAY">Forward Flight Details</font>
           </td>
       </tr>
        <tr>
               <td align ="left" valign="bottom" bgcolor="RED">
               <font size="2" color="#FFFFFF">Sorry!!! no flights found. Please try again.</font>
               </td>
          </tr>
    <% } else {%>
       <tr>
            <td>
            <font size="3" color="GRAY">Forward Flight Details</font>
           </td>
       </tr>
        <tr>
               <td align ="left" valign="bottom" bgcolor="#000080">
               <font size="2" color="#FFFFFF"><b><%=resultsForward[0].getSector().getDepartureAirport() %></b></font> -
               <font size="2" color="#FFFFFF"><b><%= resultsForward[0].getSector().getArrivalAirport() %></b></font>
               </td>
          </tr>
          <% for (int i = 0; i < resultsForward.length; i++) { %>
          <tr>
               <td align ="left" valign="bottom" >
               <font size="2" >Date: <%=  sf.format(resultsForward[i].getSector().getDepartureDate().getTime()) %></font>
               <font size="2" >Departure: <%=  resultsForward[i].getSector().getDepartureTime() %></font>
               <font size="2" >Arrival: <%=  resultsForward[i].getSector().getArrivalTime() %></font>
               </td>
          </tr>
         
          <tr>
               <td align ="left" valign="bottom" >
               <font size="2" >Price <%=  resultsForward[i].getPrice().getBasic() + " " + resultsForward[i].getPrice().getCurr() %></font>
               </td>
          </tr>
         
          <% }  }%>    
     </table>
    
     <br/>    
    <table border = "1" align="center">
     <% if (resultsReturn.length <= 0) { %>
       <tr>
            <td>
            <font size="3" color="GRAY">Return Flight Details</font>
           </td>
       </tr>
        <tr>
               <td align ="left" valign="bottom" bgcolor="RED">
               <font size="2" color="#FFFFFF">Sorry!!! no flights found. Please try again.</font>
               </td>
          </tr>
    <% } else {%>
       <tr>
            <td>
            <font size="3" color="GRAY">Return Flight Details</font>
           </td>
       </tr>
        <tr>    
        <tr>
               <td align ="left" valign="bottom" bgcolor="#000080">
               <font size="2" color="#FFFFFF"><b><%=resultsReturn[0].getSector().getDepartureAirport() %></b></font> -
               <font size="2" color="#FFFFFF"><b><%= resultsReturn[0].getSector().getArrivalAirport() %></b></font>
               </td>
          </tr>
          <% for (int i = 0; i < resultsReturn.length; i++) { %>
          <tr>
               <td align ="left" valign="bottom" >
               <font size="2" >Date: <%=  sf.format(resultsReturn[i].getSector().getDepartureDate().getTime()) %></font>
               <font size="2" >Departure: <%=  resultsReturn[i].getSector().getDepartureTime() %></font>
               <font size="2" >Arrival: <%=  resultsReturn[i].getSector().getArrivalTime() %></font>
               </td>
          </tr>
          <% }  }%>    
     </table>    
         
</body>
</html>
/searchView.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Search Flight</title>
</head>
<body> 
<form action="searchController.do" method="post">
     <table border = "1" align="center">
        <tr>
               <td align ="center" valign="bottom" bgcolor="#000080">
               <font size="4" color="#FFFFFF"><b>Airline Ticket Reservation</b></font>
               </td>
          </tr>
          <tr>
               <td>
               <img src="image/airline.png" alt="Airline" width=100% height=100%>
               </td>
          </tr>        
          <tr>
               <td>
               <b>Airport</b> <br/>
               From <SELECT NAME="fromAirport">
                    <OPTION VALUE="NRT">NaritaTokyo
                    <OPTION VALUE="LAX">Los Angeles, California
               </SELECT>

               &nbsp;To <SELECT NAME="toAirport">
                    <OPTION VALUE="LAX">Los Angeles, California
                    <OPTION VALUE="NRT">NaritaTokyo
               </SELECT>
               </td>
          </tr>         
          <tr>
               <td align="left">    
               <b>Date</b>[yyyy-mm-dd]<br/>
               Depart <input type="text" name="fromYear" size="4">-<input type="text" name="fromMonth" size="2">-<input type="text" name="fromDay" size="2">
               Return*   <input type="text" name="toYear" size="4"  >-<input type="text" name="toMonth"  size="2" >-<input type="text" name="toDay" size="2">
               <br/>
               <font size="2" color="#808080">*For one-way flight keep "Return" date blank</font>
               </td>
          </tr>
         
          <tr>
               <td align="right">
               <input type="submit" value="Search">
               </td>
          </tr>
     </table>    
</form>

</body>
</html>
/image/airline.png

/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">
  <welcome-file-list>
     <welcome-file>searchView.html</welcome-file>
  </welcome-file-list>  
  <servlet>
    <servlet-name>searchController</servlet-name>
    <servlet-class>controller.SearchController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>searchController</servlet-name>
    <url-pattern>/searchController.do</url-pattern>
  </servlet-mapping>   
</web-app>

7 comments :

  1. Hi my dears I happy for found this site very helpful !!!


    تیک بان سایت خرید آنلاین بلیط هواپیما [airline tickets] ست که بلیط استاتبول و بلیط
    هواپیما لندن را می توانید به صورت بلیط چارتر از آن خریداری کنید.فرآیند خرید بلیط قطار اینترنتی تیک بان و تهیه بلیط اتویوس و حتا تهیه بلیط هواپیما خارجی به حدی آسان است که همه مسافران با دسترسی به اینترنت می توانند بدون محدودیت زمانی و مکانی آن را تهیه کنند. تیک بان بهترین سایت برای بررسی قیمت بلیط هواپیما داخلی و خارجی است.

    ReplyDelete
  2. Your site is excellent. We and our colleagues are very happy with your site and we would love to see your site in the world, hoping for the days of success that are close.
    سایت بزرگ تورباتو علاوه بر امکان خرید تور لحظه آخری
    خارجی این امکان را به تمامی متقاضیان عزیز میدهد که تور هایی مانند تور مشهد را به صورت لحظه آخری خریداری کنید، شما با مراجعه به سایت تور با تو و با وارد شدن به قسمت تور داخلی میتوانید تمام تور های لحظه آخری داخلی یا خارجی مثل
    تور گرجستان
    را مشاهده کنید و از تمامی هزینه های آن مطلع شوید. در سایت تور باتو شما میتوانید تور هایی نظیر تور دبی و همینطور تور استانبول را به صورت لحظه آخری و دقیقه نودی خریداری نمایید زیرا سایت ما شما را مطلع میسازد که در چه زمان هایی امکان این را دارید که اینگونه تور ها مثل تور ارمنستان لحظه آخری را به صورت لحظه آخری و دقیقه نودی با کمترین مبلغ تهیه کنید..

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

    ReplyDelete
  4. انیمیشن های جالبی میشه باهاش درست کرد و خیلی جذاب در میاد.من چون شغلم سئو هست به فکر این افتادم که درمورد بهترین مشاور سئو یک انیمیشن با java و mysql بسازم

    ReplyDelete