jsp includ总结 javax.servlet.ServletException: File amp;quot;/demo/header.jsp" not found
javax.servlet.ServletException: File amp;quot;/demo/header.jsp" not found
错误原因
<jsp:include page="${ctx}/header.jsp"></jsp:include>
${ctx}
是项目名,在登录页设置<c:set var="ctx" scope="application" value="${pageContext.request.contextPath}"/>
注意:使用idea部署时不指定项目名是可以访问成功的,即${ctx}="/"
解决
使用<%@include file="/header.jsp"%>
替换<jsp:include page="${ctx}/header.jsp"/>
为什么
jsp前台显示时会先转译成Servlet,然后使用javax.servlet.http.HttpServletResponse response
进行前台展示
<jsp:include page="${ctx}/header.jsp"/>
<jsp:include/>
使用流程
- 当有jsp使用
<jsp:include page="${ctx}/header.jsp"></jsp:include>
时,把使用者转成Servlet
, - 把
header.jsp
先转译成Servlet
, - 使用者
Servlet
中配置header.jsp
的Servlet
验证
在Tomcat下\work\Catalina\localhost
下可以找到header_jsp.java
文件,使用者也有对应的文件,打开可以看到
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, (java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${ctx}/header.jsp", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false), out, false);
在Servlet中引用header.jsp<%@include%>
引进的是代码,把代码包含进来,而新进JSP时,会默认生成
<%@include file="/header.jsp"%>
<%@include%>
使用流程
- jsp文件中引入header.jsp
- 使用者转译Servlet
查看jsp转译的文件,发现没有header_jsp.java
,在使用者者中可以看到
out.write("\r\n");
···
···
···
/**
* header.jsp文件中的内容
*/
out.write("</head>");
总结
区别 | include | jsp:include |
---|---|---|
执行时间 | 翻译阶段 | 在请求处理阶段执行 |
引入的内容 | 引入静态文本,先包含,后编译
|
引入执行页面或servlet所生成的应答文本. 被包含的文件先编译,后包含 进来,然后显示 |
翻译阶段:
jsp页面不能原封不动地被传送给浏览器,全部的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来结束的。服务器需要一个jsp容器来处理jsp页面。jsp容器平常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的全部请求。
Jsp容器同时将jsp页面转化成servlet(称为jsp页面实现类—JSP Page implementation class),并编译这个servlet。这两步就组成了翻译阶段.
请求处理阶段:
Jsp容器除了上面提到的同时将jsp页面转化成servlet外,还同时调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文档.