톰캣에서 디렉토리 내용을 보여주도록 설정하기 위해


conf/web.xml을 파일을 열어서 다음을 찾는다.


    <servlet>

        <servlet-name>default</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <init-param>

            <param-name>listings</param-name>

            <param-value>false</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>


listings 값을 true로 설정한다.


Reference:

http://stackoverflow.com/questions/7068046/how-can-i-list-all-the-files-in-folder-on-tomcat

Posted by izeye

자바 JSON 라이브러리인 Jackson으로 오브젝트를 문자열로 변환하기 위해 다음과 같이 한다.


import java.io.IOException;


import org.codehaus.jackson.JsonGenerationException;

import org.codehaus.jackson.map.JsonMappingException;

import org.codehaus.jackson.map.ObjectMapper;


public class JsonUtils {


public static String toJson(Object object) {

ObjectMapper mapper = new ObjectMapper();

try {

return mapper.writeValueAsString(object);

} catch (JsonGenerationException e) {

e.printStackTrace();

throw new RuntimeException(e);

} catch (JsonMappingException e) {

e.printStackTrace();

throw new RuntimeException(e);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}


}


다음은 테스트 코드이다.


import java.util.HashMap;

import java.util.Map;


import org.junit.Test;


public class JsonUtilsTest {


@Test

public void toJson() {

Map<String, Object> map = new HashMap<String, Object>();

map.put("name", "Johnny");

map.put("age", 20);


String json = JsonUtils.toJson(map);

System.out.println(json);

}


}


결과는 다음과 같다.


{"age":20,"name":"Johnny"}


맵 (Map)도 기대한대로 변환함을 확인할 수 있다.


Reference:

http://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/

Posted by izeye

String.intern()

자바/공부 2014.05.22 21:55

자바 (Java)에서 문자열 (String)이 반복된다면,


String.intern()을 고려할 수 있다.


사용법은 다음과 같다.


@Test

public void intern() {

String string1 = "hello";

String string2 = "hello";

assertThat(string1, is(sameInstance(string2)));


string1 = new String("hello");

string2 = new String("hello");

assertThat(string1, is(not(sameInstance(string2))));


string1 = new String("hello").intern();

string2 = new String("hello").intern();

String string3 = "hello";

assertThat(string1, is(sameInstance(string2)));

assertThat(string1, is(sameInstance(string3)));

}


String.intern()을 사용하면,


JVM 상수 풀 (Constant Pool)에 들어간다.


하지만 자바 6 이하를 사용하고 있다면,


사용하지 않는 것이 낫겠다.


자바 6 이하에서는 상수 풀의 위치가 PermGen이라 메모리 초과 오류에 직면할 수 있다.


자바 7 이후로는 힙 (Heap)으로 이동되어 이러한 부담으로부터 해방되었다.


더불어 참고한 자료에 따르면 Map을 사용하는 것보다 효율적인 것으로 보인다.


상수 풀이 해쉬 테이블 (Hash Table)을 사용하기 때문에 해쉬 테이블의 크기가 성능에 영향을 미친다.


-XX:StringTableSize 옵션으로 설정할 수 있고, 값은 소수 (Prime)로 한다.


자바 7의 경우 디폴트는 1009이고,


자바 8의 경우 디폴트는 25-50K정도 되는 모양이다.


References:

http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html

http://java-performance.info/string-intern-in-java-6-7-8/

Posted by izeye

오라클에서 MyBatis로 INSERT 시 시퀀스 값을 가져오기 위해 다음과 같이 한다.


<insert id="addCategory" parameterType="Category" useGeneratedKeys="true" keyColumn="CATEGORY_ID" keyProperty="id">

INSERT INTO CATEGORY VALUES (SEQ_CATEGORY.NEXTVAL, #{name}, #{description});

</insert>


getId()로 삽입된 시퀀스 값을 확인할 수 있다.


Reference:

http://stackoverflow.com/questions/15234718/obtain-last-insert-id-in-oracle-using-mybatis

Posted by izeye

서블릿에서 POST 파라미터를 포함한 Raw 데이터를 추출하기 위해 다음과 같이 호출하면,


httpServletRequest.getInputStream();


파라미터를 가져오지 못한다.


다음과 같이 파라미터를 가져오면, InputStream으로부터 Raw 데이터를 가져올 수가 없다.


httpServletRequest.getParameterMap();


Raw 데이터를 가져와서 직접 파라미터 처리를 하거나,


파라미터를 조합해서 Raw 데이터를 유추해야만 한다.

Posted by izeye

다음은 아파치 HttpComponents HttpClient GET/POST 예제이다.


HttpMethod.java


public enum HttpMethod {


GET, POST


}


HttpClientWrapper.java


import java.util.Map;


public interface HttpClientWrapper {


String send(HttpMethod method, Map<String, Object> headers,

Map<String, Object> parameters, String uri);


}


ApacheHttpClientWrapper.java


import java.io.IOException;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;


import org.apache.commons.io.IOUtils;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.methods.HttpUriRequest;

import org.apache.http.client.utils.URLEncodedUtils;

import org.apache.http.impl.client.HttpClientBuilder;

import org.apache.http.message.BasicNameValuePair;


public class ApacheHttpClientWrapper implements HttpClientWrapper {


private static final String DEFAULT_CHARSET = "UTF-8";


@Override

public String send(HttpMethod method, Map<String, Object> headers,

Map<String, Object> parameters, String uri) {

HttpClient httpClient = HttpClientBuilder.create().build();


List<NameValuePair> nvps = new ArrayList<NameValuePair>();

for (Map.Entry<String, Object> parameter : parameters.entrySet()) {

nvps.add(new BasicNameValuePair(parameter.getKey(), parameter

.getValue().toString()));

}


HttpUriRequest request;

switch (method) {

case GET:

if (!nvps.isEmpty()) {

uri += "?" + URLEncodedUtils.format(nvps, DEFAULT_CHARSET);

}

HttpGet httpGet = new HttpGet(uri);

request = httpGet;

break;


case POST:

HttpPost httpPost = new HttpPost(uri);

try {

httpPost.setEntity(new UrlEncodedFormEntity(nvps,

DEFAULT_CHARSET));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

request = httpPost;

break;


default:

throw new IllegalArgumentException("Unsupported HTTP method: "

+ method);

}


for (Map.Entry<String, Object> header : headers.entrySet()) {

request.setHeader(header.getKey(), header.getValue().toString());

}


try {

HttpResponse httpResponse = httpClient.execute(request);

HttpEntity httpEntity = httpResponse.getEntity();

InputStream is = httpEntity.getContent();

return IOUtils.toString(is);

} catch (ClientProtocolException e) {

e.printStackTrace();

throw new RuntimeException(e);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}


}


HttpClientWrapperTest.java


import java.util.HashMap;

import java.util.Map;


import org.junit.Before;

import org.junit.Test;


public class HttpClientWrapperTest {


HttpClientWrapper httpClient;


@Before

public void setUp() {

httpClient = new ApacheHttpClientWrapper();

}


@Test

public void sendGet() {

Map<String, Object> headers = new HashMap<String, Object>();

headers.put("Header1", "headerValue1");


Map<String, Object> parameters = new HashMap<String, Object>();

parameters.put("parameter1", "parameterValue1");


String uri = "http://localhost:8080/test";


String response = httpClient.send(HttpMethod.GET, headers, parameters,

uri);

System.out.println(response);

}


@Test

public void sendPost() {

Map<String, Object> headers = new HashMap<String, Object>();

headers.put("Header1", "headerValue1");


Map<String, Object> parameters = new HashMap<String, Object>();

parameters.put("parameter1", "parameterValue1");


String uri = "http://localhost:8080/test";


String response = httpClient.send(HttpMethod.POST, headers, parameters,

uri);

System.out.println(response);

}


}


Reference:

https://gist.github.com/rponte/1321371

Posted by izeye

메이븐 (Maven)에서 프로젝트 디렉토리 내 라이브러리를 디펜던시로 추가하기 위해 다음과 같이 한다.


<repositories>

<repository>

<id>in-project</id>

<name>In Project Repo</name>

<url>file://${project.basedir}/libs</url>

</repository>

</repositories>


<dependencies>

<dependency>

<groupId>com.oracle</groupId>

<artifactId>ojdbc14</artifactId>

<version>10.2.0.3</version>

</dependency>

</dependencies>


Gradle에서 프로젝트 디렉토리 내 라이브러리를 디펜던시로 추가하기 위해 다음과 같이 한다.


dependencies {

compile files('libs/com/oracle/ojdbc14/10.2.0.3/ojdbc14-10.2.0.3.jar')

}


Reference:

http://stackoverflow.com/questions/20700053/how-to-add-local-jar-file-dependency-to-build-gradle-file

Posted by izeye

Gradle 웹 애플리케이션으로 설정하기 위해 build.gradle에 다음을 추가한다.


apply plugin: 'war'

apply plugin: 'eclipse-wtp'

apply plugin: 'jetty'


나머지는 메이븐 (Maven)과 동일하다.


실행 시 다음과 같이 한다.


gradle jettyRun


콘솔 (Console)에서는 동작했지만,


STS에서는 동작하지 않았다.


Reference:

https://weblogs.java.net/blog/manningpubs/archive/2013/03/18/building-java-web-application-gradle

Posted by izeye

Gradle 프로젝트 (Project) 생성 시 .gitignore 파일의 내용은 다음과 같다.


/bin

/build


.gradle 디렉토리도 다음과 같이 추가해야만 한다.


/bin

/build

/.gradle


Reference:

http://stackoverflow.com/questions/16736856/what-should-be-in-my-gitignore-for-an-android-studio-project

Posted by izeye

Gradle에서 자바 버전을 설정하기 위해 build.gradle 파일에 다음과 같이 설정한다.


sourceCompatibility = 1.8

targetCompatibility = 1.8


Reference:

http://www.gradle.org/docs/current/userguide/java_plugin.html

Posted by izeye