2009-12-11 6 views
1

JSPX를 사용하고 이상한 문제가 발생했습니다. jsp : text 내부의 텍스트는 공백을 제거하지 않아야한다고 JSP 문서에 따르면, jspx 뷰에서 사용되는 tagx 파일의 시작 부분에 공백이있는 jsp : text 요소가있을 때, 공백이 사라집니다.jsp : text가 태그 안에 공백을 잃음

저는 인터넷 검색을 많이 해왔지만이 문제의 원인을 찾을 수 없습니다. jspx 뷰에 직접 포함 된 동일한 jsp : text 인스턴스가 올바르게 작동하지만 별도의 tagx 파일에 저장하면이 인스턴스가 손실된다는 것을 확인했습니다.

JSP 2.1 라이브러리를 사용하는 Jetty 6.1.19 및 6.1.22가 적용됩니다.

편집 : 일부 샘플 코드는 다음과 같습니다. <jsp:text> 태그 내에서 앞뒤에 공백이 제거됩니다. 볼 수있는 JSP 문서를 보면, 그 안에있는 공백은 유지되어야한다.

WEB-INF는/탭/nameValuePair.tagx :

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page"> 
<jsp:directive.attribute name="name" type="java.lang.String" required="true"/> 
<jsp:directive.attribute name="value" type="java.lang.String" required="true"/> 
<jsp:text> ${name}=${value} </jsp:text> 
</jsp:root> 

test.jspx :

출력
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:t="urn:jsptagdir:/WEB-INF/tags"> 
<jsp:directive.page contentType="text/html; charset=ISO-8859-1" /> 

<html> 
    <head> 
     <title>Test</title> 
    </head> 
    <body> 
     <t:nameValuePair name="name" value="Google" /> 
     <t:nameValuePair name="age" value="11" /> 
     <t:nameValuePair name="description" value="Popular Search Engine" /> 
     <jsp:text> test=value </jsp:text> 
    </body> 
</html> 

</jsp:root> 

:

<html><head><title>Test</title></head><body>name=Googleage=11description=Popular Search Engine test=value </body></html> 
+0

공백을 점이나 다른 것으로 바꾸면 보존됩니까? 공백을 제거하는 태그를 둘러싼 다른 것이 없습니까? 태그 외부의 공백도 제거 되었습니까? 아니면 사라지는 JSP 공백 문자의 공백 만입니까? – Brimstedt

+0

공백을 잃어버린 jsp : text 태그는 tagx 파일의 jsp : root 바로 아래에 있으며, jspx 파일 내에서 공백을 감추고있는 것은 아무것도 없습니다. 비슷한 jsp : jspx 파일 내부의 텍스트 태그는 앞뒤 공백을 유지하지만 tagx 파일 안의 것들은 그렇지 않습니다. –

+0

나는이 문제가 무엇인지 잘 모르겠습니다. "test = value"에는 출력에 공백이 있습니다. t : nameValuePair 항목에는 공백이 없으며 올바른 항목입니다. 출력이 올바른 것처럼 보입니다! 한 가지 덧글은 닫는 두 개의 태그가 있다는 것입니다. – Joshua

답변

0

그것은 tagx 같은 날에 보이는되고 태그를 작성하는 것이 더 간단 해 지도록 트림됩니다. 예를 들어 끝에있는 새 줄은 태그가 사용되는 공간으로 끝나고 나빠질 수 있습니다.

<jsp:text><span> ${name}=${value} </span></jsp:text> 

또는 비 파괴 공간 사용 : &nbsp;

당신이 트림을 피하기이 방법을 당신이 원하는 결과를 얻을해야 기간에 태그에 텍스트를 두지 왜 비록

.

+0

실제로 렌더링 가능한 컨텐트가 아닌 태그로 HTML 소스를 내보내려고합니다. 따라서 요소 또는   요소를 포함하여 잘못된 것으로 보입니다. –

+0

그러면 jspx를 사용하지 않고 태그를 작성하고 클래스를 사용하여 출력을 제어 할 수 있도록해야합니다. 소스를 어디서 사용하고 싶은지 궁금합니다. 화면에 표시하는 것이 중요하지 않을 수도 있지만 그것이 문제라고 이해할 수있는 저장 소스인가요? – Knubo

0

공백을 잃어 버리는 문제가있었습니다. 프로덕션을 위해 jspx Documents 및 사전 컴파일러를 사용하고 있습니다. 하지만 내 개발 컴퓨터에서 jspx가 바뀔 때마다 jspx 문서를 즉석에서 재 컴파일하기 위해 임베디드 tomcat을 사용하고 있습니다.

먼저 나는 작동이 지침에 내 web.xml

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jspx</url-pattern> 
     <trim-directive-whitespaces>true</trim-directive-whitespaces> 
    </jsp-property-group> 
</jsp-config> 

이 조각과 프리 컴파일러 및 임베디드 바람둥이 컴파일러와 같은 컴파일 결과를 얻을 모두 동일하게 동작 할 필요가 있었다. 이런 식으로하지 당신이 공백을 보존하려고하면 는 않습니다

<span class="ex1"> </span> 
<span class="ex2"><jsp:text> </jsp:text></span> 
<span class="ex3"> <jsp:text><!-- keep --> </jsp:text></span> 
<span class="ex4"><!-- keep --></span> 
<span class="ex5"><span> </span> <!-- keep --></span> 
<span class="ex6">&#032;</span> 
<span class="ex7">&#009;</span> 

이 유일한 옵션입니다 작동하는 나를 위해 :

<span class="ex8">&#160;</span> 
<span class="ex9"><c:out value=" " /></span> 

결과 JSP 컴파일은 다음과 같습니다

out.write("<span class=\"ex1\"/>"); 
out.write("<span class=\"ex2\">"); 
out.write("</span>"); 
out.write("<span class=\"ex3\">"); 
out.write("</span>"); 
out.write("<span class=\"ex4\">"); 
out.write("</span>"); 
out.write("<span class=\"ex5\">"); 
out.write("<span/>"); 
out.write("</span>"); 
out.write("<span class=\"ex6\"/>"); 
out.write("<span class=\"ex7\"/>"); 
out.write("<span class=\"ex8\">"); 
out.write(' '); 
out.write("</span>"); 
out.write("<span class=\"ex9\">"); 
if (_jspx_meth_c_005fout_005f0(_jspx_th_ktr_005fform_005f0, _jspx_page_context)) 
    return true; 
out.write("</span>"); 

그건 그렇고.   참조는 XML에서 줄 바꿈하지 않는 공백으로 out.write (''); 컴파일 된 jsp에서.그러나 비파괴 공간은 보지 못하더라도 보존됩니다. 당신이 hexdump -C test.jspx을 할 경우 얻을 : 우측 열에

6f 75 74 2e 77 72 69 74 65 28 27 c2 a0 27 29 3b |out.write('..');| 

는 ".."비 인쇄 문자 "비 깨는 공간"에 대한 유니 코드는 "C2의 A0"을 보여줍니다.

휴식 공간이 항상 원하는 것은 아니기 때문에 유일한 옵션은 <c: out value=""/>입니다. 다른 옵션이 있다면 의견에 대해 기쁜 마음으로 듣습니다.