Java'da basit bir şekilde ve herhangi bir ekstra kütüphane kullanmadan HTTPURLConnection sınıfı ile bir web sitesine bağlanıp içeriğini almak konusunda ufak bir kod parçası ile örnek vereceğim. Bu işlemi, bir web sayfasını tamamen String olarak çekip parse etmek ya da GET, POST vs. ile çalışan bir REST servisi çağırmak için kullanabilirsiniz.
Aşağıdaki örnekte http://www.mehmetaktas.org?param1=VALUE1¶m2=VALUE2 şeklinde bir adresin içeriğini çekeceğiz.
public String getURLContent(){
String uri = "http://www.mehmetaktas.org?param1=value1¶m2=value2";
HttpURLConnection connection = null;
try {
//Bağlantımızı açıyoruz
URL url = new URL(uri);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");//POST, PUT, DELETE ...
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
/*
* Content-Type, Content-Language gibi request property set etmek
* istersek aşağıdaki metod kullanılabilir:
* connection.setRequestProperty("Content-Language", "tr-TR");
*/
//Response'ı alıyoruz
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder response = new StringBuilder();
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
is.close();
return response.toString();
}
catch (Exception e) {}
finally {
if (connection != null) {
connection.disconnect();
}
}
}
( httpurlconnection, screenscraper, java, url, connection, web page, parse, rest, get, post )
21 Aralık 2012 Cuma
13 Aralık 2012 Perşembe
Operation Not Allowed After ResultSet Closed
Merhaba,
JDBC kullanarak Java'da veritabanı bağlantısı yapıp veri çekmeye çalışırken "rs.next()"ile bir veriye ulaşırız. Bu metodu çağırdığımız esnada "java.sql.SQLException: Operation not allowed after ResultSet closed" şeklinde bir taha alıyorsanız olası bir kaç sebebi var. Bu sebeplerin başında ResultSet nesnenizi kullanırken bir döngü ya da başka bir metodun içerisinde "rs.close()" metodunu kullanarak ya da nesneyi null yaparak hata alma durumunuz vardır. Bu problemi, biraz araştırarak çözebilirsiniz fakat "Ben ResultSet nesnemi kesinlikle kapatmıyorum ya da null yapmıyorum neden böyle oluyor?" derseniz sebebi bulmak biraz zor olabilir. Böyle bir durum başıma geldi ve çözümünden bahsedeceğim.
Java tarafında veritabanına bağlanırken ResultSet nesnesini doldurmak için bir Statement ya da PreparedStatement nesnesi kullanırız. Bu nesne teoride bir adet ResultSet'e hizmet verebilir. Statement kapandığı zaman, ona bağlı olan ResultSet de kapanır. Sıkıntı da aslında buradan kaynaklanıyor. Özellikle uzun sürede sonuç getiren bir sorgu çalıştırdığınız zaman Statement, uygulama sunucusunun pool ayarlarında tanımlı olan Statement Timeout'una takılıyor. Bu esnada Statement, uygulama sunucusu tarafından kapatıldığı için ResultSet nesnesi de kapanmış oluyor. Siz de herhangi bir veri çekmeye çalıştığınızda en tepede bahsettiğim hatayı alıyorsunuz.
Bu sorunu, SQL sorgunuzu optimize ederek ya da uygulama sunucusundaki kullandığınız veritabanı pool'unun Statement Timeout süresini uzatarak çözebilirsiniz. Glassfish için bu ayara "Resources > JDBC > JDBC Connection Pools > POOL_ADI > Advanced" menüsünden ulaşabilirsiniz.
( java, jdbc, statement, resultset, pool, timeout, sqlexception, connection )
JDBC kullanarak Java'da veritabanı bağlantısı yapıp veri çekmeye çalışırken "rs.next()"ile bir veriye ulaşırız. Bu metodu çağırdığımız esnada "java.sql.SQLException: Operation not allowed after ResultSet closed" şeklinde bir taha alıyorsanız olası bir kaç sebebi var. Bu sebeplerin başında ResultSet nesnenizi kullanırken bir döngü ya da başka bir metodun içerisinde "rs.close()" metodunu kullanarak ya da nesneyi null yaparak hata alma durumunuz vardır. Bu problemi, biraz araştırarak çözebilirsiniz fakat "Ben ResultSet nesnemi kesinlikle kapatmıyorum ya da null yapmıyorum neden böyle oluyor?" derseniz sebebi bulmak biraz zor olabilir. Böyle bir durum başıma geldi ve çözümünden bahsedeceğim.
Java tarafında veritabanına bağlanırken ResultSet nesnesini doldurmak için bir Statement ya da PreparedStatement nesnesi kullanırız. Bu nesne teoride bir adet ResultSet'e hizmet verebilir. Statement kapandığı zaman, ona bağlı olan ResultSet de kapanır. Sıkıntı da aslında buradan kaynaklanıyor. Özellikle uzun sürede sonuç getiren bir sorgu çalıştırdığınız zaman Statement, uygulama sunucusunun pool ayarlarında tanımlı olan Statement Timeout'una takılıyor. Bu esnada Statement, uygulama sunucusu tarafından kapatıldığı için ResultSet nesnesi de kapanmış oluyor. Siz de herhangi bir veri çekmeye çalıştığınızda en tepede bahsettiğim hatayı alıyorsunuz.
Bu sorunu, SQL sorgunuzu optimize ederek ya da uygulama sunucusundaki kullandığınız veritabanı pool'unun Statement Timeout süresini uzatarak çözebilirsiniz. Glassfish için bu ayara "Resources > JDBC > JDBC Connection Pools > POOL_ADI > Advanced" menüsünden ulaşabilirsiniz.
( java, jdbc, statement, resultset, pool, timeout, sqlexception, connection )
12 Aralık 2012 Çarşamba
Aspx Html Çift Title Sorunu
Aspx kullanarak oluşturulan web sitelerinde işimiz yarayan MasterPage'den kaynaklı olarak bir duplicate <title> tag problemi yaşıyor olabilirsiniz. Bunun başlıca sebebi, master sayfasının <head> tagleri arasında bulunan ContentPlaceHolder aslında. Her bir sayfada farklı bir title kullanmak istediğimizde <title>Sayfa Bilgisi</title> kodunu master sayfadaki <head> tagi arasına koymak yerine master sayfasındaki <head> tagi içerisine bir adet ContentPlaceHolder atarız. Sonrasında oluşturduğumuz sayfada bu ContentPlaceHolder'ın içeriğini koyacağımız yere <title> tagimizi koyarız. Bu işlem, sayfa render edildiğinde biri boş olmak üzere iki adet <title> tagine sebep olmaktadır. Bunun sebebi, server tarafında çalışan ve <head> içerisinde bulunan ContentPlaceHolder'ın, <title> tagini bulamayıp kendisinin ekstra bir adet daha üretmesidir.
Sorunun çözümü ise basit. Title bilgisini <title> tagi arasına koymak yerine sayfanın en tepesindeki <%@ Page Title=""... içerisine koymak. Sırasıyla sorunlu kod ve düzeltilmiş kod aşağıdaki gibi olmalıdır.
Hatalı Kod:
<%@ Page Title="" Language="C#" MasterPageFile="~/Mstr.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
<title>BASLIK</title>
...
</asp:Content>
Doğru Kod:
<%@ Page Title="BASLIK" Language="C#" MasterPageFile="~/Mstr.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
...
</asp:Content>
( aspx, .net, <title>, <head>, çift title, contentplaceholder, masterpage, content, runat="server" )
Sorunun çözümü ise basit. Title bilgisini <title> tagi arasına koymak yerine sayfanın en tepesindeki <%@ Page Title=""... içerisine koymak. Sırasıyla sorunlu kod ve düzeltilmiş kod aşağıdaki gibi olmalıdır.
Hatalı Kod:
<%@ Page Title="" Language="C#" MasterPageFile="~/Mstr.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
<title>BASLIK</title>
...
</asp:Content>
Doğru Kod:
<%@ Page Title="BASLIK" Language="C#" MasterPageFile="~/Mstr.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
...
</asp:Content>
( aspx, .net, <title>, <head>, çift title, contentplaceholder, masterpage, content, runat="server" )
6 Kasım 2012 Salı
Java İle Basit Tek Taraflı Şifreli Metin Üretme
Özellikle veritabanında tutulmaması gereken veriler olduğunda ya da network üzerinde açık olarak gitmesini istemediğimiz veriler olduğu durumlarda tek taraflı olarak verileri şifreleriz. Örneğin girilen bir şifrenin doğru olup olmadığını kontrol ederken veritabanındaki şifrelenmiş metin ile kullanıcıdan gelen açık metini şifreleyerek karşılaştırırız. Böylece kullanıcının şifresini bilmeden şifresini doğrulayabiliriz. Bunun için kullanılabilecek en basit yöntemi aşağıda göstereceğim.
import java.security.MessageDigest;
import sun.misc.BASE64Encoder;
public final class Sifre {( java, hash, password, encrypt, salt, sha, md5 )
public static String sifrele(String mesaj,String algoritma, String encoding){
MessageDigest md = null;
String hash = null;
try {
md = MessageDigest.getInstance(algoritma);
md.update(mesaj.getBytes(encoding));
md.update("TUZ".getBytes(encoding));
byte rawByte[] = md.digest();
hash = (new BASE64Encoder()).encode(rawByte);
} catch (Exception e) {
}
return hash;
}
public static void main(String args[]) throws Exception {
String sifre = "PASSWORD";
System.out.println(sifrele(sifre, "SHA", "UTF-8"));
System.out.println(sifrele(sifre, "MD5", "UTF-8"));
}
}
19 Ekim 2012 Cuma
Glassfish'de Request URI Is Too Large Hatası
Glassfish uygulama sunucuna yüklenmiş bir web uygulamasındaki servlet'e GET ya da POST ile gitmeye çalıştığınızda Request URI is too large. java.nio.BufferOverflowException gibi bir hata almanız olası. Böyle bir durumda sıkıntı aslında TCP ile ilgili yani networksel bir problem. Yaşamadım fakat tahminimce Glassfish üzerine herhangi bir byük boyutlu uygulama yüklerken de benzer bir hata ile karşılabilirsiniz. Bu noktada yapılması gereken ise Glassfish'in network ayarlarındaki buffersize'ı artırmak olacak.
4848 portundan (default) Glassfish'in admin arayüzünü açıyoruz. Sonrasında sol taraftaki menüden sırasıyla: Configurations > Server-Config > Network Config > Transports > Tcp 'ye tıklayarak TCP menüsünü açıyoruz. Buradaki buffer size kısmını ihtiyacımız olduğu ölçüde artırıp uygulama sunucusuna restart attığımızda aynı problem ile karşılaşmayacağız.
( glassfish, tcp, buffer size, request uri too large, servlet, get, post )
4848 portundan (default) Glassfish'in admin arayüzünü açıyoruz. Sonrasında sol taraftaki menüden sırasıyla: Configurations > Server-Config > Network Config > Transports > Tcp 'ye tıklayarak TCP menüsünü açıyoruz. Buradaki buffer size kısmını ihtiyacımız olduğu ölçüde artırıp uygulama sunucusuna restart attığımızda aynı problem ile karşılaşmayacağız.
( glassfish, tcp, buffer size, request uri too large, servlet, get, post )
Kaydol:
Kayıtlar (Atom)