今天使用jsp指令元素include将两个jsp页面引入另一个jsp页面,启动服务器发现报500的错误,说index_jsp.class无法找到。于是去本地找了一下,发现确实没有生产.class文件
那说明是.java文件编译生成.class文件的过程中出现了问题,也就是这个.java文件是有bug的,才会导致编译无法通过。
无法通过的jsp页面代码如下图:
index.jsp页面
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2021/6/18 Time: 11:07 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <html> <head> <base href="<%=basePath%>"> <title>title</title> </head> <body> <%@ include file="top.jsp"%> <h1>index页面</h1> <%@ include file="bottom.jsp"%> </body> </html>
top.jsp页面
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2021/6/18 Time: 11:08 To change this template use File | Settings | File Templates. --%> <% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <html> <head> <base href="<%=basePath%>"> <title>title</title> </head> <body> <h1>头部</h1> </body> </html>
问题就出在上面脚本元素中的basePath,因为指令元素的include是静态包含,会将被包含的jsp合并到当前jsp页面中形成一份jsp文件,然后翻译成一份java文件。这样翻译出来的java文件就会有三个basePath
变量的定义,在java中变量只能声明一次,所以编译无法通过,无法生成.class文件,导致异常的发生。
解决办法,只需要将top.jsp和bottom.jsp页面中的String basePath相关的代码删除,保证最后的java文件中不会重复声明变量即可。