认识JSP及运行原理!
2018-02-09 16:26
525 查看
每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
request,response,session,application,config这些对象在前面都已经作了详细的介绍,这里重点介绍一下剩下的pageContext对象,out对象,page对象。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:设置page指令的buffer属性关闭了out对象的缓存功能
out对象的缓冲区已满
整个JSP页面结束
out对象的工作原理图
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null. 当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。范例:使用pageContext的findAttribute方法查找属性值
方法接收的资源如果以“/”开头, “/”代表当前web应用。范例:使用pageContext的forward方法跳转到其他页面
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
二、认识九个内置对象
NO. | 内置对象 | 类型 |
1 | pageContext | javax.servlet.jsp.PageContext |
2 | request | javax.servlet.http.HttpServletRequest |
3 | response | javax.servlet.http.HttpServletResponse |
4 | session | javax.servlet.http.HttpSession |
5 | application | javax.servlet.ServletContext |
6 | config | javax.servlet.ServletConfig |
7 | out | javax.servlet.jsp.JspWriter |
8 | page | java.lang.Object |
9 | exception | java.lang.Throwable |
三、内置对象使用说明
3.1、page对象
page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可3.2、out对象
out对象用于向客户端发送文本数据。out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:设置page指令的buffer属性关闭了out对象的缓存功能
out对象的缓冲区已满
整个JSP页面结束
out对象的工作原理图
3.3、pageContext对象
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。3.4、通过pageContext获得其他对象
getException方法返回exception隐式对象getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
3.5、pageContext封装其它8大内置对象的意义
如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将可以获取8大隐式对象,此时这个java对象就可以和浏览器交互了,此时这个java对象就成为了一个动态web资源了,这就是pageContext封装其它8大内置对象的意义,把pageContext传递给谁,谁就能成为一个动态web资源,那么什么情况下需要把pageContext传递给另外一个java类呢,什么情况下需要使用这种技术呢,在比较正规的开发中,jsp页面是不允许出现java代码的,如果jsp页面出现了java代码,那么就应该想办法把java代码移除掉,我们可以开发一个自定义标签来移除jsp页面上的java代码,首先围绕自定义标签写一个java类,jsp引擎在执行自定义标签的时候就会调用围绕自定义标签写的那个java类,在调用java类的时候就会把pageContext对象传递给这个java类,由于pageContext对象封装了对其它8大隐式对象的引用,因此在这个java类中就可以使用jsp页面中的8大隐式对象(request,response,config,application,exception,Session,page,out)了,pageContext对象在jsp自定义标签开发中特别重要。3.6、pageContext作为域对象
pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。 pageContext对象的常用方法1 public void setAttribute(java.lang.String name,java.lang.Object value) 2 public java.lang.Object getAttribute(java.lang.String name) 3 public void removeAttribute(java.lang.String name) 4 public java.lang.Object findAttribute(java.lang.String name)重点介绍一下findAttribute方法,这个方法是用来查找各个域中的属性的,查看这个方法的API可以看到关于这个方法的描述:
Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null. 当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。范例:使用pageContext的findAttribute方法查找属性值
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <head> 5 <title>pageContext的findAttribute方法查找属性值</title> 6 </head> 7 <% 8 pageContext.setAttribute("name1", "孤傲苍狼"); 9 request.setAttribute("name2", "白虎神皇"); 10 session.setAttribute("name3", "玄天邪帝"); 11 application.setAttribute("name4", "灭世魔尊"); 12 %> 13 <% 14 //使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型 15 //查找name1属性,按照顺序"page→request→session→application"在这四个对象中去查找 16 String refName1 = (String)pageContext.findAttribute("name1"); 17 String refName2 = (String)pageContext.findAttribute("name2"); 18 String refName3 = (String)pageContext.findAttribute("name3"); 19 String refName4 = (String)pageContext.findAttribute("name4"); 20 String refName5 = (String)pageContext.findAttribute("name5");//查找一个不存在的属性 21 %> 22 <h1>pageContext.findAttribute方法查找到的属性值:</h1> 23 <h3>pageContext对象的name1属性:<%=refName1%></h3> 24 <h3>request对象的name2属性:<%=refName2%></h3> 25 <h3>session对象的name3属性:<%=refName3%></h3> 26 <h3>application对象的name4属性:<%=refName4%></h3> 27 <h3>查找不存在的name5属性:<%=refName5%></h3> 28 <hr/> 29 <h1>使用EL表达式进行输出:</h1> 30 <h3>pageContext对象的name1属性:${name1}</h3> 31 <h3>request对象的name2属性:${name2}</h3> 32 <h3>session对象的name3属性:${name3}</h3> 33 <h3>application对象的name4属性:${name4}</h3> 34 <h3>不存在的name5属性:${name5}</h3>运行结果: EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。pageContext对象中封装了访问其它域的方法
1 public java.lang.Object getAttribute(java.lang.String name,int scope) 2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope) 3 public void removeAttribute(java.lang.String name,int scope)代表各个域的常量
1 PageContext.APPLICATION_SCOPE 2 PageContext.SESSION_SCOPE 3 PageContext.REQUEST_SCOPE 4 PageContext.PAGE_SCOPE范例:pageContext访问其它域
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <head> 5 <title>pageContext访问其它域</title> 6 </head> 7 <% 8 //此时相当于往session对象中存放了一个name属性,等价于 session.setAttribute("name","孤傲苍狼"); 9 pageContext.setAttribute("name","孤傲苍狼",PageContext.SESSION_SCOPE); 10 %> 11 <% 12 //取得session对象的属性,使用pageContext对象获取 13 String refName1 = (String)pageContext.getAttribute("name",PageContext.SESSION_SCOPE); 14 //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型 15 String refName2 = (String)session.getAttribute("name"); 16 %> 17 <h1>取出存放在session对象中的属性值:</h1> 18 <p>第一种做法:使用pageContext.getAttribute("attributeName",PageContext.SESSION_SCOPE);去取出session对象中值</p> 19 <h3>姓名:<%=refName1%></h3> 20 <p>第二种做法:使用session.getAttribute("attributeName");去取出session对象中值</p> 21 <h3>姓名:<%=refName2%></h3>
3.7、PageContext引入和跳转到其他资源
PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。方法接收的资源如果以“/”开头, “/”代表当前web应用。范例:使用pageContext的forward方法跳转到其他页面
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <head> 5 <title>使用pageContext的forward方法跳转页面</title> 6 </head> 7 <% 8 //使用pageContext的forward方法跳转到pageContextDemo05.jsp页面,/代表了当前的web应用 9 pageContext.forward("/pageContextDemo05.jsp"); 10 //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath) 11 //使用RequestDispatcher的forward方法实现的跳转方式 12 //pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response); 13 %>运行结果如下:
1 pageContext.forward("/pageContextDemo05.jsp");这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);这种写法的。在实际开发中,使用pageContext.forward(relativeUrlPath)方法跳转页面用得不多,主要是因为要在Jsp页面中嵌套java代码,所以这种做法简单了解一下即可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面,那么一般会使用<jsp:forward>标签,<jsp:forward>标签用于把请求转发给另外一个资源。范例:使用pageContext的include方法引入资源
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <head> 4 <title>使用pageContext的include方法引入资源</title> 5 </head> 6 <% 7 pageContext.include("/jspfragments/head.jsp"); 8 %> 9 使用pageContext的include方法引入资源 10 <% 11 pageContext.include("/jspfragments/foot.jsp"); 12 %> 13 <hr/> 14 <%-- 15 <jsp:include page="/jspfragments/head.jsp"/> 16 使用jsp:include标签引入资源 17 <jsp:include page="/jspfragments/foot.jsp"/> 18 --%>运行结果: 在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用jsp:include标签引入资源,因此这种做法了解一下即可。
相关文章推荐
- JSP简单运行原理----------九大隐式对象和四大域对象
- JSP笔记――1.运行原理
- 深入分析JavaWeb Item12 -- jsp运行原理与基本语法
- JSP运行原理及优势
- JSP基本概念及运行原理
- JSP的运行原理
- JavaWeb基础之一JSP语法(一) JSP运行原理
- JSP运行原理
- [JAVAWEB]5.详解JSP的运行原理
- 学习笔记之javaweb基础:JSP的HelloWorld及其运行原理
- JSP运行原理和九大隐式对象:
- jsp的运行原理及使用
- javaEE jsp运行原理
- JSP运行原理和九大隐式对象
- Jsp运行原理
- JSP工作流程及运行原理
- jsp运行原理
- 详解jsp的运行原理
- JSP运行原理
- JSP运行原理和九大隐式对象1