什么是JSP内置对象?
内置对象 | 类型 | 作用 |
---|---|---|
out | JspWriter | 用于向客户端、浏览器输出数据 |
request | HttpServletRequest | 来自客户端、浏览器的各种请求信息 |
response | HttpServletResponse | 服务器的响应信息 |
session | HttpSession | 保存会话信息。实现同一用户的信息共享 |
exception | Throwable | jsp程序执行过程中发生的异常 |
page | Servlet(this) | 指向了当前jsp程序本身 |
config | ServletConfig | 操作应用程序的配置信息 |
application | ServletContext | 不同用户之间的信息共享 |
pageContext | PageContext | 提供了对jsp页面所有对象的访问 |
从上一篇文章的学习中,我们指定Jsp文件在运行时会被翻译成servlet,那么这里的内置对象其实就是在被翻译之后的servlet中所定义的,这里我们可以打开对应的运行在tomcat上的work文件夹中的项目查看。
从翻译后的代码中可以发现,out对象的作用基本和我们之前用在Servlet中的PrintWrite的用法一致,都是将字符串的内容发送给浏览器上显示。
这里我们也创建一个jsp文件来练习一下:
<%@page import="java.util.Calendar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<% Calendar calendar=Calendar.getInstance();
int AM_PM= calendar.get(Calendar.AM_PM);
if(AM_PM==Calendar.AM){
out.print("当前时间为上午
");
}else if(AM_PM==Calendar.PM){
out.print("当前时间为下午
");
}
%>
该对象已在Servlet中做了详细讲解和介绍,这里就不再做过多的赘述,我们创建一个jsp文件来简单复习一下:
在浏览器访问该页面的地址后面拼接name和psd的数据发送给该页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
String name=request.getParameter("name");
String psd=request.getParameter("psd");
out.write("jsp接收到浏览器的数据为"+name+"---"+psd);
//请求转发,携带数据跳转jsp页面
//request对象也能存储数据,
//并且也可以让多个servlet和jsp之间共享数据
//但是必须要是请求转发跳转页面的方式才能共享数据
request.setAttribute("a", "苹果");
request.getRequestDispatcher("a.jsp")
.forward(request, response);
%>
再创建a.jsp文件用于接收该页面通过请求转发而得到的数据:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
String a=(String)request.getAttribute("a");
out.write("获得请求转发的数据为:"+a);
%>
注意:request对象存储的数据只能通过请求转发的方式让其他页面进行获得和共享
该对象已在Servlet中做了详细讲解和介绍,这里就不再做过多的赘述,我们创建一个jsp文件来简单复习一下:
该对象用于操作和设置浏览器的显示,例如:定时刷新页面,文件下载,跳转页面等等都是指挥浏览器操作数据。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<% response.sendRedirect("OutDemo.jsp"); %>
该对象已在Servlet中做了详细讲解和介绍,这里就不再做过多的赘述,我们创建一个jsp文件来简单复习一下:
该对象用于区分浏览器并保存各自浏览器要存储的数据,并在不切换浏览器的情况下,项目中的任何jsp和servlet都能共享session中存储的数据。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
session.setAttribute("b", "我是session的数据");
out.write((String)session.getAttribute("b"));
%>
该对象实际是java基础中的异常处理,用于在代码报错的时候,输出和打印报错信息,以便于开发者的理解和解决bug问题。
这里结合上一篇文章中的page指令的知识来综合使用一下:
该代码演示了算术异常,空指针异常,数组下标越界异常,类型转换异常等等常见的错误异常,并在该页面报错的时候,指定跳转至error.jsp页面。
<%@ page language="java" errorPage="error.jsp" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
//算数异常
//int x=100/0;
//空指针异常
int[] nums=null;
//int a=nums.length;
//下标越界异常
nums=new int[3];
//nums[5]=8;
//类型转换异常
//子类对象赋值给父类对象成为向上转型
//父类对象赋值给子类对象称为向下转型
//(前提父类对象原本就是子类对象)
Object object=new Object();
String str=(String)object;
out.write(str);
%>
error.jsp
<%@ page language="java" isErrorPage="true" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
当前页面出现除法异常,请仔细检查除数是否为0
<%=exception.getMessage() %>
<%=exception.toString() %>
通过运行,可以看到所产生的错误异常信息。
通过查看翻译后的servlet代码可以看到,其实page就是Object的对象,赋值为当前类对象。
该对象使用频率比较小,这里做简单的演示
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
out.write(page.equals(this)
?"page对象等于当前类对象":"不等于");
%>
该对象在Servlet的学习中已经讲过,需要学习的初学者请翻阅之前的文章进行学习。其本质的作用是获得Servlet在注册信息中的静态数据和配置信息,那在jsp中并不需要我们开发者对jsp进行注册,而是程序自动封装了注册信息的代码,隐藏该对象在jsp中使用频率较小。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<% String name= config.getServletName();
out.write(name);
%>
该对象的类名为ServletContext,其作用和用法也是Servlet的学习中已详细讲解过,用于共享数据,其分为共享静态数据,共享动态数据,共享文件数据等作用。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<% application
.setAttribute("c", "我是application的数据");
out.write((String)application.getAttribute("c"));
%>
该对象是jsp中独有的对象,该对象的作用是用于管理其余八个内置对象的快速使用和数据存储。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
//out.write("aaaaa");
pageContext.getOut().write("aaaa");
//request
pageContext.getRequest();
//response
pageContext.getResponse();
//session
pageContext.getSession();
//exception
pageContext.getException();
//page
pageContext.getPage();
//config
pageContext.getServletConfig();
//application
pageContext.getServletContext();
%>
内置对象 | 作用域 |
---|---|
application | 整个项目 |
session | 一次会话 |
request | 一次请求 |
pageContext | 一个页面 |
按作用域从小到大排列:pageContext->request ->session->application
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
//存储数据
//pageContext是可以存储数据,但是其作用域只能供其本身的jsp页面使用
pageContext.setAttribute("a", "我是pageContext的数据");
String info=(String)pageContext.getAttribute("a");
out.write("
");
out.write(info);
//request对象中的数据是可以形成多个页面共享数据,但是要通过请求转发的方式打开其他页面才能形成共享数据
//写法一
//request.setAttribute("b", "我是request的数据");
//写法二
//第一个参数表示要添加的数据的名称 第二个参数表示要存储的数据 第三个参数表示要把数据存储给哪个对象
pageContext.setAttribute("b", "我是request的数据", PageContext.REQUEST_SCOPE);
String b=(String)request.getAttribute("b");
out.write("
");
out.write(b);
//通过请求转发的方式跳转至five.jsp
//request.getRequestDispatcher("five.jsp").forward(request, response);
//判断session是否是刚刚创建
//session对象中的数据可以供任何jsp和servlet页面进行共享
//但是一旦切换浏览器访问服务器,那么数据就不存在
//说明session对象能不能共享数据和浏览器有关
if(session.isNew()){
out.write("
");
out.write("因为开启了一个新的浏览器,所以创建了一个新的session对象");
//方法一 直接使用session存储数据
//session.setAttribute("c", "我是session的数据");
//方法二 使用pageContext间接帮session存储数据
pageContext.setAttribute("c", "我是session的数据", PageContext.SESSION_SCOPE);
}
String c=(String)session.getAttribute("c");
out.write("
");
out.write(c);
//application对象存储的数据可以让任何jsp和servlet进行共享数据
//但是application对象的数据与服务器有关,只要服务器不停止,数据都能共享
//方法一
//application.setAttribute("d", "我是application的数据");
//方法二
pageContext.setAttribute("d", "我是application的数据",PageContext.APPLICATION_SCOPE);
String d=(String)application.getAttribute("d");
out.write("
");
out.write(d);
%>
在其他jsp页面也能获得其添加的数据:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
//通过运行看到效果会报错,报空指针错误,说明pageContext的数据在这个页面上获取不到
//pageContext的数据不能多个页面之间共享数据
//String info=(String)pageContext.getAttribute("a");
//out.write(info);
//方法一 request对象自己直接获得数据
//String b=(String)request.getAttribute("b");
//方法二 pageContext帮request获得数据
//String b=(String)pageContext.getAttribute("b", PageContext.REQUEST_SCOPE);
//out.write("我获得了four.jsp页面的request对象的数据:"+b);
//方法一 使用session直接获得数据
//String c=(String)session.getAttribute("c");
//方法二 pageContext帮session获得数据
//String c=(String)pageContext.getAttribute("c", PageContext.SESSION_SCOPE);
//out.write("我获得了four.jsp页面的session对象的数据:"+c);
//方法一
//String d=(String)application.getAttribute("d");
//方法二
String d=(String)pageContext.getAttribute("d",PageContext.APPLICATION_SCOPE);
out.write("我获得了four.jsp页面的application对象的数据:"+d);
%>
findAttribute(String key)(该方法的作用,在后面章节的EL表达式中进行讲解和对比,这里占时不做演示)
依次从pageContext,request,session,application四个作用域中,查找响应的属性,如果找到了返回值,且结束本次查找。
如果找不到,返回一个null
本章内容结束!!!