urlconnection 기능확장으로 편리하게 사용하기
사용법
String url = "/test/test.jsp";
//일반적으로 text기반
byteResult = WebUtil.callUrlConnect(url,null,false);
out.println("byteResult = "+new String(byteResult));
//binary file
byteResult = WebUtil.callUrlConnect(url,null,true);
기능
- jsp,html 등 웹 text기반 resource 호출가능
- xml 유니코드 호출가능 (한글깨짐방지)
-이미지,플래쉬,동영상등 바이너리 데이타 처리하여 파일로 저장 가능
/**<PRE>
* TODO:
* @param serverUrl : 호출할 URL
* @param hs : 파라미터를 넘길때 사용할 해쉬테이블
* @param bBinary : true-> 바이너리 모드로 호출 false->ascii 모드로 호출
* @return
* @throws java.net.MalformedURLException
* </PRE>
*/
public static byte[] callUrlConnect(String serverUrl,Hashtable hs,boolean bBinary) throws java.net.MalformedURLException
{
URL url = null;
URLConnection connection = null;
//binary
OutputStream outStream = null;
InputStream inStream = null;
BufferedInputStream bufInStream = null;
//text
Writer writer = null;
java.io.Reader reader = null;
BufferedReader buf = null;
String output = null;
StringBuffer sb = new StringBuffer();
byte[] bufferResult = null;
try
{
url = new URL(serverUrl);
connection = url.openConnection();
connection.setDoOutput(true); //post방식:true
connection.setDoInput(true); //데이타 첨부되는 경우
//헤더 셋팅- 웹서버마다 헤더정보가 부족하면 405에러를 반환하기도 한다.
connection.setRequestProperty("Accept","*/*");
connection.setRequestProperty("Accept-Charset","euc-kr");
// connection.setRequestProperty("host",getHostIP());
connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; i-NavFourF; .NET CLR 1.1.4322)");
outStream = connection.getOutputStream();
//일반 text 파일 요청시
//서버로 데이타를 보낼때.. writer를 사용
writer = new OutputStreamWriter(outStream);
//DataOutputStream doutput = new DataOutputStream(outStream);
// form data 를 넣어줄때
if(hs != null)
{
String sKey = null;
String param = "";
for (Enumeration e = hs.keys() ; e.hasMoreElements() ;)
{
sKey = (String)e.nextElement();
param += sKey+"="+(String)hs.get(sKey)+"&";
}
writer.write(param);
//doutput.writeBytes(param);
// writer.write("&pnum1="+URLEncoder.encode(pnum1));
// writer.write("&pnum2="+URLEncoder.encode(pnum2));
}
writer.flush();//내부버퍼에 있는 모든 데이타를 전송하도록 한다.
writer.close();
// doutput.flush();
// doutput.close();
outStream.close();
// doutput = null;
writer = null;
outStream = null;
// int response_code = connection.getResponseCode();
//보낸데이타를 받는다.
inStream = connection.getInputStream();
//text 읽을때..
if(bBinary == false)
{
//스트링 버퍼로 변환하기 위해서는 아래처럼 한다.
//euc-kr로 안하면 euc-kr로 인코딩 안된 문서는 utf-8로 읽어들이면서 sun.io.MalformedInputException을 발생
//euc-kr하면 xml등을 호출시 유니코드 한글이 ???로 나온다.
//reader = new InputStreamReader(inStream,"euc-kr");
//cp949로 하면 euc-kr도 커버하면서 xml 유니코드 한글도 잘 나온다.
reader = new InputStreamReader(inStream, "cp949");
buf = new BufferedReader(reader);
// log("----- callUrl Result START---------------------\n");
while((output = buf.readLine()) != null)
{
// log(output+"\n");
if(!output.equals(""))
{
output.trim();
sb.append(output+"\r\n");
}
}
bufferResult = sb.toString().getBytes();
}else
{
//binary로 읽을 때..(이미지,swf등을 다운로드 할때사용하면 됨)
bufInStream = new BufferedInputStream(inStream);
int bufferOffset = 0;
int nReadSize = 0;
int bufferCapacity = bufInStream.available()+1;
System.out.println("--------------------------------------");
System.out.println("[binary] 초기버퍼사이즈 = "+bufferCapacity);
bufferResult = new byte[bufferCapacity];
// log("----- callUrl Result START---------------------\n");
// while((i = bufInStream.read(bResult)) != -1);
//BufferedInputStream가 끝이 아닐때까지 돌면서 버퍼에 채우고 채워진 버퍼를 화면에 출력
while((nReadSize = bufInStream.read(bufferResult,
bufferOffset,
bufferCapacity-bufferOffset)) != -1)
{
bufferOffset += nReadSize;
System.out.println("[binary] nReadSize = "+nReadSize+"/ bufferOffset = "+bufferOffset);
if(bufferOffset >= bufferCapacity)
{
System.out.println("[binary] 버퍼확장 bufferSize = bufferCapacity "+bufferOffset+" = "+bufferCapacity);
//bufferResult를 확장한다.
bufferCapacity *= 2;
byte[] newBuffer = new byte[bufferCapacity];
System.arraycopy(bufferResult,0,newBuffer,0,bufferOffset);
//reference를 변경
bufferResult = newBuffer;
}
}
System.out.println("[binary] 최종 읽은 사이즈 = "+bufferResult.length);
System.out.println("--------------------------------------");
/*
* binary file 생성 test 소스 - stream으로 기록해야한다.
File newFile = new File("/home/webroot/download/logo2.gif");
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(newFile));
bout.write(bResult);
bout.flush();
bout.close();
*/
}
}catch(java.net.ConnectException e)
{
sb = null;
sb = new StringBuffer();
sb.append(EventLogManager._CONNECT_ERROR_+" | "+e.toString());
}catch(java.net.SocketException e)
{
sb = null;
sb = new StringBuffer();
sb.append(e.toString());
}catch(java.io.IOException e)
{
sb = null;
sb = new StringBuffer();
sb.append(e.toString());
}finally
{
try
{
// System.out.println("통신 스트림 객체 해제중...");
if(writer != null)
{
writer.close();
writer = null;
}
if(outStream != null)
{
outStream.close();
outStream = null;
}
if(inStream != null)
{
inStream.close();
inStream = null;
}
if(reader != null)
{
reader.close();
reader = null;
}
if(buf != null)
{
buf.close();
buf = null;
}
if(bufInStream != null)
{
bufInStream.close();
bufInStream = null;
}
}catch(java.io.IOException e1)
{
e1.printStackTrace();
}
}
return bufferResult;
}
'scrap > Java/JSP' 카테고리의 다른 글
java - system 정보 가져오기 (3) | 2011.07.05 |
---|---|
JAVA - 자바로 프로세스 관리 (0) | 2011.07.04 |
파싱?.? (0) | 2011.06.27 |
HttpURLConnection클래스로 웹페이지 POST 요청하기 (2) | 2011.06.27 |
웹사이트의 내용을 긁어오는 Webspider (0) | 2011.06.27 |