您的位置:首页 > 编程语言 > Java开发

JavaWeb(11) : JSP九大内置对象

2019-08-11 12:15 344 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/HuashirenYty/article/details/99167360

一、JSP运行原理

  • 每个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大对象的引用。

二、九内置对象

号码 内置对象 类型
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对象

jsp的输出流,用来向客户端发送文本数据。 out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。

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)
  • public java.lang.Object findAttribute(java.lang.String name):全域查找。从小到大(page→request→session→application),依赖查找!

  • 当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。

3.7、使用pageContext的findAttribute方法查找属性值
find6.jsp :

<%
pageContext.setAttribute("name1", "荒野反叛");
request.setAttribute("name2", "死寂空间");
session.setAttribute("name3", "死城之谜");
application.setAttribute("name4", "炼狱小镇");
%>
<%
String refName1 = (String)pageContext.findAttribute("name1");
String refName2 = (String)pageContext.findAttribute("name2");
String refName3 = (String)pageContext.findAttribute("name3");
String refName4 = (String)pageContext.findAttribute("name4");
String refName6 = (String)pageContext.findAttribute("name6");

%>
<body>
<h1>pageContext.findAttribute方法找到的属性值:</h1>
<h3>pageContext:<%=refName1 %></h3>
<h3>request:<%=refName2 %></h3>
<h3>session:<%=refName3 %></h3>
<h3>application:<%=refName4 %></h3>
<h3>不存在的:<%=refName6 %></h3>
<hr>
<h1>EL表达式疯狂输出:</h1>
<h3>pageContext:${name1} </h3>
<h3>request:${name2}</h3>
<h3>session:${name3}</h3>
<h3>application:${name4}</h3>
<h3>不存在的:${name6}</h3>
</body>
</html>

EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。

3.8、pageContext代理其它域

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)

代表各个域的static int常量(对应上述方法中的int scope)

1 PageContext.APPLICATION_SCOPE
2 PageContext.SESSION_SCOPE
3 PageContext.REQUEST_SCOPE
4 PageContext.PAGE_SCOPE
7ff8

pageContext代理其它域

</head>
<%
// 此条语句等价于session.setAttribute("name","徐康健爱沙雳");
pageContext.setAttribute("name", "徐康健爱沙雳", pageContext.SESSION_SCOPE);
%>
<%
// 两种方法获取session域里的name属性
String refName1 = (String)pageContext.getAttribute("name", pageContext.SESSION_SCOPE);
String refName2 = (String)session.getAttribute("name");
%>
<h1>第一种方法pageContext.getAttribute(java.lang.String name,int scope)获取session域里的name属性值:</h1>
<h3><%=refName1 %></h3>
<h1>第二种方法session.getAttribute(java.lang.String name)获取session域里的name属性值:</h1>
<h3><%=refName2 %></h3>
<body>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: