4,511,651 th visitor since 2017.2.1 ( Today : 2218 )
Programming
No. 517
Name. swindler
Subject. JSP/Servlet 에서의 Writer 객체의 혼용 (JEUS)
Main Cate. JSP/Servlet
Sub Cate.
Date. 2009-01-09 11:32
Hit. 5150 (211.43.206.101)
File. aa.png   
제품
JEUS 4, 5
환경
모든 Platform (AIX, HP, SUN, etc)
상세질문
JEUS 5를 사용하고 있습니다.
JSP 코드나 Beans 내에 out.println()과 response.getWriter()를 혼재하여 사용하고 있습니다.
아래는 관련 소스입니다.

# pagegen.jsp
<%@ page import="com.tmax.test.*" %>
<html>
<title>PageGenerator Test Page</title>
<table width="400" bgcolor="red">
<tr>
<td align="center">Jsp area</td>
</tr>
<tr>
<td align="center" height="350">
<%
MakeLayout1 makelayout1 = new MakeLayout1();
makelayout1.makeLayout(request, response, out);
%>
</td>
</tr>
</table>
</html>

# MakeLayout1.java
package com.tmax.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.*;
import javax.servlet.jsp.JspWriter;
public class MakeLayout1
{
public void makeLayout(HttpServletRequest request, HttpServletResponse response, JspWriter out)
{
try
{
MakeLayout2 makelayout2 = new MakeLayout2();
out.println("<table width=300 bgcolor=green>");
out.println("<tr>");
out.println("<td align=center>MakeLayout1 Space</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td align=center height=250>");
makelayout2.makeLayout(request, response);
out.println("</td>");
out.println("</tr>");
out.println("</table>");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

# MakeLayout2.java
package com.tmax.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.*;
import javax.servlet.jsp.JspWriter;
public class MakeLayout2
{
public void makeLayout(HttpServletRequest request, HttpServletResponse response)
{
try
{
PrintWriter out = getWriter(response);
out.println("<table width=200 bgcolor=blue>");
out.println("<tr>");
out.println("<td align=center>MakeLayout2 Space</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td align=center height=150>");
out.println("</td>");
out.println("</tr>");
out.println("</table>");
}
catch (Exception e)
{
e.printStackTrace();
}
}
public PrintWriter getWriter(HttpServletResponse response) throws IOException
{
PrintWriter out = null;
try
{
out = response.getWriter();
System.out.println("response.getWriter() success!");
}
catch (Exception e)
{
e.printStackTrace();
out = new PrintWriter(response.getOutputStream());
}
return out;
}
}

그런데, 동일한 소스를 JEUS 4 와 JEUS 5에서 테스트한 결과가 서로 상이합니다.
JEUS4 vs JEUS5 테스트 결과

[그림] JEUS4 vs JEUS5 테스트 결과

원인은 무엇이며, 해결책은 무엇인가요?

답변
JSP에서 내장객체인 out객체에 대한 print()를 사용할 경우, 내부적으로는
jeus.servlet.jsp2.runtime.JspWriterImpl 객체가 사용됩니다.
response.getWriter()를 사용하게 되면, 내부적으로는 jeus.servlet.engine.io.ServletPrintWriter
객체가 사용됩니다.
원래는 response.getWriter()와 기타 outputStream()의 혼용자체는 Spec에 어긋납니다.

# J2EE1.4 Servlet2.4 Spec 내용중
getOutputStream()
public ServletOutputStream getOutputStream() throws IOException
Returns a ServletOutputStream suitable for writing binary data in the response.
The servlet container does not encode the binary data.
Calling flush() on the ServletOutputStream commits the response. Either this
method or getWriter() may be called to write the body, not both.

따라서, 하나의 출력이 완성되기 위해 즉, 어떤 request가 처리되고 browser에 뿌려지기 위한
최종 버퍼인, ServletOutputStreamWriter로 위의 두개의 객체가 사용한 버퍼가 하나로 합해지지 않으면 당연히 결과는 각각 따로따로 출력됩니다.
# JEUS 버전별 순서 보장 여부
- 순서보장 함 : JEUS4.0.4.6 이상 ~ JEUS4.2x최신까지
- 순서보장 안함 : JEUS55.0 이상

JEUS4.0.4.6 이후 버전에서는 jeus.servlet.out.ensureContentOrder 라는 옵션을 두어
순서보장 유무를 설정할 수 있습니다. ( JEUS4.0.4.6 이상에서 default가 'true'입니다.)
JEUS5.0 이후 버전에서는 default값이 'false'이기 때문에, 윗 사항에 대한
기능요건이 필요한 경우 아래의 두가지 방법을 통해 기능을 활성화 시킬 수 있습니다.

# 하나의 web-context에만 적용시킬 경우 : jeus-web-dd.xml
<jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
<properties>
<property>
<key>jeus.servlet.out.ensureContentOrder</key>
<value>true</value>
</property>
</properties>
</jeus-web-dd>

# 엔진 전체에 적용시킬 경우 : JEUSMain.xml
JEUSMain.xml의 <command-option>에 아래설정 추가
-Djeus.servlet.out.ensureContentOrder=true


[바로가기 링크] : http://coolx.net/cboard/develop/517



Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog