4 Ekim 2015 Pazar

Servlet

Aşağıda bazı notlarım var. Servlet teknolojisi Http protokolü için kullanılıyor.

WAR Dosyası Yapısı
War dosyası belli bir örüntüde olmalı. Aşağıdaki örnek şekilde test isminde bir uygulamanın tomcat altındaki webapps dizinine açılmış hali görülebilir.
http://localhost:<port>/test/abc

<TOMCAT_HOME>
 |-webapps
    |-manager
    |-data
    |-docs
    |-host-manager
    |-ROOT
    |_test <--- create this folder
      |-WEB-INF
         |-classes <--classes 
         |-lib <-- librares
         |-web.xml 
WEB-INF uygulama tarafından kullanılan deployment descriptor dosyalarını içerir.

Geliştirme esnasında ise kodlar şöyle görünür.
/main/webapp/WEB-INF/
/main/webapp/WEB-INF/spring/...
/main/webapp/WEB-INF/web.xml
/main/webapp/public/...
/main/webapp/resources/...
/main/webapp/views/...

web.xml
web.xml yazısına taşıdım.

Servlet Arayüzü
Bu arayüzde kalıtım hireyarşisi aşağıda. Sadece Http protokolü için değil, diğer protokoller için de kullanılabileceği düşünülerek, GenericServlet ve daha sonra HttpServlet kalıtımı izlenmiş.
Servlet
init metodu
Bu metod container tarafından servlet ilklendirilirken çağırılır. Parametre olarak verilen ServletConfig nesnesi ile ServletContext ve diğer konfigürasyon parametrelerine erişilebilir.

Persistent Servlet
Http persistent connection istek geldikten sonra TCP bağlantısının kapatılmaması demek.

HttpServlet
HttpServlet Sınıfı yazısına taşıdım.

ServletContext
Bu arayüz servlet container ile haberleşmek için kullanılır. Aşağıdaki şekilde görülebilir.

getRequestDispatcher
Gelen istekleri başka bir adrese göndermek mümkün.Örnek:

ServletContextListener
ServletContextListener yazısına taşıdım.

Request İle İlgili Konular
Konuyu Servlet Request ve Response API'si başlıklı yazıya taşıdım.

Response ile İlgili Konular
Konuyu Servlet Request ve Response API'si başlıklı yazıya taşıdım.

ServletInputStream
Bu sınıf POST ve PUT metodu ile gönderilen veriyi okumak için kullanılır.

HttpSessionListener
Bu sınıf yeni oturum açıldığında veya oturum kapandığında tetiklenir. Örnek'te @WebListener kullanılarak web.xml dosyasına satır girilmesine gerek kalmamıştır.


HttpSession
Bu sınıf oturumla ilgili bilgileri tutar. Bilgiler key/value çiftleri şeklindedir.

Eğer session dağıtık bir yapıda başka makineler arasında paylaşılmak istenirse içinde sakladığı her nesnenin Serializable (Session Serialization) olması gerekir.

Bir Çok Key/Value Çifti veya Tek Bir Nesne
Session içinde saklanmak istenen bilgi bir çok key/value girdisi şeklinde saklanabilir.
"user" --> UserObject
"preferences" --> List
veya tek bir SessionObject nesnesinin parçaları şeklinde saklanabilir.
"sessionObject" --> SessionObject


getAttributeNames
Örnek:

getId
Servlet içinde session id'ye erişmek için aşağıdakine benzer bir kod lazım. Örnek buradan geldi.

@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    String sessionId = request.getSesion().getId();

}
Filter 
Servlet 3.0 yazısına taşıdım.

Servlet Dizin Yapısı
WEB-INF/lib
Bu dizine servlet tarafından kullanılmasını istediğimiz kütüphaneleri yerleştiriyoruz.  Eclipse ise Deployment Assembly ayarlarını aşağıdaki gibi yaparsak export komutunu kullanırken projemizdeki lib dizini altındaki jar dosyaları WE-INF/lib altına taşınırlar.


Servlet ile Dosya Yükleme
Dosya yükleme için aşağıdakine benzer bir HTML lazım.
Buradaki cümle neden enctype="multipart/form-data" kullandığımızı açıklıyor.
By specifying the enctype value of "multipart/form-data", each file's contents will be packaged for submission in a separate section of a multipart document.
Ancak Servlet 3.0'dan önceki standartta servlet sadece application/x-www-form-urlencoded formlarını okumayı biliyordu. Bu tür sabit form anlamına geliyor. Örnek:


Bu durumda Apache Commons FileUpload projesindeki sınıfları kullanmak gerekiyordu

Servlet 3.0 ile @MultipartConfig kullanarak FileUpload projesine ihtiyaç kalmadı.

FileItemFactory arayüzü
Bu arayüzü gerçekleştiren sınıflar bir FileItem nesnesi yaratırlar.

DiskFileItemFactory
Bu sınıf yukarıdaki FileItemFactory arayüzünü gerçekleştirir.

FileItem arayüzü
isFormField
Bu metod ile parse edilen request'ten elde edilen FileItem nesnesinin form alanı olup olmadığı belirlenir. Örnek:
HttpServletRequest request;
ServletFileUpload upload = //...
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iterator = items.iterator();
while (iterator.hasNext()) {
 FileItem item = iterator.next();
 if (item.isFormField()) {}
}
 
ServletFileUpload sınıfı
constructor metodu
Bir FileItemFactory alır. Örnek:
 
isMultipartContent
ServletFileUpload ile gelen HttpServletRequest nesnesinin multipart olup olmadığı kontrol edilebilir. Örnek:
protected void doPost(HttpServletRequest request,HttpServletResponse response) {
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
}
parseRequest
Örnekte dosyalara nasıl erişileceği gösteriliyor.

HttpServletRequest req;
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(req);
for (int i=0; i<items.size(); i++){
    System.out.println(items.get(i).getName());
    System.out.println(items.get(i).getFieldName());
    System.out.println(items.get(i).getString());
}

ServletFileUpload sınıfı ve Streaming API
Burada eğer Apache Commons FileUpload projesinin Stream API'si kullanılırsa, dosyanın bellekte tutulduğu açıklanmış.

Hiç yorum yok:

Yorum Gönder