티스토리 툴바


이 문제는 은근히  자주 발생하는 편이다.

가장 흔한 발생 이유가

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를 사용하는 경우이다.

Posted by 아오코
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의 방법 밖에 없다는 어제의 판단 이었다.

혹시 다른 방법을 아시는 분이 계시다면 부탁드리옵니다. (_ _ )



 


Posted by 아오코
TAG jboss

블로그에 소스 코드를 올릴 때 좀 난감한 부분이 있는데 좋은것을 발견했다.
앞으로 소스코드를 예쁘게 올릴 수 있을것 같다.
아래의 링크로 가보면 너무나 자세히 설명해 주셔서 그냥 따라만 하면 될것이다.

설명
http://gongdosoft.com/340

해당코드
http://code.google.com/p/syntaxhighlighter/

Posted by 아오코