본문 바로가기

Server Oriented/Java & JSP

URLDecoder: Illegal hex characters in escape (%) pattern


Jeus1.4.x 에서 Jeus1.6.x 로의 업그레이드시 유의사항도 참고하세요..

o java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "= "

- 여러 원인이 있을 수 있지만 아래 경우도 존재합니다.
A.jsp 가 B.jsp 를 jsp:include 할 때 A.jsp 에서 호출되는 B.jsp 에 파라미터가 동적으로 달린다면 어떻게 하시겠어요..?
파라미터가 없이 호출되는 B.jsp 자체의 파일명도 동적으로 변동된다면 동일한 룰이 적용됩니다.
<% String param1 =  "..."; %>
<jsp:include page="B.jsp?parameter=<%= param1 %>" flush="true" /> 이렇게 하신다구요..?
간편하긴 한데, 컨테이너의 종류나 버전에 따라오류가 발생할 수 있어요..
그래서 아래와 같이 하면, 해결이 됩니다.
<%
     String param1 =  "...";
     String page =  "B.jsp?parameter=" +param1;
%>
<jsp:include page="<%= page %>" flush="true" />

아니면, 아래와 같이 해도 가능해요.. 그런데, 아래와 같이 하면 Jeus1.4 에선 오류가 납니다. 결국 사용 불가.
<jsp:include page="<%=  "B.jsp?parameter=" +param1  %>" flush="true" /> 

<%@ inlcude file="B.jsp" %> 와 같은 정적 포함에서는 B.jsp 호출시 파라미터를 넣을 수 없어요.
이때는 A.jsp 에 param1 이 정의되어 있기 때문에, B.jsp 에서는 A.jsp 에서 정의된 파라미터를 가져다 사용하면 되지요.
jsp:include 로 호출되는 page 에 파라미터를 넣을때 발생하는 이런 경우는,
웹 어플리케이션 서버의 컨테이너 종류나 버전에 따라서 에러가 표시되지 않을 수도 있어요. 에러도 사실 Warning 수준이구요.
그러나, 이런 것이 로그에 많이 쌓여 있으면 정작 중요한 에러를 발견하기 어려우니까 최대한 오류가 발생하지 않도록 코딩합니다.
그리고 아래와 같은 방식의 코딩은 가능합니다.
<%
     String param1 =  "...";
     String param2 =  "...";
     String param3 =  "...";
%>
<jsp:include page="B.jsp">
  <jsp:param name="param1" value="<%= param1 %>" />
  <jsp:param name="param2" value="<%= param2 %>" />
  <jsp:param name="param3" value="<%= param3 %>" />
</jsp:include>


- % 가 들어간 특수문자를 변환..
http://stackoverflow.com/questions/6067673/urldecoder-illegal-hex-characters-in-escape-pattern-for-input-string