<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4424362800462847144</atom:id><lastBuildDate>Mon, 15 Aug 2011 08:54:47 +0000</lastBuildDate><category>reflection</category><category>universal</category><category>Evrensel Kod</category><category>jsf</category><category>ios4</category><category>javascript</category><category>java</category><category>mysql</category><category>thickbox</category><category>Encoding</category><category>struts-config</category><category>uialertview</category><category>exc_bad_access</category><category>objective c</category><category>uitextfield</category><category>Ajax</category><category>settings.bundle</category><category>misc</category><category>grails</category><category>Unicode</category><category>Karakter Set</category><category>iphone</category><category>xcode</category><category>annotation</category><category>jstl core</category><category>ios</category><category>js</category><category>sdk</category><category>spring</category><category>generics</category><category>struts action</category><category>zombie</category><category>weblogic</category><category>DWR</category><category>iOS3.2</category><category>shale remoting</category><category>notification</category><title>Mahir Tarlan</title><description /><link>http://mahirtarlan.blogspot.com/</link><managingEditor>noreply@blogger.com (Mahir Tarlan)</managingEditor><generator>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/mahirtarlan" /><feedburner:info uri="mahirtarlan" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-6537979930095603637</guid><pubDate>Mon, 15 Aug 2011 08:52:00 +0000</pubDate><atom:updated>2011-08-15T01:54:47.759-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">objective c</category><title>Movie Player'da Pinch Engelleme</title><description>Bir durumda movie player içinde pinch (iki parmakla küçültüp büyütme) özelliğini engellemem gerekiyordu. Movie player'ımı tanımlama şeklimden dolayı, kullanıcı tarafından scaling mode değiştiği zaman movie player benim tanımladığım boyuta büyüyordu. Fakat, kullanıcı "pinch" yaptığı zaman, benim dinlediğim "MPMoviePlayerScalingModeDidChangeNotification" olan observer beklediğim gibi davranmıyordu. O nedenle pinch özelliğini engellemem gerekti.
&lt;br /&gt;
&lt;br /&gt;Bunun için, movie player'ın içinde olduğu view controller içinde touchesBegan delege metodunu implement ettim.
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote&gt;- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
&lt;br /&gt;    for (UITouch *touch in touches) {
&lt;br /&gt;        NSArray *array = touch.gestureRecognizers;
&lt;br /&gt;        for (UIGestureRecognizer *gesture in array) {
&lt;br /&gt;            if (gesture.enabled &amp;amp;&amp;amp; [gesture isMemberOfClass:[UIPinchGestureRecognizer class]]) {
&lt;br /&gt;                gesture.enabled = NO;
&lt;br /&gt;            }
&lt;br /&gt;        }
&lt;br /&gt;    }
&lt;br /&gt;}&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;Bu metod içinde,   UITouch class instance'ı içindeki tüm UIGestureRecognizer objelerinde iterate ediyorum ve ilgili gesture UIPinchGestureRecognizer türünde mi diye kontrol ediyorum. Eğer öyleyse, gesture'u engelliyorum. Benim işimi gördü.
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-6537979930095603637?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/n4OdrZR_fT4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/n4OdrZR_fT4/movie-playerda-pinch-engelleme.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/movie-playerda-pinch-engelleme.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2809886821887846767</guid><pubDate>Wed, 03 Aug 2011 14:13:00 +0000</pubDate><atom:updated>2011-08-03T07:19:26.110-07:00</atom:updated><title>UIWebView'da Scroll Özelliğini Engelleme</title><description>UIWebView UIScrollView'dan türemediğinden dolayı, scrolling ya da bounce parametrelerini kullanma imkanımız yok. Bu nedenle, scroll özelliğini engelleme için iki farklı yöntem aklıma geldi.&lt;br /&gt;&lt;br /&gt;İlk yöntemde, UIWebView'ın subView'larından UIScrollView'dan türemiş olan view'u bularak onun parametrelerini NO'ya çektim.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;UIView* row = nil;&lt;br /&gt;for(row in webView.subviews){&lt;br /&gt;    if([row isKindOfClass:[UIScrollView class] ]){&lt;br /&gt;        UIScrollView* scrollRow = (UIScrollView*) row;&lt;br /&gt;        scrollRow.scrollEnabled = NO;&lt;br /&gt;        scrollRow.bounces = NO;&lt;br /&gt;    }&lt;br /&gt;}&lt;/blockquote&gt;İkinci yöntem ise daha çok Delegate üzerine. UIWebView UIScrollView'dan türememiş dedim fakat UISCrollViewDelegate'i implement edebilir. Bu nedenle, eğer bir custom UIWebView yapıp, UIScrollViewDelegate'e delege edersek ve ilgili delege metodlarını da implement edersek scroll özelliğini yakalayabiliyoruz.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@interface CustomWebView : UIWebView …&lt;br /&gt;&lt;br /&gt;@implementation CustomWebView&lt;br /&gt;&lt;br /&gt;- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{&lt;br /&gt;    scrollView.scrollEnabled = NO;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;Kullanıcı ekranı çekmeye başladığı an bu metod çağrılıyor olacak. Böylece scroll özelliğini de engellemiş olacağız.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2809886821887846767?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/lFns_UhTwQ4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/lFns_UhTwQ4/uiwebviewda-scroll-ozelligini-engelleme.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/uiwebviewda-scroll-ozelligini-engelleme.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2839716305670369975</guid><pubDate>Tue, 02 Aug 2011 10:40:00 +0000</pubDate><atom:updated>2011-08-02T03:41:04.094-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">universal</category><category domain="http://www.blogger.com/atom/ns#">iOS3.2</category><category domain="http://www.blogger.com/atom/ns#">settings.bundle</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>Universal Uygulamalarda settings.bundle ayrımı</title><description>Universal uygulama yazarken, setting bundle'ını iphone ve ipad için ayrıştırmam gerekti. Ipad görünürken iphone'da görünmemesi gereken bir setting parametresi istendi. Bu sorunu şu şekilde çözdüm.&lt;br /&gt;&lt;br /&gt;Settings.bundle dosyamızı Other Sources altında tanımladığımızdan bundle dosyamız her iki platform için de tek oluyor mecburen.&lt;br /&gt;&lt;br /&gt;Settings.bundle içinde iki tane Root.plist dosyası tanımladım. Bu dosyalardan birine Root~iphone.plist ismini verdim, diğerine de Root~ipad.plist ismini verdim. Her iki dosyanın içindeki değerleri de istediğim şekilde değiştirdim.&lt;br /&gt;&lt;br /&gt;Fakat, iOS3.2 versiyonu makine bazlı dosya isimlerini tanımadığından iOS 3.2'de çalışan ipad'lerde Root~ipad.plist dosyası okunamıyordu. Bu nedenle, şöyle bir yönteme gittim. Settings.bundle altında default olarak oluşan Root.plist dosyasını silmedim, sakladım ve bu dosyanın içeriğini Root~ipad.plist dosyasındaki içerikle doldurdum.&lt;br /&gt;&lt;br /&gt;Daha pratik bir çözüm bulan varsa paylaşırsa çok sevinirim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2839716305670369975?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/243WZvmuqFM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/243WZvmuqFM/universal-uygulamalarda-settingsbundle.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/universal-uygulamalarda-settingsbundle.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2111803349978079707</guid><pubDate>Tue, 02 Aug 2011 10:24:00 +0000</pubDate><atom:updated>2011-08-02T03:26:56.772-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">sdk</category><category domain="http://www.blogger.com/atom/ns#">xcode</category><category domain="http://www.blogger.com/atom/ns#">ios</category><title>Eski iOS Dönüşü</title><description>Xcode'u ve iOS'u yükselttiniz fakat uygulamayı eski iOS ile derlemeniz gerekiyor diyelim. Bu durumla ben, MPMoviePlayerController'da yapılan güncellemelerden dolayı karşılaştım. Bu durumda eski iOS'u tekrar yüklemek istiyorsunuz.&lt;br /&gt;&lt;br /&gt;Böyle bir durumda ben ne yaptım, yazayım. iOS 4.2'yi yükledikten sonra eski versiyonum olan iOS 3.2'yi kaybetmiş oldum. O nedenle iOS 3.2'yi tekrar yüklemem gerekti. Öncelikli olarak eski iOS'ların linklerini vereyim:&lt;br /&gt;&lt;br /&gt;Netten arakladığım şekilde yazıyorum:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SDK 3.1.3 ve Xcode 3.1.4:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/iphone/iphone_sdk_3.1.3__final/iphone_sdk_3.1.3_with_xcode_3.1.4__leopard__9m2809a.dmg&lt;br /&gt;&lt;br /&gt;SDK 3.2 ve Xcode 3.2.2:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/iphone/iphone_sdk_3.1.3__final/iphone_sdk_3.1.3_with_xcode_3.2.1__snow_leopard__10m2003a.dmg&lt;br /&gt;&lt;br /&gt;SDK 3.2 ve Xcode 3.2.2:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/iphone/iphone_sdk_3.2__final/xcode_3.2.2_and_iphone_sdk_3.2_final.dmg&lt;br /&gt;&lt;br /&gt;SDK 4 ve Xcode 3.2.3:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/iphone/iphone_sdk_4__final/xcode_3.2.3_and_iphone_sdk_4__final.dmg&lt;br /&gt;&lt;br /&gt;SDK 4.0.1 ve Xcode 3.2.3:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.0.1__final/xcode_3.2.3_and_ios_sdk_4.0.1.dmg&lt;br /&gt;&lt;br /&gt;SDK 4.0.2 ve Xcode 3.2.3:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.0.2__final/xcode_3.2.3_and_ios_sdk_4.0.2.dmg&lt;br /&gt;&lt;br /&gt;SDK 4.1 ve Xcode 3.2.4:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg&lt;br /&gt;&lt;br /&gt;SDK 4.2 ve Xcode 3.2.5:&lt;br /&gt;https://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.2_gm_seed/xcode_3.2.5_and_ios_sdk_4.2_gm_seed.dmg&lt;br /&gt;&lt;br /&gt;SDK 4.2 ve Xcode 3.2.5:&lt;br /&gt;http://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.2__final/xcode_3.2.5_and_ios_sdk_4.2_final.dmg&lt;/blockquote&gt;Buradan indirdiğimiz setup dosyasını çalıştırıyoruz. Install adımlarından introduction, licence, iPhone SDK licence, Destination select adımlarını geçiyoruz. Installation type adımında sağdaki listede en üst maddenin location kolonunda default olarak "Developer" klasörü seçili çoktan seçmeli bir alan gelecektir. Bu alana basarak Other'ı seçiyoruz ve açılan klasör seçme ekranında Developer dizini altına "old" ismiyle bir dizin oluşturuyoruz. "old" dizini seçiliyken Choose diyoruz ve installation'ın bitmesini bekliyoruz. Installation sonrasında ihtiyacımız olan SDK'yı Xcode'un default gördüğü dizine taşıyacağız.&lt;br /&gt;&lt;br /&gt;Bunun için şu dizine gidiyoruz:&lt;br /&gt;/Developer/old/Platforms/iPhoneOS.platform/Developer/SDKs/&lt;br /&gt;Bu dizin altında yeni yüklememizle gelen SDK'ları görebiliriz. Benim ihtiyacım olan SDK 3.2 olduğundan iPhoneOS3.2.sdk klasörünü kopyalıyorum.&lt;br /&gt;Default dizin olan şu dizine gidiyorum ve kopyaladığım klasörü yapıştırıyorum:&lt;br /&gt;/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/&lt;br /&gt;&lt;br /&gt;XCode'umu restart ettiğimde Project -&amp;gt; Edit Project Settings -&amp;gt; Build altındaki Base SDK seçenekleri içinde iOS 3.2'nin geldiğini görüyorum.&lt;br /&gt;&lt;br /&gt;Başka bir çözüm olarak; bunu klasör kopyalamadan direk Base SDK seçeneklerinden Other seçip ilgili dizini buraya girerek yapmayı denediğimde iOS 3.2'yi gösterebildim fakat bu durumda da (missing) hatası verdi. O nedenle kopyalama yoluna gittim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2111803349978079707?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/VgtCoi_05l0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/VgtCoi_05l0/eski-ios-donusu.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/eski-ios-donusu.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-4084072251723538337</guid><pubDate>Tue, 02 Aug 2011 10:18:00 +0000</pubDate><atom:updated>2011-08-02T03:24:10.448-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uitextfield</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">uialertview</category><category domain="http://www.blogger.com/atom/ns#">objective c</category><title>UIAlertView'da Text Field etc.</title><description>uialertview'a textfield ekleme ve programatik olarak uialertview'ı kapatma.&lt;br /&gt;&lt;br /&gt;AppStore'dan uygulama indirirken bize username/password girmemiz için açılan bir alertView vardır. Benzer bir alertView yapma ihtiyacım doğduğunda internette biraz araştırma yaptım. Karşıma çıkan bazı çözümlerin private api kullanımından dolayı Apple tarafından reject edildiğini öğrendim. Fakat şöyle bir çözümün doğru çözüm olduğunu düşünerek şu şekilde istediğimi uyguladım.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- (void) alertViewForPass {&lt;br /&gt;    passwordInsertAlert = [[UIAlertView alloc] initWithTitle:@"Sifre" message:@"\n\n\n\n\n" delegate:self cancelButtonTitle:@"Kapat" otherButtonTitles:@"Tamam", nil];&lt;br /&gt;    passwordInsertAlert.tag = PASS_INSERT_ALERT_TAG;&lt;br /&gt;    currentAlertType = PASS_INSERT_ALERT_TAG;&lt;br /&gt;   &lt;br /&gt;    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(12,40,260,30)];&lt;br /&gt;    headerLabel.font = [UIFont systemFontOfSize:13];&lt;br /&gt;    headerLabel.textColor = [UIColor whiteColor];&lt;br /&gt;    headerLabel.backgroundColor = [UIColor clearColor];&lt;br /&gt;    headerLabel.shadowColor = [UIColor blackColor];&lt;br /&gt;    headerLabel.shadowOffset = CGSizeMake(0,-1);&lt;br /&gt;    headerLabel.textAlignment = UITextAlignmentCenter;&lt;br /&gt;    [headerLabel setAdjustsFontSizeToFitWidth:YES];&lt;br /&gt;    headerLabel.numberOfLines = 2;&lt;br /&gt;    headerLabel.text = @"Sifre Ekrani";&lt;br /&gt;    [passwordInsertAlert addSubview:headerLabel];&lt;br /&gt;    [headerLabel release];&lt;br /&gt;   &lt;br /&gt;    passInsert1Field = [[UITextField alloc] initWithFrame:CGRectMake(16,83,252,25)];&lt;br /&gt;    passInsert1Field.font = [UIFont systemFontOfSize:16];&lt;br /&gt;    passInsert1Field.backgroundColor = [UIColor whiteColor];&lt;br /&gt;    passInsert1Field.secureTextEntry = YES;&lt;br /&gt;    passInsert1Field.keyboardAppearance = UIKeyboardAppearanceAlert;&lt;br /&gt;    passInsert1Field.keyboardType = UIKeyboardTypeNumberPad;&lt;br /&gt;    passInsert1Field.delegate = self;&lt;br /&gt;    passInsert1Field.placeholder = @"Sifre giriniz";&lt;br /&gt;    passInsert1Field.tag = PIN_INSERT_FIELD_TAG;&lt;br /&gt;    [passInsert1Field becomeFirstResponder];&lt;br /&gt;    [passwordInsertAlert addSubview:passInsert1Field];&lt;br /&gt;   &lt;br /&gt;    passInsert2Field = [[UITextField alloc] initWithFrame:CGRectMake(16,120,252,25)];&lt;br /&gt;    passInsert2Field.font = [UIFont systemFontOfSize:16];&lt;br /&gt;    passInsert2Field.backgroundColor = [UIColor whiteColor];&lt;br /&gt;    passInsert2Field.secureTextEntry = YES;&lt;br /&gt;    passInsert2Field.keyboardAppearance = UIKeyboardAppearanceAlert;&lt;br /&gt;    passInsert2Field.keyboardType = UIKeyboardTypeNumberPad;&lt;br /&gt;    passInsert2Field.delegate = self;&lt;br /&gt;    passInsert2Field.placeholder = @"Tekrar sifre giriniz";&lt;br /&gt;    passInsert2Field.tag = PIN_INSERT_FIELD2_TAG;&lt;br /&gt;    [passwordInsertAlert addSubview:passInsert2Field];&lt;br /&gt;   &lt;br /&gt;    [passwordInsertAlert setTransform:CGAffineTransformMakeTranslation(0,109)];&lt;br /&gt;    [passwordInsertAlert show];&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Burada UIAlertView'ı (passwordInsertAlert) instance variable olarak header'da tanımladığımızı varsayalım. Aynı şekilde UITextField'ları (passInsert1Field ve passInsert2Field) da instance variable olarak header'da tanımlıyoruz. Tabi, class'ın dealloc metodu içinde bunları release etmeyi de unutmayalım. Bu arada PIN_INSERT_FIELD_TAG gibi değerler benim #define ile tanımladığım değerler. İsterseniz bu değerler yerine direk unique rakamsal değerler de yazabilirsiniz.&lt;br /&gt;&lt;br /&gt;TextField için keyboard ve diğer tuşların yakalanması için class'ımızı UITextFieldDelegate'e extend ediyoruz:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@interface [ClassName] : UIView &amp;lt;UITextFieldDelegate&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;Bu arada alertView'dan gelecek aksiyonları handle etmek için de aşağıdaki metodumuzu implement ediyoruz:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{   &lt;br /&gt;    if (alert.tag == PASS_INSERT_ALERT_TAG) {&lt;br /&gt;        if (buttonIndex == 1) {&lt;br /&gt;            [self hideKeyboard];&lt;br /&gt;            [self validateInsert];&lt;br /&gt;        }&lt;br /&gt;    } else if(alert.tag == PASS_INSERT_ERROR_ALERT_TAG) {&lt;br /&gt;        [passwordInsertAlert release];&lt;br /&gt;        [self alertViewForPass];&lt;br /&gt;    }&lt;br /&gt;}&lt;/blockquote&gt;Burada alertView'lara tanımladığımız tag'lere göre aksiyon alıyoruz. İlk metodumuzda tanımladığımız alertView'ın tag'ı PASS_INSERT_ALERT_TAG olduğunu düşünürsek AlertView'ımızda "Tamam" butonuna basıldığında bu metodda ilk kontrole girecektir. buttonIndex değeri de özellikle değiştirilmediği sürece "Cancel" butonu için 0, "OK" butonu için 1'dir. hideKeyboard metodu extend ettiğimiz UITextFieldDelegate ile gelen ve bizim gerekli durumda extend ettiğimiz bir metod.&lt;br /&gt;&lt;br /&gt;UITextFieldDelegate gelen metodları kendime göre kullanmak üzere extend ediyorum.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- (void) showKeyboardAndToolbar {&lt;br /&gt;    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;    if(currentAlertType == PASS_INSERT_ALERT_TAG) {&lt;br /&gt;        [passInsert1Field becomeFirstResponder];&lt;br /&gt;    }&lt;br /&gt;    [pool release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)hideKeyboard {&lt;br /&gt;    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;    if(currentAlertType == PASS_INSERT_ALERT_TAG) {&lt;br /&gt;        [passInsert1Field resignFirstResponder];&lt;br /&gt;        [passInsert2Field resignFirstResponder];&lt;br /&gt;    }&lt;br /&gt;    [pool release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (BOOL) textFieldShouldReturn:(UITextField *)theTextField {&lt;br /&gt;    if(currentAlertType == PASS_INSERT_ALERT_TAG) {&lt;br /&gt;        if (theTextField.tag == PIN_INSERT_FIELD_TAG) {&lt;br /&gt;            [passInsert2Field becomeFirstResponder];&lt;br /&gt;        } else {&lt;br /&gt;            [self hideKeyboard];&lt;br /&gt;            [self validateInsert];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return YES;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;validateInsert meted, alert içindeki textField'lara girilen değerleri valide etmek için implement ettiğim bir metod. Siz de burada istediğiniz bir metodu çağırabilirsiniz.&lt;br /&gt;Yine de textField'ların ve alertView tag'larının nasıl handle edildiğini göstermek adına bu metodu da yazayım.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- (void) validateInsert {&lt;br /&gt;    if (![passInsert1Field.text isEqual:passInsert2Field.text]) {&lt;br /&gt;        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hata"&lt;br /&gt;                                                            message:@"Girdiğiniz 2 sifre aynı olmalıdır."&lt;br /&gt;                                                           delegate:self&lt;br /&gt;                                                  cancelButtonTitle:@"Tamam"&lt;br /&gt;                                                  otherButtonTitles:nil];&lt;br /&gt;        alertView.tag = PASS_INSERT_ERROR_ALERT_TAG;&lt;br /&gt;        [alertView show];&lt;br /&gt;        [alertView release];&lt;br /&gt;    } else {&lt;br /&gt;        //why don't you do something ...&lt;br /&gt;    }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Burada gördüğümüz gibi hata alert'üne yeni bir tag veriyoruz ki "alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex" metodu içinde alert'ler karışmasın. Eğer bu metod içine gelen alert'ün tag'i PASS_INSERT_ERROR_ALERT_TAG  ise tekrar alertViewForPass metodu tetikleniyor.&lt;br /&gt;&lt;br /&gt;Çok basit bir çözüm, ama bir o kadar da hayat kurtarıcı. Son olarak da basit ama gerekli bir bilgi daha ekleyelim. Alert'ler üzerindeki "Tamam" butonunu handle edecek metodlar yazdık fakat bir noktada alert'ü de kapatmamız gerekecektir. Bu durumda şu şekilde alert'ümüzü kapatabiliriz:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[passwordInsertAlert dismissWithClickedButtonIndex:0 animated:YES];&lt;/blockquote&gt;Adeta "Cancel" butonuna basılmış gibi alert'ümü dismiss et diyoruz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-4084072251723538337?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/Y7MIJebaE8c" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/Y7MIJebaE8c/uialertviewda-text-field-etc.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/uialertviewda-text-field-etc.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-3876290238040183053</guid><pubDate>Tue, 02 Aug 2011 10:15:00 +0000</pubDate><atom:updated>2011-08-02T03:17:45.916-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">notification</category><category domain="http://www.blogger.com/atom/ns#">ios4</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">objective c</category><title>iOS 4 ve Local Notification</title><description>iOS 4 ile birlikte hayatımıza giren yeniliklerden biri de local notification oldu. Bu sayede server-side'a gerek kalmadan, sertifikaya gerek kalmadan, APN gateway'e bağlanmaya gerek kalmadan client üzerinde notification set edebilecek kod yazabilir hale geldik.&lt;br /&gt;&lt;br /&gt;Aşağıda bir local notification set etme örneğini vereceğim. Fakat bunu yazmamdaki asıl amaç basit bir yöntemle local notification'ı silme özelliğini ekleyebilecek bir yol anlatmak.&lt;br /&gt;&lt;br /&gt;      &lt;blockquote&gt;  NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"VALUE", @"NOTIFICATION_KEY", nil];&lt;br /&gt;&lt;br /&gt;        NSString *message = ...;&lt;br /&gt;        UILocalNotification *notification = [[UILocalNotification alloc] init];&lt;br /&gt;        notification.alertBody = message;&lt;br /&gt;        notification.timeZone = [NSTimeZone defaultTimeZone];&lt;br /&gt;        notification.fireDate = ...;&lt;br /&gt;        notification.userInfo = infoDict;&lt;br /&gt;        [[UIApplication sharedApplication] scheduleLocalNotification:notification];&lt;br /&gt;        [notification release];&lt;/blockquote&gt;Bu şekilde notification'ınımızı set ettik. Burada sonra silmek için kullanacağımız kısım userInfo'ya set ettiğimiz değerler. Geri kalanı standart local notification set etme.&lt;br /&gt;&lt;br /&gt;Ne için notification set ediyorsak infoDict içindeki VALUE alanına onun unique bir identifier'ını yazabiliriz. Mesela, ben bunu bir kanal programına hatırlatma için kullandım. Dolayısıyla bu VALUE alanına da program'ın id'sini verdim.&lt;br /&gt;&lt;br /&gt;Sileceğimiz zaman ise şöyle yapıyoruz:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;        UIApplication *app = [UIApplication sharedApplication];&lt;br /&gt;        NSArray *notificationArray = [app scheduledLocalNotifications];&lt;br /&gt;        UILocalNotification *row = nil;&lt;br /&gt;        for (row in notificationArray) {&lt;br /&gt;            NSDictionary *userInfo = row.userInfo;&lt;br /&gt;            NSString *identifier = [userInfo valueForKey:@"NOTIFICATION_KEY"];&lt;br /&gt;            if(identifier != nil){&lt;br /&gt;                if([identifier isEqualToString:[NSString stringWithFormat:@"%d", program.programId]]) {&lt;br /&gt;                    [app cancelLocalNotification:row];&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-3876290238040183053?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/QtDLS8dFnm0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/QtDLS8dFnm0/ios-4-ve-local-notification.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/ios-4-ve-local-notification.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-4693693384666890175</guid><pubDate>Tue, 02 Aug 2011 10:12:00 +0000</pubDate><atom:updated>2011-08-02T03:15:21.200-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">exc_bad_access</category><category domain="http://www.blogger.com/atom/ns#">zombie</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">objective c</category><title>EXC_BAD_ACCESS</title><description>iPhone geliştirmesi yapmanın olmazsa olmazı EXC_BAD_ACCESS hatası ile ilgili basit bir debug metodunu yazayım istedim.&lt;br /&gt;&lt;br /&gt;EXC_BAD_ACCESS hatasının birkaç nedeni olsa da genelde release edilmiş bir objeyi manipüle etmeye çalışınca bu hatayla karşılaşıyoruz. Debugger konsolda EXC_BAD_ACCESS yazısının ötesinde, hatanın nedenine uygun olarak hatanın verildiği class'ı görebilmek için kullanabileceğimiz bir parametre var.&lt;br /&gt;&lt;br /&gt;NSZombieEnabled&lt;br /&gt;&lt;br /&gt;Efendim bu parametre neyi sağlar? Release edilen her bir objenin yerine bir dummy obje yani zombi bırakır.&lt;br /&gt;&lt;br /&gt;XCode'da Executables altındaki app dosyamızın "Get Info"sunu açarak "Arguments" tab'ına geçiyoruz. Buradaki ekranın alt kısmındaki Variables alanına "+"  işaretiyle yeni bir parametre ekliyoruz.&lt;br /&gt;&lt;br /&gt;Name: NSZombieEnabled Value: YES&lt;br /&gt;&lt;br /&gt;En baştaki checkbox'u da işaretlemeyi unutmuyoruz.&lt;br /&gt;&lt;br /&gt;Bu aşamadan sonra build and debug yapıp sonucu debugger konsoldan takip edebiliriz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-4693693384666890175?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/dmHuKlk_sCo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/dmHuKlk_sCo/excbadaccess.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2011/08/excbadaccess.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-8626034550269052425</guid><pubDate>Thu, 28 May 2009 08:49:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.147-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">spring</category><title>spring'de PropertyPlaceholderConfigurer ile multiple properties dosyası kullanımı</title><description>Spring'de PropertyPlaceholderConfigurer class'ını kullanarak xml'lerde properties dosya değerlerini ilgili bean'lere geçirebiliriz. Bunun için aşağıdaki gibi bir kullanım yeterlidir.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&amp;lt;bean id="propertyConfigurer" class= "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &amp;lt;property name="locations"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;  &amp;lt;list&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   &amp;lt;value&amp;gt;classpath:appConfig.properties&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;  &amp;lt;/list&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fakat birden fazla properties dosyasi kullanim ihtiyaci cikti. Bu durumda buraya birden fazla properties dosyasi value'su ekleyebiliyoruz.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&amp;lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &amp;lt;property name="locations"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;  &amp;lt;list&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   &amp;lt;value&amp;gt;classpath:file.properties&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   &amp;lt;value&amp;gt;classpath:ldap.properties&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;  &amp;lt;/list&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;gibi.&lt;br /&gt;&lt;br /&gt;XML içinde bu değerlerin kullanımı da şöyle oluyor. ldap.properties dosyamda config.ldap.username isimli property olduğunu varsayarak:&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&amp;lt;property name="username" value="${config.ldap.username}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Şık, temiz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-8626034550269052425?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/4RfXyqa6wtk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/4RfXyqa6wtk/springde-propertyplaceholderconfigurer.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/05/springde-propertyplaceholderconfigurer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-5129407673374746108</guid><pubDate>Thu, 21 May 2009 11:02:00 +0000</pubDate><atom:updated>2009-05-21T04:04:00.715-07:00</atom:updated><title>TOW SoapUI Binary Data veya File Transfer</title><description>SoapUI'dan webservice'e attachment yollamak icin biraz arastirma yaptim. Burada dursun, ileride lazim olabilir.&lt;br /&gt;&lt;br /&gt;New WSDL project'e bastık. Gelen kutuya dummy bir proje ismi girdik ve wsdl url'ini girdik. OK'e bastik. Biraz bekledikten sonra tüm olasi Request'lerimizi liste olarak gördük. File yollayacagimiz requesti cift tiklayarak request kutusunu actik.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mng47JW9E7U/ShU1CLHljJI/AAAAAAAAAFk/l-xxi_K_BOA/s1600-h/soapUI-attach.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 194px;" src="http://1.bp.blogspot.com/_Mng47JW9E7U/ShU1CLHljJI/AAAAAAAAAFk/l-xxi_K_BOA/s320/soapUI-attach.JPG" alt="" id="BLOGGER_PHOTO_ID_5338231244778212498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;fileData alaninda görüntüde görüldügü gibi cid:XYZ formatinda bir deger yaziyor olmali. Buradaki degeri istedigimiz bir isimle degistiriyoruz. testImage dedim ben buna. Yani son deger cid:testImage&lt;br /&gt;&lt;br /&gt;Daha sonra ekranin altinda Attachment(0) a basiyoruz ve attachment kutusu aciliyor. Burada + ya basarak attach edecegimiz dosyayi seciyoruz. Bu dosyanin Part kolonuna basip oradan testImage'i seciyoruz. Type degerinin otomatik olarak degistigini görüyoruz. Haziriz. Artik requesti submit edebiliriz. Benim ekrandaki web servisim attach olarak gönderdigim file'i alip deneme amacli C:/ dizinin altina atiyordu ki yukaridaki yeşil run butonuna bastigimda errorCode'u görünce gidip baktim ki ne göreyim, dosya C:/ dizini altina atilmis.&lt;br /&gt;&lt;br /&gt;SoapUI'da yeniyim, o nedenle bu tür bilgiler hayati oluyor benim icin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-5129407673374746108?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/lNj4amJMtgE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/lNj4amJMtgE/tow-soapui-binary-data-veya-file.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Mng47JW9E7U/ShU1CLHljJI/AAAAAAAAAFk/l-xxi_K_BOA/s72-c/soapUI-attach.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/05/tow-soapui-binary-data-veya-file.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-4758261475133184766</guid><pubDate>Wed, 13 May 2009 20:41:00 +0000</pubDate><atom:updated>2009-05-14T23:53:54.400-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">generics</category><category domain="http://www.blogger.com/atom/ns#">annotation</category><title>TOW Type safety</title><description>Java 1.4 ile yazılmış bir ejb'yi yeni yazdığım ve generics kullandığım kod üzerinden çağırırken aşağıdaki uyarıyı alıyorum:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Type safety: The expression of type List needs unchecked conversion to conform to &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; List&amp;lt;XYZObject&amp;gt;&lt;xyzobject&gt;&lt;/xyzobject&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Compiler, type uyumunu kontrol ederken ejb'deki eski koddan gelecek listedeki type'ı bilemediğinden bu hatayı vermesi normaldir.&lt;br /&gt;Sonuçta uyarıdır, geçilir. Ama kafaya takılmaması için şu annotation, ilgili metodun üzerine eklenebilir. Ki ben öyle yaptım.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;@SuppressWarnings("unchecked")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;public List&amp;lt;AddressUnit&amp;gt;&lt;addressunit&gt; getCityList() throws Exception {&lt;/addressunit&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aynı kod generics kullanılmadan da yazılabilir, başka bir uyarı da alınabilirdi :)&lt;br /&gt;&lt;br /&gt;Generics yazarken type ismi yerine ? kullanılarak da bu uyarının üstesinden gelinebilir.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;public List&amp;lt;?&amp;gt; getCityList() throws Exception {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-4758261475133184766?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/urkVkGQpBR4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/urkVkGQpBR4/tow-type-safety.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/05/tow-type-safety.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2816150647491331216</guid><pubDate>Tue, 17 Mar 2009 20:20:00 +0000</pubDate><atom:updated>2009-03-24T08:47:24.188-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">grails</category><title>the one with mysql ve grails</title><description>Grails'te mysql kullanımı çok basit olmasına rağmen doğru düzgün kaynak bulamadığım için çok basit bir şekilde ben anlatayım istedim.&lt;br /&gt;&lt;br /&gt;Aşağıdakileri yapmak için grails'in kurulu olduğunu varsayıyorum.&lt;br /&gt;&lt;br /&gt;İçinde projeyi oluşturmak istediğimiz dizine gidiyoruz komut satırından. Sonra adım adım yapalım:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;grails create-app MysqlDeneme&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sonra projemizin dizinine gidiyoruz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cd MysqlDeneme&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dummy bir domain class oluşturuyoruz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;grails generate-all Hikaye&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sonra NetBeans'ten ya da hangi IDE'yi kullanıyorsak oradan projemizi import ediyoruz. Ya da uğraşmayalım dersek projenin dizinine yani MysqlDeneme dizinine gidiyoruz. grails-app\domain klasörüne giriyoruz. Buradaki Hikaye.groovy dosyasını notepad ile açıyoruz. En basitinden şu şekilde yazıyoruz ve kaydediyoruz.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;class Hikaye {    &lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;   String baslik    &lt;/span&gt; &lt;span style="font-weight: bold;"&gt;  &lt;br /&gt;   String icerik&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ardından uygulamayı bu haliyle çalıştırıp bir bakalım.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;grails run-app&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Default olarak localhost:8080'de çalışacaktır uygulama. Ama port'u değiştirmek için grails1.1 kullanıyorsanız GRAILS_HOME dizinine gidin, scripts altında _GrailsSettings.groovy dosyasını bulun. Kime sorsanız gösterir. Bu dosyayı açıp şu satırı bulup port'u istediğiniz gibi değiştirin.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;serverPort = getPropertyValue("server.port", 9090).toInteger()&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Ya da kalıcı bir değişiklik istemiyorsanız grails run-app yerine komutu şöyle yazabiliriz.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;grails -Dserver.port=9090 run-app&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uygulamamıza bir göz atıyoruz:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mng47JW9E7U/ScAG4QjptGI/AAAAAAAAAFU/aSU0VGO8StQ/s1600-h/grails.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 132px;" src="http://1.bp.blogspot.com/_Mng47JW9E7U/ScAG4QjptGI/AAAAAAAAAFU/aSU0VGO8StQ/s320/grails.JPG" alt="" id="BLOGGER_PHOTO_ID_5314255123884127330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Tamamdır. Komut satırından ctrl+c yapıp y diyerek hemen oracıkta uygulamamıza son verelim.&lt;br /&gt;&lt;br /&gt;Mysql'imize gidip hikaye isminde bir database oluşturalım. Herhangi bir tablo vs. oluşturmuyoruz.&lt;br /&gt;&lt;br /&gt;Ardından uygulamamıza geri dönüyoruz ve DataSource.groovy dosyasını buluyoruz. grails-app\conf klasörü altında bulabiliriz kendisini.&lt;br /&gt;&lt;br /&gt;Buradaki datasource kısmını şöyle değiştiriyoruz:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;dataSource {&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt; pooled = true&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;  &lt;br /&gt; driverClassName = "com.mysql.jdbc.Driver"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;  &lt;br /&gt; username = "root"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;  &lt;br /&gt; password = "root"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mysql username ve password'ü kendimize göre değiştiriyoruz tabiii ki.&lt;br /&gt;&lt;br /&gt;Bir sonraki adımımız yine DataSource.groovy dosyasını aşağıdaki gibi değiştirmek:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;environments {&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;development {&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;      &lt;br /&gt;   dataSource {&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;          &lt;br /&gt;     dbCreate = "update" &lt;/span&gt; &lt;span style="font-weight: bold;"&gt;          &lt;br /&gt;     url = "jdbc:mysql://localhost:3306/trip?autoreconnect=true"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;      &lt;br /&gt;   }&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;  &lt;br /&gt; }&lt;/span&gt;&lt;br /&gt;..&lt;br /&gt;&lt;br /&gt;Burada da yine url kısmını kendimize göre değiştiriyoruz. Default değerlerle mysql'i kurmuşsak değerler yukarıdaki gibi olacaktır.&lt;br /&gt;&lt;br /&gt;Efendim, sıra geldi mysql connector jar'ımızı uygulamamızın altına atmaya. Öncelikle mysql connector jar'ımızı &lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html#downloads"&gt;buradan &lt;/a&gt;indirelim.&lt;br /&gt;&lt;br /&gt;Sonra jar'ımızı MysqlDeneme projemizin içindeki lib klasörü altına atalım.&lt;br /&gt;&lt;br /&gt;Tamamdır herhalde. Durun bir deniyim. grails run-app yapıp çalıştırıyoruz.  HikayeController'a gidip  bir hikaye kaydediyoruz.  Sonra gidip mysql'den bakıyoruz.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mng47JW9E7U/ScAK6sVOIEI/AAAAAAAAAFc/_FVUdkar-Q0/s1600-h/grails2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 238px;" src="http://3.bp.blogspot.com/_Mng47JW9E7U/ScAK6sVOIEI/AAAAAAAAAFc/_FVUdkar-Q0/s320/grails2.JPG" alt="" id="BLOGGER_PHOTO_ID_5314259563746041922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Evet olmuş, tamamdır. Oturup çatır çatır yazdım, copy paste'i minimum'da tutaraktan. O nedenle bir yanlışımız olmuşsa affola.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2816150647491331216?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/Mrv5v_rkarY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/Mrv5v_rkarY/one-with-mysql-ve-grails.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Mng47JW9E7U/ScAG4QjptGI/AAAAAAAAAFU/aSU0VGO8StQ/s72-c/grails.JPG" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/03/one-with-mysql-ve-grails.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2066717888297874903</guid><pubDate>Thu, 05 Mar 2009 07:44:00 +0000</pubDate><atom:updated>2009-03-24T08:47:29.761-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DWR</category><title>The One With DWR'dan HttpServletRequest Erişimi</title><description>DWR'dan httpservletrequest'e erişim için, dwr içinde Httpservletrequest kullanımı için benim bildiğim iki yol var. şimdiye kadar hep 1'i kullanıyordum ama 2. yol da bana çekici gelmeye başladı.&lt;br /&gt;&lt;br /&gt;1. WebContextFactory.get().getHttpServletRequest()&lt;br /&gt;2. metodun aldığı parametrelerden birini httpservletrequest yapıyoruz, ama ekrandan bu metodu js fonksiyonu olarak çağırırken bu parametre sanki yokmuş gibi davranıyoruz.&lt;br /&gt;&lt;br /&gt;public class DWRUtility {&lt;br /&gt;  public void getData(int param, HttpServletRequest rq, String s) {&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Javascript'ten bu metodu çağırırken de şöyle yapıyoruz:&lt;br /&gt;&lt;br /&gt;DWRUtility.getData(7, "string deger", callbackFuncName);&lt;br /&gt;&lt;br /&gt;Güzelmiş.&lt;br /&gt;&lt;br /&gt;Dwr call'larında şu hata karşısında zaten ne yapılacağını biliyoruz:&lt;br /&gt;&lt;br /&gt;A request has been denied as a potential CSRF attack&lt;br /&gt;&lt;br /&gt;web.xml'deki dwr tanımına&lt;br /&gt;crossDomainSessionSecurity parametresini "false" olarak set ediyoruz.&lt;br /&gt;&lt;br /&gt;      &amp;lt;init-param&amp;gt;&lt;br /&gt;         &amp;lt;param-name&amp;gt;crossDomainSessionSecurity&amp;lt;/param-name&amp;gt;&lt;br /&gt;         &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;      &amp;lt;/init-param&amp;gt;&lt;br /&gt;&lt;br /&gt;Bunla ilgili security concern'lerini de okumanız gerekir tabi. &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"&gt;Buradan&lt;/a&gt; okuyabilirsiniz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2066717888297874903?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/PvBSg0LYGbA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/PvBSg0LYGbA/one-with-dwrdan-httpservletrequest.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>2</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/03/one-with-dwrdan-httpservletrequest.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-780152461158961508</guid><pubDate>Thu, 05 Mar 2009 07:43:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.148-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">jstl core</category><title>c.tld'de counter falan</title><description>core tld kullanırken forEach içinde counter gerekirse şunu yapabilirim. unutmamak için kısa not alayım.&lt;br /&gt;&lt;br /&gt;&amp;lt;c:forEach var="row" items="${list}" varStatus="stat"&amp;gt;&lt;br /&gt;&lt;br /&gt;varStatus'u sonra şu şekilde kullanarak counter alabilirim.&lt;br /&gt;&lt;br /&gt;&amp;lt;c:out value="${stat.count}"/&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-780152461158961508?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/UW1w-4yKZuY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/UW1w-4yKZuY/ctldde-counter-falan.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/03/ctldde-counter-falan.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-3478666227636481887</guid><pubDate>Sun, 15 Feb 2009 17:06:00 +0000</pubDate><atom:updated>2009-03-24T08:50:12.048-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">misc</category><title>Back Tuşu, Back Tuşu, Bulunmaz eşin</title><description>Back'i engellemek daha doğrusu aynı formun ikinci kez submit edilmemesi için token kullanmıştım. Token hala daha sağlıklı çözüm olarak görünüyor. Ama yine de js ile işi halletmek durumunda kalınabilir diye başka bir not daha alayım buraya. Bir gün lazım olabilir.&lt;br /&gt;&lt;br /&gt;html'in head kısmına aşağıdaki js'i ekliyoruz.&lt;br /&gt;&lt;br /&gt;  var backPressed = 1;&lt;br /&gt;&lt;br /&gt;  window.onbeforeunload = fn_unload;&lt;br /&gt;&lt;br /&gt;  function fn_unload(){&lt;br /&gt;      if(backPressed == 1){&lt;br /&gt;          window.location.reload();&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Böylece sayfa unload etmeden önce çağırdığı fn_unload fonksiyonu vasıtasıyla tekrar reload oluyor. backPressed diye tanımladığımız parametreyi ise normal navigasyon işlemlerinde yine aynı ekranı reload etmesin diye kullanıyoruz. Yani ekrandaki bir linke basmadan önce backPressed'i 1 haricindeki bir değere set ediyoruz. Böylece, biz istediğimiz zaman ekran unload olabiliyor, başka türlü back tuşu vs. ile ekran terkedilmeye çalışıldığında aynı ekran tekrar reload oluyor.&lt;br /&gt;&lt;br /&gt;Bir formun submit'inden sonra açılan bir ekrana bunu koyarsak back tuşuna basınca aynı ekranı tekrar reload edeceğinden formu double submit etmiş oluruz. O nedenle submit sonrası araya başka bir ekran koyup o aradaki ekranın forward yaparak istediğimiz ekrana ulaşmasını sağlayabiliriz. Yani form submit edildiğinde içinde sadece&lt;br /&gt;&lt;br /&gt;  response.sendRedirect("success.jsp");&lt;br /&gt;&lt;br /&gt;olan bir jsp ile asıl gitmek istediğiniz success.jsp'ye ulaşabilirsiniz. Yukarıda eklediğimiz kod ile de success.jsp'de back tuşuna basılınca bu ekranı tekrar reload edebilirsiniz.&lt;br /&gt;&lt;br /&gt;backPressed diye bir parametre kullanmak istemiyorsak&lt;br /&gt;&lt;br /&gt;  window.onbeforeunload = null;&lt;br /&gt;&lt;br /&gt;da kullanılabilir.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-3478666227636481887?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/d3NN1GmC-cg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/d3NN1GmC-cg/back-tusu-back-tusu-bulunmaz-esin.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/02/back-tusu-back-tusu-bulunmaz-esin.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-6491356043965116836</guid><pubDate>Wed, 11 Feb 2009 17:53:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.149-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">struts action</category><category domain="http://www.blogger.com/atom/ns#">java</category><title>struts token kullanımı</title><description>aynı formu birden fazla submit etme, ya da back yapıp aynı formu tekrar submit etme gibi sorunları engellemek için struts'ta token kullandım. Bunun için google yaptiginizda back tuşunu engellemek gibi garip bir seçenek hakkında yogun bir tartisma görürsünüz. Fakat back yapmanın binbir yolu olduğundan ve kullanıcıyı kızdırmamak için, back işlevselliğine bulaşmamak daha iyi diye düşündüm. Ama yine de back tuşunu engelleme kodunu yazayım buraya. Bu kod ayrıca, input text alanı ya da textarea alanı içindeyken back tuşu işlevselliğini geri veriyor. Yani bu alanlarda back'i engellemiyor.&lt;br /&gt;&lt;br /&gt;if (typeof window.event == 'undefined'){&lt;br /&gt;document.onkeypress = function(e){&lt;br /&gt;      var fieldVal = e.target.nodeName.toUpperCase();&lt;br /&gt;   &lt;br /&gt;      if (e.target.type)&lt;br /&gt;          var fieldType = e.target.type.toUpperCase();&lt;br /&gt;   &lt;br /&gt;      if ((fieldVal == 'INPUT' &amp;amp;&amp;amp; fieldType == 'TEXT') || fieldVal == 'TEXTAREA'){&lt;br /&gt;          return e.keyCode;&lt;br /&gt;      } else if (e.keyCode == 8) {&lt;br /&gt;          e.preventDefault();&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;} else {&lt;br /&gt;document.onkeydown = function(){&lt;br /&gt;      var fieldVal = event.srcElement.tagName.toUpperCase();&lt;br /&gt;   &lt;br /&gt;      if (event.srcElement.type)&lt;br /&gt;          var fieldType = event.srcElement.type.toUpperCase();&lt;br /&gt;      if ((fieldVal == 'INPUT' &amp;amp;&amp;amp; fieldType == 'TEXT') || fieldVal == 'TEXTAREA'){&lt;br /&gt;          return event.keyCode;&lt;br /&gt;      }else if (event.keyCode == 8){&lt;br /&gt;          event.returnValue=false;&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bir diğer seçenek de location replace yapıp history'ye atılan değeri manipüle etmekti. Ama o da benim için uygun bir çözüm değildi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ve gelelim token konumuza.&lt;br /&gt;&lt;br /&gt;Ders: Struts&lt;br /&gt;Konu: Token&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Token için kullanılan üç adet method var. saveToken(), isTokenValid() ve resetToken()&lt;br /&gt;&lt;br /&gt;Forma gitmeden önce çağrılan metoda saveToken()'ı ekliyoruz. Böylece session'a unique bir key koymuş oluyoruz.&lt;br /&gt;&lt;br /&gt;açılan jsp'yi view source yaparsak şuna benzer birşey görürüz:&lt;br /&gt;&amp;lt;div&amp;gt;&amp;lt;input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="e1473d05ed6b8a3ddf22844f94776dd2"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;Formu submit'inde çağrılan metoda da isTokenValid() i koyuyoruz. isTokenValid yaptığımız zaman, Submit ile formdan gelen key'i, session'daki key ile karşılaştırıyor ve form'un expire olup olmadığını anlıyor.&lt;br /&gt;&lt;br /&gt;Son olarak, işlemimizin başarılı olduğu case'ler için resetToken çağırıyoruz ki yeni bir key oluştursun ve eski key expire olmuş olsun. Böylece, aynı form submit edildiğinde key'ler uyuşmadığından hata alınacak ve ikinci kez aynı işlemin yapılması engellenmiş olacak.&lt;br /&gt;&lt;br /&gt;Eğer işlem başarılı olmamışsa yani hata alınmışsa resetToken'ı çağırmıyoruz, böylece mevcut key hala geçerli oluyor. Hata nedeniyle kullanıcı aynı formu tekrar submit etmek istediğinde key uyumsuzluğu yaşamıyor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-6491356043965116836?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/53IDaCwlacU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/53IDaCwlacU/struts-token-kullanm.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>1</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2009/02/struts-token-kullanm.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-8328152575792964243</guid><pubDate>Thu, 26 Jun 2008 05:27:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.150-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">struts action</category><category domain="http://www.blogger.com/atom/ns#">java</category><title>struts html:form'da dinamik action degistirme</title><description>ekran açilirlen c:if'lerle action degistirmede sorunla karsilastim. nesting error veriyordu çünkü c:if'in html:form'un kapatilmasindan sonra kapatilmis olmasini istiyordu.&lt;br /&gt;&lt;br /&gt;html:form yerine html-el:form kullanip bir parametreye action degerini tanimladiktan sonra bu parametreyi action olarak kullanarak sorunu çözdüm. Bu da burada bir kösede dursun. Tekrar karsilasabilecegim bir durum gibi hissettim bir an.&lt;br /&gt;&lt;br /&gt;&amp;lt;c:set var="PARAM_BIR" value="1"/&amp;gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;c:set var="PARAM_IKI" value="2"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:if test="${sessionScope.paramAdi eq PARAM_BIR}"&amp;gt;&lt;br /&gt;&amp;lt;c:set var="formAction" value="/birAction.do"/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&amp;lt;c:if test="${sessionScope.paramAdi eq PARAM_IKI}"&amp;gt;&lt;br /&gt;&amp;lt;c:set var="formAction" value="/ikiAction.do"/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html-el:form action="${formAction}" method="post" &amp;gt;&lt;br /&gt;&lt;br /&gt;burada eger farkli action'lara gitme ihtiyaci yoksa dispatchAction ya da mappingDispatchAction kullanarak tek action degeriyle çözüm getirilebilir. sonra yollanan parameter degeri degistirilerek farkli metodlara gitme saglanabilir. ama bu benim için çözüm degildi. struts-config'de farkli action'lara gitmem gerektiginden böyle bir çözüm gerekti.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-8328152575792964243?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/kOKmgt1urGI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/kOKmgt1urGI/struts-htmlformda-dinamik-action.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2008/06/struts-htmlformda-dinamik-action.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-1012383669092983368</guid><pubDate>Thu, 26 Jun 2008 05:24:00 +0000</pubDate><atom:updated>2008-06-25T22:27:31.715-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">js</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">thickbox</category><title>Javascript'ten Thickbox Tetikleme</title><description>Thickbox'u javascript içinden trigger etmek gerekebilir.&lt;br /&gt;&lt;br /&gt;Bunun için thickbox.js içinde olan fakat nedense adı dökümanlarda ve örneklerde pek geçmeyen şu fonksiyon kullanilabilir.&lt;br /&gt;&lt;br /&gt;function tb_show(caption, url, imageGroup) //function called when the user clicks on a thickbox link&lt;br /&gt;&lt;br /&gt;Ayni sekilde javascript içinden thickbox kutusunu kapatmak için de tb_remove() kullanilabilir.&lt;br /&gt;&lt;br /&gt;Bir url'i javascript'ten tetiklerken:&lt;br /&gt;      var url = "/actionUrl?KeepThis=true&amp;amp;TB_iframe=true&amp;amp;width=300&amp;amp;height=200";&lt;br /&gt;      tb_show("Baslik", url);&lt;br /&gt;&lt;br /&gt;Kapatirken:&lt;br /&gt;      tb_remove();&lt;br /&gt;&lt;br /&gt;Ekran içinde tanimladigimiz bir DIV'i ya da bir nesneyi açarken de:&lt;br /&gt;  var url = "#TB_inline?height=300&amp;amp;width=400&amp;amp;inlineId=NESNE_ADI";&lt;br /&gt;  tb_show("Baslik", url);&lt;br /&gt;&lt;br /&gt;Dursun, lazım olur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-1012383669092983368?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/GHl-YrmhBzE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/GHl-YrmhBzE/javascriptten-thickbox-tetikleme.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>1</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2008/06/javascriptten-thickbox-tetikleme.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2037212186680518769</guid><pubDate>Fri, 18 Jan 2008 11:34:00 +0000</pubDate><atom:updated>2009-03-24T08:50:12.048-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">misc</category><title>onunload not working .. Google Toolbar</title><description>Belki siz de yaşamışsınızdır. Bazı makinalarda internet explorer'da Ununload event'inin çalışmadığı durumlar oluyordu.&lt;br /&gt;&lt;br /&gt;Bir arkadaş bunu araştırmış. İlginç birşey! Görmüş ki google toolbar bazı internet explorer fonksiyonalitelerini kullanmayı engelliyor.&lt;br /&gt;&lt;br /&gt;Yani, onunload event'i çalışmıyor diyorsanız nedenlerinden biri bu olabilir. internet explorer'a girip tools altındaki manage add-ons'tan bir kontrol edebilirsiniz.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mng47JW9E7U/R5CPJ0K9XcI/AAAAAAAAADM/RePbGA29fEg/s1600-h/addon.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mng47JW9E7U/R5CPJ0K9XcI/AAAAAAAAADM/RePbGA29fEg/s320/addon.JPG" alt="" id="BLOGGER_PHOTO_ID_5156778972125420994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nacizane çözüm fikirlerim, ya google toolbar'ı kaldırmak ya da kullanılabiliyorsa onunload yerine onbeforeunload kullanmak ki firefox'ta da artık kullanılabilir bir event.&lt;br /&gt;&lt;br /&gt;Toolbar'ın ayarları da popup'a izin verecek şekilde set edilebilir. Ama onunload deyince neden hep popup akla gelir bilmem. Özellikle ajax bu kadar yaygınlaşmışken onunload'la yapılabilecek kamyon dolusu şey var.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.michaelteper.com/archive/2004/04/29/165.aspx"&gt;Bunla ilgili yazılardan birini buradan görebilirsiniz.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2037212186680518769?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/SegObuP2jB0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/SegObuP2jB0/onunload-not-working-google-toolbar.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Mng47JW9E7U/R5CPJ0K9XcI/AAAAAAAAADM/RePbGA29fEg/s72-c/addon.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2008/01/onunload-not-working-google-toolbar.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-967156490762111265</guid><pubDate>Thu, 17 Jan 2008 14:58:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.151-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">struts-config</category><title>Passing parameter from struts-config ... Custom action-mapping</title><description>Farklı ortamlarda aynı war'un çalışması gerekiyordu. Env variable olarak alınabilecek bir parametreyi struts-config üzerinden gönderebilir miyimi düşündüm. custom action-mapping class'ı yazarak bunun yapılabileceğini gördüm.&lt;br /&gt;&lt;br /&gt;Yazayım, bir kenarda dursun. Lazım olur. Zaten birkaç basit adımdan oluşuyor.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;önce custom mapping class'ımızı yazalım:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;package xxx.yyy;&lt;br /&gt;&lt;br /&gt;import org.apache.struts.action.ActionMapping;&lt;br /&gt;&lt;br /&gt;public class CustomActionMapping extends ActionMapping {&lt;br /&gt;    private String channelInfo;&lt;br /&gt;&lt;br /&gt;    public String getChannelInfo() {&lt;br /&gt;        return channelInfo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setChannelInfo(String channelInfo) {&lt;br /&gt;        this.channelInfo = channelInfo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Bana bir tane parametre gerektiği için şimdilik channelInfo adında tek bir tane parametre ekledim.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ardından struts-config'de tanımladığım &amp;lt;action-mappings&amp;gt; içindeki action tanımlarına, yukarıda yazmış olduğum custom mapping'i göstereyim:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;lt;action path="/dummyAction"&lt;br /&gt;    className="xxx.yyy.CustomActionMapping"&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;şimdi de custom içindeki ilgili parametreyi struts-config'den istediğim değere set edeyim:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;    &amp;lt;set-property property="channelInfo" value="CHANNEL1"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;son olarak da action içinde bu değeri nasıl okuyacağıma geldim. Bunun için de action class'ına gelen ActionMapping objesini benim custom mapping'ime cast ediyorum. Ve istediğim parametreyi alıyorum.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;        CustomActionMapping myMapping = (CustomActionMapping) mapping;&lt;br /&gt;        String channelInfo = myMapping.getChannelInfo();&lt;br /&gt;&lt;br /&gt;Benim çok işime yaradı. Şimdilik action mapping'de ihtiyacım oldu ama eğer lazım olursa &amp;lt;forward&amp;gt; ve &amp;lt;form-bean&amp;gt; implementasyonlarını da customize edebiliyor olmamız da aklımızın bir kenarında bulunsun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-967156490762111265?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/0T3X-Qd0pzo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/0T3X-Qd0pzo/passing-parameter-from-struts-config.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2008/01/passing-parameter-from-struts-config.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2974732239172840405</guid><pubDate>Thu, 29 Nov 2007 08:38:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.151-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">struts action</category><category domain="http://www.blogger.com/atom/ns#">java</category><title>struts validation</title><description>Server side struts validation'ı çalıştırmaya çalışırken gözden kaçan ufak ama çok zaman alan hatalarla yüzleştim. Bunları not almakta yarar görüyorum.  Server side validation'ın bana uygun olmadığını düşünerek client side validation'a döndürdüm.&lt;br /&gt;&lt;br /&gt;Bunları da not alalım.&lt;br /&gt;&lt;br /&gt;validator-rules'ta zaten tanımlı rule'lar geliyor. Bunlar dışında pek bir rule'a ihtiyaç olacağını sanmıyorum. Ama ihtiyaç olduğu sürece custom rule'lar yazılma imkanı var.&lt;br /&gt;&lt;br /&gt;validation.xml'de ise asıl validation adımlarını belirtiyoruz. Burada validator-rules'ta tanımlanmış olan rule'lara depend ediyoruz.&lt;br /&gt;&lt;br /&gt;En basitinden required bir field için eklenen kısımı örnek verelim:&lt;br /&gt;&amp;lt;form-validation&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;formset&amp;gt;&lt;br /&gt;     &amp;lt;form name="xxxForm"&amp;gt;&lt;br /&gt;        &amp;lt;field property="zipCode"&lt;br /&gt;               depends="required" &amp;gt;&lt;br /&gt;                   &amp;lt;arg0 key="title.address.adr4"/&amp;gt;&lt;br /&gt;           &amp;lt;/field&amp;gt;&lt;br /&gt;       &amp;lt;/form&amp;gt;&lt;br /&gt;    &amp;lt;/formset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form-validation&amp;gt;&lt;br /&gt;&lt;br /&gt;validator-rules.xml'deki kullanılmayacak rule'ları temizlemekte yarar var. Buna sonra da değineceğim. validation.xml ve validator-rules.xml'le işimiz bittikten sonra bu xml'lerdeki msg'ları resource properties dosyamıza eklememiz gerekiyor. validator-rules.xml'de msg tag'iyle kullanılan mesajlar içindeki argümanlar da validation.xml'de arg tag'iyla, birden fazla varsa da arg0, arg1 gibi taglerle belirtiliyor. Hem msg hem de arg içindeki key'lerin resource properties dosyamızda tanımlı olmasına dikkat etmeliyiz.&lt;br /&gt;&lt;br /&gt;struts-config.xml içinde tanımlanmış olan form ismini validation.xml'de kullanmak gerekiyor.&lt;br /&gt;&lt;br /&gt;Sırada, bu validation'ın kullanılacağı ekranda yapılacak değişiklikler var. Öncelikle jsp'nin head kısmına şu bilgiyi eklemeliyiz.&lt;br /&gt;&lt;br /&gt;&amp;lt;html:javascript formName="xxxForm"/&amp;gt;&lt;br /&gt;&lt;br /&gt;Aynı ekranımızın onSubmit'ine de aşağıdaki gibi js fonksiyon ismini ekliyoruz. Buradaki ismin struts-config'de tanımlı olan form ismiyle aynı olduğuna dikkat edilmeli. Eğer struts-config'de bu form ismi küçük harfle tanımlanmışsa burada büyük harfle başlaması gerektiğini de belirtelim.&lt;br /&gt;&lt;br /&gt;&amp;lt;html:form method="post" action="/xxxAction.do" onsubmit="return validateXxxForm(this)"&amp;gt;&lt;br /&gt;&lt;br /&gt;Bu değişiklikler yapıldıktan sonra client side validation'ın çalışması gerekiyor. Bunu server side'a çevirmek için ise şu değişiklikler gerekiyor.&lt;br /&gt;&lt;br /&gt;Öncelikle form'umuzun ActionForm'a değil de ValidatorForm'a extend etmesi sağlanmalı.&lt;br /&gt;Ardından struts-config'deki action mapping'imiz içinde bir input tanımlamalıyız.&lt;br /&gt;&lt;br /&gt;        &amp;lt;action path="/xxxAction"&lt;br /&gt;                type="com.xxx.action.XxxAction"&lt;br /&gt;                name="xxxForm"&lt;br /&gt;                scope="request"&lt;br /&gt;                input="/jsp/xxx/xxxMain.jsp"&amp;gt;&lt;br /&gt;&lt;br /&gt;validate'i de true set ettiğimiz zaman validation'dan geçemeyen ekranımız input'ta tanımlı olan sayfaya düşecektir.&lt;br /&gt;&lt;br /&gt;Akış da şöyle: validate false set edilmediği zaman Struts validate metodunu çağırır. Validate'ten ActionErrors objesi döner. Eğer bu obje null değilse requesti input'ta tanımlı olan ekrana yönlendirir. Eğer ActionErrors objesi null gelmişse Struts validation'ı tamamlar ve execute metoduna devam eder.&lt;br /&gt;&lt;br /&gt;Eğer ekran açılışını da aynı action mapping üzerinden yapıyorsa ekran açılırken de validation yapmaya çalışacaktır ve büyük ihtimalle -validation kurallarının nasıl olduğuna bağlı olarak tabi- sürekli input'a düşecektir. O nedenle, server side validasyon için ekran açilisindaki action path'i ile formu submit ettigimizde gitmesini istedigimiz action path'i ayri ayri tanimlamaliyiz.&lt;br /&gt;&lt;br /&gt;Client side validation'a dönecek olursak, yukarıda bahsettiğim validator-rules'ta kullanılmayacak kuralların silinmesinin nedeni, client side validation kullanılan ekran açıldığında view source yaparsanız ortaya çıkıyor. Validator-rules'ta tanımlı kuralların ekran tarafında javascript olarak oluşturulduğunu ve tutulduğunu göreceksiniz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2974732239172840405?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/3EXsooUFMWg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/3EXsooUFMWg/struts-validation.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2007/11/struts-validation.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-2397911134099989487</guid><pubDate>Thu, 22 Nov 2007 16:59:00 +0000</pubDate><atom:updated>2008-12-09T07:01:24.942-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DWR</category><category domain="http://www.blogger.com/atom/ns#">Ajax</category><title>jquery veya thickbox ile dwr conflict</title><description>jquery'yi ve dwr'ı birlikte kullanmaya kalktığımda hata aldım. Bir conflict olduğu belli.&lt;br /&gt;&lt;br /&gt;&amp;lt;script language="Javascript" src=".../jquery-1.1.3.1.pack.js"&amp;gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&lt;br /&gt;Bu jquery'yi kullandım.&lt;br /&gt;&lt;br /&gt;DWR için de engine ve util'i ekledim.&lt;br /&gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='.../dwr/engine.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='.../dwr/util.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;Ardından bir yerde DWRUtil.removeAllOptions kullanmak istediğimde şu hatayı aldım:&lt;br /&gt;removeAllOptions can only be used with select, ol and ul elements&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mng47JW9E7U/R0W38GvNxHI/AAAAAAAAADE/xYPC2id27Yw/s1600-h/query+conflict.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Mng47JW9E7U/R0W38GvNxHI/AAAAAAAAADE/xYPC2id27Yw/s320/query+conflict.JPG" alt="" id="BLOGGER_PHOTO_ID_5135713193314600050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bunun çözümü için iki aksiyon aldım. Yine karşılaşırsam sıyırmadan önce bunları deneyeceğim.&lt;br /&gt;1. $('#DIV_ismi') kullanim yerine jQuery('#DIV_ismi')&lt;br /&gt;2. page onload'una jQuery.noConflict(); eklemek&lt;br /&gt;&lt;br /&gt;Ardından, ilgili conflict kayboldu. Güzel de oldu.&lt;br /&gt;&lt;br /&gt;Thickbox kullandığım zaman da aynı sorunla karşılaştım. Yukarıdaki çözümler bu durumda yetersiz kaldı, o nedenle thickbox.js dosyasını açıp içindeki $('#DIV_ismi') kullanımlarını, jQuery('#DIV_ismi') ile değiştirdim. Thickbox da böylece çalıştı.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-2397911134099989487?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/GMnJ855d_ZU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/GMnJ855d_ZU/jquery-dwr-conflict.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Mng47JW9E7U/R0W38GvNxHI/AAAAAAAAADE/xYPC2id27Yw/s72-c/query+conflict.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2007/11/jquery-dwr-conflict.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-8646397303979656760</guid><pubDate>Thu, 18 Oct 2007 08:48:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.154-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">reflection</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">DWR</category><title>java reflection notlar</title><description>Dwr kodu genel bir yere konup birden fazla developer'a açıldığında, production release'lerde versiyon ayarlaması büyük çaba istiyor. Birçok dosyada aynı sorun yaşanabiliyor. Ama bu durum için bir çözüm üretilebilir.&lt;br /&gt;&lt;br /&gt;O nedenle, dwr metodlarını tuttuğum class içinden çağrılan tüm static metodları reflection ile çağırmayı uygun buldum. Böylece, productiona henüz çıkmamış kodları kullanan yeni metodların dwr class'ı içinde productiona alınmasında bir sorun olmayacaktı.&lt;br /&gt;&lt;br /&gt;Bunun için ilgili static metodları reflection ile çağırmak için kullanılacak metodun içini yazıyorum.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            Class temp = Class.forName(className);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;            Method method1 = temp.getMethod(methodName1, parameterTypes);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;            return method1.invoke(temp, parameters);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;className olarak metodun bulunduğu class ismini veriyorum. Aynı dizinde olsa bile className'i tüm package ismiyle vermemiz gerekiyor. Yoksa classnotfound hatası alınıyor.&lt;br /&gt;&lt;br /&gt;methodName olarak, çağıracağım metodun ismini veriyorum. getMethod'a gönderilen ikinci parametre de çağrılacak metodun aldığı parametrelerin bir class array içine konulmuş hali.&lt;br /&gt;&lt;br /&gt;Bir örnek olarak:        &lt;br /&gt;&lt;span style="font-style: italic;"&gt;Class[] parameterTypes = { String.class, String.class};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;invoke'u çağırırken de bu parametrelere denk gelen değerleri bir object array içinde ikinci parametre olarak yolluyorum.&lt;br /&gt;&lt;br /&gt;Buna da bir örnek olarak:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Object[] parameters = { "111", "222"};&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Yukarıda yazmış olduğum reflection metodu, verilen class ve metod ismiyle bir static metod arayacağı için reflection ile çağrılacak olan metod eğer static tanımlanmamışsa aşağıdaki gibi bir hatayla karşılaşılabilir:&lt;br /&gt;&lt;br /&gt;java.lang.IllegalArgumentException: object is not an instance of declaring class&lt;br /&gt;    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;    at java.lang.reflect.Method.invoke(Method.java:324)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;O nedenle, reflection ile yukarıdaki gibi çağrılacak olan metodun static olarak tanımlanması gerekiyor.&lt;br /&gt;&lt;br /&gt;Non-static bir metodun çağrılması için class'ın bir instance'ını oluşturmak gerekir. Onu da not düşelim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            Class temp = Class.forName(className);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;            Object obj = temp.newInstance();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;            Method method1 = temp.getMethod(methodName1, parameterTypes);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;            result = method1.invoke(obj, parameters);&lt;br /&gt;&lt;br /&gt;Bu ortak class'ın içine metod ekleneceği zaman reflection ile dallanma sağlandığı sürece versiyonlamada bir problem yaşanmayacaktır. En azından öyle ümit ediyorum.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-8646397303979656760?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/8qos-fCbmWM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/8qos-fCbmWM/java-reflection-notlar.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2007/10/java-reflection-notlar.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-8015583808695983959</guid><pubDate>Tue, 02 Oct 2007 12:42:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.154-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">weblogic</category><title>java.sql.SQLException: Cursor is closed Hmm Veya Already in transaction Hataları</title><description>java.sql.SQLException: Cursor is closed.&lt;br /&gt;at weblogic.rmi.internal.ServerRequest.sendReceive(ServerRequest.java:186)&lt;br /&gt;at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:290)&lt;br /&gt;at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:248)&lt;br /&gt;&lt;br /&gt;Pool'umdan arada bir böyle hata aliyordum. Bugün bu had safhaya ulasti, sürekli ayni hatayi veriyordu.&lt;br /&gt;&lt;br /&gt;Biraz arastirma yapinca ögrendim ki sunu yaptigimda bu hata düzeliyor. Bu hatayi veren datasource'u silip yeniden tanimliyorum ve yeni tanim esnasinda da Honor Global Transactions'in check'ini kaldiriyorum yani false yapiyorum. Sonra ilgili datasource deploy edildiginde ilgili sorun düzelmis oluyor.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mng47JW9E7U/RwI-qEUC5BI/AAAAAAAAAC4/I_4TfneUkYE/s1600-h/bir.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mng47JW9E7U/RwI-qEUC5BI/AAAAAAAAAC4/I_4TfneUkYE/s320/bir.JPG" alt="" id="BLOGGER_PHOTO_ID_5116721019079549970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Peki bu check ne ise yariyor? Onu da buraya not alayim. Bu opsiyon, bu datasource'un transactional datasource olarak kullanilabilmesini sagliyor.&lt;br /&gt;&lt;br /&gt;Datasource, local transaction'lar için kullanilirken, transactional datasource distributed transaction'lar için kullaniliyor. Eger, bir transaction içinde birden fazla kaynaga erisim gerekiyorsa, ya da bir transaction içinde birden fazla database'e güncelleme yapacaksak, transactional datasource kullanmamiz gerekiyor. Bir de, ayni connection pool'u birden fazla serverda kullanmak istiyorsak...&lt;br /&gt;&lt;br /&gt;Son bir not! Bu parametre, DS tanimlandiktan sonra tekrar degistirilemiyor. O nedenle, DS'i silip tekrar tanimlamak gerekiyor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-8015583808695983959?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/TJXKEb9vKy4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/TJXKEb9vKy4/javasqlsqlexception-cursor-is-closed.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Mng47JW9E7U/RwI-qEUC5BI/AAAAAAAAAC4/I_4TfneUkYE/s72-c/bir.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2007/10/javasqlsqlexception-cursor-is-closed.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-3045741293245869284</guid><pubDate>Sat, 25 Aug 2007 21:31:00 +0000</pubDate><atom:updated>2011-08-03T07:22:03.155-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">misc</category><category domain="http://www.blogger.com/atom/ns#">java</category><title>JAR üzerine Temel Bilgiler - Cevaplanamamış Soru :)</title><description>Jar dosyalarını neden yaparız? Nedenlerinden biri, bir uygulamaya ait tüm class'ları ve kaynakları bir pakette toplamak içindir diye düşünüyorum. Bir diğer nedeni ise arşivlenmiş olan bir uygulamayı kolayca çalıştırabilmek içindir. Jarın faydalarına da bakalım. Jar haline getirilmiş paketimizi dijital olarak imzalayabiliriz. Uygulamanın boyutunu azaltır ve tek http transaction içinde bir applet'in ihtiyacı olan tüm kaynakların alınmasını sağlar. &lt;br /&gt;&lt;br /&gt;Bazen kendimizi framework'lere, hazır teknolojilere o kadar kaptırıyoruz ki basit sorulara cevap bulamadığımız oluyor. Aslında zihnimizin bir yerinde bu basit sorulara cevabımız oluyor ama artık beynimizin çalışma yapısından mıdır bilemiyorum daha kompleks çalışmaya itiyor bizi. Basit düşün demişti bir abimiz. Cidden çok önemli bir özellik. Basit düşünmek... &lt;br /&gt;&lt;br /&gt;Bir jar dosyasını nasıl çalıştırabileceğimiz sorusu da böyle bir soru. Bir jar'ı execute etmek için java'nın -jar komutunu kullanabiliriz. &lt;br /&gt;&lt;em&gt;java -jar jarIsmi.jar &lt;/em&gt;&lt;br /&gt;şeklinde. &lt;br /&gt;&lt;br /&gt;Ya da &lt;br /&gt;&lt;em&gt;jre -cp jarIsmi.jar MyClass &lt;/em&gt;&lt;br /&gt;şeklinde jre'yi kullanarak da çalıştırabiliriz jar'ımızı. İlk kullanım için yapılması gereken bir ön işlem var. Jar içindeki uygulamanın main class'ını tanıtmamız gerekiyor. Bunun için de manifest dosyasına şunu ekliyoruz:&lt;br /&gt;Main-class: MyClass&lt;br /&gt;&lt;br /&gt;Main class için de bu class'ın bildiğimiz gibi &lt;em&gt;public static void main(String[] args)&lt;/em&gt; metoduna sahip olması gerekmektedir. O zaman jar içindeki class'lardan main metoduna sahip farklı class'larımızı manifest dosyasını değiştirerek komut satırından çalıştırabiliriz. Manifest dosyasını komut satırından değiştirmek için de m opsiyonunu kullanabiliriz. m opsiyonunu kullanarak jar'ın manifest'i içine ek bilgi girebiliriz. Şöyle ki:&lt;br /&gt;&lt;br /&gt;jar cmf manifest-addition jar-file input-file(s)&lt;br /&gt;&lt;br /&gt;Fakat bunun daha kolay yolu yukarıda da belirttiğimiz jre komutunu kullanmak ve komut sonunda verdiğimiz class ismini değiştirmek.&lt;br /&gt;&lt;br /&gt;Soruları biraz daha geliştirelim. Bu jar içindeki bir applet'i web tarayıcı'dan nasıl çalıştırırız? Buna cevabı sun developer network'ten alıyorum. &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&amp;lt;applet code=MyClass.class &lt;br /&gt;        archive="jarIsmi.jar"&lt;br /&gt;        width=100 height=100&amp;gt;&lt;br /&gt;&amp;lt;/applet&amp;gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Peki ant'a alışmışız, o tamam ... Ama komut satırından ya da manuel olarak bir jar yapmak istersek nasıl yaparız? Basit kullanım şöyle:&lt;br /&gt;&lt;em&gt;&lt;em&gt;jar cf myjarfile *.class &lt;/em&gt;&lt;/em&gt;&lt;br /&gt;Opsiyonel olarak Manifest dosyasını da eklemek istiyorsak o zaman cf komutunun sonuna m opsiyonu geliyor. &lt;br /&gt;&lt;em&gt;jar cfm myJarFile myManifestFile *.class&lt;/em&gt;&lt;br /&gt;Eğer komut olarak cmf kullanırsak manifest ismi jar isminden önce gelir:&lt;br /&gt;&lt;em&gt;jar cmf myManifestFile myJarFile *.class&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Ant'ta basitçe şu satırları da yazalım da aradaki benzerlikler kendini göstersin:&lt;br /&gt;&amp;lt;property name="war" value="myJar" /&amp;gt;&lt;br /&gt;&amp;lt;property name="dist" value="../baseDirectory" /&amp;gt;&lt;br /&gt;&amp;lt;jar jarfile="${war}.war" manifest="manifest.mf" basedir="${dist}"/&amp;gt;    &lt;br /&gt;&lt;br /&gt;Bu bilgileri yazmamın nedeni, bana sorulan bir soruya cevap veremeyişimdi. Demek ki kendime dert edinmişim :) O yüzden buraya yazıyorum, aklımın bir kenarında dursun diye. Umarım ilgili soruya da yeterli cevap vermiş olurum. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-3045741293245869284?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/YrchI52KX10" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/YrchI52KX10/jar-zerine-temel-bilgiler-cevaplanamam.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>0</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2007/08/jar-zerine-temel-bilgiler-cevaplanamam.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4424362800462847144.post-15490740766367296</guid><pubDate>Wed, 15 Aug 2007 17:04:00 +0000</pubDate><atom:updated>2007-08-16T08:52:44.329-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Evrensel Kod</category><category domain="http://www.blogger.com/atom/ns#">Encoding</category><category domain="http://www.blogger.com/atom/ns#">Karakter Set</category><category domain="http://www.blogger.com/atom/ns#">Unicode</category><title>Encoding - Evrensel Kod - Karakter Setleri (II)</title><description>&lt;div&gt;Unicode, tüm karakterlerin belirli hexadecimal sayılarla tanımlanması için hazırlanmış bir evrensel kod sistemi dedik. Fakat, bu bilginin yani bir karakteri belirleyen bu sayı değerinin hafızada nasıl tutulacağına değinmedik.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Mahir'i iki byte'lar halide (UTF-16) hafızada tutmak istediğimizde:&lt;br /&gt;00 4D 00 61 00 68 00 69 00 72 şeklinde tutabildiğimiz gibi,&lt;br /&gt;72 00 69 00 68 00 61 00 4D 00 şeklinde tam tersi biçimde de tutabiliriz. Bu durumda, sisteme bu bilginin hangi yönde tutulduğunun da belirtilmesi gerekir. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Bu noktada, tüm unicode verilerin başına FE FF (big endian) FF FE (little endian) dizinini ekleyerek kendinden sonra gelecek olan verinin nasıl tutulduğunu belirtme yoluna gidilmiş. &lt;a href="http://msdn2.microsoft.com/en-us/library/ms776429.aspx"&gt;Byte Order Mark&lt;/a&gt; denen bu dizin sayesinde işlemcilere en düşük byte'ın nerede olduğu belirtiliyor. Bunun nedeni aslında, piyasadaki işlemcilerin en düşük byte olarak kabul ettiği byte'ın birbirinden farklı olması. Intel en düşük byte olarak ilk byte'ı kabul ederken, Motorola işlemcisi, en düşük byte olarak en sonuncuyu kabul etmekte. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Bu yapı, yeterince tatminkar görünse de özellikle ingiliz alfabesini kullanan sistemlerde gereksiz çok fazla 00'lara neden olmaktaydı çünkü ANSI ya da ASCII'de tanımlanabilen karakterler Unicode yapısında 00'la başlayan karakterlerdi ve iki byte'lık bir karakter yapısının ikinci byte'ı sürekli 00 olmaktaydı. Aynı zamanda, bu sistemlerin birbirine dönüştürülmesi de ayrı bir maliyetti. Bu noktada, UTF-8 geliştirildi. UTF-8 encoding'ine göre 0-127 rakamları arasında tanımlı olan karakterler tek byte'la gösterilecekti. 128 ve üzerindeki rakamlarla tanımlı karakterler ise birden fazla byte'la gösterilecekti. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Böylece, Mahir yazımı 4D 61 68 69 72 şeklinde olacaktı. Ki bu yazım, ASCII ve ANSI yapısındaki yazımla aynıydı. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Mevcut HTML'lerimizi incelediğimizde encoding tagı içinde birçok encoding görüyoruz. Bunlardan en yaygın olanlarından bazıları ISO-8859 ile başlayanlardır. ISO-8859'lar, ISO ve IEC tarafından tanımlanmış 8 bitlik karakter encodingleridir. ISO-8859'la başlayan birçok bölüm vardır ve her biri farklı özel karakter setleri içerir. Türkçe için kullandığımız ISO-8859-9 bölümünde mesela, özel İzlanda harfleri türkçe harfleriyle değiştirilmiş. Onun haricinde ISO-8859-1 bölümü ile hemen hemen aynıdır. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Bunu yanında, bize yine tanıdık gelen windows karakter setleri vardır. Bunlar, microsoft tarafından tanımlanmış olan ANSI code page'leridir. Bilinenler 1250 ile 1258 arasında değişir. 1252 yani West European Latin, ISO-8859-1 baz alınarak hazırlanmıştır. Bizim işimize yarayan ise &lt;a href="http://en.wikipedia.org/wiki/Windows-1254"&gt;1254 &lt;/a&gt;yani türkçe için hazırlanmış olan code page'tir. &lt;/p&gt;&lt;br /&gt;&lt;div&gt;Zamanında bir yazı okumuştum bu konu üzerine. Bu yazı boyunca, o yazıdan, yer yer birebir çeviri yaptım, yer yer esinlendim. Encoding hakkındaki o yazıya &lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;buradan &lt;/a&gt;erişebilirsiniz. Bu linkte verdiğim yazıyı iki kez okudum ve bunun yanında biraz araştırma yaptım ama gördüm ki bir yere not almadan tüm bu bilgileri unutuyorum. Ben de, eksiğiyle yanlışıyla aklımda kalanları not almak için bu yazıyı yazdım. Daha öğrendikçe yazıyı da geliştirmeyi düşünüyorum. Ama şimdilik aklımda kalanları bunlar.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4424362800462847144-15490740766367296?l=mahirtarlan.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mahirtarlan/~4/CLxpwcGjeyk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/mahirtarlan/~3/CLxpwcGjeyk/encoding-evrensel-kod-karakter-setleri_15.html</link><author>noreply@blogger.com (Mahir Tarlan)</author><thr:total>1</thr:total><feedburner:origLink>http://mahirtarlan.blogspot.com/2007/08/encoding-evrensel-kod-karakter-setleri_15.html</feedburner:origLink></item></channel></rss>

