The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit
원인 : jsp에서 컴파일한 파일 크기가 65535 bytes를 넘을 경우에 발생
해결책 : 해결책은 web.xml설정을 변경하거나 jsp를 쪼개면 된다.
1. 톰캣이나 웹로직의 경우 web.xml에 mappedfile를 설정하면 된다.
단, 가끔 웹로직의 경우 버전에 따라서 해당 설정이 적용되지 않을 때가 있다. 그럴 경우에는 편법이 없으므로 jsp를 쪼개는 방법 밖에 없으니 더 찾지 말자.
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
2. jsp를 쪼개를 방법
기존에 include file로 되어있으면 해당 파일을 include page로 변경한다. include file의 경우 말 그대로 include한 파일의 코드를 호출 jsp에 삽입하고 난 뒤에 컴파일을 하는 방식이지만, include page의 경우 include한 파일을 컴파일한 결과를 호출한 파일에 삽입하는 방식으로 jsp 파일을 컴파일 할 때 크기를 줄여준다. 만약 하나의 jsp가 문제가 된다면 해당 jsp를 2, 3개의 jsp로 코드를 나눠준다.
예를 들면 아래와 같은 코드가 있다고 가정한다.
<% String ans = "Y";
if(ans.equals("Y")){%>
<h5>정답입니다.</h5>
<%}else{%>
<h5>정답이 아닙니다.</h5>
<%}%>
include file의 경우 if문에 따라서 html이 다르게 들어간다면 아예 if문 구문을 호출 jsp에 삽입하여 호출 jsp의 코드들과 같이 한번에 컴파일이 되고 그제서야 if문을 실행한다.
하지만 include page의 경우는 해당 코드가 전부 컴파일 되고난 뒤 jsp가 호출 jsp에 들어간다.
즉, 코드가 많은 양을 한번에 컴파일 하는 게 아니라 쪼개서 컴파일을 하므로 limit에 걸리지 않는다.
다만 미리 컴파일한 코드를 호출한 jsp에 넣는 것이기 때문에 include file과는 다르게 변수를 공유할 수 없다. 그래서 include page의 경우는 호출 시에는 파라미터를 전송해하고 호출된 페이지에서는 jsp를 받아서 써야한다.
include file의 경우 | include page의 경우 | |
호출시 | String ans = "Y"; <%@ include file="./b.jsp"%> |
String ans = "Y"; <jsp:include page="./b.jsp"> <jsp:param name="ans" value="<%=ans %>"/> </jsp:include> |
호출 jsp 변수 사용 시 | <% if(ans.equals("Y")){ %> <h5>정답입니다.</h5> <%}else{%> br />%> <h5>정답이 아닙니다.</h5> <%}%> |
<% String ans = request.getParameter("ans"); if(ans.equals("Y")){ %> <h5>정답입니다.</h5> <%}else{%> br />%> <h5>정답이 아닙니다.</h5> <%}%> |
+ 실무에서는 String이나 int 뿐만이 아닌 HashMap이나 ArrayList같은 변수를 넘겨야하는 경우는 attribute를 이용하면된다.(json의 경우는 gson을 이용하면 편리하다.)
a.jsp
<% ArrayList<map<String, String>> ansList = [
{"color": "red","text":"정답입니다."},
{"color": "blue","text":"정답이 아닙니다."}
];%>
<jsp:include page="./b.jsp">
<jsp:param name="ansList" value="${ansList}"/>
</jsp:include>
b.jsp
<% ArrayList<map<String, String>> ansList = (ArrayList)request.getAttribute("ansList");
for (int i = 0; i < ansList.size(); i++) {
Map<String,String> obj = ansList.get(i);
String color = obj.get("color");
String text = obj.get("text"); %>
<h5 style="color:<%=color%>"><%=text %></h5><br>
<%}%>