czwartek, 22 grudnia 2011

Spring - pierwszy projekt

Spring
Spring składa się z pliku XML i Beanów.
Bean:
Jest to klasa zgodna ze specyfikacją JavaBeans.
Przykładowy program na bazie Springa.

HelloWorld.java
package hello;

public class HelloWorld {
    public void hello() {
 System.out.println("Hello World!!!");
    }
}

Plik XML:
Plik w którym zapisane są zależności między obiektami.

helloworld.xml
< beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
              
 <  bean id="helloworld" class="hello.HelloWorld" />


Uruchomienie:
Aby uruchomić przykład musimy podać ścieżkę do pliku XML, z którego będziemy korzystali:
Main.java
package hello;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("helloBeans.xml");
  BeanFactory factory = context;
  HelloWorld bean = (HelloWorld) factory.getBean("helloworld");
  bean.hello();
  
 }
}

Cechy Springa:
Odwrócenie sterowania – kontener IoC (Inversion of Control) – technika, która pozwala przekazać na zewnątrz tworzenie i zarządzanie zależnościami obiektów. Opis zależności między klasami jest przeniesiony do oddzielnego pliku xml.

Zależności między Beanami:
Zależności między konkretnymi Beanami określa się w pliku XML. Są dwa sposoby ich określenia:
Za pomocą konstruktora:
 < bean id="PrimeServiceBean" class="kkk.PrimeService" />
 < bean id="ApplicationBean" class="kkk.Application">
  < constructor−arg>< ref bean=”PrimeServiceBean” />

Za pomocą setterów:
 < bean id="PrimeServiceBean" class="kkk.PrimeService" />
 < bean id="ApplicationBean" class="kkk.Application" >
  < property name="primeService" ref="PrimeServiceBean" />
 

Wykorzystanie zależności zapisanych w beanie. Program sprawdza czy podana liczba jest liczbą pierwszą.


Main.java
package kkk;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  BeanFactory factory = context;
  Application test = (Application) factory.getBean("ApplicationBean");
  test.run();
  
 }
}
PrimeService.java
package kkk;

// odpowiedzialna za sprawdzenie czy dana liczba jest liczbą pierwszą
// powinny zostać wstrzyknięte do instancji Application z użyciem kontenera Spring 

public class PrimeService {
    public boolean sprawdzCzyPierwsza(int liczba) {
 double r = Math.sqrt(liczba);
 int i = 2;
 while (i <= r) {
     if ((liczba % i) == 0)
  return false;
     i++;
 }
 return true;
    }

}
Application.java
package kkk;

import java.util.Scanner;


// odpowiedzialna za wczytywanie wejścia i wypisywanie odpowiedzi

public class Application {
    private PrimeService primeService;

    public void setPrimeService(PrimeService primeService) {
 this.primeService = primeService;
    }

    public void run() {
 int liczba = wczytajDane();
 boolean czyPierwsza = primeService.sprawdzCzyPierwsza(liczba);
 wypiszWynik(czyPierwsza);
    }

    public static int wczytajDane() {
 Scanner s = new Scanner(System.in);
 System.out.print("Podaj liczbe: ");
 int w = s.nextInt();
 return w;
    }

    public static void wypiszWynik(boolean czyPierwsza) {
 if (czyPierwsza) {
     System.out.println("Wpisałeś liczbę pierwszą");
 } else {
     System.out.println("To nie jest liczba pierwsza");
 }
    }

}
bean.xml
< beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

 < bean id="PrimeServiceBean" class="kkk.PrimeService" />
 < bean id="ApplicationBean" class="kkk.Application">
  
 

CRUD – podstawowe operacje na bazach danych

CRUD.java
package kkk;

public interface CRUD {
 public void create(Osoba osoba);
 public Osoba read(int id);
 public void update(Osoba osoba);
 public void delete(int id);
}

Manager.java
package kkk;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Manager implements CRUD {

 @Override
 public void create(Osoba c) {
  String query = "INSERT INTO OSOBA VALUES(" 
+ c.getId() + ", '" + c.getImie() + "','" + c.getNazwisko() + "');";
  try {
   polaczenieUpdate(query);
  } catch (Exception e) {
   e.printStackTrace();
  }

 }

 @Override
 public Osoba read(int id) {
  Osoba osoba = new Osoba();
  Statement statement;
  ResultSet rs;
  try {
   Class.forName("org.h2.Driver");
   Connection conn = DriverManager.getConnection("jdbc:h2:~/baza_ksiazki",
 "sa", "");
   statement = conn.createStatement();
   String query = "SELECT * FROM OSOBA where id = " + id;
   rs = statement.executeQuery(query);
   while (rs.next()) {
    osoba = new Osoba(rs.getInt("id"), 
rs.getString("IMIE"), rs.getString("nazwisko"));
   }
   conn.close();
   System.out.println(query);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return osoba;
 }

 @Override
 public void update(Osoba c) {
  String query = "UPDATE Osoba SET imie='" 
+ c.getImie() + "',nazwisko='" + c.getNazwisko() + "' WHERE ID=" + c.getId()
    + ";";
  try {
   polaczenieUpdate(query);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 @Override
 public void delete(int id) {
  String query = "DELETE from Osoba  WHERE ID=" + id + ";";
  try {
   polaczenieUpdate(query);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void polaczenieUpdate(String query) {
  Statement statement;
  try {
   Class.forName("org.h2.Driver");
   Connection conn = DriverManager.getConnection("jdbc:h2:~/baza_ksiazki",
 "sa", "");
   statement = conn.createStatement();
   statement.executeUpdate(query);
   conn.close();
   System.out.println(query);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void tworzenieBazy() {
  String konstruktorTabeliOsoba = "DROP TABLE IF EXISTS OSOBA; CREATE 
TABLE OSOBA(ID INT PRIMARY KEY, IMIE VARCHAR(255), NAZWISKO VARCHAR(255));";
  try {
   polaczenieUpdate(konstruktorTabeliOsoba);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}

Main.java
package kkk;

public class Main {

 public static void main(String[] args) {
  Manager manager = new Manager();
  manager.tworzenieBazy();

  Osoba os1 = new Osoba(1, "adam", "piep");
  Osoba os2 = new Osoba(2, "tom", "kiep");

  manager.create(os1);
  manager.create(os2);

  Osoba wczytanaOsoba = manager.read(2);
  System.out.println("--- " + wczytanaOsoba.getImie() + " " 
+ wczytanaOsoba.getNazwisko() + " ---");

  Osoba os3 = new Osoba(2, "kamil", "rosol");
  manager.update(os3);

  wczytanaOsoba = manager.read(2);
  System.out.println("--- " + wczytanaOsoba.getImie() + " " 
+ wczytanaOsoba.getNazwisko() + " ---");

  manager.delete(2);
  wczytanaOsoba = manager.read(2);
  System.out.println("--- " + wczytanaOsoba.getImie() + " " 
+ wczytanaOsoba.getNazwisko() + " ---");
 }

}

Osoba.java
package kkk;

public class Osoba {
 private int  id;
 private String imie;
 private String nazwisko;

 public Osoba() {
 };

 public Osoba(int id, String imie, String nazwisko) {
  this.id = id;
  this.imie = imie;
  this.nazwisko = nazwisko;
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getImie() {
  return imie;
 }

 public void setImie(String imie) {
  this.imie = imie;
 }

 public String getNazwisko() {
  return nazwisko;
 }

 public void setNazwisko(String nazwisko) {
  this.nazwisko = nazwisko;
 }

}