20 Haziran 2016 Pazartesi

Spring MVC ile Dosya Yükleme


Bu yazımda sizlere Spring MVC ile file upload işleminden bahsedeceğim. Bu işlem Spring MVC de multipart request lerin handle edilme işlemidir. Bu multipart request leri handle etmenin 2 yolu vardır.

1. StandartServletMultipartResolver
Servlet 3.0 ın sunduğu bir özellik olup , uygulamada ki Servlet sürümünün 3.0 veya üzeri olmasını gerektirir.

2. CommonsMultipartResolver
Jakarta commons FileUpload kullanarak multipart requestleri çözer.


Şimdilik 2.yolu kullanarak dosya yükleme işlemini gerçekleştireceğiz. Bunun için pom.xml dosyamıza aşağıda ki satırları eklememiz gerekmektedir.

<dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring</artifactId>
       <version>2.5.6</version>
   </dependency>

<!-- Spring MVC framework -->
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>2.5.6</version>
   </dependency>
<!-- Apache Commons Upload -->
   <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.2.2</version>
    </dependency>

<!-- Apache Commons Upload -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.3.2</version>
    </dependency>
<!-- JSTL -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>


Bunları ekledikten sonra DispatcherServlet classımıza temp dosyalarının tutulacağı yeri göstermek maksadı ile aşağıda ki metodu eklememiz gerekiyor.


@Override
protected void customizeRegistration(Dynamic registration) {
    registration.addMapping("/");
    registration.setMultipartConfig(new        MultipartConfigElement("/home/mesud/springtemp",2097152, 4194304, 0));
}

Artık JSP sayfamızı ve Controller classımızı yazabiliriz.


fileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="false"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

<div class="body">
   <h1>Resim Yükleme Formu</h1>
   <form method="POST" enctype="multipart/form-data">
      <label>Profil Resmi : </label> <input type="file" name="profilResim"
   accept="image/jpeg,image/png,image/gif" />
   <br/>
   <input type="submit" value="<s:message code="register.save"/>" />
   <br/>
   <strong> ${uploadFileName} </strong>
   </form>
</div>

FileUploadController.java

package com.mesutemre.controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;


@Controller
public class FileUploadController {

@RequestMapping(value = "/fileUpload", method = RequestMethod.GET)
public String getFileUploadPage() {
 return "fileUpload";
}

@RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
public String uploadImageFile(
@RequestParam("profilResim") MultipartFile file , Model model) {

if (!file.isEmpty()) {
 try {
  BufferedOutputStream stream = new BufferedOutputStream(
  new FileOutputStream(new File("/home/mesud/springupload/"+file.getName())));
  FileCopyUtils.copy(file.getInputStream(), stream);
  stream.close();
  model.addAttribute("uploadFileName", file.getName());
  System.out.println(file.getName()+" başarı ile yüklendi...");
  System.out.println("Dosya büyüklük : "+file.getSize());
 } catch (Exception e) {
   e.printStackTrace();
 }
 } else {
   System.err.println("Boş dosya...");
}

return "fileUpload";
}

}

Yükleme ekranımız aşağıda ki gibi olur.




Bir sonraki yazıda görüşmek üzere hoşçakalın. 

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.