翻译后的jsp,继承HttpJspBase实现JspSourceDependent接口
_jspInit()
_jspDestroy()
_jspService()
1. javax.servlet.jsp.PageContext pageContext
2. application = pageContext.getServletContext();
3. config = pageContext.getServletConfig();
4. session = pageContext.getSession();
5. out = pageContext.getOut();
6. java.lang.Object page = this;
7. javax.servlet.http.HttpServletRequest response
8. javax.servlet.http.HttpServletResponse request
9 exception
pageContex application config session out
page request responce exception
jsp指令 include taglib page
include指令 是属于静态包含,它包含的所有多个jsp页面编译成一个Servlet文件
而与之相对的是
reques.getRequestDispatcher("x.jsp").include(request,responcse);
它包含的所有多个jsp页面编译成多个Servlet文件。执行的时候在动态包含内容进来。
面试题:静态包含与动态包含的区别:
静态包含:编译时包含,包含的所有多个jsp页面编译成一个Servlet文件,效率高
动态包含:运行时包含,所有多个jsp页面编译成多个Servlet文件,执行的时候在动态包含内容进来。
pageContext.forword(); 实际上这个是reques.ggetRequestDispatcher().forword()
pagecontext.include();实际上这个是reques.ggetRequestDispatcher().include()
pageContext.getAttribute("",Scope)//从四大域里面查找 page request session application
jsp运行原理:
当JSP页面第一次被访问时,Web服务器会请求交给JSP引擎去处理。
JSP引擎先将JSP页面文件转译成一个Java文件,也就是jsp会被翻译成一个Servlet,
服务器将前Java文件编译成字节码文件,再执行这个字节码文件来响应客户的请求。
当这个JSP页面再次被请求时,只要该JSP文件没有被改动,JSP引擎就直接调用已装载的Servlet。
out
out的类型是JspWrite
JspWrite相当于一种带缓存功能额PrintWrite。
page指令的buffer属性可以调整缓存大小或关闭
只有向out对象写入了内容,且满足如下任一条件时。out对象才会调用ServletResponse.getWrite方法
并通过该方法的PrintWrite对象将out对象的缓冲区内容真正写入到Servlet引擎提供的缓冲区中。
1.设置page指定的buffer属性关闭了out对象的缓存功能
2.out对象的缓冲区已满
3.整个jsp页面结束
面试题:out隐式对象的工作原理。
调用out对象方法写入的数据,首先存储在JspWrite对象的缓冲区里面
当JspWrite对象的缓冲区已满或整个jsp页面结束的时候
JspWrite对象会调用ServletResponse.getWrite()方法返回的PrintWrite对象的write()方法将数据写入Response的缓冲区里面
<jsp:include> --->动态包含,运行时包含
<jsp:forward> --->首页调整。首页不能配置Servlet,
<jsp:param> -->用法给forward的页面传递参数
映射jsp-->映射servlet
<Setvlet>
<servlet-name>xxx</servlet-name>
<jsp-file>/14.jsp</jsp-file>
</Setvlet>
<Servlet-mapping>
<Servlet-name>xxx</Setvlet-name>
<url-pattern>/index.html</url-pattern>
</Servlet-mapping>