이 문제는 은근히 자주 발생하는 편이다.
가장 흔한 발생 이유가
1. response 에서 getOutputStream()을 호출하여 outputStream을 꺼내 올때이다.
Weblogic 환경에서는 별 문제 없었지만 몇몇의 환경에서는 에러를 배출한다.
이런 방식을 안쓰는 것이 정신건강에 좋겠지만 String을 이것저것 붙여서 성능상에 너무 문제가 된다는 생각을 갖고 계신 분이라면 JspPrinter(JSP 내의 out 변수) 를 이용하여 직접 print 처리한다면 이러한 문제를 해결 할 수 있다.
2. inlucde page 시에 발생한다.
이는 구글링을 한 결과 bufferSize가 너무 작아서 발생한다고 한다. include 직전에 flush를 해서 buffer를 비우고 flush 이후에는 열심히 스트림에 써도 결국 에러만이 남을뿐........
간단히 bufferSize를 넉넉하게 늘려주면 별 문제 없다.
번외로....(삽질의 산출물)
include page 시에 include 된 페이지 내용까지는 잘 나오는데 include 이후 내용이 나오지 않는 경우에는
거의 99.9% include 된 페이지가 foward를 사용하는 경우이다.
TAG response
JSP 스펙에는 분명 print 메소드에 String을 넘 길 경우 null 을 출력하는 게 맞지만
null 처리등이 너무 불편한게 사실이다.
어제 갑자기 회사에서 자주 사용하는 Weblogic이 아닌 JBoss에 어플리케이션을 돌리는 상황이 생기게 되었다.
역시 화면 가득 null 이 출력되었고 해결방법을 알아 보기 시작했는데.....
Weblogic 에서는
PrintNulls 이라는 옵션으로 이 기능을 지원하고
Jeus 에서는
java 실행시에 옵션으로 jeus.servlet.print.null.as.emptystring=true
을 지원하여 이기능을 지원하지만
Tomcat 과 Tomcat 이 기반인 JBoss 는 이러한 기능을 아무리 눈씻고 쳐다봐도 찾을 수가 없었다.
결국 대책을 강구하던중 생각 해본게 문제가 되는 JspPrinter 의 print 메소드를 바꿔버리면 어떨까 생각을 하던중
아예 JspPrinter를 갈아 치우면 어떨까라는 생각이 스치고 지나 갔다.
다행히 모든 회사에서 사용하는 모든 JSP는 특정 JSP를 include file 되어 있기때문에
손쉽게 해결 할 수 있는 냄새를 맡았다. (ㅡㅡ;)
JspPrinter 상속하는 클래스 생성 (JspPrinterNullToBlank)
JspPrinterNullToBlank 내부에 JspPrinterImpl을 변수로 지정
!!!!! JspPrinterImpl 란 Tomcat에서 JspPrinter를 실제로 구현한 클래스다.(jasper runtime 어쩌구 패키지)
!!!!! JspPrinter 를 사용하고 싶었지만 슬프게도 JspPrinter는 추상 클래스라 clear()를 직접 구현해야 했다.
!!!!! 내가 직접 구현할 수 도 없기에 그냥 JspPrinterImpl 을 선택해야만 했다.
!!!!! 이는 곧 Tomcat/JBoss 아니면 실행불가 ㅡㅡ;
!!!!! 하지만 아래에서 나오는 include 되는 JSP 에서 코드를 제거하면 다른데서도 잘 된다.(하하하)
JspPrinterImpl 를 객체 내로 모시는 메소드 생성(setJspPrinterImpl)
JspPrinter 모든 메소드 오버라이드 & Delivery
public void print(String arg0) 메소드만 Delivery 하기 전에
if(arg0 == null) return;
한줄을 추가
include 되는 JSP에
JspPrinterNullToBlank jpntb = new JspPrinterNullToBlank(...); // 어차피 껍대기라 아무거나 넣어서 기억 안남
jpntb.setJspPrinter(out);
out = jspntb;
추가하여 교체 작업 끝...
뭔가 좀 깔끔한 맛은 없지만 별 문제 없이 잘 돌아 간다.
다만 아쉬운 것은 jsp include 에서 처리 하지 않고 다른방식이 있지 않을까 하는 생각이다..
jsp 의 java 코드가 되어 들어 가게되는
_jspService(HttpServletRequest request, HttpServletResponse response) 메소드의 파라미터에
JspPrinter 가 없는 걸 봐서는 메소드 내에서 JspPrinter는 out 이란 변수에 지정이되는 듯 하고
특히 JBoss 나 Tomcat 에서는 response 에서 outputStream을 한번 이상 꺼내면 에러를 뱉어 내니 사실상 inlude의 방법 밖에 없다는 어제의 판단 이었다.
혹시 다른 방법을 아시는 분이 계시다면 부탁드리옵니다. (_ _ )
TAG jboss
블로그에 소스 코드를 올릴 때 좀 난감한 부분이 있는데 좋은것을 발견했다.
앞으로 소스코드를 예쁘게 올릴 수 있을것 같다.
아래의 링크로 가보면 너무나 자세히 설명해 주셔서 그냥 따라만 하면 될것이다.
설명
http://gongdosoft.com/340



