'Java / JSP/Java'에 해당되는 글 36건

  1. 2015.01.13 자바에서 파일을 복사하는 4가지 방법
  2. 2014.08.27 랜덤 문자열 생성
  3. 2013.12.26 자바 이메일 정규식
  4. 2013.06.10 Java 파일 업로드 with Spring MVC
  5. 2013.05.23 Java 엑셀 파일 읽기
  6. 2013.02.01 Spring Framework을 이용한 HSQLDB 테스트
  7. 2012.11.01 Java Ext JS를 이용한 RESTful 구현
2015.01.13 14:14

자바에서 파일을 복사하는 4가지 방법

1. FileStream

private static void copyFileUsingFileStreams(File source, File dest)
		throws IOException {
	InputStream input = null;
	OutputStream output = null;
	try {
		input = new FileInputStream(source);
		output = new FileOutputStream(dest);
		byte[] buf = new byte[1024];
		int bytesRead;
		while ((bytesRead = input.read(buf)) > 0) {
			output.write(buf, 0, bytesRead);
		}
	} finally {
		input.close();
		output.close();
	}
}


2. java.nio.channels.FileChannel

private static void copyFileUsingFileChannels(File source, File dest)
		throws IOException {
	FileChannel inputChannel = null;
	FileChannel outputChannel = null;
	try {
		inputChannel = new FileInputStream(source).getChannel();
		outputChannel = new FileOutputStream(dest).getChannel();
		outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
	} finally {
		inputChannel.close();
		outputChannel.close();
	}
}


3. Apache Commons IO

private static void copyFileUsingApacheCommonsIO(File source, File dest)
		throws IOException {
	FileUtils.copyFile(source, dest);
}


4. Java 7 Files class

private static void copyFileUsingJava7Files(File source, File dest)
		throws IOException {
	Files.copy(source.toPath(), dest.toPath());
}



[출처] 4 Ways to Copy File in Java

Trackback 0 Comment 0
2014.08.27 16:02

랜덤 문자열 생성

아파치의 RandomStringUtils 사용

import org.apache.commons.lang.RandomStringUtils;

public class RandomStringUtilsTest {
    int length = 10;
    String randomString = RandomStringUtils.random(length, true, true);
    System.out.println(randomString);
}


Maven Repository

http://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.3.2


	org.apache.commons
	commons-lang3
	3.3.2


[출처] 자바 (Java)에서 랜덤 (Random) 문자열 (String) 생성하기

Trackback 0 Comment 0
2013.12.26 17:06

자바 이메일 정규식

import java.util.regex.Pattern;

String emailPattern = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$";
Pattern.matches(emailPattern, email);



[출처] email 체크 정규식*Java

Trackback 0 Comment 0
2013.06.10 11:37

Java 파일 업로드 with Spring MVC

※ 해당 포스트는 파일 저장이 아닌 메모리에 올려 읽어 들이는 작업을 수행


1. Dependency 추가

commons-fileupload

commons-io


2. web form 설정

<pre class="brush: xml"><form action="submit_url" method="post" enctype="multipart/form-data">
<input name="uploadFile" type="file">
<input value="upload" type="submit">
</form>


3.Dispetcher Servlet 설정

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1024000000" />
    </bean>


4. Controller 작성

RequestParam의 value는 웹 폼에서 설정한 name과 동일해야 함

@RequestMapping(value = "/fileUpload", method = "RequestMethod.POST")
public void fileUpload(@RequestParam(value = "uploadFile", required = true) MultipartFile file) {
    // 컨트롤러 바디 작성
}


[참고] [Spring] 스프링 3.0 에서 파일 업로드 처리 (File Upload)

Trackback 0 Comment 0
2013.05.23 15:37

Java 엑셀 파일 읽기

Java에세 엑셀 파일을 읽는 방법에는 2가지가 있다.

  1. JExcelApi를 이용하는 방법
  2. POI을 이용한 방법

첫번째 방법인 JExcelApi를 이용하는 경우 의존 라이브러리가 적고 사용이 간편한 반면 엑셀97~2003 사이의 xls만 지원하는 단점이 있다.

두번째 방법인 POI를 이용하는 경우 구현에 따라 xls뿐만 아니라 xlsx까지 읽어들일 수 있다.

1. POI를 이용한 xls 읽기

라이브러리 추가

poi.jar

poi-excelant.jar

poi-ooxml.jar

poi-ooxml-schemas.jar

poi-scratchpad.jar


프로그램 작성

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

// 중략...

try {
	// Workbook 지정
	HSSFWorkbook workBook = new HSSFWorkbook(inputStream);

	// 읽어들이고자 하는 시트 지정
	HSSFSheet sheet = workBook.getSheetAt(0);

	// 시트에 있는 Row의 끝가지 루프
	for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
		// 시트에서 Row 가져오기
		HSSFRow row = sheet.getRow(i);

		// Row에서 데이터 가져오기
	}
} catch (Exception ex) {
	throw new RuntimeException(ex.getMessage());
}


2. POI를 이용한 xlsx 읽기

라이브러리 추가

dom4j.jar

axis2-xmlbeans.jar

poi.jar

poi-excelant.jar

poi-ooxml.jar

poi-ooxml-schemas.jar

poi-scratchpad.jar


프로그램 작성

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

//중략...

try {
	// Workbook 지정
	XSSFWorkbook workBook = new XSSFWorkbook(inputStream);

	// 시트 지정
	XSSFSheet sheet = workBook.getSheetAt(0);

	// 시트에 포함된 Row의 끝까지 루프
	for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {

		// 시트에서 Row 읽어 들이기
		XSSFRow row = sheet.getRow(i);

		// Row에서 데이터 가져오기
	}
} catch (Exception ex) {
	throw new RuntimeException(ex.getMessage());
}



[참고] Read Excel File (.XLS) in Java

           Read Excel File (.XLSX) in Java

Trackback 0 Comment 0
2013.02.01 08:49

Spring Framework을 이용한 HSQLDB 테스트

※ 본 예제에서는 In-memory DB로 한번 실행이 되면 데이터가 삭제된다.

1. 이클립스에서 Maven Project 생성


2. pom.xml을 수정해서 필요한 Dependency 등록

unit : 4.7

mockito-all : 1.9.5

spring-context : 3.1.2.RELEASE

spring-asm : 3.1.4.RELEASE

spring-beans : 3.1.2.RELEASE

spring-core : 3.1.2.RELEASE

spring-expression : 3.1.2.RELEASE

spring -test : 3.1.2.RELEASE

spring-orm : 3.1.2.RELEASE

hibernate-core : 4.1.9.Final

hsqldb : 2.2.9

cglib : 2.2.2

commons-dbcp : 1.4


3. Entity 클래스 작성

package net.bboks.test.hibernate.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "MEMBERS")
public class Member {
	private int id;
	private String name;
	private double point;

	public Member() {
		
	}
	
	public Member(int id, String name, double point) {
		this.id = id;
		this.name = name;
		this.point = point;
	}

	@Id
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(length = 100)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Column(nullable = false)
	public double getPoint() {
		return point;
	}

	public void setPoint(double point) {
		this.point = point;
	}
}


3. Dao 클래스 작성

IMemberDao

package net.bboks.test.hibernate.dao;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import net.bboks.test.hibernate.entity.Member;

@Transactional
public interface IMemberDao {
	public List list();
	
	public Member get(int id);
	
	public void save(Object obj);
	
	public void delete(Object obj);
}


MemberDao

package net.bboks.test.hibernate.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import net.bboks.test.hibernate.entity.Member;

public class MemberDao implements IMemberDao {

	@Autowired
	private SessionFactory sessionFactory;
	
	private Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}
	
	@SuppressWarnings("unchecked")
	public List list() {
		return getCurrentSession().createCriteria(Member.class).list();
	}

	public Member get(int id) {
		return (Member)getCurrentSession().get(Member.class, id);
	}

	public void save(Object obj) {
		getCurrentSession().save(obj);
	}

	public void delete(Object obj) {
		getCurrentSession().delete(obj);
	}
}


4. HSQLDB 구동시 실행할 스크립트 작성

create table members (
    id        decimal,
    name    varchar(100),
    point    decimal
);

insert into members (id, name, point) values(1, 'a', 1.00);
insert into members (id, name, point) values(2, 'b', 2.00);
insert into members (id, name, point) values(3, 'c', 3.00);
insert into members (id, name, point) values(4, 'd', 4.00);
insert into members (id, name, point) values(5, 'e', 5.00);
insert into members (id, name, point) values(6, 'f', 6.00);
insert into members (id, name, point) values(7, 'g', 7.00);
insert into members (id, name, point) values(8, 'h', 8.00);
insert into members (id, name, point) values(9, 'i', 9.00);
insert into members (id, name, point) values(10, 'j', 10.00);
insert into members (id, name, point) values(11, 'k', 11.00);
insert into members (id, name, point) values(12, 'l', 12.00);
insert into members (id, name, point) values(13, 'm', 13.00);
insert into members (id, name, point) values(14, 'n', 14.00);
insert into members (id, name, point) values(15, 'o', 15.00);
commit;


5. 테스트 시 사용할 Context 작성

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />

    <!-- DataSource로 HSQL 사용 설정 -->
    <jdbc:embedded-database id="dataSource" type="HSQL">
        <!-- HSQLDB 구동시 실행할 스크립스 설정 -->
        <jdbc:script location="classpath:/META-INF/script-create.sql"/>
    </jdbc:embedded-database>

    <bean id="sessionFactory" scope="singleton" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="net.bboks.test.hibernate.entity" />
       
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.pool_size">1</prop>
            </props>
        </property>
    </bean>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

    <bean id="transactionManager" scope="singleton"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
   
    <bean class="net.bboks.test.hibernate.dao.MemberDao" />
   
</beans>


6. Test Case 작성

package net.bboks.test.hibernate;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import net.bboks.test.hibernate.entity.Member;
import net.bboks.test.hibernate.dao.IMemberDao;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/META-INF/member_context.xml" })
public class MemberTest {
	@Autowired
	IMemberDao memberDao;

	@Test
	@Transactional
	public void testList() {

		for (Member m : memberDao.list()) {
			System.out.println(m.getName());
		}
	}

	@Test
	@Transactional
	public void testGet() {
		Member member = memberDao.get(1);
		
		assertThat(member.getId(), is(1));
	}

	@Test
	@Transactional
	public void testSave() {
		Member member = new Member(16, "hwanbok", 100.00);
		
		memberDao.save(member);
		
		member = memberDao.get(16);
		
		assertThat(member.getId(), is(16));
		assertThat(member.getName(), is("hwanbok"));
		assertThat(member.getPoint(), is(100.00));
	}

	@Test(expected = NullPointerException.class)
	@Transactional
	public void testDelete() {
		Member member = new Member(1, "a", 1.00);
		
		memberDao.delete(member);
		
		member = memberDao.get(1);
		
		assertThat(member, null);
	}
}


7. 테스트 결과


8. 최종적으로 구성된 프로젝트 구조는 다음과 같다.

Trackback 0 Comment 0
2012.11.01 14:34

Java Ext JS를 이용한 RESTful 구현

1. STS(Spring Tool Suite)에서 Spring MVC 프로젝트를 생성한다.


2. Ext JS RESTful 예제 사이트를 참고해 필요한 시타일시트와 스크립트 파일을 준비한다.

필요한 스타일시트 파일

ext-all.css
example.css
restful.css

필요한 자바스크립트 파일

ext-all.js
examples.js
restful.js


3. 필요한 시타일시트와 스크립트 파일을 Home.jsp에 링크한다.

restful.js는 파일을 링크를 하던지 아니면 페이지내에 직접 작성한다.


4. Ext.define 메소드를 이용해 원하는 객체 이름과 컬럼을 구성한다.

Ext.define('Book', {
        extend : 'Ext.data.Model',
        fields : [ {
            name : 'id',
            type : 'int',
            useNull : true
        }, 'isbn', 'title', 'writer' ],
        validations : [ {
            type : 'length',
            field : 'isbn',
            min : 1
        }, {
            type : 'length',
            field : 'title',
            min : 1
        }, {
            type : 'length',
            field : 'writer',
            min : 1
        } ]
    });


5. Ext.onReady의 url을 컨트롤러의 url 패턴을 연결한다.

Ext.onReady(function() {
        var store = Ext.create('Ext.data.Store', {
            autoLoad : true,
            autoSync : true,
            model : 'Book',
            proxy : {
                type : 'rest',
                url : 'book',
                reader : {
                    type : 'json',
                    root : 'data' //Controller에서 반환하는 JSON의 root명
                },
                writer : {
                    type : 'json'
                }
            }
        });


6. 행을 추가하는 메소드의 파라미터를 앞서 정의한 타입으로 변경한다.

text : 'Add',
iconCls : 'icon-add',
handler : function() {
    // empty record
    store.insert(0, new Book());
    rowEditing.startEdit(0, 0);
}


7. 서버에서 상태를 저장을 위해 클래스를 추가한다.

package net.bboks.app.model;

public class Book {
    int id;
    String isbn;
    String title;
    String writer;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getWriter() {
        return writer;
    }

    public void setWriter(String writer) {
        this.writer = writer;
    }
}


8. REST 요청을 받기위한 컨트롤러를 작성한다.
Spring MVC 프로젝트 생성시 제공하는 컨트롤러에 REST를 처리하는 메소드를 추가한다.

8.1 GET

@RequestMapping(value = "/book", method = RequestMethod.GET)
public void getBooks(HttpServletResponse response) {
    //JSON 형태로 리턴하기 위해 JSONObject와 JSONArray를 사용한다
    JSONObject obj = new JSONObject();
   
    try {
        JSONArray array = new JSONArray();
       
        for(int i=0; i<books.size(); i++) {
            JSONObject obj2 = new JSONObject();
            obj2.put("id", books.get(i).getId());
            obj2.put("isbn", books.get(i).getIsbn());
            obj2.put("title", books.get(i).getTitle());
            obj2.put("writer", books.get(i).getWriter());
           
            array.put(obj2);
        }
       
        obj.put("data", array);
       
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println(obj.toString());
    }
    catch(Exception ex) {
       
    }
}


8.2 POST

//Ext Js의 POST의 경우 RequestBody에 실려 전송되기 때문에 RequestBody 전체를 받는다
@RequestMapping(value = "/book", method = RequestMethod.POST)
public void postBook(@RequestBody String body, HttpServletResponse response) {
    //전송된 JSON을 Book 객체로 바로 변환하기 위해 Jackson의 ObjectMapper를 이용한다.
    ObjectMapper mapper = new ObjectMapper();
   
    try {
        Book book = mapper.readValue(body, Book.class);
        book.setId(seq++);
       
        books.add(book);
       
        writeResponse(book, response);
    }
    catch(Exception ex) {
       
    }
}


8.3 DELETE

//DELETE의 경우 Key로 지정한 값만 전송된다.
@RequestMapping(value = "/book/{id}", method = RequestMethod.DELETE)
public void deleteBook(@PathVariable int id) {
    for(int i=0; i<books.size(); i++) {
        if(books.get(i).getId() == id) {
            books.remove(i);
            break;
        }
    }
}


8.4 PUT

//PUT의 경우 POST와 동일하게 JSON은 RequestBody에 실려 전송이 되며, 더불어 Key이 동시에 전송된다.
@RequestMapping(value = "/book/{id}", method = RequestMethod.PUT)
public void updateBook(@PathVariable int id, @RequestBody String body, HttpServletResponse response) {
    ObjectMapper mapper = new ObjectMapper();
   
    try {
        Book book = mapper.readValue(body, Book.class);
       
        Book targetBook = findBook(id);
       
        targetBook.setIsbn(book.getIsbn());
        targetBook.setTitle(book.getTitle());
        targetBook.setWriter(book.getWriter());
       
        writeResponse(targetBook, response);
    }
    catch(Exception ex) {
       
    }
}


주의할 점은 REST를 호출 후 JSON 형태의 Response를 전달해줘야 클라이언트와 sync가 되며, JSON의 구조는  Ext.create 메소드의 Root 명을 포함해야한다.

기타 유틸 메소드

//ArrayList에서 id에 해당하는 Book 객체를 찾아 반환한다.
private Book findBook(int id) {
    Book book = null;
   
    for(int i=0; i<books.size(); i++) {
        if(books.get(i).getId() == id) {
            book = books.get(i);
        }
    }
   
    return book;
}

//Book 객체를 이용해 Ext JS에 정의된 JSON 형태로 만들어 HttpServletResponse을 이용해 반환한다.
private void writeResponse(Book book, HttpServletResponse response) {
    try {
        JSONObject obj = new JSONObject();
       
        JSONArray array = new JSONArray();
        JSONObject obj2 = new JSONObject();
        obj2.put("id", book.getId());
        obj2.put("isbn", book.getIsbn());
        obj2.put("title", book.getTitle());
        obj2.put("writer", book.getWriter());
       
        array.put(obj2);
       
        obj.put("data", array);
       
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println(obj.toString());
    }
    catch(Exception ex) {
       
    }
}


[참고] Rest Proxy Example

Trackback 0 Comment 0