Merhabalar arkadaşlar. Daha önceki yazdığımız Maven yazılarının ardından bu yazıda demo bir maven projesi yapacağız.

  • IDE’miz üzerinde bir Maven projesi oluşturacağız.
  • Önyüzde Jsp ve onu beslemesi için Servlet kullanacağız.
  • MySQL db’de tutulan verileri çekip ekrana yazdıracağız.

Maven projesinin oluşturulma aşamasını önceki yazılarda anlatmıştım. Ben bu yazıyı yazarken IDE desteği kullanarak yazıyorum. Siz de Eclipse için buradan NetBeans için buradan ilgili yazılara erişip IDE’nizde Maven projesini açabilirsiniz.

O yazılar içerisinde pom.xml dosyasında javaee-web-api artifactId’li bağımlılığa bu yazı için ihtyacımız yok. Bu nedenle ilgili dependency kodunu silebilirsiniz.

Şimdi projedeki dosya ve sınıfları inceleyelim.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.ilkaygunel</groupId>
	<artifactId>DemoMavenProject</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>DemoMavenProject</name>
	<dependencies>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.6</version>
		</dependency>
	</dependencies>
	<build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.6.1</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Önceki yazılarda da bahsettiğim gibi pom.xml dosyası Maven projelerinin konfigürasyon dosyasıdır. Şimdi dosyayı bir inceleyelim:

  • Önceden de bahsettiğim gibi Maven’ın amaçlarından biri bağımlılık yönetimini kolaylaştırmaktır. Biz de ihtiyaç duyduğumuz kütüphaneleri dependencies tagleri arasına yazarak projemize dahil ediyoruz. Bu proje için 3 adet kütüphaneye ihtiyacımız var. Servlet&JSP kullandığımız için Servlet API, JSP içerisinde kullanmak için JSTL ve veri tabanı yazılımımız olan MySQL’in JDBC sürücüsü.
  • Ayrıca pom.xml içerisinde projemizin esas alacağı Java sürümünü de içerein bir compiler-plugin tanımı yer alıyor.
  • Dependencies eklemesi yapmak için kütüphanelerin bu bağımlılık kodlarına nereden erişeceğiz derseniz önünüzde iki yol mevcut. Birincisi Maven Repo’da yer alan aşağı yukarı tüm kütüphaneler kendi web sitelerinde bu bağımlılık kodunu verirler. İkinci yol ise https://mvnrepository.com/ adresinde ilgili kütüphaneyi arayıp kodu bulmaktır. Ben genellikle hızlı ve eski sürümler de kolaylıkla bulunabildiği için mvnrepository’i kullanıyorum.
  • groupId, artifactId, version ve packaging gibi alanlar hakkında daha önce bilgi vermiştim. Bu alanlara ait tanımlamalarımız proje için tanımlıyacı alanlardır.

Şimdi hızlıca Java kodlarına bakalım.

Benim veritabanımda Formula1 adında vir veritabanı mevcut ve bu veritabanı içerisinde Drivers adında bir tablo mevcut. O tabloda da şu kayıtlar yer almaktadır:

Şimdi bu kayıtları çekip ekrana yazdırmaya bakalım.

Driver.java

package com.ilkaygunel.pojo;

public class Driver {
	private int driverId;
	private String driverName;
	private String driverSurname;
	private String driverCountry;
	private String driverTeam;
	public int getDriverId() {
		return driverId;
	}
	public void setDriverId(int driverId) {
		this.driverId = driverId;
	}
	public String getDriverName() {
		return driverName;
	}
	public void setDriverName(String driverName) {
		this.driverName = driverName;
	}
	public String getDriverSurname() {
		return driverSurname;
	}
	public void setDriverSurname(String driverSurname) {
		this.driverSurname = driverSurname;
	}
	public String getDriverCountry() {
		return driverCountry;
	}
	public void setDriverCountry(String driverCountry) {
		this.driverCountry = driverCountry;
	}
	public String getDriverTeam() {
		return driverTeam;
	}
	public void setDriverTeam(String driverTeam) {
		this.driverTeam = driverTeam;
	}
}

Driver sınıfı bizim veritabanımızdaki Drivers tablosuna karşılık gelen, o tablodaki alanları içerisinde barındıran bir sınıftır. Herhangi bir ORM framework’ü kullanmadığımız için tabloya karşılık gelen sınıfı kendimiz yazdık. Eğer bir ORM tool’u kullanmış olsaydık tablonun Java sınıfı karşılığını otomatik oluşturabilirdik. Bu tarz sadece değişken ve onların get-set metotlarını barındıran sınıflar POJO (Plain Old Java Object) olarak adlandırılırlar.

DriverService.java

package com.ilkaygunel.service;

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.List;

import com.ilkaygunel.pojo.Driver;

public class DriversService {
	private List<Driver> driverList;
	
	public List<Driver> getDriverList(){
		driverList = new ArrayList<Driver>();
		
		PreparedStatement ps=null;
	    Connection con=null;
	    
	    
	    try {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Formula1","root","");
            ps=con.prepareStatement("SELECT * FROM drivers");
            ResultSet rs=ps.executeQuery();
            
            while(rs.next())
            {
            	Driver driver=new Driver();
                driver.setDriverId(rs.getInt("driverId"));
                driver.setDriverName(rs.getString("driverName"));
                driver.setDriverSurname(rs.getString("driverSurname"));
                driver.setDriverCountry(rs.getString("driverCountry"));
                driver.setDriverTeam(rs.getString("driverTeam"));
                driverList.add(driver);
            }
            return driverList;
        } 
        catch (ClassNotFoundException | SQLException exception) {
            System.out.println("Bir hata meydana geldi:"+exception);
            return null;
        }
        finally{ 
            try {
                if(con!=null){ 
                    con.close();
                }
                if(ps!=null){ 
                    ps.close();
                }
            } catch (SQLException sqlException) {
                System.out.println("Bir hata meydana geldi:"+sqlException);
            }
        }
	}
}

DriverService sınıfı mantık olarak Drivers tablosu üzerinde yapılacak operasyonları karşılayacak sınıftır. Bizim sınıfımız da Driver listesini getirmekle yükümlüdür. Sınıf içerisinde MySQL db’ye bağlantı açılıp Drivers tablosundan veriler çekiliyor ve listeye dolduruluyor. Yukarıdaki JDBC operasyonunu şurada biraz daha detaylı olarak anlatmıştım. Yazıyı uzatmamak adına tekrar burada paylaşmıyorum arkadaşlar, operasyon hakkında bilgi almak için linki tıklayabilirsiniz.

GetDriversServlet.java

package com.ilkaygunel.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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.ilkaygunel.service.DriversService;

@WebServlet(name = "getDrivers", urlPatterns = {"/getDrivers"})
public class GetDriversServlet extends HttpServlet{
	
	private static final long serialVersionUID = 1L;

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		DriversService driversService = new DriversService();
		request.setAttribute("driverList", driversService.getDriverList());
		RequestDispatcher view = request.getRequestDispatcher("/index.jsp");
        try {
			view.forward(request, response);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

GetDriversServlet sınıfı gelen isteği karşılayıp bir JSP sayfasına yönlendirme vazifesini üstlenmiş sınıftır. doGet metodu içerisinde DriversService sınıfından bir nesne oluşturulup driver listesini veren metot çağırılıyor ve gelen liste request objesi içerisine konuluyor. Ardından bir RequestDispatcher nesnesi edinilip forward işlemi yapılıyor. Biz kod içerisinde bu Servlet’e istek gelirse son aşamada index.jsp’ye yönlendirme yap dedik.

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:forEach var = "driver" items="${driverList}">
          <c:out value = "${driver.driverId} ${driver.driverName} ${driver.driverSurname} ${driver.driverCountry} ${driver.driverTeam}"/><p>
      </c:forEach>
</body>
</html>

JSP sayfamız içerisinde JSTL kütüphanemizden edindiğimiz c tag’i ile bir forEach döngüsü kuruyoruz ve items özelliğine az önce GetDriversServlet sınıfının doGet metodu içerisinde request objesine koyduğumuz driverList değerini atıyoruz. var özelliği ise döngü sırasında ayrı ayrı her bir objeye karşılık gelecek özelliğimizdir. c:forEach içerisinde c:out ile de driver var’ındaki alanlarımızı ekrana yazdırıyoruz.

web.xml

Son olarak bir de web.xml dosyasına göz atalım:

<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>DemoMavenProject</display-name>
  <welcome-file-list>
    <welcome-file>getDrivers</welcome-file>
  </welcome-file-list>
</web-app>

web.xml dosyamız oldukça basit ve sade. Servlet’ler normale web.xml içerisinde de tanımlanabilir ancak ben bu yazı için notasyon ile tanım yöntemini kullandım. web.xml içerisinde projenin karşılama sayfası yani projeye doğrudan istek yapıldığında otomatik açılacak sayfanın kim olduğunun tanımı welcome-file tag’i ile yapılıyor. Burada jsp, html, xhtml sayfaları tanımlanabilir. Ben GetDriversServlet sınıfının kayda geçirildiği isim olan getDrivers‘ı veriyorum ve projeye yapılan isteği Servlet’in karşılayacağını söylüyorum.

Şimdi http://localhost:8080/DemoMavenProject/ adresine gidiyorum ve şu ekran ile karşılaşıyorum:

Veritabanından bilgiler çekilmiş ve ekrana yazdırılmış.

Bu yazıda anlatacaklarım bu kadar arkadaşlar. Başka yazıda görüşmek üzere.

Görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle