21 Eylül 2014 Pazar

javax ile smtp mail gönderme

Merhabalar herkese,
bu yazımda sizlere javax ile smtp doğrulama yaparak mail gönderme işlemi yapacağız. Java da Mail gönderme işlemi yapan birkaç yöntem var ben sadece bir tanesini anlatacağım. Bu size şimdilik  yol göstermiş olsun ilerleyen zamanlarda ihtiyaç duyulursa diğer metodları da yazarım.


Öncelikle yine intelliJ ile bir web(Spring MVC) projesi oluşturarak işe başlıyoruz.
projenin bitmiş hali aşağıdaki yapıda olacaktır:


projeyi oluşturduktan sonra maven dosyasını(pom.xml) aşağıdaki tanımlamaları ekleyelim.
pom.xml 
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.1</version>
        </dependency>

burada gördüğünüz üzere iki farklı tanımlama var. Birincisi mail göndermemize yarayan jar diğeri ise json değerleri okumamıza yarar.


index html sayfasında basit bir form oluşturalım ve bu form sayesinden son kullanıcıdan mail bilgilerini alalım.

index.html 
<div class="mailDiv">
    <form role="form" id="mailForm" method="POST" onsubmit="return false;">
        <div class="form-group">
            <input type="text" class="form-control" name="firstname" id="firstname" placeholder="Ad">
        </div>

        <div class="form-group">
            <input type="text" class="form-control" name="lastname" id="lastname" placeholder="Soyad">
        </div>
        <div class="form-group">
            <input type="email" class="form-control" id="email" name="email" placeholder="E-Posta">
        </div>

        <div class="form-group">
            <input type="password" class="form-control" id="password" name="password" placeholder="Sifre">
        </div>

        <div class="form-group">
            <input type="text" class="form-control" id="subject" name="subject" placeholder="Konu">
        </div>

        <div class="form-group">
            <textarea class="form-control" rows="3" name="message"></textarea>
        </div>
        <button type="submit" id="btnFormPost" class="btn btn-primary">Gonder</button>
    </form>
</div>

özetle bu formdan bilgileri post edip java ile karşılayacağız. Daha sonra  gelen değerli alarak Javax ile mail gönderme yapacağız.

 MailController.java
        final Mail mail = new Mail();
        mail.setFirstname(request.getParameter("firstname")); // Adı
        mail.setLastname(request.getParameter("lastname")); // Soyadı
        mail.setFromMail(request.getParameter("email")); //Gönderen Mail
        mail.setToMail(request.getParameter("email")); // Alan Mail
        mail.setPassword(request.getParameter("password")); // Gönderen Mail Şifresi
        mail.setMessage(request.getParameter("message")); // Mail mesajı
        mail.setSubject(request.getParameter("subject")); //mail konusu


        mail.setHost("smtp.gmail.com"); //sender smtp host
        mail.setPort(587);//smtp port

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", mail.getHost());
        props.put("mail.smtp.port", "587");//gönderen mail port

üstteki kodlar ile formdan gelen bilgilerle Mail nesnesini dolduracağız. Ayrıca Properties sınıfını da gmail in mail sunucu bilgilerine göre dolduruyoruz. Diğer mail sunucular için ayarları(port,auth,host,..vs) güncellemeyi unutmayın.

projenin çıktısı aşağıdaki gibidir:


formdan girilen değerlerle mail gönderme işlemi yaptıktan sonra Adı,Soyadı,Email ve Email gönderme durumunu ekrana yazacaktır.

kaynak dosyalar(github) : indirmek için tıklayın

20 Eylül 2014 Cumartesi

Jsp ile Basit Dört işlem

Merhaba, hatırlarsanız  Neden yazıyorum? Neler yazacağım ? başlıklı yazımda sizlere(yeni başlayanlara) dört işlem ve form işlemlerinden başlayarak belirli bir java seviyesi kazandırmayı amaçladığımı belirtmiştim.
Bu yazımda  jsp sayfası üzerinden form işlemleri çerçevesinde basit aritmetik işlemler(Toplama,Çıkarma,Çarpma,Bölme) yapacağız.

Hemen intelliJ ile bir web(Spring MVC) projesi oluşturarak işe başlıyoruz.
Projenin bitmiş hali aşağıdaki yapıda olacaktır:


Oluşturduğumuz projenin görsel tarafıyla zaman kaybetmemek adına projeyi  bootstrap üzerine inşa edeceğim.
Öncelikle bootstrap  kaynak(source) linklerini jsp sayfamıza ekleyelim.

index.html 
<!-- minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">

<!-- minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>

Projede jquery ve ajax post işlemleri yaptıracağımız için Jquery  kodlarını da   sayfaya ekleyelim.
 index.html
<!-- minified jQuery -->
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>


sonuçları json formatında alacağım için pom xml'e jackson-mapper-asl' yi ekliyorum.
pom.xml 
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.1</version>
        </dependency>

OpController.java dosyasında tüm işlemler(toplama,çıkarma,çarpa,bölme) için birer method ekleyelim.

OpController.java 
    @RequestMapping(value = "/topla.html", method = RequestMethod.POST)
    public
    @ResponseBody
    Numbers topla(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        Numbers numbers = new Numbers();
        numbers.setFirstNum(Integer.parseInt(request.getParameter("firstNum")));
        numbers.setSecNum(Integer.parseInt(request.getParameter("secNum")));
        numbers.setResult((double) (numbers.getFirstNum() + numbers.getSecNum()));
        return numbers;
    }


Yazıda bilgi tekrarı yaparak sizleri sıkmamak adına yazımı burada sonlandırıyorum.Kolay anlaşılabilmesi için  projenin kaynak kodlarını yazarken gerekli yerlerde  yorum satırları ekledim. Bu size yol gösterecektir.

Projenin çıktısı aşağıdaki gibi olacaktır:




kaynak dosyalar(github) : indirmek için tıklayın

19 Eylül 2014 Cuma

Maven Profil Oluşturma (Dev + Preprod + Prod) - 2

Herkese merhaba,
bir önceki yazımda sizlere maven profilinin nasıl oluşturulacağını ve intelliJ ile nasıl profil bazlı compile edileceğini  anlatmıştım. Geçen süre zarfında düşündüm ki ,  sizleri biraz ezberciliğe yönlendirmiş olabilirim. Dolayısıyla konuyla ilgili bir yazı daha yazarak arka planda bu işlerin nasıl ilerlediğini anlatayım istedim. Bu yazım da da komut satırı üzerinden maven profiline göre compile etmeyi anlatacağım.

Kısacası bir önceki  yazıda olan işlemlerin aynısını yapacağız ancak compile ederken maven install butonlarına basmadan bu işlemlerin komutunu yazarak yapacağız.

Öncelikle bir önceki yazımı yazarken oluşturduğum projemi tekrar intelliJ  ile açıyorum. Pom.xml dosyasındaki  profiles tagları arasındaki tüm profiller için  activation tanımlaması yapacağım. Bunun için activation tagları arasında property ve property içinde de name/value tag lerini kullanacağım. Bu sayede profillere birer isim ve bu isimlere birer değer set etmiş olacağız.

  • profiles
    • profile
      • activation
        • property
          • name = env
          • value = Test, Prod yada Dev 
şeklinde bir hiyerarşide olacak.
pom.xml 
<activation>
     <property>
          <name>env</name>
          <value>Test</value>
     </property>
</activation>

Basitçe şöyle düşünebilirsiniz : env diye bir değişken tanımlayıp ve değerini Test olarak set ediyoruz.

şimdi komut satırı üzerinden cd komutuyla projenin kodlarının olduğu dizine gidelim


başlangıçta   
mvn help:active-profiles
 komutunu çalıştırarak varsayılan da hangi profil ile compile edildiğine bakıyoruz(sonuç aşağıdadır).



hemen ardından  
mvn -Denv=Test help:active-profiles
 komutuyla aktif profili önce Test olarak set ettim. Daha sonrada aktif profili tekrar ekrana yazdırdım.


Son olarak ta alttaki komutla profili test olarak set edip projemizi compile edelim.
mvn -Denv=Test install

Bu işlemlerden sonra projenin  target dizini altında oluşan war dosyası artık test profiline göre hazırlanmıştır. Test sunucusuna deploy edebilirsiniz.. :)


kaynak dosyalar(github) : indirmek için tıklayın

15 Eylül 2014 Pazartesi

Maven Profil Oluşturma (Dev + Preprod + Prod)

Herkese merhaba bu yazımda maven ile profil oluşturma dan bahsedeceğim. Biraz uzun fakat ehemmiyeti büyük olan bir yazı olacak. Bir senaryo üzerinden örnekleme yaparak anlatacağım maven profile kullanmayı. Bu arada bir parantezle  belirtmek istiyorum ki Java ile geliştirme yaparken maven kullanan yada kullanacak olan herkese  maven profile kullanmalarını kesinlikle ve şiddetle tavsiye ediyorum.

Maven profile ne amaçla kullanıldığıyla ilgili internetten çeşitli araştırmalar yapabilirsiniz. Ben çok detaya inmeden kendi kullanımımı anlatacağım size.

Java ile geliştirme yaptığım her projede 3 farklı profilim olur benim.  dev , prep ve prod diye..

  • dev  : Development(geliştirme yaptığım) ortamını ifade eder
  • prep : preProduction dan gelir. Test ortamını ifade eder.
  • prod : production ortamını ifade eder.
Peki neden 3 farklı profil size kısaca anlatayım. Öncelikle genel olarak şirketlerde kodları geliştirdiğiniz bir makine oluyor(Bu size verilen laptop). Geliştirme işlemleri bitince sizden geliştirme isteyenlerin kodlarınızı görebilmesi ve test uzmanlarının sizin geliştirdiğiniz kodu test edebilmesi için bu projeye ait bir test sunucusu oluyor. Birde testlerden onay alındıktan sonra amacına hizmet etmek üzere kodları attığınız gerçek(Erişime açılan) sunucular...

Bir projenin geliştirilip yayına çıkması bu 3 aşamadan geçerek gerçekleşir. Dolayısıyla siz geliştirme yaparken localde kullandığınız veri tabanı bilgileri ayrı, testte kullandıklarınız ayrı ve prodda kullandıklarınız ayrı olacaktır. Bu farklılıklara istinaden projenizi deploy ederken ya her sunucunun bilgilerini elle güncelleyip, compile edip, deploy edeceksiniz, yada birazdan göstereceğim şekilde  maven ile profil oluşturarak bu üç farklı sunucu için üç farklı ayar dosyası oluşturacaksınız. Ve compile ederken profil seçeceksiniz.
Kısacası ; localde çalışırken maven'a kodlarımı dev profiline göre compile et, teste giderken prep'e göre ve son olarak production a çıkarken prod'a göre compile et diyeceksiniz..

NOT : Bu yazıyı sadece  4 satırlık veri tabanı ayar dosyaları üzerinden örneklendiriyorum ancak gerçek ortamlarda kod yazarken bu ayar dosyalarının farklılıkları onlarca satırı bulur ve eğer profil kullanmazsanız her deploy etmede(dev+test+prod) bu onlarca satır kodu ilgili sunucuya göre değiştirmek durumunda kalırsınız. 

şimdi örneklendirmeye geçiyorum.Geliştirme yaptığımız ortamda(development) bir  MySQL veri tabanımız   olsun erişim bilgileri aşağıdaki gibi olsun 
url   : localhost
user : root 
pass : 12345 

Birde bu geliştirmeleri yaptıktan sonra tester ların bu kodları test edebilmesi için bir test sunucusu olduğunu ve  tabi bu sunucu içinde bir test veri tabanımız olsun.
url   : 192.168.1.110
user : rootTest 
pass : 12345Test 

son olarak geliştirmeyi yaptık, testlerden geçti ürünün yayınlandığı gerçek ortam(production) olacak birde.
url   : 192.168.1.111
user : rootProd
pass : 12345Prod 


Hemen intelliJ ile bir web(Spring MVC) projesi oluşturup projemizi geliştirmeye başlayalım.

projenin son hali aşağıdaki yapıda olacaktır:


İlk olarak resources dizini altında üç profili ayırmak için üç dev , prod ve prep diye üç farklı dizin oluşturuyoruz. Her üç dizinin altında da config.properties dosyasını oluşturuyoruz.

Bu işlemlerden sonra xml dosyasında config dosyasını load edecek şekilde ayarlıyoruz. Bu işlemler için alttaki parametreyi mvc-dispatcher-servlet.xml dosyasına eklemek yeterlidir(classpath ten sonra gelen tüm .properties uzantılı dosyaları yükle anlamı taşır).

mvc-dispatcher-servlet.xml
    <context:property-placeholder location="classpath*:*.properties"/>

bu tanımlamayı yaptıktan sonra config.properties dosyalarını aşağıdaki şekilde düzenliyoruz.

dev/config.properties
db.url = localhost
db.user = root
db.pass = 12345

 prep/config.properties
db.url = 192.168.1.110
db.user = rootTest
db.pass = 12345Test

prod/config.properties
db.url = 192.168.1.111
db.user = rootProd
db.pass = 12345Prod



ayar dosyalarını da tanımladıktan sonra , controller'a giderek yüklenen ayar dosyasındaki değerleri okuyalım.


 HelloController.java

@Controller
@RequestMapping("/")
public class HelloController {

    @Value("${db.url}")
    public String dbUrl;


    @Value("${db.user}")
    public String dbUser;


    @Value("${db.pass}")
    public String dbPass;



                @RequestMapping(method = RequestMethod.GET)
                public String printWelcome(ModelMap model) {
                               model.addAttribute("message", "Okunan Degerler!");
        model.addAttribute("url",this.dbUrl);
        model.addAttribute("pass",this.dbPass);
        model.addAttribute("user",this.dbUser);

                               return "index";
                }
}



son olarak okunan değerlerin view edilmesi için index.jsp sayfasına aşağıdaki kodları ekleyelim.
index.jsp
                <h3>${message}</h3>
                <p><b> user :</b>${user}</p>
                <p><b> pass :</b>${pass}</p>
                <p><b> url: </b>${url}</p>



Kodlamamız buraya kadardı ancak bizim maven'a giderek profil tanımlamasını  henüz yapmadık. Üstte üç farklı dizine ayırdığımız ayar dosyalarını profillerle eşleştirmemiz gerekmektedir.  Bu tanımlamayı yapmak için pom.xml e aşağıdaki kodları ekleyelim.



 pom.xml
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/dev</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>prep</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/prep</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/prod</directory>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>

Buradaki komutlarla maven'a  dev,prep ve prod diye 3 profil ID si verdik. bu profillerin ayar dosyalarının nerede olduğunu belirttik. Üstteki kodları pom.xml e ekledikten sonra sağ üste köşedeki maven tabında profil bilgileri listelenecektir. Burada hangi profili seçip maven install dersek artık  maven  o profile ait ayar(config.properties) dosyasını okuyarak war dosyası oluşturacaktır.


 Her profil için maven clean deyip ardından maven install ettikten sonra projeyi çalıştırınca  oluşan  3 farklı (profile göre) çıktı aşağıdaki gibi olacaktır.




kaynak dosyalar(github) : indirmek için tıklayın


14 Eylül 2014 Pazar

Spring MVC ve JSLT ile controllerdan(java) view'a(jsp) değer göndermek-2 (Foreach + If)

Merhaba, bir önceki yazımda controllerdan aldığımız değerleri view katmanında nasıl listeleyeceğimizi görmüştük. Bu yazımda ise sizlere controllerdan set edilen değerleri listelerken If kontrolünün nasıl yapılacağını ve array lerin nasıl listeleneceğini inceleyeceğiz.

Yine intelliJ ile bir web(spring MVC) projesi oluşturarak işe başlayacağız.
projemizin bitmiş halinin görünümü(Hiyerarşik yapı) aşağıdaki gibi olacaktır.



ilk olarak controllerda bilgiler ve diller diye iki farklı arrayList tanımladım. diller ; programlama dilleri bilgisini tutacak  , bilgiler ise kişi bilgilerini(ad,soyad) tutacak.
NOT: Normal şartlarda bilgileri arrayListte tutmak size anlamsız gelebilir ancak jsp(view) sayfasında farklı iki foreach ve if kullanımına yer verdim. Kullanımlardaki farklılıkları daha kolay inceleyebilmeniz için böyle bir yöntem tercih ettim.

ListController.java 
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView index() {
        ModelAndView mv = new ModelAndView("index"); // index sayfasına gider

        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("adi", "Levent");
        hashMap.put("soyadi", "YILDIZ");

        ArrayList bilgiler = new ArrayList();
        bilgiler.add(hashMap);

        mv.addObject("bilgiler", bilgiler);

        List<String> list = new ArrayList<String>();
        list.add("C");
        list.add("Java");
        list.add("C++");
        list.add("C#");
        list.add("phyton");

        mv.addObject("diller", list);

        return mv;
    }


bu bilgileri ekrana basabilmek için yine bir önceki yazımda olduğu gibi jslt yi maven'a ekliyoruz.
pom.xml
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>



maven'a ekledikten sonra yine jsp sayfasının en üstünde jslt core'u çağırıyoruz.

index.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


bu işlemlerden sonra arraylist'i foreach ile ekrana basabiliriz.

index.jsp
<%--kullanım 1--%>
<c:forEach var="bilgi" items="${bilgiler}">
    <c:choose>
        <c:when test="${bilgi.adi!=null && bilgi.adi!=''}">
            <p> Adi :  ${bilgi.adi} &nbsp;</p>
        </c:when>
    </c:choose>
    <c:choose>
        <c:when test="${bilgi.soyadi!=null && bilgi.soyadi!=''}">
            <p> Soyadi :  ${bilgi.soyadi} &nbsp;</p>
        </c:when>
    </c:choose>
</c:forEach>


 index.jsp
<%--kullanım2--%>
<c:if test="${not empty diller}">

    <ul>
        <c:forEach var="listLangs" items="${diller}">
            <li>${listLangs}</li>
        </c:forEach>
    </ul>

</c:if>


üstteki kodları projenize ekleyip çalıştırdığınızda controllerdan doldurulan diller(Programlama Dilleri)  ve bilgiler(Kullanıcı Bilgileri) ekrana yazdırılacaktır. Ekran çıktısı aşağıdaki gibi olacaktır.

kaynak dosyalar(github) : indirmek için tıklayın

Spring MVC ve JSLT ile controllerdan(java) view'a(jsp) değer göndermek

Merhaba,
bu yazımda size Spring ile controller dan view'a listelenecek verilerin nasıl gönderildiğini anlatacağım.

Öncelikli olarak inteliJ ile web(spring MVC ) projesi oluşturuyoruz.

projenin yapısı  aşağıdaki gibi olacaktır.


projeyi oluşturduktan sonra yapacağımız işlemleri sırasıyla ve en kısa haliyle yazıyorum;
  • pom.xml(maven) dosyasına jslt core 'u eklemek. 
  • Controller içinde listelenecek değerleri set etmek.
  • view kısmında(Jsp sayfası) bu değerleri ekrana basmak (tabi öncelikle jsp sayfasında  jslt core u çağırmak).


jslt yi maven'a eklemek için
pom.xml 
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>



controllerda değişkenleri set etmek için.
 ListController.java
    @RequestMapping(value = "/" , method = RequestMethod.GET)
    public ModelAndView index(){
        ModelAndView mv = new ModelAndView("index"); // index sayfasına gider
        mv.addObject("adi","levent");
        mv.addObject("soyadi","YILDIZ");
        return mv;
    }

index.jsp de göstermek için adı ve soyadı diye iki değer set edip addObject metoduyla bu derğerleri  springin  ModelAndView nesnesine ekliyoruz.



 index.jsp
<b>Adi :</b> ${adi}
<hr/>
<b>Soyadi : </b> ${soyadi}

controller tarafında doldurduğumuz adi ve soyadi değerlerini ekrana basmak için  ${değişken adi} şeklinde kodlama yapıyoruz. Bu sayede controller da dolan adı ve soyadı değişkenleri ekrana yazılacaktır.


Yazının başında da belirttiğim üzere sadece controllerda değer set edip view da ekrana yazdırdık. Bir sonraki yazımda  List(ArrayList)  tanımlama yapıp view katmanında göstereceğim.


kaynak dosyalar(github) : indirmek için tıklayın