15 Ekim 2012 Pazartesi

window.open ve window.opener

Window.open ile bir sayfanın içinden diğer bir sayfayı açabiliriz.

var newWindow=window.open('deneme2.html');

daha sonra
newWindow.document.getElementById('') 
diyerek açtığımız sayfadaki istediğimiz bir htmlelement e müdahale edip sayfanın içeriğini ana sayfadan değiştirebiliriz. Anasayfadan 2. açılan sayfaya ulaşım bu şekilde sağlanabilir.

2. sayfadan anasayfaya ulaşım ise opener kullanılarak yapılır.

window.opener.document.getElementById('') 

diyerekten 2. sayfadan anasayfaya ulaşabilir ve içeriğini değiştirebiliriz. Ayrıca anasayfada tanımlanmış herşeye de ulaşabiliriz. window.opener bize anasayfanın window elementini döndürür. Yani anasayfanın tüm özellikleri elimizdedir.

Dikkat edilmesi gereken bir konu olarak sayfaların 2 si de en azından http protokolü kullanıyor olmalıdır.
Eğer protokol yoksa sayfalar arası erişime izin verilmez.

Aşağıdaki örneklerde deneme1.html anasayfa, deneme2.html de açılan sayfadır.

//deneme1.html

<!DOCTYPE html>
<html>
<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

<button type="button" onclick="denemeFunction1();">Click Me!</button>
</body>
</html>
<script>
var denemeVar = 12345;
function denemeFunction1(){
var newWindow=window.open('deneme2.html');
window.top.deneme1=1;
window.top.deneme2=2;
window.top.deneme3=3;
window.top.deneme4=4;
window.top.deneme5=5;
window.top.deneme6=6;
}
</script>


//deneme2.html

<!DOCTYPE html>
<html>
<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

<button type="button" onclick="denemeFunction2();">Click Me!</button>
</body>
</html>
<script>
function denemeFunction2(){
var i=0;
for(var j=0;j<15;j++){
j++;
}
alert(window.opener.denemeVar);
alert(window.opener.top.deneme3);
}
</script>

4 Ekim 2012 Perşembe

java android mevcut session kaybetme

Bir android uygulamasında login olduktan sonra mevcut oturum bilgileriniz kullanarak bir servisten veri çekmek isteyebilirsiniz. Bunun içinde defaulthttpclient ve httppost ve httpresponse nesnelerini kullanabiliriz. Fakat veriyi çekerken defaulthttpclient i new lersek mevcut session ı kaybedip yeni bir session açmış oluruz ve karşıdaki servis bize login olmamış yabancı bir kişi muamelesi yaparak ya hata döndürür ya da login page i döndürür.

Bu gibi durumlarda defaulthttpclient i new lememeliyiz.


Defaulthttpclient i her zaman saklamalıyız ve ona olan referansı kaybetmemeliyiz. Bu duruma sağlayabilmek için aşağıdaki bloka sahip bir sınıf kullanabiliriz.


private CookieStore androidCookie= null;
private Object androidLock = new Object();
/**
 *Bu method mevcut cookiestore yi kullanarak yeni bir httpclient yaratır.
 *Bu şekilde mevcut session ı da almış oluruz.
 * @author Murat GUZEL
 */
private HttpClient getHttpClient() {
        final DefaultHttpClient httpClient = new DefaultHttpClient();
        synchronized (androidLock) {                
        if (androidCookie== null) { 
        androidCookie= httpClient.getCookieStore();                
        } else {
              httpClient.setCookieStore(androidCookie);               
        }
  }
  return httpClient;
}
Bu sınıfı uygulamanın heryerinde kullanabilirsiniz.

3 Ekim 2012 Çarşamba

Java JFileChooser dosya açma ve kaydetme mantığı.

http://yazilimsozluk.com/Default.aspx?KonuId=1674 da bir soruya cevap olarak benim tarafımdan yazılmıştır.


Dostum şimdi o olay şöyle. Şimdi adam menübar ı açtı. Aç a bastı. Bir path e ilerledi bir dosya seçti ve open a bastı. Sen burada getSelectedFile diyip adamın seçtiği dosyayının referansını alman lazım.
Bu dosya ne dosyası ise istersen bu dosyayı okuyup adama içeriğini gösterip üstünde değişiklik te yaptırabilirsin, neyse.
Şimdi bu dosyayı başka bir yere kayıt ediceksin diyelim. Senin yine filechooser ın showSaveDialog unu kullanman lazım. Onu açıcaksın adam bir path seçicek, aşağıdan dosyanın ismini girecek ve kaydet e basıcak.
Kaydet e bastığında senin daha önce açılmış dosyayı byte byte okuyup adamın seçtiği yere yazman lazım.
Okuyup yazarken fileinputstream,fileoutputstream kullanabilirsin. Ya da fileutils gibi bir kütüphane nin copy metodunu da kulanabilirsin ya da channel acıp yollayabilirsin.
Biraz da kodda anlatmaya çalışayım.

Şimdi adam menübar dan aç a bastığında

//frmDosyaAcKaydet JFileChooser tipinde.
frmDosyaAcKaydet.showSOpenDialog(anaFrame);

diyip açtın dosya açma kısmını. Adam seçti dosyayı. Dosyayı seçtiği anda senin şöyle bir kod çalıştırman lazım.

//Kullanıcının seçtiği dosya. io kütüphanesinin File tipinde dönen bir değer
//frmDosyaAcKaydet JFileChooser tipinde.
acilanDosya = frmDosyaAcKaydet.getSelectedFile();

şimdi bu değeri bir yerde tuttun. Adamın seçtiği dosyaya bir referansın var artık.

Daha sonra adam menubar dan kaydet e bastığında senin

//frmDosyaAcKaydet JFileChooser tipinde.
frmDosyaAcKaydet.showSaveDialog(anaFrame);

gibi bir kod çalıştırman lazım. Bu şekilde istediğin gibi bir kaydetme frame i açılmış olacak. Adam sonra gitti bir path e dosya adını girdi ve kaydet butonuna bastı. Çalışacak kod şöyle birşey olmalı.

//frmDosyaAcKaydet JFileChooser tipinde.
//Kullanıcının kaydetmek için seçtiği path ve dosya adı. io kütüphanesinin File tipinde dönen bir değer
File kaydedilecekDosya = frmDosyaAcKaydet.getSelectedFile();
  //Dosya yazmak için output stream açıyoruz
  OutputStream st = null;
  try {
   st = new FileOutputStream(kaydedilecekDosya);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  //Byte array tanımlıyoruz. Buradan dosyayı okuyup outputstream vasıtasıyla yeni yere yazıcaz.
  byte[] buffer=new byte[1024];
  int okunanByte=0;
  //Dosyayı burada 1024 lük bloklar halinde okuyup yeni
  //path ine yazıyoruz.
  try {
   while ((okunanByte=acilanDosya.read(buffer))>0){
    try {
     st.write(buffer,0,okunanByte);
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  try {
   st.flush();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   acilanDosya.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   st.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  Böylece dosyayı yeni yerine yazmış oluruz. Bu okuma ile yazma arasında geçen sürede dosya üzerinde istediğin
  değişiklikleri yapıp o şekilde de yazabilirsin. Mesela bir text dosyasıysa dosyayı açarsın stringbuffer a alıp
  kullanıcıya gösterirsin üstünde değişiklikler yapar kullanıcı daha sonra da değişiklikyapılandosya.getBytes();
  ı alıp fileoutputstream in write metodunu kullanarak yeni yerine yazabilirsin.

  Benden bu kadar :-) . Umarım işine yarar dostum. Takıldığın ya da anlamadığın birşey olursa
  yardımcı olmaya çalışırım yine. Kolay gelsin.