2. 컴퓨터 이야기/프로그래밍

jsp:include 할때 page 에 뭘 넣을까..?

래빗 크리스 2009. 7. 6. 13:24


<jsp:include page="/abc/defg/hij.jsp" flush="true" /> 라고 사용하는 것은 이미 아는 이야기 겠고..
<%@ include file="/abc/defg/hij.jsp" %> 와의 차이점도 아시겠죠..?

물론 두가지 방식 모두 동일 서버나 클러스터링 된 서버 또는,
NetworkFileSystem 이나 NAS 장비가 Mount 되어 있는 서버에서 가져와야 하지요.
다른 URL 을 가지고 있는 다른 물리적인 서버에서는 가져올 수가 없습니다.
동일 서버에 존재하더라도 page 에 "http://.../abc/defg/hij.jsp" 뭐 이렇게 기술하면 오류가 납니다.

그리고 jsp:include 에서 page 에 파라미터를 넣으려면 2가지 방법이 있는데,

<jsp:include page="/abc/def/ghi.jsp" flush="true">
  <jsp:params name="aa" value="bb" />
</jsp:include>

위와 같이 하든지, 아니면 jsp:params 없이 jsp:include 의 page 에 파라미터를 넣으면 되는데..
이때는 /abc/def/ghi.jsp?abc=&def= 뭐 이런식으로 넣으면 안 되고,
<% String url = "/abc/def/ghi.jsp?abc=&def="; %>
<jsp:include page="<%= url %>" flush="true" /> 와 같이 해야 하는 것도 아실테고..

가만 있자.. 아하.. 오늘 이야기 하려는 것은,
일반적인 웹서비스를 통해 접근할 수 없는 파일을 jsp:include 를 통하여 가져오는 방법..

url 에 JSP 파일 하나 넣고, JSP 에서는 화면에 표시하는 내용을 기술하면 되는데..
만약, url 에 파일 내용을 읽어서 가져와야 한다면 어떻게 해야 할까..?
가령, 웹서버를 통해서는 가져올 수 없는 이미지 파일이 있다면..?
첨부 파일을 웹서버의 URI 를 통해서는 닿을 수 없는 곳에 있는 파일을 가져오게 하려면..?
이를테면, 웹서버의 서비스 경로가 아닌 다른 디렉토리에 쌓여 있는 파일을 가져오게 하려면..?
이런 파일들은 웹사이트를 긁어갈 수 있는 웹로봇도 접근이 불가능하니까.. ㅋ
그리고, 해당 파일을 가져오는 것을 jsp 에 구현하고, jsp 는 접근권한을 주면 보안도 확실.
HTML 파일의 경우 문자셋도 고려해야 하는데, 일반적인 방식이라면 이곳에서 설명하는 대로 하면 한글이 깨지지 않죠.

jsp 에서는 다음을 구현하고,

String fileSpec = "/data/path1/path2/file.jpg"; // os 상의 절대 경로를 기술, 웹서비스 상의 절대 경로 아님
File file = new File(fileSpec);
if(file.exists() && file.length()>0){ // 파일이 존재하면 해당 로직을 구현한 Java 에서 해당 파일의 내용을 긁어온다
 fileMng.sendImage(response, fileMng.readImage(file)); // fileSpec OS 상의 절대 경로
}

위에서 fileSpec 에 해당하는 것은 DB 에서 값을 가져올 수도 있겠고, 그냥 파라미터로 가져올 수도 있겠지요.



 java 에서는 다음을 구현한다. 참고로, java 에서 response 개체에 실어 보내야 한다.

/**
 * 데이타를 response 로 내 보낸다<br>
 * 데이타는 HTML 파일 일 수도 있고, Image 파일 일 수도 있다.
 * @param HttpServletResponse 데이타를 내보내는 곳
 * @param byte 데이타
 * @return void
 * @throws Exception
 */
public void sendImage(HttpServletResponse response, byte[] imgContentsArray){

  ServletOutputStream  svrOut   = null;
  BufferedOutputStream outStream  = null; // 버퍼를 적극 활용합시다..

  try{

    svrOut = response.getOutputStream();
    outStream = new BufferedOutputStream(svrOut);
    outStream.write(imgContentsArray, 0, imgContentsArray.length);
    outStream.flush();

  }catch(Exception e){
    StringBuffer sbLog  = new StringBuffer();
    sbLog.append("\n");
    sbLog.append("---.package.class.sendImage(HttpServletResponse response, byte[] imgContentsArray)\n");
    sbLog.append("---.Exception       :" +e.toString()+   "..\n");
    sbLog.append("---.imgContentsArray:" +imgContentsArray+ "..\n");
    System.out.println(sbLog); // println 이기 때문에 맨 뒤에는 sbLog.append("\n"); 불필요.
  }finally{
    if(svrOut!=null){ try { svrOut.close(); } catch(Exception e){} finally { svrOut = null; } }
    if(outStream!=null){ try { outStream.close(); } catch(Exception e){} finally { outStream = null; } }
  }
}


/**
 * File 의 내용을 읽어 온다
 * @param String 파일 경로 (FileSpec)
 * @return byte 데이타
 * @throws Exception
 */
public byte[] readImage(String filePath) throws Exception{

  byte[]     buf    = null;
  DataInputStream in    = null;
  FileInputStream fis    = null;

  try{

    File f = new File(filePath);
    fis = new FileInputStream(f);
    int BUF_SIZE = (int)f.length();
    buf = new byte[BUF_SIZE];
    in = new DataInputStream(fis);
    in.readFully(buf);

  }catch(Exception e){
    StringBuffer sbLog  = new StringBuffer();
    sbLog.append("\n");
    sbLog.append("---.package.class.readImage(String filePath)\n");
    sbLog.append("---.Exception       :" +e.toString()+ "..\n");
    sbLog.append("---.filePath        :" +filePath+   "..\n");
    System.out.println(sbLog); // println 이기 때문에 맨 뒤에는 sbLog.append("\n"); 불필요.
  }finally{
    if(in!=null){ try { in.close(); } finally { in = null; } }
    if(fis!=null){ try { fis.close(); } finally { fis = null; } }
  }

  return buf;
}   


readImage 메소드는 Overiding 을 통해 File 개체를 파라미터로 받도록 해야 위에서 기술한 jsp 와 맞아 떨어진다.
지면의 편의상 String 개체로 FileSpec 을 파라미터로 받는 부분을 설명했다. 여기까지 설명했으면 알아서 할 수 있죠..?
각각의 close 메소드는 finally 에 필히 등록. 아니면 간혹, 서버가 Out of Memory 에 시달릴 수도 ..