xrp_coil

레이블이 java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java인 게시물을 표시합니다. 모든 게시물 표시

2012년 6월 1일 금요일

jstl ${param} 동적으로 구현해보기.

jstl을 사용하면서 여태 동적으로 구현 할 일이 없었는데 ....

이번건 동적이라기보다 변수하나만을 할당해서 가져오는것이지만.

이 방법으로 동적구현까지도 충분히 될듯하다.

1. 목적 :
  - 세션을 가져올 때 세션명을 properties 또는 Constants 에서 지정한 명으로 받아오게 하기.





1-1. 일반적인 방법 :

 - java
 세션명을 직접 입력하여 저장한다.

HttpSession session = request.getSession();
session.setAttribute("SESSION_USER", userInfo);



 - jsp
위에서 입력한 세션명으로 바로 가져온다.

${sessionScope.SESSION_USER.name}





1-2. 세션명을 선언후 사용 :

 - Constants.java
  공통으로 사용할 세션명을 정한다.

public final class Constants {

 public static final String USER_SESSION_KEY = "_S_USER_KEY_";   //유저 세션 KEY

}



 - java
  Constants에 지정된 세션키로 세션을 저장한다.

HttpSession session = request.getSession();
session.setAttribute(Constants._S_USER_KEY_, userInfo);



 - jsp
  Constants를 import 하고 세션키를 변수에 담는다. 그리고 변수에 담겨있는 세션키명으로 세션을 가져온다.
  ( 대괄호 안에 있다고 배열로 착각한 내가 좀 챙피함. -_-;;)

2012년 5월 30일 수요일

스프링(spring) 3.0 Annotation 파일 다운로드(File Download) 구현하기.


그냥 파일다운로드는 다른 사람들의 포스팅에도 있어서 금방했는데...

프로퍼티에서 가져와서 구현을 하려고 했더니 클래스패스를 잡지 못해서

request.getClass().getResource("/").getPath() 를 사용하면 이상하게 자꾸 톰캣 라이브러리 쪽으로 패스를 가져온다.

그래서 바꾼것이 currentThread에서 클래스로더를 가져오고 거기에서 getResource로 프로퍼티의 위치를 가져오는식으로 바꿈. 그래도 이렇게 해서 되니까~ 다행~ .

그것때문에 좀 더 시간이 걸렸슴.


우선 첫번째로 해야할 부분. 파일다운로드용 ViewResolver를 선언.

- dispatcher-servlet.xml




두번째로, Controller 구현. 일반적으로 공통 controller를 만들고 bean으로 만드는데 저는 그냥 업무마다 각각의 controller에서 구현했슴. 원래 properties에서 가지고 오는 부분은 공통클래스로 되어있으나 포스팅을 위해 잠시...
- templeteFileController.java






세번째로. 파일다운로드 뷰 bean으로 넘긴 후, 처리해야할 로직 구현.
- FileDownloadView.java





네번째로 jsp에서 필요 파라메터를 넘긴 후, 다운로드 테스트.
- test.jsp





* 참고 프로퍼티 파일은 아래와 같습니다. 경로는 src 바로 아래에 있구요.
- test.properties





다운로드 부분은 얼마전 작성한 아래 포스팅을 참고하시면 됩니다.

ajax로 파일다운로드 구현.
http://leinger.blogspot.com/2012/05/ajax.html


다른 세팅에 비해 비교적 간단하게 보이기는 하지만. 이것도 몇 시간에 걸쳐서 한... 나는..

역시.. 배울게 많은 프로그래머이다...ㅠ_ㅠ


======================================
2012-05-31 내용추가

로컬서버에서 잘 돌아가던 다운로드가 linux서버로 올리고나니 돌아가지 않는다. 원인을 찾아보니.

local서버에서 돌릴때 controller의 properties 파일을 가져오는 부분에서 url은


url.toString()::::::file:/D:/project/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/Test/WEB-INF/classes/test.properties
url.toString().substring()::::::D:/project/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/Test/WEB-INF/classes/test.properties

테스트서버에서 url은


url.toString()::::::file:/usr/local/tomcat7.0.23/webapps/ROOT/Test/WEB-INF/classes/test.properties
url.toString().substring()::::::usr/local/tomcat7.0.23/webapps/ROOT/test/WEB-INF/classes/test.properties

즉. 절대경로이기 때문에 local서버에서는 substring 6자리가 맞지만. linux서버에서는 substring 5자리로 변경해 주어야 한다. 

편하게 만들려고 했는데.. 점점 불편해지고 있는...ㅠㅠ os체크라도 해야하나..ㅠㅠ


결론...;;; 아래 로직 추가.




int substrStartAt = 0;
      String osName = System.getProperty("os.name").toLowerCase();
      if(osName.indexOf("win")>=0){
       substrStartAt = 6;
      }else if(osName.indexOf("mac")>=0){
       substrStartAt = 5;
      }else if(osName.indexOf("nix")>=0 || osName.indexOf("nux")>=0){
       substrStartAt = 5;
      }else if(osName.indexOf("sunos")>=0){
       substrStartAt = 5;
      }

2012년 5월 23일 수요일

ClassCastException : cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest 해결.

업로드 파일을 처리하기 위해 request 를 MultipartHttpServletRequest 으로 캐스팅 하는 과정에서 Exception 이 난다.


(MultipartHttpServletRequest) request).getFile("returnFile")


java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

해결방법은, dispatcher-servlet.xml에 bean 을 세팅해주면 된다.




이상.

2012년 5월 16일 수요일

spring에서 ibatis 트랜잭션(transaction) 처리.


기본적으로 사용하는 트랜잭션 처리가



 
try {
   sqlMap.startTransaction()
   Employee emp2 = new Employee();
   // ...set emp2 data
   Integer generatedKey = (Integer) sqlMap.insert ("insertEmployee", emp2);
   emp2.setFavouriteColour ("green");
   sqlMap.update("updateEmployee", emp2);
   sqlMap.commitTransaction();
}catch(Exception e){
    sqlMap.getCurrentConnection().rollback();
    e.printStackTrace();
    throw e;
} finally {
   sqlMap.endTransaction();
 }


위처런 startTransaction 과 endTransaction 을 사용하는 방식인데.

아무리 해도. 적용이 되지 않는다...
분명히 rollback 도 타는데 말이다.


검색질 중에 http://javastore.tistory.com/103 포스팅의 도움으로 해결.


applicationContext.xml 에 아래와 같이 추가한다.




daoImpl.java 에는 아래와 같이 setter를 만들어준다.

@Autowired
 private TransactionTemplate transactionTemplate;
 
 public void setTransactionTemplate(TransactionTemplate transactionTemplate){
  this.transactionTemplate = transactionTemplate;
 }


메서드 부분은 아래와 같다.


private int saveCaseLowReal(HashMap hmap) throws Exception {
                        ghmap = hmap;
   
   
   boolean result = false;
   result = (Boolean)transactionTemplate.execute( new TransactionCallback() {
    public Object doInTransaction(TransactionStatus status) {
     try {

                                                      /*인서트 로직.*/      

      return true;
     }catch (Exception e){
      e.printStackTrace();
      status.setRollbackOnly();
      return false;
     }
    }
   });

}


대략의 로직으로 보아 excute 하기 전에 true인지 false 인지 판별해서 던져주는듯 하지만..

불편하다...-_-;;;;;


이거보다 좋은 방법 있으신분은 링크를 댓글로 Plzzzzzzz..... ㅠㅠ


2012년 5월 9일 수요일

request.getRemoteAddr() IP가 0:0:0:0:0:0:0:1 일때 해결.


아이피가 0:0:0:0:0:0:0:1 이라는건 ipv6의 주소를 가져온것으로 ipv4로 봤을때 127.0.0.1 이 맞다.

localhost로 서버에 접속했을 때 생기는 현상이며, 10.10.10.1 과 같은 아이피로 접근했을때는 정상적으로 가져온다.

윈도우7 에선 기본적으로 IPv6를 리턴하므로 WAS 세팅으로 바꾸어 주면된다.


WAS Arguments를 세팅해보자.


  1. eclipse에서 톰캣을 실행할경우
    메뉴의 Run -> Run Configurations -> Arguments 탭 -> -Djava.net.preferIPv4Stack=true 추가




2. 톰캣을 개별로 실행 할 경우
    톰캣설치경로/bin/catalina.bat 의 "set JAVA_OPTS" 라는 키워드로 검색하면 두개가 나오는데 두군데 다  -Djava.net.preferIPv4Stack=true 추가

@Autowired :: nested exception is org.springframework.beans.NotWritablePropertyException 해결.

아오.. 세팅하다가 이것때문에 무지 고생했네요.

다 허접한 실력때문이겠지만...ㅠㅠ

여튼 에러의 내용은 아래와 같습니다. 아래 색칠한 부분을 구글 번역기로 돌리면...

 클래스의 잘못된 부동산'loginDao'[com.kis.web.system.login.service.LoginService] :  재산'loginDao는'쓰기 아니거나 잘못된 세터 메소드를 가지고 있습니다.세터 매개 변수 타입은 게터의 반환 형식이 일치하는가?
라고 나옵니다..-_-;; 뭔소리야.. -_-^

짧은 영어실력으로 보자면 일단 getter와 setter 부분이 잘못되어서Bean을 만들수 없다는건데말이지요.. 해결을 하자면....

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'loginDao' of bean class [com.kis.web.system.login.service.LoginService]: Bean property 'loginDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'loginDao' of bean class [com.kis.web.system.login.service.LoginService]: Bean property 'loginDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1024) at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:900) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) ... 21 more



applicationContext.xml 의 내용입니다.

<Bean id="loginDao"> 로 되어있습니다.

LoginService.java 의 내용입니다.

public void setUserDao(LoginDao loginDao) { 로 만들어져 있네요.

위 부분을 아래와 같이 맞춰줍니다.

public void setLoginDao(LoginDao loginDao) {

그리고 서버를 재시작..

잘돌아 갑니다.. 왜 이름을 다르게 했을까요..ㅠㅠ 버린시간이 너무 아깝네요.ㅠ


2012년 4월 19일 목요일

No mapping found for http request with uri 해결.

흠.... 우선 이 에러는 기본적인 지식이 없어서 발생한듯하다...

처음부터 세탕을 해봤다면 생기지 않았겠지만 어쨋은 해결을 해보자..



우선 에러의 원인은 에러 그대로 리퀘스트 매핑을 찾지 못해서임.

 세팅을 살펴보면 나의 경우,

web.xml 에 다음과 같이 세팅이 되어있다.


<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/test/*</url-pattern>
  </servlet-mapping>


컨트롤러에는 이렇게 되어있다. 

@Controller 
@RequestMapping("Abcd_01") 
Public Class 어쩌구.... 

 그리고 실제 컨트롤러의 패키지는 이렇다.

 com.test.web.abcd.controller.Abcd_01.class 

 흠... 그래서 보니... 예전에는 컨트롤러 매핑에 저렇게만 써도 됬었는데 무슨 세팅을 잘못한건지....

컨트롤러에서 이렇게 바꾸어야 서블릿을 잘 찾아온다.

 @Controller 
@RequestMapping("abcd/Abcd_01") 
Public Class 어쩌구.... 

 매핑 클래스 앞에 패키지명을 써줘야 찾아온다...

왜일까나 ㅠㅠ 해결은 했고 잘 돌아가지만 원인을 몰라 디게 찝짭한 해결..



 원인 아시는분 댓글 부탁드려요~~~^^

2012년 4월 13일 금요일

request.getRemoteAddr() 인증오류: 접속IP가 변경됨 0 0:0:0:0:0:0:0:1 원인 해결.

 request.getRemoteAddr();

인증오류: 접속IP가 변경됨 0 0:0:0:0:0:0:0:1

AbstractAuthCheckInterceptor.java

무슨 소리인가 했네..

해결방법은 간단.


localhost 대신 자신의 IP 를 적어주면 잘 됩니다.