27 Eylül 2017 Çarşamba

WEB-INF

Giriş
Açıklaması şöyle.
A special directory exists within the application hierarchy named WEB-INF. This directory contains all things related to the application that aren’t in the document root of the application. The WEB-INF node is not part of the public document tree of the application. No file contained in the WEB-INF directory may be served directly to a client by the container. However, the contents of the WEB-INF directory are visible to servlet code using the getResource and getResourceAsStream method calls on the ServletContext, and may be exposed using the RequestDispatcher calls.
Yapısı şöyle
ApplicationName
|
|--META-INF
|--WEB-INF
      |_web.xml       <-- configuration file of your web app
      |_classes       <--all the classes of your webapp, 
      |_lib           <--all the libraries (jars) your application need
Proje içinde görünümü şöyledir.

Dosyalardan birisi web.xml

META-INF dizini
İçi şöyledir.
Apps
  --META-INF
     -maven
     -MANIFEST.MF
     -war-tracker
  --WEB-INF
      -classes
           -com
           -static
           -application.properties
      - lib-provided
      -lib
      - web.xml + audit-servlet.xml
  --org
  -- My JSP pages ..
classes dizini
Açıklaması şöyle
The WEB-INF/classes and WEB-INF/lib folders are examples of folders required by the Servlet specification at runtime.
Örnek
ClassLoader ile classes dizininden okumak için şöyle yaparız.
this.getClass().getClassLoader().getResourceAsStream("xyz");
Örnek
Elimizde şöyle bir yapı olsun. file.text classes dizini altında.
WEB-INF
    + classes
        + package
            + App.class
        + file.txt
Okumak için şöyle yaparız.
InputStream in = package.App.class.getClassloader().getResourceAsStream("file.txt");
Örnek
Bu sefer dll'leri classes dizinine ekliyoruz. Şöyle yaparız.
WEB-INF\classes\mylibrary.dll
Bu dll'i tomcat'e yükletip JNI ile kullanmak için şöyle yaparız.
${catalina.home}\webapps\ROOT\WEB-INF\classes\mylibrary.dll
lib dizini
lib dizininden okuma yapmak mümkün değil. Açıklaması şöyle
WEB-INF/lib is not in the classpath. It is supposed to contain jar files, that are in the classpath.


26 Eylül 2017 Salı

DateTimeFormatterBuilder Sınıfı

appendPattern metodu
Şöyle yaparız.
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
    // month-year
    .appendPattern("MM-yyyy")
    // default value for day
    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
    // create formatter
    .toFormatter();
LocalDate dt = LocalDate.parse("09-2017", fmt);

YearMonth Sınıfı

Giriş
Bu sınıf saat dilimi bilmez. Bu sınıf ile Month Sınıfı benzeşiyorlar.

Bu sınıf LocalDate'ten farklı olarak gün bilgisine sahip değildir. Gün bilgisini atayıp LocalDate elde etmek için at() metodu kullanılır.

at metodu
Örnek
Şöyle yaparız.
YearMonth lastDayOfPreviousMonth = yearMonth.atDay(1).minusDay(1);
Örnek
Şöyle yaparız.
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM-yyyy");
YearMonth ym = YearMonth.parse("09-2017", fmt);
LocalDate dt = ym.atDay(1); // choose whatever day you want
atEndOfMonth metodu
Şöyle yaparız.
YearMonth firstDayOfNextMonth = yearMonth.atEndOfMonth().plusDays(1);
format metodu
Şöyle yaparız.
Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMM yyyy" , locale );
String output = yearMonth.format ( formatter );
Çıktı olarak fransızca ay ve yıl alırız.
déc. 2015
getMonth metodu
Month nesnesi döner. Şöyle yaparız.
String monthName = yearMonth.getMonth()
getYear metodu
int döner. Şöyle yaparız.
yearMonth.getYear()
minusMonths metodu
Şöyle yaparız.
YearMonth yearMonth = YearMonth.now().minusMonths(1);
now metodu
Şöyle yaparız.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
YearMonth yearMonth = YearMonth.now( zoneId );

25 Eylül 2017 Pazartesi

PropertyChangeListener Arayüzü

Örnek ver

PropertyChangeEvent Sınıfı

Örnek ver

Observable Sınıfı

Giriş
Observable sınıfı ve Observer arayüzü beraber kullanlır. Observable sınıfı arayüz olmadığı için nesnemizi bir kere kalıtınca başka bir sınıftan kalıtma imkanı ortadan kalkıyor.

Serializable
Bu sınıfı Serializable değil !

Java 9
Bu sınıf Java 9 ile deprecate edildi. Açıklaması şöyle
The event model supported by Observer and Observable is quite limited, the order of notifications delivered by Observable is unspecified, and state changes are not in one-for-one correspondence with notifications. For a richer event model, consider using the java.beans package. For reliable and ordered messaging among threads, consider using one of the concurrent data structures in the  java.util.concurrent package. For reactive streams style programming, see the Flow API.
java.beans paketindeki PropertyChangeEvent ve PropertyChangeListener kullanılablir.

addObserver metodu
Şöyle yaparız.
public class SomeView implements Observer{

 private MyObservable controller;

 public SomeView (MyObservable ctrl)
 {
   this.controller= ctrl;
   ctrl.addObserver(this);
 }

 public void update (Observable o,Object arg)
 {
   if (o==controller)
   System.out.println("Update detected");
  }

}
notifyObservers metodu
Şöyle yaparız.
public class MyObservable extends Observable{

  public void doSomething()
  {
    //dostuff
    setChanged();
    notifyObservers();
  }

}