레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시
레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시

2012-12-20

Java] SpringFramework 개발 팁.




출처 : http://www.omnibuscode.com/zeroboard/zboard.php?id=seeyou_programing_spring&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=reg_date&desc=desc&no=59


SiteLink #1 : http://blog.naver.com/ecogeo?Redirect=Log&logNo=100010951233

스프링 MVC 적용하면서 대강 정리한 "노트"입니다. 팁이라고하기엔 좀 모자란듯...^^
(오류가 있을수도 있으니 너무 맹신하지는 마세요..-.-);

-. 한 웹app에 여러개의 *-servlet.xml 사용하기
- web.xml에서 원하는 만큼 DispatcherServlet을 선언하고 그 서블릿이름에 대응하는 [servlet-name]-servlet.xml을 작성한다.
- 이렇게 하면 한개의 웹APP 내부에서 웹자원을 몇개의 그룹으로 나누어 별도로 설정하는 것이 가능해진다.

-. 웹자원에 AOP 적용하기
- 핸들러 매핑에 인터셉터를 걸면 된다.
  <bean id="signonInterceptor" class="xxx.SignonInterceptor">
    <property name="signonView">
      <value>redirect:/login_form.html</value>
    </property>
  </bean>
  <bean id="handlerMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
      <list>
        <ref bean="signonInterceptor"/>
      </list>
    </property>
    <property name="mappings">
      .... ....
    </property>
  </bean>
- 그럼 Controller를 통하지 않고 호출되는 JSP에 AOP 적용하려면?
=> 우선은 web.xml에서 jsp 자원들이 DispatcherServlet을 타도록 만든다음 UrlFilenameViewController를 이용한다.
- 위의 SimpleUrlHandlerMapping 의 mappings 속성을 아래처럼 설정한다.(패턴은 적절히 수정)
      <property name="mappings">
         <props>
            <prop key="*">jspViewController</prop>
         </props>
      </property>
     .... ....
   <bean id="jspViewController"
      class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

- 그럼 특정 자원에 대해서만 AOP를 적용하지 않으려면?(ex: 로그인폼과 로그인콘트롤러에는 인증인터셉터를 걸면 안된다...)
=> AOP적용하면 안되는 자원에 대한 핸들러 매핑을 추가로 설정하고 우선 순위를 부여한다.
(아래에서 publicHandlerMapping에는 인증인터셉터가 없다)
  <bean id="publicHandlerMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="order"><value>1</value></property>
    <property name="mappings">
         <props>
            <prop key="/signon/LoginForm.do">jspViewController</prop>
            <prop key="/signon/Login.do">signonController</prop>
         </props>
    </property>
  </bean>
  <bean id="protectedHandlerMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="order"><value>2</value></property>
    <property name="interceptors">
      <list>
        <ref bean="signonInterceptor"/>
      </list>
    </property>
    <property name="mappings">
         <props>
            <prop key="*">jspViewController</prop>
         </props>
    </property>
  </bean>
- 위와 같은 설정에서 /signon/Login.do 요청이 들어오면 url패턴은 publicHandlerMapping과
protectedHandlerMapping에 모두 해당된다 할지라도 order 순위에 의해 publicHandlerMapping이
그 요청을 처리하게 된다.

-. ModelAndView에 여러 개의 객체를 저장하기
- Map을 만들어 거기에 적절한 이름으로 저장하면 된다.
 return new ModelAndView(this.successView, map);
- JSP에서는 Map에 저장된 키로 request 스코프에서 꺼내어 쓰면된다.

-. 콘트롤러 실행후 특정 url로 redirect하는 방법
- ModelAndView에 넘길 url 앞에 redirect: 접두문자열을 붙여주면 된다.
 <bean name="xxxController" class="xxx.XxxController">
    <property name="successView"><value>redirect:/admin/XXXForm.do</value></property>
  </bean>

-. 에러 종류별로 에러페이지 다르게 지정하기- exception resolver 빈을 설정한다. exception resolver는 콘트롤러에서 발생한 에러를 잡아낸다.
 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
   <props>
    <prop key="org.springframework.dao.DataIntegrityViolationException">DupError.jsp</prop>
    <prop key="org.springframework.dao.DataAccessException">DBError.jsp</prop>
    <prop key="java.lang.Exception">Error.jsp</prop>
   </props>
  </property>
 </bean>
- exceptionMappings의 각 키의 속성값은 exception 타입별 jsp 페이지 경로이며 이 또한 view resolver에 의해 해석된다(만약 뷰resolver에 suffix를 .jsp로 주었다면 위의 설정에서 Error.jsp는 그냥 Error로 설정해야할 것이다).
- 의문 : 위 설정이 콘트롤러에서 포워딩되는 JSP에도 적용이 되는가? => 안된다!!!
- jsp에서 발생한 에러는 jsp 페이지에 선언한 error 페이지로 가거나 jsp에서 error 페이지 선언을 안했으면 web.xml에 정의한 error 페이지로 간다.

- SimpleFormController 를 이용할 경우엔 onSubmit 메소드안에서
 try {
     if (siteForm.isNewSite()) {
  this.siteService.insertSite(siteForm.getSite());
     } else {
  this.siteService.updateSite(siteForm.getSite());
     }
 } catch (DataIntegrityViolationException ex) {
     errors.rejectValue(
      "site.siteip",
      "SITE_IP_ALREADY_EXISTS",
      "Site IP already exists: choose a different Site ip.");
     return showForm(request, response, errors);
 }
이런식으로 에러처리가 가능하다.

-. 프로세스 처리 과정
- Handler mappings가 url을 분석하여 Controllers 선택 => Controllers는 로직수행후 지정된 View를 생성 => ViewResolvers는 뷰를 해석 => 해석된 뷰로 포워딩

-. 핸들러 매핑
- 여러개의 핸들러 매핑이 있을 때 순서를 부여할 수 있다.
- 패턴 사용가능하다... 특정 패턴의 url을 하나의 콘트롤러에 매핑할 수 있다.
- url 별로 빈네임을 설정하기 위해서 : SimpleUrlHandlerMapping 이용
- url을 바로 빈네임으로 사용하기 위해서 : BeanNameUrlHandlerMapping 이용(아래 소스)
    <bean id="handlerMapping"
          class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean name="/editaccount.form"
          class="org.springframework.web.servlet.mvc.SimpleFormController">
        <property name="formView"><value>account</value></property>
        <property name="successView"><value>account-created</value></property>
        <property name="commandName"><value>Account</value></property>
        <property name="commandClass"><value>samples.Account</value></property>
    </bean>
- setAlwaysUseFullPath 속성에 대한 API 설명 읽어볼것.
=> setAlwaysUseFullPath 속성이 false(default)일 때 web.xml에서 /abc/* 로 매핑한 상태에서 url요청이 /abc/test.do 로 들어왔다면 빈네임은 /test.do 로 해야한다는 것이다.

-. 무한루핑 피하기
[web.xml]
"test"라는 이름의 Dispatcher 서블릿에 대한 url 패턴매핑 : /test/jsp/*
[test-servlet.xml] : test Dispatcher 서블릿에 대한 컨텍스트 파일
<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="prefix"><value>/test/jsp/</value></property>
    <property name="suffix"><value>.jsp</value></property>
</bean>
=> 이 상황에서 viewResolver에 의한 url 조합이 web.xml의 서블릿 매핑 패턴과 일치하면 무한루프에 빠진다. 주의할 것.

-. UrlFilenameViewController
- UrlFilenameViewController은 url에서 파일명 부분만 빼내어 뷰 url을 만든다.
즉 url이 /foo/bar/test.do 로 들어오건 /bar/foo/test.do로 들어오건 상관없이 뷰 url은 test가 된다.
- 따라서 UrlFilenameViewController를 쓸 경우에는 경로는 다르지만 이름은 동일한 매핑은 없는지 주의해야 한다.
-. JSP에서 스프링 빈 참조하기- servlet context로부터 스프링 WebApplicationContext를 얻은 후 거기서 빈을 액세스한다.
  WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
  SomeBean = (SomeBean)wac.getBean("beanName");
- 그러나 이 방법은 너무 힘들어보인다. 그래서 혹시나해서 스프링 태그라이브러리를 찾아보았다.
- 스프링 태그라이브러리에는 빈을 직접 리턴해주는 태그가 안보인다...왜 없을까?
=> 아시는분? JSTL 때문일까? bind 태그를 잠깐 봤는데... 잘이해안됨.
=> 내가 바라는 건 콘트롤러 통하지 않는 JSP에서 특정 빈의 속성값을 쉽게 액세스하고 싶은거다.

-. web.xml에 대한 푸념
- web.xml에서 서블릿 url 패턴매핑에 *.foo 나 /foo/*는 되는데 이 둘의 조합은 왜 안될까?
=> 패턴의 우선 순위 등이 문제일까? 심플하게 갈려고?
- 에러페이지 설정하는데 Exception 클래스 타입별로 다른 에러페이지를 지정했는데, 예외 클래스간의 관계가 부모자식인게 있으면 최상위 부모 클래스에 대한 에러페이지가 보여진다.
=> 왜 상식과 어긋나게 행동하게 했는지...

-. web.xml에서의 url 패턴매핑에 대한 의견
- 개인적으로 /foo/* 식의 패턴매핑은 바람직하지 않다고 생각한다. 왜냐면 static 자원(html,image 등)도 서블릿을 타게 만들기 때문이다. 물론 컨테이너 앞단에 웹서버를 둔다면 어차피 static 자원은
  웹서버가 처리하기 때문에 상관은 없겠지만... 하여간 *.foo 식의 패턴을 사용하는게 좋다고 생각한다.

-. 정적 자원에 대한 의문
- 서블릿/jsp 에서 static 자원으로 포워딩했을 때 컨테이너에서 도대체 무슨일이 벌어지는 걸까?
  쓰레드 제어권이 static 자원으로 넘어갈리는 없을테고... redirect같은 특수한 응답헤더가 존재하는가?

2012-10-31

java Framework/jsp 프로그래밍/common.net을 이용한 FTP client 프로그램



소스영역 :::

/**
 * 참조 사이트 목록
 * http://www.okjsp.pe.kr/seq/51685
 * http://benelog.springnote.com/pages/1468338
 * 참조해서 작업 해 본것임.
 * apache 의  common.net api 사용
 * ftp batch 작업을 위한  용도
 * 2009.03.26
 * 인자 : -H:server ip, -P:server port, -UI:user id, -UP:user pw, -PM:passive-mode
 */
package net.nchannel.ftp;
/**
 * @author snipper
 *
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
//import org.apache.commons.net.ftp.FTPListParseEngine;
//import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;

public class FCBatch {
//    protected static final Log logger = LogFactory.getLog(FCBatch.class);
 /**
  *
  */
    public FCBatch() {
  // TODO Auto-generated constructor stub
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  // 인자는 -H, -P, -ui, -up, -path, -pm 이 존재
  String host = "";
  String port = "";
  String id = "";
  String pw = "";
  String rpath = "";
  String pm = "";
  String fileNm = "";   //"JeusServer_"+getDate(-1)+".log"; //현재 이전 날짜의 파일 가져오기 위한 파일명 구하기
  String lpath = "";    //"d:\\jeuslogs\\JeusServer_"+getDate(-1)+".log"; //현재 이전 날짜의 파일 가져오기 위한 파일명 구하기
  FileOutputStream fos = null;
 
//  System.out.println("입력 인자 수 : " + args.length);
//  System.out.println("파일 명  : " + fileNm);
  // 입력된 인자 값을 각 의미 변수에 할당.
  for(int i=0; i < args.length; i++) {
   if(args[i].indexOf("-H")!=-1)
    host = args[i].substring(2);
   if(args[i].indexOf("-P")!=-1)
    port = args[i].substring(2);
   if(args[i].indexOf("-UI")!=-1)
    id = args[i].substring(3);
   if(args[i].indexOf("-UP")!=-1)
    pw = args[i].substring(3);
   if(args[i].indexOf("-RP")!=-1)
    rpath = args[i].substring(3);
   if(args[i].indexOf("-LP")!=-1)
    lpath = args[i].substring(3);
   if(args[i].indexOf("-FN")!=-1)
    fileNm = args[i].substring(3);
   if(args[i].indexOf("-PM")!=-1)
    pm = args[i].substring(3);
  }
  if(port.equals("")) port = "21";  //접속 포트 번호, 기본 21번 포트 사용
  if(rpath.equals("")) rpath = "/home/tmax/jeus5/logs/ECOWEB/";  //원격 기본 디렉토리 설정, 제우스를 기본으로 했음.
  if(lpath.equals("")) lpath = "c:\\jeuslogs\\";      //로컬 기본 디렉토리 설정, 로컬 디렉토리가 없을 경우.... 현재 폴더로 해도 되나 그냥 위와 같이 함.
  if(fileNm.equals("")) fileNm = "JeusServer_"+getDate(-1)+".log"; //가져올 기본 파일명 설정
  if(pm.equals("")) pm = "Y"; // 패시브모드 on(기본모드)
//  System.out.println("host = " + host);
//  System.out.println("port = " + port);
//  System.out.println("id = " + id);
//  System.out.println("pw = " + pw);
//  System.out.println("remote path = " + rpath);
//  System.out.println("local path = " + lpath);
//  System.out.println("file name = " + fileNm);
//  System.out.println("passive mode y/n  = " + pm);
 
  FTPClient ftp = null;
 
  try {
   ftp = new FTPClient();
   ftp.setControlEncoding("euc-kr");  // ftp 인코딩을 EUC-KR 로 설정.
  
//   if(logger.isDebugEnabled()) {
    System.out.println("FTP Client Test Progrma with Commons NET");
    System.out.println("test by 2009.03.26");
    System.out.println("FCBatch main() start");
//    System.out.println("host = " + host);
//    System.out.println("port = " + port);
//    System.out.println("id = " + id);
//    System.out.println("pw = " + pw);
//    System.out.println("remote path = " + rpath);
//    System.out.println("passive mode y/n  = " + pm);
//   }
//  
  
   if(!host.equals("") && !port.equals("") && !id.equals("") && !pw.equals("")) {
    // ftp 연결
    ftp.connect(host,Integer.parseInt(port));
//    if(logger.isDebugEnabled()) {
     System.out.println("connected to " + host +":"+port);
//    }
//    if(logger.isDebugEnabled()) {
     System.out.println("login by user id : " + id +", password :"+pw);
     System.out.println("ftp.login()");
//    }
    ftp.login(id, pw);
//    if(logger.isDebugEnabled()) {
     System.out.println("login success...");
//    }
   
    // 패시브 모드 설정 하기
    if(pm.endsWith("Y")) {
//     if(logger.isDebugEnabled()){
      System.out.println("passive mode 설정");
      System.out.println("passive mode 입력 값: " +pm);
//     }
     ftp.enterLocalPassiveMode();
//     if(logger.isDebugEnabled()){
      System.out.println("passive mode 설정 완료");
//     }
    }
   
    //change directory
//    if(logger.isDebugEnabled()) {
     System.out.println("change directory : " + rpath );
     System.out.println("ftp.changeWorkingDirectory("+rpath+")");
//    }
    ftp.changeWorkingDirectory(rpath);
//    if(logger.isDebugEnabled()) {
     System.out.println("경로 변경 : " + rpath);
//    }
   
//    if(logger.isDebugEnabled()) {
     System.out.println("파일 전송 타입 설정  : setFileType" );
     System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
//    }
    ftp.setFileType(FTP.BINARY_FILE_TYPE);
//    if(logger.isDebugEnabled()) {
     System.out.println("파일 전송 타입 설정 완료 " );
//    }
   
    // ftp  사이트 리스팅.
//    ftpList(ftp, path);
/*    
    try{
//     if(logger.isDebugEnabled()) {
      System.out.println("서버 디렉토리 리스팅  : " );
      System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
//     }
     FTPListParseEngine engine = ftp.initiateListParsing("unix",path);
     System.out.println("" + StringUtils.rightPad("Name", 30) + StringUtils.leftPad("Size", 10) + " ");
     System.out.println("" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10,"-") + "-");
    
     int idx=0;
    
     while(engine.hasNext()) {
      FTPFile[] files = engine.getNext(25);
      idx += files.length;
     
      for(int i=0; i < files.length; i++) {
       FTPFile file= files[i];
       System.out.println(StringUtils.rightPad(" "+file.getName(),30) + StringUtils.leftPad(""+file.getSize(), 10) + " ");
      
      }
     }
    
     System.out.println("-" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10, "-") + "-");
     System.out.println(" total : " + idx);
     System.out.println("  ");
      
//     if(logger.isDebugEnabled()) {
      System.out.println("서버 디렉토리 리스팅  : " + path + "완료" );
//     }
    } catch (Exception e) {
     System.out.println("ftp 리스팅 실패");
     e.printStackTrace();
     System.exit(-1);
    }
   
*/   
    // 파일 내려 받기 ??
    try {
     fos = new FileOutputStream(lpath+fileNm);
     ftp.retrieveFile(fileNm, fos);
    } catch(IOException e) {
     System.out.println("IO Exception : " + e.getMessage());
    } finally {
     if(fos != null) {
      try {
       fos.close();
      
      } catch (IOException e) {
       System.out.println("IO Exception : " + e.getMessage());
      }
     }
    }
   
    System.out.println(fileNm + "파일 다운로드 완료 !!!");  
   
   } else { // host, port, id, pw 없으면 에러 발생.
    System.out.println("usage : FCBatch -Hhost -P[port] -UIid -UPpw -RP[remote path] -LP[local path] -FN[file name] -PM[passive mode] ");
    System.out.println("options ");
    System.out.println("-H : Host [Name | IP] ");
    System.out.println("-P : 접속할 포트 번호 ,     Default : 21 ");
    System.out.println("-UI : User ID ");
    System.out.println("-UP : User Password");
    System.out.println("-RP : FTP Server Path,    Default : /home/tmax/jeus5/logs/ECOWEB/");
    System.out.println("-LP : Localhost Path,    Default : c:\\jeuslogs\\");
    System.out.println("-FN : Download 할 File Name ,  Default : JeusServer_"+getDate(-1)+".log  ");
    System.out.println("-PM : Passive Mode 사용 여부 [Y/N], Default: Y ");
   
//    throw new Exception("접속에 필요한 필수 정보를 입력하지 않으셨습니다.");
   }
  
  
  } catch (Exception e) {
//   System.out.println("ftp 로그인 실패");
   e.printStackTrace();
  } finally {
   // ftp 연결 해제.
//   System.out.println("ftp 연결해제");
   if(ftp != null && ftp.isConnected()) {
    try {
     ftp.disconnect();
    } catch (IOException e) {
     System.out.println("IOException : " + e.getMessage());
    }
   }
   // 프로그램 종료
   System.exit(-1); // 종료
  }

 }
/*
 public static void ftpList(FTPClient ftp, String path) {
  try{
   if(logger.isDebugEnabled()) {
    System.out.println("서버 디렉토리 리스팅  : " );
    System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
   }
   FTPListParseEngine engine = ftp.initiateListParsing("unix",path);
   System.out.println("" + StringUtils.rightPad("Name", 30) + StringUtils.leftPad("Size", 10) + " ");
   System.out.println("" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10,"-") + "-");
  
   int idx=0;
  
   while(engine.hasNext()) {
    FTPFile[] files = engine.getNext(25);
    idx += files.length;
   
    for(int i=0; i < files.length; i++) {
     FTPFile file= files[i];
     System.out.println(StringUtils.rightPad(" "+file.getName(),30) + StringUtils.leftPad(""+file.getSize(), 10) + " ");
    
    }
   }
  
   System.out.println("-" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10, "-") + "-");
   System.out.println(" total : " + idx);
   System.out.println();
    
   if(logger.isDebugEnabled()) {
    System.out.println("서버 디렉토리 리스팅  : " + path + "완료" );
   }
  } catch (Exception e) {
   System.out.println("ftp 리스팅 실패");
   e.printStackTrace();
   System.exit(-1);
  }
 
 }
*/

 /**
  *
  * @param day
  * @return
  */
 public static String getDate(int day){
  Calendar temp = Calendar.getInstance();
  StringBuffer sDate = new StringBuffer();
 
  temp.add(Calendar.DAY_OF_MONTH, -1);
 
  int iYY = temp.get(Calendar.YEAR);
  int iMM = temp.get(Calendar.MONTH)+1;
  int iDD = temp.get(Calendar.DAY_OF_MONTH);
 
  sDate.append(iYY);
  if(iMM <10)
   sDate.append("0");
  sDate.append(iMM);
 
  if(iDD < 10)
   sDate.append("0");
  sDate.append(iDD);
 
  return sDate.toString();
 }
}

java Framework/JSP] taglib prefix=c 로 사용시 에러 발생하는 경우



출처 : http://ck1024.tistory.com/14

-<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>" 으로 작성을 했더니 아래의 에러가 발생
→ According to TLD or attribute directive in tag file, attribute value does not accept any expressions

"<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>"으로 수정하니 정상적으로 실행됨


Servlet 2.3
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

Servlet 2.4
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>

java Framework/jsp] 세션 공유시 서블릿 컨텍스트 참조 문제



원문 url : http://blog.daum.net/uttiboy/16864082

세션 공유시 서블릿 컨텍스트 참조 문제


두 웹애플리케이션에서 세션을 공유할때 세션을 통해 서블릿 컨텍스트를 참조할때
어떤 서블릿 컨텍스트를 참조할까?

Root WebApp - xxx.co.kr
WebApp1 - xxx.co.kr/app1

두 애플리케이션은 서로 세션공유가 가능하도록 설정되어 있다
이때 xxx.co.kr로 접근하고 xxx.co.kr/app1으로 접근할때 두 애플리케이션간에
세션은 공유되어 있다.

문제는 WebApp1에서 session.getServletContext()를 호출할때 어떤 서블릿 컨텍스트가 반환될까?
애플리케이션의 접근 순서에 따라 다른데 xxx.co.kr을 접근하고 xxx.co.kr로 접근하게되면
xxx.co.kr에서 세션이 생성되고  Root WebApp의 서블릿 컨텍스트를 참조하게 되어서
WebApp1에서 session.getServletContext()는 xxx.co.kr의 서블릿 컨텍스트를 참조한다.

WebApp1에서 자신의 서블릿 컨텍스트를 참조하기 위해서는 session.getServletContext().getContext("/app1")으로 참조해야 한다.

Tomcat의 경우 context에 crossContext 속성을 true로 설정해야 가능하다고 합니다

java Framework/java]Reading and writing text files


 출처 : http://www.javapractices.com/topic/TopicAction.do?Id=42


Reading and writing text files

When reading and writing text files :
  • it's almost always a good idea to use buffering (default size is 8K)
  • it's often possible to use references to abstract base classes, instead of references to specific concrete classes
  • there is always a need to pay attention to exceptions (in particular, IOException and FileNotFoundException)
The close method :
  • always needs to be called, or else resources will leak
  • will automatically flush the stream, if necessary
  • calling close on a "wrapper" stream will automatically call close on its underlying stream
  • closing a stream a second time has no consequence
Commonly used items :
The FileReader and FileWriter classes are a bit tricky, since they implicitly use the system's default character encoding. If this default is not appropriate (for example, when reading an XML file which specifies its own encoding), the recommended alternatives are, for example :
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader in = new InputStreamReader(fis, "UTF-8");
FileOutputStream fos = new FileOutputStream("test.txt");
OutputStreamWriter out = new OutputStreamWriter(fos, "UTF-8");
Scanner scanner = new Scanner(file, "UTF-8");
The following examples use JDK 1.5.
Example 1
Here is a fairly compact example of reading and writing a text file, using an explicit encoding. If you remove all references to encoding from this class, it will still work -- the system's default encoding will simply be used instead.
import java.io.*;
import java.util.Scanner;

/** 
 Read and write a file using an explicit encoding.
 Removing the encoding from this code will simply cause the 
 system's default encoding to be used instead.  
*/
public final class ReadWriteTextFileWithEncoding {

  /** Requires two arguments - the file name, and the encoding to use.  */
  public static void main(String... aArgs) throws IOException {
    String fileName = aArgs[0];
    String encoding = aArgs[1];
    ReadWriteTextFileWithEncoding test = new ReadWriteTextFileWithEncoding(
      fileName, encoding
    );
    test.write();
    test.read();
  }
  
  /** Constructor. */
  ReadWriteTextFileWithEncoding(String aFileName, String aEncoding){
    fEncoding = aEncoding;
    fFileName = aFileName;
  }
  
  /** Write fixed content to the given file. */
  void write() throws IOException  {
    log("Writing to file named " + fFileName + ". Encoding: " + fEncoding);
    Writer out = new OutputStreamWriter(new FileOutputStream(fFileName), fEncoding);
    try {
      out.write(FIXED_TEXT);
    }
    finally {
      out.close();
    }
  }
  
  /** Read the contents of the given file. */
  void read() throws IOException {
    log("Reading from file.");
    StringBuilder text = new StringBuilder();
    String NL = System.getProperty("line.separator");
    Scanner scanner = new Scanner(new File(fFileName), fEncoding);
    try {
      while (scanner.hasNextLine()){
        text.append(scanner.nextLine() + NL);
      }
    }
    finally{
      scanner.close();
    }
    log("Text read in: " + text);
  }
  
  // PRIVATE 
  private final String fFileName;
  private final String fEncoding;
  private final String FIXED_TEXT = "But soft! what code in yonder program breaks?";
  
  private void log(String aMessage){
    System.out.println(aMessage);
  }
}
 


Example 2
This example uses FileReader and FileWriter, which implicitly use the system's default encoding. To make this example compatible with JDK 1.4, just change StringBuilder to StringBuffer:
import java.io.*;

public class ReadWriteTextFile {

  /**
  * Fetch the entire contents of a text file, and return it in a String.
  * This style of implementation does not throw Exceptions to the caller.
  *
  * @param aFile is a file which already exists and can be read.
  */
  static public String getContents(File aFile) {
    //...checks on aFile are elided
    StringBuilder contents = new StringBuilder();
    
    try {
      //use buffering, reading one line at a time
      //FileReader always assumes default encoding is OK!
      BufferedReader input =  new BufferedReader(new FileReader(aFile));
      try {
        String line = null; //not declared within while loop
        /*
        * readLine is a bit quirky :
        * it returns the content of a line MINUS the newline.
        * it returns null only for the END of the stream.
        * it returns an empty String if two newlines appear in a row.
        */
        while (( line = input.readLine()) != null){
          contents.append(line);
          contents.append(System.getProperty("line.separator"));
        }
      }
      finally {
        input.close();
      }
    }
    catch (IOException ex){
      ex.printStackTrace();
    }
    
    return contents.toString();
  }

  /**
  * Change the contents of text file in its entirety, overwriting any
  * existing text.
  *
  * This style of implementation throws all exceptions to the caller.
  *
  * @param aFile is an existing file which can be written to.
  * @throws IllegalArgumentException if param does not comply.
  * @throws FileNotFoundException if the file does not exist.
  * @throws IOException if problem encountered during write.
  */
  static public void setContents(File aFile, String aContents)
                                 throws FileNotFoundException, IOException {
    if (aFile == null) {
      throw new IllegalArgumentException("File should not be null.");
    }
    if (!aFile.exists()) {
      throw new FileNotFoundException ("File does not exist: " + aFile);
    }
    if (!aFile.isFile()) {
      throw new IllegalArgumentException("Should not be a directory: " + aFile);
    }
    if (!aFile.canWrite()) {
      throw new IllegalArgumentException("File cannot be written: " + aFile);
    }

    //use buffering
    Writer output = new BufferedWriter(new FileWriter(aFile));
    try {
      //FileWriter always assumes default encoding is OK!
      output.write( aContents );
    }
    finally {
      output.close();
    }
  }

  /** Simple test harness.   */
  public static void main (String... aArguments) throws IOException {
    File testFile = new File("C:\\Temp\\blah.txt");
    System.out.println("Original file contents: " + getContents(testFile));
    setContents(testFile, "The content of this file has been overwritten...");
    System.out.println("New file contents: " + getContents(testFile));
  }
} 


Example 3
This example demonstrates using

Scanner to read a file containing lines of structured data. Each line is then parsed using a second Scanner and a simple delimiter character, used to separate each line into a name-value pair. The Scanner class is used only for reading, not for writing.
import java.io.*;
import java.util.Scanner;

public final class ReadWithScanner {

  public static void main(String... aArgs) throws FileNotFoundException {
    ReadWithScanner parser = new ReadWithScanner("C:\\Temp\\test.txt");
    parser.processLineByLine();
    log("Done.");
  }
  
  /**
  * @param aFileName full name of an existing, readable file.
  */
  public ReadWithScanner(String aFileName){
    fFile = new File(aFileName);  
  }
  
  /** Template method that calls {@link #processLine(String)}.  */
  public final void processLineByLine() throws FileNotFoundException {
    Scanner scanner = new Scanner(fFile);
    try {
      //first use a Scanner to get each line
      while ( scanner.hasNextLine() ){
        processLine( scanner.nextLine() );
      }
    }
    finally {
      //ensure the underlying stream is always closed
      scanner.close();
    }
  }
  
  /** 
  * Overridable method for processing lines in different ways.
  *  
  * <P>This simple default implementation expects simple name-value pairs, separated by an 
  * '=' sign. Examples of valid input : 
  * <tt>height = 167cm</tt>
  * <tt>mass =  65kg</tt>
  * <tt>disposition =  "grumpy"</tt>
  * <tt>this is the name = this is the value</tt>
  */
  protected void processLine(String aLine){
    //use a second Scanner to parse the content of each line 
    Scanner scanner = new Scanner(aLine);
    scanner.useDelimiter("=");
    if ( scanner.hasNext() ){
      String name = scanner.next();
      String value = scanner.next();
      log("Name is : " + quote(name.trim()) + ", and Value is : " + quote(value.trim()) );
    }
    else {
      log("Empty or invalid line. Unable to process.");
    }
    //(no need for finally here, since String is source)
    scanner.close();
  }
  
  // PRIVATE //
  private final File fFile;
  
  private static void log(Object aObject){
    System.out.println(String.valueOf(aObject));
  }
  
  private String quote(String aText){
    String QUOTE = "'";
    return QUOTE + aText + QUOTE;
  }
} 


Example run of this class :
Name is : 'height', and Value is : '167cm'
Name is : 'mass', and Value is : '65kg'
Name is : 'disposition', and Value is : '"grumpy"'
Name is : 'this is the name', and Value is : 'this is the value'
Done.


java Framework/java]Http 통신


java :: http 통신

출처 : http://blog.naver.com/banhong/104373158

얼마전에 자바 어플리캐이션에서 http통신으로 데이터 값을 가져와야 하는것을 개발해야 해서

동작테스트 삼아 만들었쌈~..... 실제는 이렇게 안만들었지만 서도


/**
 *
 */
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author 이준성
 *
 */
public class HttpRequest {

 private String url;


 public HttpRequest(String url) {
 
  this.url = url;
 
 }

 public String request()  {
 
  String returnVal = "";
 
  HttpURLConnection con = null;
 
  BufferedReader br = null;
 
  try {
  
   URL tempCon = new URL(url);
   con = (HttpURLConnection)tempCon.openConnection();
  
   // 메소드 방식설정
   con.setRequestMethod("POST");
   // 헤더 설정
   con.setRequestProperty("Content-Type" , "application/x-www-form-urlencoded");
  
   con.connect();
  
   InputStreamReader isr = new InputStreamReader(con.getInputStream());
   br = new BufferedReader(isr);
  
   String temp = null;
  
   while((temp = br.readLine()) != null) {
   
    System.out.println(temp);
   
   }
     
  }catch(IOException e) {
  
   e.printStackTrace();
    
  } finally {
  
   if(br != null) {
    try {
     br.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  
   con.disconnect();
  
  }
 
  return returnVal;
 }



 /**
  * 동작 테스트
  *
  * @param args
  */
 public static void main(String args[]) {
 
  //HttpRequest 생성시에 인자로 요청을 보낼 주소를 적으면 된다.
  //HttpRequest hr = new HttpRequest("");
  //hr.request();
 
 }

}


자바에서 제공하는 HttpURLConnection 이란 녀석때문에 상당이 쉽게 만들수는 있다지만,
상당히 객체지향적이지 못하게 설계된 클래스라고 하네요. 흠~~ 구런가????

서블릿과의 통신 가능한 클라이언트 작성에 대해서
출처 :

HTTP통신을 하는 서버와 클라이언트를 작성하려고 합니다. 서버측은 서블릿으로 작성을 하였습니다. 클라이언트단은 jsp나 html이 아닌 일반 어플리케이션을 이용해야 합니다. URLConnection클래스를 이용하여 서버에 접속하여 정보를 주고 받게끔 작성하였는데 클라이언트에서 정보를 보내는 것은 가능하나 서버로 부터 오는 정보를 다시 받는 방법을 모르겠습니다. 또한, jsp나 html는 form태크를 써서 서버에서 doPost함수에서 response할 수 있는반면 URLConnection으로 서버에 접속을 하게 되면 URL뒤에 정보가 붙어서 가는 Get방식으로 밖에 전송이 안되네요. 어떤 방법으로 클라이언트를 작성하는 것이 더 원활한 서블릿과의 통신방법이 될 수 있을까요? 아래에 소스를 첨부하겠습니다. 꼭 답변 부탁드릴께요.

<HttpClient>
import java.io.*;
import java.net.*;

import sun.net.www.protocol.http.HttpURLConnection;

public class HttpClient {

  public static void main(String[] args) {
    try {
    URL url = new URL("http://127.0.0.1:8080
                    /servlet/HttpTest?p=abc");
    HttpURLConnection huc = (HttpURLConnection)
                                   url.openConnection();
       
    huc.setDoOutput(true);
          OutputStream os = huc.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    BufferedInputStream bis = new BufferedInputStream
                                    (huc.getInputStream());
           //送信
    bos.write("abc".getBytes());
    bos.flush();
    System.out.println("end");

    //受信
    byte[] r = new byte[3];
    bis.read(r);
    System.out.println("read : "+new String(r));

    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


<HttpServer>
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class HttpServer extends HttpServlet {

  public void service(HttpServletRequest request,
                         HttpServletResponse response)
    throws IOException {
       
     response.getOutputStream();
     BufferedInputStream bis = new BufferedInputStream
                               (request.getInputStream());
    byte[] r = new byte[3];
    System.out.println("start");
    int j = bis.read(r, 0, 3);
    System.out.println("read "+j+" : "+new String(r));
    //受信
    bis.read(r);
    System.out.println("read : "+new String(r));
    String str = request.getParameter("p");
    BufferedOutputStream bos = new BufferedOutputStream
                                     (response.getOutputStream());
    //送信
    bos.write(str.getBytes());
    bos.flush();
    System.out.println("write end ");
    }
}
 
   
 
 
 
2003-10-13 13:37:10.0  /  글번호 : 261780 
::carroty:: 도움이 되실란가 모르겠지만...dangguni
 
무슨 이유 때문인지 잘 모르겠지만, 아무튼 HTTP 통신을 하는 CS를 개발
하시는데, 클라이언트가 어플리케이션이어야 하는 이유를 잘 모르겠습니다. 다들 클라이언트를 웹브라우져안으로 이식하기위해 고생하는데 말이져.


클라이언트를 어플케이션으로 만드실것이라면, 애초에 걍 소켓 접속을
통해 프로그램을 만드시는 것이 어떤지요.
클라이언트는 걍 어플리케이션, 서버측도 걍 어플리케이션
이게 더 만들기도 편하고(편한가? *^^*) HTTP보다는 강력할 텐데요.

굳이 80 포트를 경유해야 한다면, 어플리케이션이 애플릿을 경유하여
작성하는 것도 괜찮은 방법이리라 생각됩니다.

클라이언트 프로그램 <-> 웹 브라우져 <-> (애플릿) <-- internet -->

웹 서버 <- 서블릿 -> core 서버 프로그램

머 이런식으로 하시는 것보다는 아래것이 더 낫지 않나요?

클라이언트 프로그램 <-- internet --> core 서버 프로그램

도움이 되시면 좋겠네염.

즐건 하루 되세염.
 
   
 
 
 
2003-10-13 14:32:08.0  /  글번호 : 261785 
서블릿과 애플리케이션과의 통신의 예javamaster
 
/**
  @explain : 서블릿테스트 클라이언트 by javamaster
*/
 
import java.io.*; 
import java.net.*;
import java.util.*;

import javax.servlet.*; 
import javax.servlet.http.*; 

public class HttpConnector{   
  DataInputStream dis;
  OutputStreamWriter writer; // 플래쉬 쓰기만
  String id; // 이 클라이언트가 서버로부터 할당받은 고유아이디  
  String host;
  public static void main(String[] args){ 
    HttpConnector con = new HttpConnector();
    con.initConnection("http://211.110.15.5/javamaster/servlet/Proxy2"); // 특정 URL로 서블릿 생성
  }

  /**
    @explain : 초기 접속 협상을 시도함
    @packet : 000    
  */
  public void initConnection(String _host){      
    host = _host;
    try{      
      URL url = new URL(_host);    
      URLConnection rconnector = url.openConnection();        
      rconnector.setDoOutput(true);
      
      Writer flashwriter = new OutputStreamWriter(rconnector.getOutputStream(), "euc-kr");   
      flashwriter.write("000\n");
      flashwriter.flush();
      flashwriter.close();

      dis = new DataInputStream(rconnector.getInputStream());
      // 이부분에서 무한으로 read() 상태에 있게 된다. 서버와의 통신부분의 핵심
      String line="";
      
      while((line = dis.readLine()) != null){
        System.out.println("서블릿으로 부터 : " + line);      
        if(line.indexOf("000") == 0){ // 초기접속 ok이므로, 서버로 부터 고유아이디를 받았다면 writer를 생성해야 함
          id = line.substring(line.indexOf(" ") + 1, line.length());
          //writeToServer("001 " + id);          
        }else if(line.indexOf("001") == 0){
          System.out.println("history : writer생성 협상 성공,, 이후 서버스 진행하면 됨");  
        }else{
          // 이곳에서 클라이언트 프로토콜을 위임함
          System.out.println("서버로 부터 : " + line);  
        }
        System.out.println("서버로부터 데이터가 오기를 대기함");
      }      
      System.out.println("모든 것 종료");
      
    }catch(Exception e){
      e.printStackTrace();  
    }finally{
    
    }      
  } 
  /**
    @explain : 연결된 writer 객체를 이용해서 서버로 전송
  */
  public void writeToServer(String _packet){
    try{
      URL url = new URL(host);    
      URLConnection wconnector = url.openConnection();        
      wconnector.setDoOutput(true);
      
      // 현재의 writer를 멤버writer로 등록
      OutputStreamWriter writer = new OutputStreamWriter(wconnector.getOutputStream(), "euc-kr");        
      writer.write(_packet + "\n");
      writer.flush();
      writer.close();
      System.out.println("서블릿에 전송 : " + _packet);
      // 응답을 받기위해 임의로
      BufferedReader reader2 = new BufferedReader(new InputStreamReader(wconnector.getInputStream(),"latin1"));      
      reader2.close();
    }catch(Exception e){
      e.printStackTrace();  
    }
  }
}
                    
위의 소스는 일본 KDDI 무선네트워크 프로젝트를 하면서 작성한 것입니다
서버 - 서블릿 - 무선핸드폰 이 실제 구조이고
서버 - 서블릿 - 애플리케이션 의 구조로 실제 서비스전에 데이터 통신에
대한 무선핸드폰 부분을 가상 테스트 하게 됩니다.
혹시 일본쪽 프로젝트신가요?

테스트를 해보시고 궁금하신거나 다른 부분에 대한 문의가 있으시면
제 홈페이지에 방문해 보시기 바랍니다.
요즘 문서 정리중이라 서블릿 부분이 추가 되어서.
그럼

javamaster wild world


제RssReader_Http통신예.zip


아파치 HttpClient 3.x 기준 설명 ..1-1. HttpClient 소개
HttpClient은 HTTP상에서 커뮤니케이션을 하는 자바 기반의 어플리케이션 개발을 쉽게 할수 있도록 제공한다.
우리가 웹 브라우저 또는 그에 준하는 어플리케이션을 개발한다면 HttpClient은 우리에게 클라이언트 코드 개발에 도움을 줄수있다.
이름에서 의미하는것과 같이 HttpClient는 오직 HTTP 클라이언트 코드을 위한 컴포넌트이지 HTTP 요청을 처리하는 서버측 프로세스을 지원하지는 않는다.
1-2. 설치
현재 아파치 HttpClient 는 3.0.1 안정버전을 지원한다.
Jakarta Commons HttpClient 페이지에서 다운로드 받으면 된다.
(다운로드 페이지: http://jakarta.apache.org/commons/httpclient/downloads.html)
(최신버전 다운로드:
  - http://jakarta.apache.org/site/downloads/downloads_commons-httpclient.cgi
  - http://mirror.apache-kr.org/jakarta/commons/httpclient/binary/commons-httpclient-3.0.1.zip
)
commons-httpclient-3.0.1.zip 를 받아서 압축을 풀고,
commons-httpclient-3.0.1.jar 를 CLASSPATH 에 추가하면 된다.
1-3. 추가 설정(Dependencies)
http://jakarta.apache.org/commons/httpclient/dependencies.html
 

Artifact ID  Type  Version  Scope  URL  Comment
commons-codec jar 1.2  http://jakarta.apache.org/commons/codec/
                       http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi
commons-logging jar 1.0.4  http://jakarta.apache.org/commons/logging/ 
junit jar 3.8.1 test  http://www.junit.org/


[JAVA] httpClient 샘플  ============================
출처 ; http://www.albumbang.com/board/board_view.jsp?board_name=free&no=126


package test;



import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.MultipartPostMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.util.EncodingUtil;

public class HttpClientHelper {
    public HttpClientHelper(String urlStr){
        this.urlStr = urlStr;
        paramList = new ArrayList();
    }

    private String urlStr = "";
    private String content = "";
    private int methodType = 0;
    private int iGetResultCode = 0;
    private int connectionMaxTime = 5000;

    private static final int GETTYPE = 0;
    private static final int POSTTYPE = 1;
    private static final int MULTIPARTTYPE = 2;

    public String getContent() {
        return content;
    }

    public int getIGetResultCode() {
        return iGetResultCode;
    }

    private List paramList = null;

    public void setParam(String key, String value) {
        paramList.add(new NameValuePair(key,value));
    }

    public int getMethodType() {
        return methodType;
    }

    public void setMethodType(int methodType) {
        this.methodType = methodType;
    }

    public int execute() {
        iGetResultCode = 0;
        HttpClient client = null;
        HttpMethod method = null;
        NameValuePair[] paramArray = new NameValuePair[paramList.size()];
        paramList.toArray(paramArray);
        try {
            client = new HttpClient(new MultiThreadedHttpConnectionManager());
            client.setTimeout(getConnectionMaxTime());

            if(methodType == GETTYPE){
                GetMethod getMethod = new GetMethod(urlStr);
                if(paramArray.length > 0)
                    getMethod.setQueryString(EncodingUtil.formUrlEncode(paramArray,"euc-kr"));
                method = getMethod;
            }else if(methodType == POSTTYPE){
                PostMethod postMethod = new PostMethod(urlStr);
                for(int k = 0; k < paramArray.length; k++){
                    postMethod.addParameter(paramArray[k].getName(), new String(paramArray[k].getValue().getBytes(),"ISO-8859-1"));
                }
                method = postMethod;
            }else if(methodType == MULTIPARTTYPE){
                MultipartPostMethod multipartPostMethod = new MultipartPostMethod(urlStr);
                for(int k = 0; k < paramArray.length; k++){
                    multipartPostMethod.addParameter(paramArray[k].getName(), paramArray[k].getValue());
                }
                method = multipartPostMethod;
            }
            // method.setFollowRedirects(true);

            iGetResultCode = client.executeMethod(method);
            if(iGetResultCode == HttpStatus.SC_OK)
            {
                content = method.getResponseBodyAsString();
            }
        } catch (Exception e) {
            iGetResultCode = 0;
        }finally{
            if(method != null) method.releaseConnection();
        }
        return iGetResultCode;
    }

    public int getConnectionMaxTime() {
        return connectionMaxTime;
    }

    public void setConnectionMaxTime(int connectionMaxTime) {
        this.connectionMaxTime = connectionMaxTime;
    }
}



--------------------------------------------------------------------------------


package test;



import gshs.eshop.common.httputil.HttpClientHelper;



public class TestSimple {
    private void testPostMethod() {
        System.out.println("testPostMethod() start ###################################");

        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        // 넘겨줄 파라미터 세팅
        test.setParam("act", "/servlet/KBoard?tableName=kjsp");
        // setMethodType을 지정하지 않으면 default = 0, (0:get, 1:post, 2:multipart)
        test.setMethodType(1);
        // connection 연결시간 설정 default = 5000;
        test.setConnectionMaxTime(5000);

        int rtnCode = test.execute(); // 실행하기
        System.out.println(rtnCode); // 결과 값. 200이면 정상
        System.out.println(test.getIGetResultCode()); // rtnCode 값을 결과 값이다.
        System.out.println(test.getContent()); // 해당 페이지의 내용 불러오기
    }

    private void testGetMethod() {
        System.out.println("testGetMethod() start ###################################");
        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        test.setParam("act", "/servlet/KBoard?tableName=kjsp");
        // setMethodType을 지정하지 않으면 default = 0, (0:get, 1:post, 2:multipart)
        test.setMethodType(0);
        // connection 연결시간 설정 default = 5000;
        test.setConnectionMaxTime(5000);

        int rtnCode = test.execute();
        System.out.println(rtnCode); // 결과 값. 200이면 정상
        System.out.println(test.getIGetResultCode()); // rtnCode 값을 결과 값이다.
        System.out.println(test.getContent()); // 해당 페이지의 내용 불러오기
    }

    private void testGetMethodSample() {
        System.out.println("testGetMethodSample() start ###################################");
        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        test.setParam("act", "/servlet/KBoard?tableName=kjsp");
        // setMethodType을 지정하지 않으면 default = 0, (0:get, 1:post, 2:multipart)
        test.setMethodType(0);
        // connection 연결시간 설정 default = 5000;
        test.setConnectionMaxTime(5000);

        int count = 5;
        int rtnCode = 0;
        for (int i = 0; i < count; i++) {
            System.out.println("count : " + (i + 1));
            rtnCode = test.execute();
            if (rtnCode == 200) {
                break;
            }
        }
        if (rtnCode == 200) {
            System.out.println(test.getIGetResultCode());
            System.out.println(test.getContent());
        }
    }

    private void testNoMethodOnlyUrl() {
        System.out.println("testNoMethodOnlyUrl() start ###################################");
        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp?act=/servlet/KBoard?tableName=kjsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        int rtnCode = test.execute();
        System.out.println(rtnCode); // 결과 값. 200이면 정상
        System.out.println(test.getIGetResultCode()); // rtnCode 값을 결과 값이다.
        System.out.println(test.getContent()); // 해당 페이지의 내용 불러오기

    }

    public static void main(String[] args) {
        TestSimple test = new TestSimple();
        test.testGetMethod();
        test.testPostMethod();
        test.testNoMethodOnlyUrl();
        test.testGetMethodSample();
    }
}



HttpClient 4.x버전으로 올라오면서 조쿰 바뀐 것 같습니다.
기록용으로 기록합니다-_-
아래 예제는.....티월드사이트의 무료사용량 조회 예제입니다-_-







출처 : http://mudchobo.tomeii.com/tt/479

Java] HttpClient 4.x 버전 예제


import java.net.URI;import java.util.ArrayList;import java.util.List;
import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;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.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;
publicclassMain{
/**

     * @param args

     */publicstaticvoid main(String[] args)throwsException{HttpClient httpclient =newDefaultHttpClient();

        String id ="t월드 아이디";String pw ="비밀번호";

        List<NameValuePair> qparams =newArrayList<NameValuePair>();

        qparams.add(newBasicNameValuePair("URL","http://www.tworld.co.kr/loginservlet.do?returnURL=http%3A%2F%2Fwww.tworld.co.kr&kind=&popup=&cmd=&reload=&ID="+ id));

        qparams.add(newBasicNameValuePair("ID", id));

        qparams.add(newBasicNameValuePair("PASSWORD", pw));

        qparams.add(newBasicNameValuePair("SERVERIP","203.236.20.129"));

        qparams.add(newBasicNameValuePair("X","0"));

        qparams.add(newBasicNameValuePair("Y","0"));UrlEncodedFormEntity entity =newUrlEncodedFormEntity(qparams,"UTF-8");HttpPost httpPost =newHttpPost("http://nicasams.sktelecom.com:2040/icas/fc/LogOnSV");

        httpPost.setEntity(entity);

        ResponseHandler<String> responseHandler =newBasicResponseHandler();String responseBody ="";HttpResponse response = httpclient.execute(httpPost);Header[] headers  = response.getAllHeaders();

        httpclient =newDefaultHttpClient();HttpGet httpGet =newHttpGet();if(headers.length >1){String url = headers[1].getValue();System.out.println("url = "+ url);

            httpGet.setURI(new URI(url));

            responseBody = httpclient.execute(httpGet, responseHandler);System.out.println(responseBody);}

        httpGet.setURI(new URI("http://www.tworld.co.kr/normal.do?serviceId=S_BILL0070&viewId=V_CENT0261"));

        responseBody = httpclient.execute(httpGet, responseHandler);

        System.out.println("result = "+ responseBody);}}

java Framework/java]Bean to XML



package org.kodejava.example.bean;

import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;

public class BeanToXML {
    private Long id;
    private String itemName;
    private String itemColour;
    private Integer itemQuantities;

    public static void main(String[] args) {
        BeanToXML bean = new BeanToXML();
        bean.setId(new Long(1));
        bean.setItemName("T-Shirt");
        bean.setItemColour("Dark Red");
        bean.setItemQuantities(new Integer(100));
       
        try {
            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
                    new FileOutputStream("Bean.xml")));

            //
            // Write an XML representation of the specified object to the output.
            //
            encoder.writeObject(bean);
            encoder.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Long getId() {
        return id;
    }

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

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getItemColour() {
        return itemColour;
    }

    public void setItemColour(String itemColour) {
        this.itemColour = itemColour;
    }

    public Integer getItemQuantities() {
        return itemQuantities;
    }

    public void setItemQuantities(Integer itemQuantities) {
        this.itemQuantities = itemQuantities;
    }
}


The XML persistence will be like:
<?xml version="1.0" encoding="UTF-8"?> 

<java version="1.6.0_02" class="java.beans.XMLDecoder"> 

 <object class="org.kodejava.example.bean.BeanToXML"> 

  <void property="id"> 

   <long>1</long> 

  </void> 

  <void property="itemColour"> 

   <string>Dark Red</string> 

  </void> 

  <void property="itemName"> 

   <string>T-Shirt</string> 

  </void> 

  <void property="itemQuantities"> 

   <int>100</int> 

  </void> 

 </object> 

</java>