欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp includ总结 javax.servlet.ServletException: File amp;quot;/demo/header.jsp" not found

程序员文章站 2022-06-04 19:32:01
...

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/>使用流程

  1. 当有jsp使用<jsp:include page="${ctx}/header.jsp"></jsp:include>时,把使用者转成Servlet
  2. header.jsp先转译成Servlet
  3. 使用者Servlet中配置header.jspServlet

验证
在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%>使用流程

  1. jsp文件中引入header.jsp
  2. 使用者转译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页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文档.