Tomcat 6, 7 의 EL 표현식 해석 시 존재하는 버그 분석

2831 단어 EL표현식Tomcat
오늘 데이터 페이지를 나누어 표시할 때 문제가 발생했습니다. 테스트를 통해 Tomcat6의 버그가 확인되었습니다. 제가 사용한 버전은:apache-tomcat-6.0.36, 7.0.30입니다.다음은 이 버그를 상세하게 설명합니다.
이 버그는 JSTL 탭에서 발견되었으며, 나중에 EL 표현식이 실현될 때 발생한 문제로 분석되었습니다.jsp 페이지에 리스트가 하나 있습니다. 이 리스트의 유형은 ArrayList입니다. 제가 그 안에 놓은 데이터는 (제가 수조로 쓸 수 있도록 하기 위해): ["1", "...","4","5","6","7","8","...",'10'], 이것은 매우 흔히 볼 수 있는 페이지 번호 축소판이 있는 페이지 내비게이션이다.이 데이터를 보여줄 때 나는 아래의 코드를 사용했다

<c:forEach var="looper" items="${pageHelper.pageList}">
 <c:choose>
  <c:when test="${looper eq pageHelper.pageDot}">
  <p> </p>
  </c:when>
  <c:when test="${looper eq pageHelper.pageNo}">
  <p> ${looper} </p>
  </c:when>
  <c:otherwise>
  <p> :${looper}</p>
  </c:otherwise>
 </c:choose>
</c:forEach>
여기 페이지헬퍼는 바로 페이지 구성 요소입니다. 그 중에서 페이지Dot은 "..."로 미리 설정되어 있습니다.페이지 No 는 현재 페이지 번호 (6 으로 가정), 페이지 구분 커서를 직접 표시합니다.순환 반복에서 가장 기본적인 조건 판단 문장을 사용했을 뿐이다. 페이지 리스트는 정의에서 리스트 이라고 명확하게 지적했기 때문에 논리적으로 eq는 문자열에 따라 판단해야 하는데 뜻밖에도 이상이 생겼다

javax.el.ELException: Cannot convert ... of type class java.lang.String to class java.lang.Long
왜'유형 변환 오류'가 발생했을까?코드의 방향을 분석함으로써 순환에 들어간 후 list의 첫 번째 데이터는 "1"이고 pageHelper입니다.pageNo는 long형입니다. 이 때tomcat의 EL 표현식 해석기는 looper 형식을 Long형으로 변환합니다. pageHelper가 아니라.페이지 No 유형을 String으로 변환하여 비교합니다. 다음 요소로 이동할 때 looper = "..."이 때 looper의 형식이 확정되었습니다. 비교할 때tomcat에서 looper를 Long 형식으로 바꾸려고 시도했기 때문에 오류가 발생했습니다.
이를 위해 나는 전문적으로 실례 코드를 하나 썼다

<c:forEach var="looper" items="${pageHelper.pageList}">
 <c:choose>
  <c:when test="${looper eq fn:trim(pageHelper.pageDot)}">
  <p> </p>
  </c:when>
  <c:when test="${looper eq fn:trim(pageHelper.pageNo)}">
  <p> ${looper} </p>
  </c:when>
  <c:otherwise>
  <p> :${looper}</p>
  </c:otherwise>
 </c:choose>
</c:forEach>
간단하다. 비교할 때마다 후자를 fn:trim 방법으로 좌우 비가시 문자를 제거한다.String 형식으로 강제로 변환하는 것과 같습니다. 이 때tomcat은 코드를 정상적으로 해석할 수 있으며 오류가 발생하지 않습니다.
같은 코드를 Resin에 배치하면 수정 전이든 수정 후든 정상적으로 실행될 수 있음을 알 수 있습니다. 이것은tomcat의 버그일 것입니다.
예제 코드:다운로드 클릭
tomcat에 오류를 보고하도록 하는 프레젠테이션 주소:/bug/show.do
이 버그를 피하는 방법 설명 주소:/bug/avoid.do
상기 주소 전에 프로젝트 이름을 추가해야 할 수도 있습니다. (구체적으로 이 프로젝트를 어떻게 배치하느냐에 달려 있습니다.)

좋은 웹페이지 즐겨찾기