18 Haziran 2016 Cumartesi

Spring MVC – Apache Tiles 3 Entegrasyonu


Bu yazımda sizlere Spring MVC uygulamalarında annotation tabanlı ayar yaparak Apache Tiles 3 entegrasyonundan bahsedeceğim.
Apache Tiles template tabanlı bir composite frameworktür. Tiles kullanarak kullanışlı templateler oluşturabiliriz.

Apache Tiles kullanmak için öncelikle pom.xml imize aşağıda ki satırları eklememiz gerekmektedir.

         <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-api</artifactId>
            <version>3.0.5</version>
         </dependency>

         <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-core</artifactId>
            <version>3.0.5</version>
         </dependency>

        <dependency>
           <groupId>org.apache.tiles</groupId>
           <artifactId>tiles-servlet</artifactId>
           <version>3.0.5</version>
        </dependency>

        <dependency>
           <groupId>org.apache.tiles</groupId>
           <artifactId>tiles-jsp</artifactId>
           <version>3.0.5</version>
        </dependency>



Artık uygulamada kullanacağımız templateleri yazmaya başlayabiliriz. Fakat öncelikle Spring MVC ' nin Apache Tiles resolver unu config classımızda tanımlamamız gerekmektedir. WebConfig classımız aşağıda ki gibidir.

WebConfig.java

package com.mesutemre.dispatcherservlet;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;

/**
* @author mesudemre
*
*/
@Configuration
@EnableWebMvc
@ComponentScan("com.mesutemre")
public class WebConfig extends WebMvcConfigurerAdapter {

@Bean
public TilesConfigurer tilesConfigurer(){
   TilesConfigurer tiles = new TilesConfigurer();
   tiles.setDefinitions(new String[] {
"tiles-definitions.xml"
});
   tiles.setCheckRefresh(true);
   return tiles;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
   TilesViewResolver viewResolver = new TilesViewResolver();
   registry.viewResolver(viewResolver);
 }

}


tiles-definition.xml dosyamız aşağıda ki gibi olur.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>

<definition name="base-definition"
template="/layout/template.jsp">
    <put-attribute name="header" value="/layout/header.jsp" />
    <put-attribute name="menu" value="/layout/menu.jsp" />
    <put-attribute name="footer" value="/layout/footer.jsp" />
    <put-attribute name="body" value="" />
</definition>

<definition name="home" extends="base-definition">
   <put-attribute name="title" value="Anasayfa" />
   <put-attribute name="body" value="/home.jsp" />
</definition>

<definition name="apacheTiles" extends="base-definition">
   <put-attribute name="title" value="Apache Tiles" />
   <put-attribute name="body" value="/apacheTiles.jsp" />
</definition>
</tiles-definitions>

Uygulamada ki bütün JSP sayfalarını burada tanımlamamız gerekmektedir. Aksi takdir de aşağıda ki gibi bir hata ile karşılaşırız.

javax.servlet.ServletException: Could not
resolve view with name 'example' in servlet with name 'dispatcher'

Bu örnekte header.jsp , footer.jsp ve menu.jsp den oluşan 3 template dosyası kullandık. Bunlar aşağıda ki gibidir.

header.jsp

<div class="header">
<h1>Merhabalar...</h1>
</div>

footer.jsp

<div class="footer">Her hakkı saklıdır</div>

menu.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<nav>
<a href="/SpringDispatcherServlet/home"><img class="logo" src="http://icons.iconarchive.com/icons/kearone/comicons/128/linux-icon.png"></a>
<ul id="menu">
<li><a href="/SpringDispatcherServlet/home">Anasayfa</a></li>
<li><a href="/SpringDispatcherServlet/liste">Liste</a></li>
<li><a href="/SpringDispatcherServlet/register">Kayıt</a></li>
<li><a href="/SpringDispatcherServlet/ajaxRegister">Ajax Kayıt</a></li>
<li><a href="/SpringDispatcherServlet/apacheTiles">Apache Tiles</a></li>
</ul>
</nav>

Bunları için de barındıran ana template sayfamız aşağıda ki gibidir.

template.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title><tiles:getAsString name="title" /></title>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<style type="text/css">
html{
background-color:#2F2F2F;
}

body{
height: 100%;
background-color:rgb(245, 245, 245);
}


#header {
margin-left:20%;
top: 0px;
width: 80%;
height: 20%;
position: fixed;
font-family: 'bgMed',arial,helvetica,sans-serif;
font-size: 0.6em;
color: #fff;
z-index: 15;
text-transform: uppercase;
background-color: #272727;
border-bottom: 2px solid hsl(180,70%,55%);
padding-top:20px;
text-align:center;
}

#footer {
margin-left:20%;
left: 0px;
bottom: 0px;
width: 80%;
height: 10%;
position: fixed;
font-family: 'bgMed',arial,helvetica,sans-serif;
font-size: 0.6em;
color: #fff;
z-index: 15;
text-transform: uppercase;
background-color: #272727;
padding-top:20px;
text-align:center;
}


#sidemenu {
width: 20%;
background-color:#2B2B2B;
height: 100%;
overflow: auto;
float: left;
z-index: 20;
position: fixed;
left: 0px;
margin-top:
}

#sidemenu #menu {
color: #fff;
text-align: right;
list-style-type: none;
margin-right: 40px;
float: right;
}

#sidemenu #menu li {
width: 150px;
height: 35px;
font-size: 1.2em;
padding-right:5px;
}

#sidemenu #menu li a {
text-decoration: none;
text-transform: uppercase;
color: #fff;
}

#sidemenu #menu li:active{
border-left: 5px solid hsl(180,70%,55%);
}

#sidemenu #menu li:hover {
background-color: #635555;
border-left: 5px solid hsl(180,70%,55%);
}

.logo{
float:left;
}

#site-content {
width: 80%;
height: 100%;
overflow: auto;
float: left;
z-index: 20;
position: fixed;
min-height: 600px;
margin-top:10%;
margin-bottom:10%;
margin-left:20%;
padding-left:10px;
}

</style>
</head>

<body>
<header id="header">
<tiles:insertAttribute name="header" />
</header>

<section id="sidemenu">
<tiles:insertAttribute name="menu" />
</section>

<section id="site-content">
<tiles:insertAttribute name="body" />
</section>

<footer id="footer">
<tiles:insertAttribute name="footer" />
</footer>
</body>
</html>


Bu templatimiz ; yukarıda bir header , solda bir menu ortada content ve aşağıda bir footer sayfamızı içeriyor. Bu uygulama boyunca görünümde değişen tek kısım content olacaktır. Örneğin anasayfamızın da kulandığı bu template aşağıda ki gibidir.

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<div class="body">
<h1>Merhabalar...</h1>
<a href="<c:url value="/home" />">Uygulama</a> <br> <a
href="<c:url value="/liste"/>">Liste</a> <br> <a
href="<c:url value="/register" />">Kayıt</a> <br> <a
href="<c:url value="/ajaxRegister" />">Ajax Register</a> <br> <a
href="<c:url value="/apacheTiles" />">Apache Tiles</a>
</div>


Bu sayfanın görünümü aşağıda ki gibi olur.






27 Eylül 2015 Pazar

Linux Terminalinden YouTube Videosu İndirme

YouTube dan video indirmek için JDownloader ve Free YouTube Downloader gibi uygulamalar kullanılabilir.Bildiğim kadarıyla Free YouTube Downloader ' ın Linux için bir sürümü mevcut değil.Fakat Jdownlaoder ubuntu markette şu an mevcut.

Bunları kullanmak yerine http://www.youtubevideoindir.org/ sitesine URL i girip de videoyu indirebiliriz.

Bu yazımda Linux terminalinden youtube-dl ile bir YouTube videosunun nasıl indirileceğinden bahsedeceğim.


Öncelikle aşağıda ki gibi youtube-dl paketini sudo apt-get install youtube-dl ile yüklüyoruz.


Bu paketi yükledikten sonra artık YouTube'dan video indirebiliriz. Bu işlemi ;

youtube-dl -o videoadi.mp4 videoUrl

Bu komutu verince aşağıda ki gibi indirme işlemi başlar ve home dizinimize video inmiş olur.


30 Haziran 2015 Salı

REST With Java (JAX-RS) -Jersey Kullanımı


Bu yazımda bir Jersey implementationu olan JAX-RS ile RESTful webservislerinin nasıl geliştirildiğinden bahsedeceğim.

Rest(Representational State Transfer) : REST , SOAP gibi bir servisdir.REST in SOAP dan en önemli farkı XML ve JSON formatı ile mesaj yollayıp geri alıyor olabilmesidir.REST , HTTP protokolü üzerinden GET,POST,PUT veya DELETE komutlarını kullanarak isteklerini bildirir.Şimdi bu komutlara bir göz atalım.

GET : Sunucuda bulunan kaynağı(resource) almak için kullanılır.Bu metod ile resource değişmez.Bir nevi select görevi görür.

POST : Yeni bir kaynak(resource) oluşturmaya yarar.Bir nevi insert görevi görür.

PUT : Mevcut bir kaynağı değiştirmek-güncellemek için kullanılır.Bir nevi update görevi görür.

DELETE : Mevcut bir kaynağı silmek için kullanılır.

Java da Jersey ileJAX-RS Kullanımı

Java'nın REST desteği JSR (Java Spesification Request) 311 aracılığıyla olur. İşte bu JSR 311 özelliği JAX-RS(Java API for RESTful Web Services) diye bilinir.

Jersey : Jersey bir JSR 311 implementationudur.Bu implementation Restful web servisleri için bir kütüphane sağlar.
Jersey hem server hem de client tarafında iletişim kurmamızı sağlar. URL aşağda ki gibidir;

      
http://your_domain:port/display-name/url-pattern/path_from_rest_class


Bu servlet gelen HTTP requestlerini analiz eder ve bunlara uygun bir response için uygun classı seçer.
JAX-RS , JAXB ' ye alternatif olarak JSON ve XML formatlarının ikisini de destekler.

@Produces(MediaType.TEXT_PLAIN[, more-types]) : Mime türünün belirlememize yarar.Gelen data GET metodu ile alınan datadır.Bu tür ayrıca “application/xml” ya da “application/json” da olabilir.Yanda ki kısımda “text/plain” örnek olarak kullanılmıştır.
@Consumes(type[, more-types]) : Alınan kaynağın mime type ını belirlemek için kullanırız.

@PATH(your_path) : URL + /your_path.Aşağıda ki örnek gibidir.

 http://your_domain:port/display-name/url-pattern/path_from_rest_class


Jersey kütüphanelerini buradan indirebilirsiniz.


Aşağıda ki örnekler Jersey kullanarak XML ve Json formatında RestFul webservis yazılışını göstermektedir.

 Java classlarımızı yazmaya başlamadan önce açtığımız Dynamic Web Projesinde ki web.xml dosyamıza aşağıda ki gibi eklemeler yapmamız lazım.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>KutuphaneOtomasyonu</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet- class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.mesutemre.kitaplarJAXRS</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


KitaplarRestModel.java

@XmlRootElement(name = "kitap")
public class KitaplarRestModel {

private Integer kitapID;
private String kitapad;
private String yazarad;
private String kitaptur;
private String kitapdurum;

public Integer getKitapID() {
   return kitapID;
}

public void setKitapID(Integer kitapID) {
   this.kitapID = kitapID;
}

public String getKitapad() {
   return kitapad;
}

public void setKitapad(String kitapad) {
   this.kitapad = kitapad;
}

public String getYazarad() {
   return yazarad;
}

public void setYazarad(String yazarad) {
   this.yazarad = yazarad;
}

public String getKitaptur() {
   return kitaptur;
}

public void setKitaptur(String kitaptur) {
   this.kitaptur = kitaptur;
}

public String getKitapdurum() {
   return kitapdurum;
}

public void setKitapdurum(String kitapdurum) {
   this.kitapdurum = kitapdurum;
}
}

Yukarıda yazdığımız POJO , XML ve JSON elde etmek için kullanacağımız POJO dur.

Artık Resource dosyalarımızı yazabiliriz.


KitaplarRestResource.java


@Path("/kitaplar")
public class KitaplarRestResource {

@GET
@Produces(MediaType.TEXT_XML)
public List<KitaplarRestModel> getKitaplarBrowser() {
   return findAllBooks();
}

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public List<KitaplarRestModel> getKitaplar() {
   return findAllBooks();
}

@GET
@Path("kitapsayisi")
@Produces(MediaType.TEXT_PLAIN)
public String getCount() {
   return String.valueOf(findAllBooks().size());
}

private List<KitaplarRestModel> findAllBooks() {
List<KitaplarRestModel> kitapRestList = new ArrayList<KitaplarRestModel>();
List<Kitaplar> kitapList = new ArrayList<Kitaplar>();
try {
    KitaplarFacade service = (KitaplarFacade) new InitialContext()
     .lookup("kitapservice");
    kitapList = service.findAllKitaplar();
    for (int i = 0; i < kitapList.size(); i++) {
        KitaplarRestModel krm = new KitaplarRestModel();
        krm.setKitapID(kitapList.get(i).getKitapID());
        krm.setKitapad(kitapList.get(i).getKitapad());
        krm.setYazarad(kitapList.get(i).getYazarad());
        krm.setKitaptur(kitapList.get(i).getKitaptur());
        krm.setKitapdurum(kitapList.get(i).getKitapdurum());

        kitapRestList.add(krm);
     }
  } catch (Exception e) {
      e.printStackTrace();
  }
   return kitapRestList;
 }
}

Burada findAllBooks() metodu ile DB deki kitap listesini çekiyoruz.Çektikten sonra kendi POJO typında bir List dolduruyoruz.


Yukarda ki URL'i tarayıcımıza yapıştırdığımız zaman bize XML formatında bir sayfa açacaktır.





<kitaplarRestModels>
   <kitap>
     <kitapID>12</kitapID>
     <kitapad>Java Server Pages</kitapad>
     <kitapdurum>Rafta</kitapdurum>
     <kitaptur>Bilgisayar</kitaptur>
     <yazarad>Mimar ASLAN</yazarad>
</kitap>

....


JSON formatında bir servis elde etmek için resource classımız aşağıda ki gibi olur.

KitaplarRestResourceJSON.java

@Path("/kitaplarjson")
public class KitaplarRestResourceJSON {

@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<KitaplarRestModel> getKitaplarJson() {
   return findAllBooks(); 
  }
}

http://localhost:9090/KutuphaneOtomasyonu/rest/kitaplarjson

Yukarıda ki URL ise bize JSON formatında kitap listemizi gösterir.