java web九个内置对象_javaweb-JSP中的九个内置对象

本文详细介绍了JSP的内置对象,特别是pageContext对象的重要性和使用方法,包括如何获取其他八大内置对象、作为域对象的角色以及如何进行资源的引入和跳转。此外,还讲解了out对象用于输出文本数据的功能,以及page对象的概念。通过pageContext对象,开发者可以更便捷地与web环境交互,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、JSP原理

所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个_jspServlet,然后按照servlet的调用方式进行调用。

于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

request,response,session,application,config这些对象在前面都已经做了详细的介绍,这里重点介绍一下剩下的pageContext对象,out对象,page对象。

三、内置对象使用说明

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对象的工作原理图

6045412ad898ca64f32b9a7828a56624.png

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 voidsetAttribute(java.lang.String name,java.lang.Object value)2 publicjava.lang.Object getAttribute(java.lang.String name)3 public voidremoveAttribute(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

2 pageEncoding="UTF-8"%>

3

4

5

6

7

pageContext的findAttribute方法查找属性值

8

9

10 pageContext.setAttribute("name1","张三");11 request.setAttribute("name2","李四");12 session.setAttribute("name3","王五");13 application.setAttribute("name4","小六");14 %>

15

16 //使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型17 //查找name1属性,按照顺序"page→request→session→application"在这四个对象中去查找18 Stringvalue1=(String)pageContext.findAttribute("name1");19 Stringvalue2=(String)pageContext.findAttribute("name2");20 Stringvalue3=(String)pageContext.findAttribute("name3");21 Stringvalue4=(String)pageContext.findAttribute("name4");22 Stringvalue5=(String)pageContext.findAttribute("name5");//查找不存在的属性23 %>

24

pagecontext.findAttribute方法查找到的属性值:

25

pageContext对象的name1属性值:

26

request对象的name2属性值:

27

session对象的name3属性值:

28

application对象的name4属性值:

29

查找不存在的name5属性值:

30

31

使用EL表达式进行输出

32

pageContext对象的name1属性值:${name1}

33

request对象的name2属性值:${name2}

34

session对象的name3属性值:${name3}

35

application对象的name4属性值:${name4}

36

查找不存在的name5属性值:${name5}

37

38

39

ba978a6f3dd58f5cea370c94332021fa.png

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

pageContext对象中封装了访问其它域的方法

1 public java.lang.Object getAttribute(java.lang.String name,intscope)2 public void setAttribute(java.lang.String name, java.lang.Object value,intscope)3 public void removeAttribute(java.lang.String name,int scope)

代表各个域的常量

1 1PageContext.APPLICATION_SCOPE2 2PageContext.SESSION_SCOPE3 3PageContext.REQUEST_SCOPE4 4 PageContext.PAGE_SCOPE

范例:pageContext访问其它域

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

pageContext访问其它域

8

9

10

11 //此时相当于session对象中存放了一个name属性,等价于session.setAttribute("name","张三");12 pageContext.setAttribute("name","张三", PageContext.SESSION_SCOPE);13 %>

14

15 //取得session对象的属性,使用pageContext对象获取16 Strings1=(String)pageContext.getAttribute("name", PageContext.SESSION_SCOPE);17 //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型18 Strings2=(String)session.getAttribute("name");19 %>

20

取出存放在session对象中的属性值:

21

第一种做法:使用pageContex.getAttribute("attributeName",pageContex.SESSION_SCOPE)

22

姓名:

23

第二种做法:使用session.getAttribute("attributeName");去取出session对象中值

24

姓名:

25

26

8c4f61da3b5ca4890bb3e22ee8a48efe.png

3.7、PageContext引入和跳转到其他资源

PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。

方法接收的资源如果以“/”开头, “/”代表当前webContent应用。

范例:使用pageContext的forward方法跳转到其他页面

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

使用pageContext的forwrd方法跳转页面

8

9

10

11 //使用pageContext的forward方法跳转到page02.jsp页面,/相对webContent12 pageContext.forward("/page02.jsp");13 //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)14 //使用替代RequestDispatcher的forward方法实现的跳转方式15 //pageContext.getRequest().getRequestDispatcher("/page02.jsp").forward(request, response);16 %>

17

18

运行结果如下:

3f8775339e60a3b2dd68519764e7e25f.png

1 pageContext.forward("/page02.jsp");

这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);这种写法的。在实际开发中,使用pageContext.forward(relativeUrlPath)方法跳转页面用得不多,主要是因为要在Jsp页面中嵌套java代码,所以这种做法简单了解一下即可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面,那么一般会使用标签,标签用于把请求转发给另外一个资源。

范例:使用pageContext的include方法引入资源

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

使用pageContext的include方法引入资源

8

9

10

11 pageContext.include("/jsp/head.jsp");12 %>

13

主体部分

14

15 pageContext.include("/jsp/foot.jsp");16 %>

17

18

运行结果:

39e82d5a73175ba005ca52d63a25ed32.png

在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用jsp:include标签引入资源,因此这种做法了解一下即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值