Java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Perşembe, Nisan 05, 2012

Spring 3 @Scheduled ile zamanlanmış görevler

Java ile uğraşanların çoğu zamanlanmış görevleri yerine getirmek için Quartz Apisini kullanmıştır. Bu api ile basit işlerden tutun clustered kompleks yapıdaki bir çok işimizi yapabiliyoruz aslında.

Spring 3 ile bu zamanlanmış görevler daha da basitleştirilerek bize sunulmaya başlandı. Spring 3 bunun için arka tarafta hem Quartz hem de kendi yapısını kullanabiliyor. Bu yazının konusu Spring ile @scheduled annotasyonunu kullanarak basit bir zamanlanmış görevi nasıl yapabileceğimizi göstermektir.
@Service
public class ScheduledJob {

    @Scheduled(fixedDelay = 5000)
    public void process() {   
        //do your job here
        System.out.println("processing job " + new Date());              
    }
}

işte bu kadar basit. yapacağınız tek şey istediğiniz aralıkta veya zamanda çalışacak metodunuzun başına @Scheduled annotasyonunu koymak. Yukarıdaki metod 5 saniyede bir çalışır. bunun aralığını;
@Scheduled(fixedDelay = 5000)  // iş bittikten 5 sn sonra yeni iş tekrar başlar
@Scheduled(fixedRate = 5000)    //iş başladıktan 5 sn sonra yeniş iş başlar
@Scheduled(cron="0 0 1 * * ? ")    //her gece saat 01:00 da çalışır.

şeklinde verebilirsiniz.

@Scheduled annotasyonunun dışında applicationContext.xml dosyasına
<task:scheduler ../>
ekleyerek de zamanlanmış bir iş yapılabilir.

Clustered bir ortamda çalışacaksanız bunun için Spring in henüz bir çözümü yok bildiğim kadarıyla. Ama spring in kullandığı Quartz zaten buna çözüm getiriyor. Quartz bunun için veritabanında lock tablolar oluşturarak ayarlama yapar. Ama benim tavsiyem cluster bir ortamda çalışıyorsanız Quartz ın oluşturacağı bir sürü tablo yerine siz kendiniz db de bir tane tablo oluşturarak lock değerleri koymak ve oradan kontrol etmek. Cluster ortamlar için bildiğim en basit yöntem bu.

cron expression detayları için bakınız: http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson06.html
quartz cluster detayları için bakınız: http://java-x.blogspot.com/2006/12/using-quartz-scheduler-in-cluster.html
Spring 3 Scheduling : http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/scheduling.html

Perşembe, Ekim 07, 2010

"java.lang.OutOfMemoryError: PermGen space" Hatası

Uzun bir aradan sonra tekrar merhaba. Askerden döner dönmez eclipse'imin bana küçük bir hediyesi işte bu hata oldu. Bunu sizinle de paylaşmak istedim.

Birçoğumuz OutOfMemory hatasını çeşitli tiplerde almışızdır. Bunların en sık olanı "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space" hatasıdır ki; Xmx ile belirtilen heap boyutu aşıldığını gösteriyor. Bunun dışında daha az karşılaşılan ve yazımızın konusu olan "java.lang.OutOfMemoryError: PermGen space" hatası var ki bunu anlamak için java Garbage Collection ın nasıl çalıştığını bilmek gerekiyor.

Daha verimli çöp toplama ve optimizasyonu daha iyi yapmak için java memory alanı(Java heap) nesiller halinde yönetilir. GC algoritması her nesil için farklı farklı çalışır. Bunlardan en uzun süre yaşayan nesil yukarıdaki hatayla ilgili olan nesil "Permanent Generation" dır. Bu nesildeki classlar kullanıcı bilgilerini tutan meta-data classlarıdır. Büyük çaplı uyugulamar rahatlıkla bu segmenti doldurabiler.

Sun JVM her neslin tutulduğu segmentin boyutunu ayarlama imkanı verir. Permanent generation ın başlangıç ve maks boyutunu aşağıdaki gibi ayarlayabiliriz.

-XX:PermSize=64m
-XX:MaxPermSize=128m



Kendi sorunumu bu şekilde çözdüm. Eclipse için bunları eclipse.ini dosyasına eklemek yeterli olur.

Ayrıca normal "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space" için aşağıdaki satırları eclipse.ini ye yerleştirmek gerekiyor;

-vmargs
-Xms128m
-Xmx512m


Tip:
Eclipse'in kullandığı argümanları görmek için Eclipse açıkken "Help>>About Eclipse>>Installation details" i takip ederek "Configuration" tabini açıp bakabilirsiniz.

Cuma, Kasım 20, 2009

JSF'te PDF Dosya Görüntüleme

Bir önceki kayıtta dosyaları servlet ile nasıl gösterebileceğimizi gösterdik. şimdi de aynı işi standart jsf yapısı içinde nasıl yapacağımıza bakalım. JSF ile pdf dosyası görüntlemek için button veya commandlink kullanabiliriz. ayrı bir sayfada açmak için target="_blank" yapılır.

public void showFile(){
try{
HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
File file = new File(filePath+fileName);
BufferedInputStream input =new BufferedInputStream(new FileInputStream(file), 1024);

response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "inline; filename=\"" + fileName + "\"");

BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream(), 1024);
byte[] buffer = new byte[1024] //1KB buffer size
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try{
output.close();
input.close();
}catch(Exception e){e.printStackTrace();}
}
facesContext.responseComplete();
}


JSP sayfasında yapılması gereken de şöyle bir kod ile çağırmaktır;

<h:commandLink value="Download PDF" action="#{testBean.showFile}" target="_blank" />

java servlet ile dosya görüntüleme

Jsf veya java nın başka bir teknolojisini kullandığımızda servlete ihtiyaç duyduğumuz zamanlar çok olur. Bu durumlardan bir tanesi de veritabanından veya herhangi bir path'ten aldığımız dosyaları uygulama içinde göstermektir. pdf, doc, excel, jpeg gif veya başka herhangi bir dosya türünü bu şekilde servlet içine okuyarak gösterebiliriz. aşağıda jsf de kullanılan buna ilişkin bir örnek var. bu örnekte pdf dosya türü okunmuştur.
public class MyStoredFiles extends HttpServlet implements Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
InputStream is = null;
String fileName="",mimeType="";

String fileid=request.getParameter("fileid");
String tmpPath = System.getProperty("tmpfilepath");
try {
String sql = "select * from storedfiles where fileid=?";
conn = OraManager.getConnection(this);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, fileid);
rs = pstmt.executeQuery();
if (rs.next()) {
fileName=rs.getString("filename");
mimeType=rs.getString("content_type");
//write it to the temp area
java.io.File file = new java.io.File(tmpPath+fileName);
FileOutputStream fos = new FileOutputStream(file);
is = rs.getBinaryStream("data");
byte[] buffer = new byte[1000];
while (is.read(buffer) > 0) {
fos.write(buffer);
}
fos.close();

BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
// Get image contents.
byte[] bytes = new byte[in.available()];
in.read(bytes);
in.close();

response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "inline;filename=\""+fileName+"\"");

// Write image contents to response.
response.getOutputStream().write(bytes);

}
} catch (Exception e) {
e.printStackTrace();
}

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

Bu örnekte link ile gelen paramterelere göre veritabanından dosya çekiyoruz.
Bu servletimzi web.xml de tanımlamamız gerekiyor;
<servlet>
<description></description>
<display-name>MyStoredFiles</display-name>
<servlet-name>MyStoredFiles</servlet-name>
<servlet-class>org.test.servlet.MyStoredFiles</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyStoredFiles</servlet-name>
<url-pattern>/showstoredfile</url-pattern>
</servlet-mapping>


jsp sayfasında görüntüleme is şöyle olabilir;
<h:commandLink value="#{file.name}" 
onclick="javascript:window.open(root_folder+'/showpffile?fileid=#{file.fileId}','popupWindow', 'dependent=yes,menubar=no,toolbar=no,location=no,resizable=1,scrollbars=yes');">
</h:commandLink>

Cuma, Ekim 09, 2009

Java'da ResultSet size(row count) almak

Java'da resultset size ını veren direk bir method yok. Bunun için ResultSeti scrollable yapmamız gerekiyor. Eğer preparedstatement kullanıyorsak aşağıdaki gibi bir şey yapabiliriz.
pstmt = conn.prepareStatement(sqlstr,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
pstmt.setString(1,param)

Eğer statement kullanılıyorsa;
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR _READ_ONLY);

Bundan sonra Resultset table içinde son sona giderek row number alacağız. En sonda da ResultSetteki kayıtlara sırasıyla ulaşmak için cursoru en başa tekrar getiriyoruz.
int countOfRecords = 0;
if (rs != null) {
rs.last();//move cursor to the last record
countOfRecords = rs.getRow();
rs.beforeFirst();//move cursor to the first record
}

Cuma, Temmuz 31, 2009

HttpSessionListener ve ServletContextListener

ServletContextListener ve HttpSessionListener bir web projesinde sıkça kullanılması gerekenlerdendir. bir web projesinde session create edilirken ve destroy olurken yapılması gereken işler mutlaka olur. Bunun için HttpSessionListener nesnesini kullanırız.

Aynı şekilde projeyi ilk olarak servera deploy edip başlatırken uygulamanın çalışması boyunca kullanılacak parametreleri yüklemek isteyebiliriz. veya uygulamayı kapatırken yapmamız gereken işler olabilir. Bu durumda contextlistenera ihtiyacımı olacaktır. Bunun için de ServletContextListener ı kullanabiliriz.

Aşağıda ikisini bir arada kullanan bir örnek bulunmaktadır.
public class MySessionListener implements HttpSessionListener, ServletContextListener {
public MySessionListener() {
}

public void sessionCreated(HttpSessionEvent event) {
/*session ilk oluşturulduğunda yapacağınız işleri burada yapabilirsiniz
örneğin aşağıda kullanıcı session objemizi oluşturup sessiona atıyoruz
*/
SessionUserBean sub =new SessionUserBean();
event.getSession().setAttribute("sessionUserBean", sub);
}

public void sessionDestroyed(HttpSessionEvent event) {
// session destroy olurken yapılmak istenen işler...
}

public void contextInitialized(ServletContextEvent event) {
//uygulama deploy edilirken yapılamsı gereken işler...
ApplicationBean appbean = new ApplicationBean();
event.getServletContext().setAttribute("applicationBean",appbean);

}


public void contextDestroyed(ServletContextEvent event) {
//uygulama kapatılırken yapılması gereken işler...
}
}


web.xml deki tanımı ise şöyle yapılabilir.
<!-- Session listeners -->
<listener>
<listener-class>org.yourapp.listener.MySessionListener</listener-class>
</listener>

Pazartesi, Aralık 22, 2008

XML Processing in kolay yolu -- JAXB Tutorial

Xml dosyaları ile uğraşıyorsanız, web servislerlerle işiniz çoksa bilmeniz gereken en önemli java paketi jwsdp dir. jwsdp (java web service developer pack) j2ee mimarisinde çok önemli bir yere sahiptir. bu yazımızda JWSDP nin içinde bulunan JAXB üzerinde duralım. Kısaca JAXB java developerlara xml ve xml processing işlerini detaylı olarak bilmeden xml ile kolayca çalışmasını sağlar. XML-Databinding ile xml e karşılık gelen java objeleri oluşturularak onlar üzerinde çalışılır. Böylelikle SAX, JDOM, ve DOM bilmenize gerek kalmadan xml ile işlerinizi yaparsınız. Bu sizinle xml dosyası arasına bir katman koyar. Bu katmanın xml üzerinde detaylı çalışmak isteyenler için tabiiki kısıtlayıcı özelliği var ama xml yapıları pek değişmeyen durumlar için JAXB kullanmak çok avantajlı. çünkü sizi hamallıktan kurtarır.

Bu tutorial içinde JAXB kurulumu, marshalling ve unmarshalling konuları yer alır.

JAXB SETUP
Öncelikle Java Web Services Developer Pack 2.0 ı indirmeniz gerekir. setupını çalıştırıp bitirdikten sonra C:\Sun\jwsdp*** gibi bir dizin oluşacaktır.(Tabi JDK5.0 ve üstünü kurmuş olduğunuzu varsayıyorum). Bundan sonra sistem PATH ine C:\Sun\jwsdp-2.0\jaxb\bin eklemeniz gerekir. yani JAXB nin bin klasörünü. Ayrıca JAXB_HOME değişkenini de sisteme eklemeniz gerekir. Bundan sonra komut satırına girip xjc yazdığınızda eğer tanınıyorsa kurulumunuz bitmiş demektir.


UNMARSHALLING (XML to Java Object)
şöyle bir xml dosyamız olsun;

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</shipTo>
<billTo country="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</billTo>
<items>
<item partNum="242-NO">
<productName>Nosferatu - Special Edition (1929)</productName>
<quantity>5</quantity>
<USPrice>19.99</USPrice>
</item>
<item partNum="242-MU">
<productName>The Mummy (1959)</productName>
<quantity>3</quantity>
<USPrice>19.98</USPrice>
</item>
<item partNum="242-GZ">
<productName>Godzilla and Mothra: Battle for Earth/Godzilla
vs. King Ghidora</productName>
<quantity>3</quantity>
<USPrice>27.95</USPrice>
</item>
</items>
</purchaseOrder>




bu xml dosyamızı xsd ye çevirmemiz gerekiyor. xsd detayları ile uğraşmak istemiyorsanız herhangi bir xml xsd convertor ile bu işi halledebilirsiniz. bu tutorial da XMLFox kullandım.

command promptan xsd dosyanızın olduğu dizine gelin;

xjc -p org.karatas.test.po po.xsd

komutunu yazdıktan sonra size verdiğiniz path te classlarınızı oluşturur. üretilen klassları projenizde src klasörüne kopyalayın.

jaxb-api.jar, jaxb-impl.jar, jaxb-xjc.jar, activation.jar ve jsr173_api.jar liblerini de jaxb kurulum klasöründe alıp projeye lib olarak ekleyin veya projede external olarak onları referans gösterin.


şimdi asıl işimize geldik. unmarshall yapan kod bloğumuz şöyle olabilir;

JAXBContext jc = JAXBContext.newInstance("org.karatas.test.po");
Unmarshaller u = jc.createUnmarshaller();
PurchaseOrder po=(PurchaseOrder)u.unmarshal(new File("D:\\workarea\\po.xml"));

System.out.println("============shipto==========");
List stlist = po.getShipTo();
for (Iterator iterator = stlist.iterator(); iterator
.hasNext();) {
ShipTo shipTo = (ShipTo) iterator.next();
System.out.println("Name=" + shipTo.getName());
System.out.println("street=" + shipTo.getStreet());
System.out.println("city=" + shipTo.getCity());
System.out.println("state=" + shipTo.getState());
System.out.println("zip=" + shipTo.getZip());
System.out.println("country=" + shipTo.getCountry());
}


gördüğünüz gibi xml dosyasını çok kolay bir şekilde java objelerinden okuduk. unmarshal paketinin classları ve detaylı kullanımı için adresine bakabilirsiniz.


MARSHALLING (Java Object to XML)
şimdi marshalling işini yapan kodumuzu aşağıya alalım.


JAXBContext jc = JAXBContext.newInstance("org.karatas.test.po");
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

ObjectFactory of = new ObjectFactory();
PurchaseOrder po = of.createPurchaseOrder();

po.setOrderDate(new Date().toString());

ShipTo shipto = of.createPurchaseOrderShipTo();
shipto.setCity("NewYork");
shipto.setCountry("US");
shipto.setName("Muhammet Simsek");
shipto.setState("NY");
shipto.setStreet("265 Garden Street");
shipto.setZip("12530");
po.getShipTo().add(shipto);

Items items=of.createPurchaseOrderItems();

Item item = of.createPurchaseOrderItemsItem();
item.setPartNum("NY-567");
item.setProductName("The GodFather");
item.setQuantity("5");
item.setUSPrice("35.25");
items.getItem().add(item);

po.getItems().add(items);
m.marshal(po, new FileWriter(new File("D:\\workarea\\po22.xml")))


marshal olayı için gene yukarıdaki projemiz üzerinde çalışalım.
Dikkat edecek olursanız hep JAXBContext objesini kullanıyoruz. Bununla çalışacağımız contexi veriyoruz. Ondan sonra ya Unmarshaller ya da Marshaller objelerini kullanıyoruz. Dolayısıyla xml ile çalışmak için çok fazla şey öğrenmeye gerek yok.

Gördüğnüz üzre xsd de verdiğimiz yapının istediğimiz tarafını doldurup istediğimiz tarafını boş bırakabiliriz.

bu tutorial ın dosyaları için lütfen tıklayınız.
Projeyi çalıştırma konusunda sıkıntı yaşarsanız bana yazabilirsiniz.


Konu ile ilgili detaylı bilgi için http://java.sun.com/webservices/docs/1.6/tutorial/doc

Herkese iyi çalışmalar...

Pazartesi, Aralık 15, 2008

Log4j tutorial

Log4j javada loglama için kullanılan önemli ve güzel özellikleri olan bir Java API sidir. Log4j yi herhangi java projenizde kullanabilirsiniz. log4j kurulumu için;

1. http://logging.apache.org/log4j/1.2/download.html adresinden apache-log4j-1.2.?.jar ı indirin.

2. log4j-1.2.*.jar lib dosyasını projenize ekleyin. bu jar WEB-INF/lib in altında olması gerekiyor.

3. log4j.properties dosyasını oluşturun. bu dosyanız src klasörünüzün hemen altında olsun. isterseniz log4j.xml dosyasını da oluşturabilirsiniz. çünkü java önce log4j.xml dosyasının var olup olmadığına bakar sonra log4j.properties dosyasına bakar. ama xml yazmak daha karışk gelecektir. buna karşın config dosyası oluşturmak daha kolay olduğu için genelde .properties dosyası oluşturulur.

log4j.rootLogger=debug,sysout,fileout

# sysout log configuration
log4j.appender.sysout=org.apache.log4j.ConsoleAppender
log4j.appender.sysout.Target=System.out
log4j.appender.sysout.Threshold=info
log4j.appender.sysout.layout=org.apache.log4j.PatternLayout
log4j.appender.sysout.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %5p (%F:%L) - %m%n

#fileout log configuration
log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileout.ImmediateFlush=true
log4j.appender.fileout.Threshold=INFO
log4j.appender.fileout.File=applog.log
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.DatePattern='.'yyMMdd'.txt'
log4j.appender.fileout.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %5p (%F:%L) - %m%n

gördüğünüz gibi bu konfigürasyon dosyasında hem dosyaya hemde system out a yazıyoruz.

4.Javada loglama için ise şöyle basitçe kullanımı var.

.
.
private static org.apache.log4j.Logger log = Logger.getLogger(MyLogger.class);
log.info("info message");
log.error("error message");
log.warn("warn message");
.
.


isterseniz loglarınızı mail olarak da gönderebilirsiniz. bu durumda log4j.rootLogger=debug,sysout,fileout,mail şeklinde rootlogger ı değiştirmeniz gerekir.


#email appender
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
#defines how othen emails are send
log4j.appender.mail.BufferSize=1
log4j.appender.mail.SMTPHost="smtp.myservername.xx"
log4j.appender.mail.From=fromemail@myservername.xx
log4j.appender.mail.To=toemail@myservername.xx
log4j.appender.mail.Subject=Log ...
log4j.appender.mail.threshold=error
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n


Eğer projenizi weblogic server a deploy ediyorsanız loglama sorunu yaşayabilirsiniz. çünkü weblogic server önce kendi loglama mekanizmasına bakıyor ve onu kullanıyor. kendi projenizdeki loglama mekanizmasını öncelemek için aşağıdaki parametreleri weblogic.xml dosyasına ekleyerek deploy yaparsanız sorun çözülür.
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>


log4j dosyasının detaylı kurulumu için
http://www.vipan.com/htdocs/log4jhelp.html adresine gözatmanızda yarar var.

Cuma, Kasım 14, 2008

Blogger da html kod yayınlama problemi

Bloggerda blog oluşturmaya başladıktan sonra bloggerın yazdığım kodları yayınlayamadığımı gördüm. bu bloggerda blog yayınlayan bütün programcılar için bir sorun maalesef. bunun için küçük bir script ile işi çözebiliriz.

aşağıya aldığım java kodunu kullanarak burada yayınlayacağınız kodu önce dönüştürüp sonra da yayınlarsınız. sorun çözülmüş olur.

package org.karatas.test.misc;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class BloggerCodeGenerator {
public static void main(String[] args) {
BloggerCodeGenerator gen=new BloggerCodeGenerator();
gen.generateCode();
}

public void generateCode(){
String newCode="";
try {
File file=new File("D:\\workarea\\text.txt"); //yayınlayacağımız kodu önce bir dosyaya yazabiliriz mesela.

BufferedReader br=new BufferedReader(new FileReader(file));
String str="";
while((str=br.readLine())!=null){
newCode+=str.replaceAll("<", "< işaretinin karakter karşılığı").replaceAll(">", "> işaretiin karakter karşılığı");
}
} catch (Exception e) {
e.printStackTrace();

}
System.out.println(newCode);
}
}

Pazartesi, Kasım 03, 2008

xmlbeans ile xml parse etme

bugünkü yazımızda xmlbeans ile daha kolay xml parsetme yöntemine bakalım.

xmlbeans sizin için sizin xml yapınıza uygun java objeleri oluşturur. bunu yaptıktan sonra sizin yapmanız gereken o objelerin değerlerini almanız veya onlara değer atmanız.

öncelikle xmlbeans i indirmeniz gerekecek. indirdikten sonra dosyayı extract etmeniz gerekiyor. extract edilen klasörün içindeki bin klasörünü sistem pathinize ekleyin. bunu yaptıktan sonra command prompptan scomp yazdığınızda komut tanınmış olacak. böyleylikle xmlbeans imiz kuruldu.

bundan sonra artık işe başlıycaz. birinci işimiz parse edeceğimiz xml file ı xml schema(xsd) ya çevirmek. bunun için bir dizi uygulama ve online tool var. her zaman elinizin altında olması açısından online bir toolu tercih edebilirsiniz. xmlinizi şu adreste xsd ye çevirdikten sonra çok işimiz kalmıyor.

command prompta girelim. scomp yazıp entera bastıktan sonra seçenekleri göreceksiniz . Aşağıdaki şekli ile basitçe işimizi görebiliriz;

scomp -out note.jar note.xsd

config.xsdconfig adında bir dosya oluşturarak package yapınızı verebilirsiniz.

Bu dosyayı da tanıdıktan sonra komut yapımızı şu şekilde düzenleyebiliriz;

scomp -out note.jar note.xsd config.xsdconfig

buarada xsd dosyanız ve config dosyanız bulunduğunuz dizinde olmalı bunu unutmayalım.

şimdi de xmlimizi okuyalım;

File file=new File("D:\\workarea\\note.xml");
NoteDocument notedoc=NoteDocument.Factory.parse(file);
NoteDocument.Note note=notedoc.getNote();
System.out.println("note from:"+note.getFrom());


Önemli Not: xmlinizi xsdye çevirirken veya çevirdikten sonra okurken zorlukla karşılaşırsanız. xsd schemanızı kontrol edin. zira xsd oluşturduğunuz xml yapınız farklı olabilir. o yüzden gerekirse manuel olarak xsd de değişklik yapabilirsiniz. birde xbean.jar ve jsr***.jar liblerini proje pathine eklemeyi unutmayalım.

görüşmek üzere...

Cuma, Eylül 19, 2008

java.lang.NoSuchMethodError: javax.servlet.jsp.tagext.TagAttributeInfo.(Ljava/lang/String;ZLjava/lang/String;ZZ)

Uzun aradan sonra tekrar merhabalar diyerek, bir ara karşılaştığım bir hatayı sizinle paylaşayım istedim.

efendim yukarıda adı geçen hata şundan kaynaklanıyordu;
projede jsp 2.0 altyapısı ve tagları kullanıldığı halde jsp1.1 veya 1.2 classları jsp2.0 classlarından önce load oluyordu classloader tarafından. bu classlar da weblogic80.jar ındaydı. weblogic80 jarını çıkartıp bir üst versiyon olan weblogic811.jar ı jre/lib/ext ye atınca hata giderildi.

Anlıycağınız sizin proje altyapınız ve kullandığınız libler uyumlu olmalı...