JSP.13.8 예제 간단한 태그 핸들러 시나리오가 작동하지 않습니까?

StackOverflow https://stackoverflow.com/questions/624607

  •  05-07-2019
  •  | 
  •  

문제

이 테스트는 독서로 인해 촉발되었습니다 Sun Java 포럼에 관한 질문 그리고 내가 시도해 볼 것이라고 생각했습니다. JSP2.0 사양 섹션 JSP.13.8에는 "예제 간단한 태그 핸들러 시나리오"가 포함되어 있습니다. 코드 조각을 복사하고 붙여 넣고 실행하려고 시도했습니다.

환경 : Apache Tomcat 버전 5.5.26 및 6.0.14 (둘 다 테스트) Java : 1.5

다음과 같이 테스트하는 코드 : JSP 페이지 :

<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:simpletag x="10">
<jsp:attribute name="y">20</jsp:attribute>
<jsp:attribute name="nonfragment">
Nonfragment Template Text
</jsp:attribute>
<jsp:attribute name="frag">
Fragment Template Text ${var1}
</jsp:attribute>
<jsp:body>
Body of tag that defines an AT_BEGIN
scripting variable ${var1}.
</jsp:body>
</my:simpletag>

그리고 태그 파일 :

<%-- /WEB-INF/tags/simpleTag.tag --%>
<%@ attribute name="x" %>
<%@ attribute name="y" %>
<%@ attribute name="nonfragment" %>
<%@ attribute name="frag" fragment="true" %>
<%@ variable name-given="var1" scope="AT_BEGIN" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Some template text.
<c:set var="var1" value="${x+y}"/>
<jsp:invoke fragment="frag" varReader="var1"/>
Invoke the body:
<jsp:doBody/>

이 코드는 JSP2.0 사양의 PDF 사본에서 직접 복사됩니다.
JSP-API의 일부로도 사용할 수 있습니다 여기사소한 변경 - JSP의 호출과 일치하도록 Tagfile의 이름을 SimpleTag.tag에서 SimpleTag.tag로 변경했습니다.
또한 사양의 PDF에서 복사를 시도했습니다 (필요에 따라 따옴표 조정) - 동일한 결과.

페이지를 실행할 때 표준 500 오류 루트 원인으로 끝납니다.

생성 된 JSP의 Line62는 var1 = (java.lang.string) _jspx_page_context.findattribute ( "var1");

자, ClassCastException을 이해할 수 있습니다. VAR1은 문자열이어야하고 실제 속성은 StringReader라고 생각합니다. 그러나 왜 StringReader입니까? 변수는 어디에서 생성 되었습니까? 그리고 왜이 과제를 전혀 시도하고 있습니까?

누군가 나를 올바른 방향으로 가리킬 수 있습니까? 코드/설정에 어떤 문제가 있습니까? 이것이 알려진 문제입니까? 나는 그것을 위해 구글을 봤지만 아무것도 찾을 수 없었습니다.

감사합니다, evnafets


해상도 편집 : ClassCastException은 태그의 라인으로 인해 발생했습니다.

<jsp:invoke fragment="frag" varReader="var1"/>

말한 바와 같이 여기 VarReader 속성은 평가 결과를 StringReader로 저장할 속성을 지정합니다. 예외는 Tomcat 생성 코드로 인해 "var1"값을 검색하고 문자열로 캐스트했습니다. 문자열은 StringReader가 아니기 때문에 그 시점에서 예외가 발생했습니다.

코딩 오류가 "varreader"속성 대신 "var"를 사용해야했는지 여부는 확실하지 않거나 그 중에서도 사용하지 말아야합니다. 그 속성을 제거하면 조각을 완전히 인쇄 한 다음 "var1"의 값으로 본문을 모두 인쇄합니다.

조각 템플릿 텍스트 30. BODOKE : AT_BEGIN 스크립팅 변수 30을 정의하는 태그의 본문

속성 Var = "var1"을 만드는 것은 조각을 실행하고 결과를 Var1에 저장합니다. 그런 다음 신체는이 새로운 VAR1 값으로 평가하여 다음을 초래합니다.

BODY : AT_BEGIN 스크립팅 변수 단편 템플릿 텍스트 30을 정의하는 태그 본문 30

개인적으로 첫 번째 사례는 더 의미가 있다고 생각하지만이 코드는 모범 사례가 아니라 내부 작업의 예로 제시됩니다.
나는 여전히 예제가 어쨌든 컴파일/실행 될 것으로 예상했을 것입니다. 나는 그것이 그렇지 않을 때 상당히 놀랐습니다.

도움이 되었습니까?

해결책

로부터 구문 참조 var 또는 varreader가 있음을 알 수 있습니다

파편 호출의 결과를 저장하기위한 범위가있는 속성의 이름

따라서 샘플 코드에 오류가 포함되어 두렵습니다. JSP의 결과를 작성 해야하는 경우 : 페이지로 직접 호출 해야하는 경우 Var에 할당 할 필요가 없습니다.

"varreader"속성을 남기려고 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top