두가지 경우 모두 maven dependency를 등록해주면 된다.
 
프로젝트 >> properties >> Deployment Assembly를 선택한 후,
"Add" >> Java Build Path Entries >> Maven Dependencies 선택한 후, "Apply"를 해준다.


그래도 에러가 사라지지 않는다면

에러코드를 마우스 오른쪽 버튼 누르고 삭제 하면 해결됨
2015/05/08 11:45 2015/05/08 11:45
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/683

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/683

tomcat out of memory exception

JSP, JAVA RSS Icon ATOM Icon 2015/04/24 15:51 visualp
create file from /usr/local/tomcat/bin/setenv.sh
chmod 707 setenv.sh

export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=512m"

java out of memeory  문제 해결 방법

2015/04/24 15:51 2015/04/24 15:51
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/677

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/677

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.3.2</version>
  </dependency>


디버깅 할 때 클래스 객체를 스트링으로 변환해서 출력 해주는 util
  vo 클레스에 추가 한다.

   @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

baseVO를 만들고 해당 vo에 추가한다.
2015/02/23 17:32 2015/02/23 17:32
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/670

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/670

//java save data as image from image url

public static void image_download(String turl, String fname) throws Exception{
   URL url = new URL(turl);
   InputStream in = new BufferedInputStream(url.openStream());
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   byte[] buf = new byte[1024];
   int n = 0;
   while (-1!=(n=in.read(buf)))
   {
      out.write(buf, 0, n);
   }
  
   out.close();
   in.close();
   byte[] response = out.toByteArray();
  
   FileOutputStream fos;
   fos = new FileOutputStream(fname);
   fos.write(response);
   fos.close();
 }
2015/02/12 16:36 2015/02/12 16:36
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/668

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/668

jstl 내림, 올림, 반올림

JSP, JAVA RSS Icon ATOM Icon 2015/01/07 19:15 visualp
c:set var="pages" value="${totalCnt/rowsPerPage}" />

 

내림 : ${pages-(pages%1)}

올림 : ${pages+(1-(pages%1))%1}

반올림 : ${pages+((pages%1>0.5)?(1-(pages%1))%1:-(pages%1))}

2015/01/07 19:15 2015/01/07 19:15
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/662

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/662

spring 3.2, mobile detect

JSP, JAVA RSS Icon ATOM Icon 2015/01/07 11:39 visualp
dev-tool  : sts
spring - version 3.2.x

when i use spring-mobile-device then  
error ocured fallowing
"Could not instantiate bean class [org.springframework.mobile.device.Device]: Specified class is an interface] with root cause"

i try to solved this problem , 
example : https://spring.io/guides/gs/device-detection/ 
 
but 

same error occoured..


 .. search and more .. google...

1.  pom.xml <-- inject to dependency

<dependency>
   <groupId>org.springframework.mobile</groupId>
   <artifactId>spring-mobile-device</artifactId>
   <version>1.1.3.RELEASE</version>
  </dependency>

2. web.xml  <--add  filter config

<!--device filter_start() -->
 <filter>
        <filter-name>deviceResolverRequestFilter</filter-name>
        <filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>deviceResolverRequestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 <!--device filter_end() -->

3. using like this ... (controller)
 
 if( DeviceUtils.getCurrentDevice(request).isMobile() ||  DeviceUtils.getCurrentDevice(request).isTablet() ){
   model.addAttribute("is_mobile", true);
  }else{
   model.addAttribute("is_mobile", false);
  }



2015/01/07 11:39 2015/01/07 11:39
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/661

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/661

spring 3.2 부터
<exclude-mapping path="/login/**/"/>추가 되었습니다.
3.1 버전은 에러 발생 ..
pom.xml에서 spring 버전을 변경 합니다.
<!--
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
-->
<org.springframework-version>3.2.2.RELEASE</org.springframework-version>

sts tool을 이용하여 작업시 위 사항들을 유의 합니다.
<mapping path="/**/"/>  로그인 인터셉터를 사용하기 위해서 모든 url을 로그인 체크를 합니다.
<exclude-mapping path="/login/**/"/>로그인 페이지는 로그인을 누구나 할 수 있도록 해야 하기 때문에 intercepter에서 체크 할 대 제외 시킵니다.

[example]
<interceptors>
  <interceptor>
   <mapping path="/**/"/>
   <exclude-mapping path="/login/**/"/>
   <exclude-mapping path="/resources/**/"/>
   <beans:ref bean="LoginInterceptor"/>
  </interceptor>
 </interceptors>
2015/01/06 10:48 2015/01/06 10:48
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/660

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/660

add follow pom.xml

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20140107</version>
</dependency>

version is 20140107 <-- jdk 6 compiled ...
and higher version is occured error

[useable]
wirte this sentense to  youer controller and define  @ResponseBody anotation 
becouse @ResponseBody =>  noting header and nothing footer  , only body

@RequestMapping(value = "/code/code_get_json", produces="text/plain;charset=UTF-8" ,  method = RequestMethod.GET)
 public @ResponseBody String code_get_json(@RequestParam("cd_pid") String cd_pid){
  ArrayList<CodeVO> codelist   = null ;
  codelist = (ArrayList<CodeVO>)codeService.code_list(cd_pid);
  JSONArray json = new JSONArray(codelist);
  return json.toString();
 }

[refference]
https://github.com/douglascrockford/JSON-java


2014/12/31 11:48 2014/12/31 11:48
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/659

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/659

tomcat session timeout 변경
 
[tomcat]이 설치된 디렉토리/conf/web.xml 에서 아래 부분을 편집
단위는 분, 기본은 30분으로 설정되어 있음


<session-config>
        <session-timeout>360</session-timeout>
< /session-config>

** 세션 타임아웃 적용 우선순위

1. 프로그램에 코딩된 session.setMaxInactiveInterval(int)
2. 각 웹 어플리케이션의 WEB-INF/web.xml
3. [tomcat설치디렉토리]/conf/web.xml
2014/12/30 10:17 2014/12/30 10:17
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/658

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/658

[원문]http://lng1982.tistory.com/143



웹 애플리케이션을 개발할 때 세션을 이용하여 사용자 로그인 정보를 저장하고, 사용자의 로그인 상태를 유지할 수 있게 개발하는 방법은 많은 개발자가 알고 있다.

하지만 로그인 상태를 유지하기 위해서 서블릿 컨테이너인 tomcat이 내부적으로 어떻게 동작하는지 모르는 분들이 계셔서 이곳에 정리를 해보려고 한다.

 

  1. 로컬에 톰켓 설치 후 구동

  2. HTTP request, response 헤더를 확인해야 하기 때문에 크롬의 개발자 도구를 이용한다.

  3. 크롬 개발자 도구의 Network 탭을 선택한 후 http://localhost:8080/login.jsp 접속

  4. HTTP 헤더 정보를 보면 Response Headers에 쿠키 정보를 client로 전달한 것을 볼 수 있다. JSESSIONID 값이 톰켓에서 발급하는 쿠키 정보이다.

  5. 이와 같이 톰켓은 사용자가 로그인을 하지 않아도 최초 접속 시 JSESSIONID 쿠키 값을 브라우저에 내려주는 것을 알 수 있다. 그럼 왜 쿠키 값을 내려주는 걸까? HTTP 프로토콜은 stateless의 특징을 가지고 있기 때문에 사용자와 서버는 단 한번의 요청과 응답으로 연결이 끊어진다. 그렇기 때문에 서버에서는 사용자의 로그인 인증 여부를 확인할 수 있도록 key 값 처럼 사용할 수 있는 JSESSIONID 값을 클라이언트로 내려줌으로써 이를 이용하여 로그인 처리를 할 수 있는 것이다.

  6. http://localhost:8080/login.jsp 재요청
    재요청을 보내게 되면 client 브라우저는 로컬에 저장되어 있는 JSESSIONID 쿠키 값을 request header에 담아 서버로 전송한다. 톰켓은 client로부터 JSESSIONID 쿠키 값을 전달 받으면 response로 JSESSIONID 쿠키 값을 내려주지 않는다.

  7. 로그인 페이지에서 로그인 진행
    사용자가 아이디와 패스워드를 로그인 창에서 입력 후 서버로 전송을 하게 되면 웹 애플리케이션에서 사용자 인증 후 세션 객체에 JSESSIONID 쿠키 값을 키로 사용하는 사용자 정보를 메모리 영역에 저장하게 된다.
    이와 같이 키 값으로 사용되는 세션 아이디 값이 메모리에 저장 됨으로써 사용자는 로그인 상태를 유지하면서 여러 페이지를 이동하여도 로그인 상태를 유지할 수 있는 것이다.

 

여기까지 쿠키를 이용해서 어떻게 세션을 유지하는지에 대해서 알아봤다.

이처럼 동작 원리를 알고 있으면 다음과 같은 문제가 발생할 때 빠른 트러블슈팅이 가능하다.

 

개발 장비에 포트만 달리하는 3개의 어플리케이션이 적재되어 있다. (톰켓 instance 3개)

222.111.111.111:8001

222.111.111.111:8002

222.111.111.111:8003

하나의 애플리케이션에서 로그인 후 또 다른 어플리케이션에 로그인 하면 처음에 로그인 했던 어플리케이션의 세션이 사라져서 자동으로 로그아웃 처리 된 것을 확인할 수 있는데 이는 JSESSIONID 라는 쿠키 이름의 충돌 때문이다.

 

충돌이 발생하는 이유는 각 애플리케이션의 아이피가 같기 때문이다.

참고로쿠키는 포트를 구분하지 않기 때문에 8001, 8002, 8003 포트로 서비스를 분리하여도 동일 서비스로 인식하여 로컬에 저장되어 있는 쿠키를 서버로 전송한다.

이를 해결하기 위해서는 server.xml의 context에 다음을 추가하여 각 서비스를 구분하면 위의 문제를 해결할 수 있다.

sessionCookieName="ADMIN_JSESSIONID"

 

추가적으로 톰켓은 JSESSIONID 쿠키를 풀 도메인으로 셋팅한다. 즉, 서브 도메인이 서로 다르면 JSESSIONID 값도 달라진다는 것이다.

a.test.com <-- JSESSIONID : 11114B1E761B88562A923438B1DA2F17

b.test.com <-- JSESSIONID : 22224B1E761B88562A923438B1DA2F17

c.test.com <-- JSESSIONID : 33334B1E761B88562A923438B1DA2F17

 

만약 여러 도메인의 세션을 공유하기 원한다면 server.xml에 다음을 추가해 주면 된다.

<Context sessionCookieDomain=”.test.com”>

2014/12/18 16:12 2014/12/18 16:12
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/657

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/657