Jsp第七课 Jsp内置对象的学习和使用

Posted 笔触狂放

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsp第七课 Jsp内置对象的学习和使用相关的知识,希望对你有一定的参考价值。

概念

什么是JSP内置对象?

} JSP 内置对象是 Web 容器创建的一组对象
} JSP 内置对象是可以直接在 JSP 页面使用的对象 ,无需使用“ new” 获取实例
} JSP 内置对象的名称是 JSP 的保留字
} 内置对象说白了就是别人创建好了的对象,我们直接用即可

九大内置对象

内置对象类型作用
out JspWriter用于向客户端、浏览器输出数据
requestHttpServletRequest来自客户端、浏览器的各种请求信息
responseHttpServletResponse服务器的响应信息
sessionHttpSession保存会话信息。实现同一用户的信息共享
exceptionThrowablejsp程序执行过程中发生的异常
pageServlet(this)指向了当前jsp程序本身
configServletConfig操作应用程序的配置信息
applicationServletContext不同用户之间的信息共享
pageContext PageContext提供了对jsp页面所有对象的访问

从上一篇文章的学习中,我们指定Jsp文件在运行时会被翻译成servlet,那么这里的内置对象其实就是在被翻译之后的servlet中所定义的,这里我们可以打开对应的运行在tomcat上的work文件夹中的项目查看。

1. out对象

从翻译后的代码中可以发现,out对象的作用基本和我们之前用在Servlet中的PrintWrite的用法一致,都是将字符串的内容发送给浏览器上显示。

 这里我们也创建一个jsp文件来练习一下:

<%@page import="java.util.Calendar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- Jsp九大内置对象之一:out对象,对应的类名JspWriter -->
<!-- 判断当前是上午还是下午 -->
<% Calendar calendar=Calendar.getInstance();
	int AM_PM= calendar.get(Calendar.AM_PM);
	if(AM_PM==Calendar.AM){
		out.print("<p style='color:red;'>当前时间为上午</p>");
	}else if(AM_PM==Calendar.PM){
		out.print("<p style='color:green;'>当前时间为下午</p>");
	}
%>
</body>
</html>

2.request对象

该对象已在Servlet中做了详细讲解和介绍,这里就不再做过多的赘述,我们创建一个jsp文件来简单复习一下:

在浏览器访问该页面的地址后面拼接name和psd的数据发送给该页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- request:用于接收浏览器发送过来的数据 -->
	<%
		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);
	%>
</body>
</html>

 再创建a.jsp文件用于接收该页面通过请求转发而得到的数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String a=(String)request.getAttribute("a");
		out.write("获得请求转发的数据为:"+a);
	%>
</body>
</html>

注意:request对象存储的数据只能通过请求转发的方式让其他页面进行获得和共享 

3.response对象

 该对象已在Servlet中做了详细讲解和介绍,这里就不再做过多的赘述,我们创建一个jsp文件来简单复习一下:

该对象用于操作和设置浏览器的显示,例如:定时刷新页面,文件下载,跳转页面等等都是指挥浏览器操作数据。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- response给浏览器回复数据
	使用该对象可以实现,页面跳转,称为重定向 -->
	<%  response.sendRedirect("OutDemo.jsp"); %>
</body>
</html>

4. session对象

 该对象已在Servlet中做了详细讲解和介绍,这里就不再做过多的赘述,我们创建一个jsp文件来简单复习一下:

该对象用于区分浏览器并保存各自浏览器要存储的数据,并在不切换浏览器的情况下,项目中的任何jsp和servlet都能共享session中存储的数据。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- session:比喻成档案,
	用于存放数据的,数据的是否存在只和浏览器是否相同有关
	只要不切换浏览器,任何servlet,jsp都能共享 -->
	<% 
	session.setAttribute("b", "我是session的数据");
	out.write((String)session.getAttribute("b"));
	%>
</body>
</html>

5.exception对象

该对象实际是java基础中的异常处理,用于在代码报错的时候,输出和打印报错信息,以便于开发者的理解和解决bug问题。

这里结合上一篇文章中的page指令的知识来综合使用一下:

该代码演示了算术异常,空指针异常,数组下标越界异常,类型转换异常等等常见的错误异常,并在该页面报错的时候,指定跳转至error.jsp页面。

<%@ page language="java" errorPage="error.jsp" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
//算数异常
//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);
%>
</body>
</html>

 error.jsp

<%@ page language="java" isErrorPage="true" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
当前页面出现除法异常,请仔细检查除数是否为0
<p><%=exception.getMessage() %></p>
<p><%=exception.toString() %></p>
</body>
</html>

通过运行,可以看到所产生的错误异常信息。

6.page对象

通过查看翻译后的servlet代码可以看到,其实page就是Object的对象,赋值为当前类对象。

该对象使用频率比较小,这里做简单的演示

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- Jsp九大内置对象之一: page,对应的类Object类 -->
<%
	out.write(page.equals(this)
			?"page对象等于当前类对象":"不等于");
%>
</body>
</html>

7.config对象

该对象在Servlet的学习中已经讲过,需要学习的初学者请翻阅之前的文章进行学习。其本质的作用是获得Servlet在注册信息中的静态数据和配置信息,那在jsp中并不需要我们开发者对jsp进行注册,而是程序自动封装了注册信息的代码,隐藏该对象在jsp中使用频率较小。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- Jsp九大内置对象之一:config对象,对应的类名ServletConfig -->
<%  String name= config.getServletName();
	out.write(name);
%>
</body>
</html>

8.application对象

该对象的类名为ServletContext,其作用和用法也是Servlet的学习中已详细讲解过,用于共享数据,其分为共享静态数据,共享动态数据,共享文件数据等作用。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- application是ServletContext这个类的对象
		这个类在整个项目中只有一个对象,tomcat服务器一启动,就开始创建,
		tomcat服务器一关闭,该对象就被销毁,
		存在这个对象中的数据就会被删除
		只要服务器不关闭,任何Servlet和jsp都能共享数据
	 -->
	 <% application
	 		.setAttribute("c", "我是application的数据");
	 	out.write((String)application.getAttribute("c"));
	 %>
</body>
</html>

9.pageContext对象

该对象是jsp中独有的对象,该对象的作用是用于管理其余八个内置对象的快速使用和数据存储。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- Jsp九大内置对象之一:pageContext
pageContext:当前页面的上下文对象
作用:1.用于管理和获得其他内置对象2.存储数据
pageContext可以获得任意其他的内置对象,可以管理所有内置对象
 -->
 <%
 	//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();
 %>
 
 
</body>
</html>

四大作用域

内置对象作用域
application整个项目
session一次会话
request 一次请求 
pageContext一个页面

 按作用域从小到大排列:pageContext->request ->session->application

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- Jsp九大内置对象之一:pageContext
pageContext:当前页面的上下文对象
作用:1.用于管理和获得其他内置对象2.存储数据
pageContext可以获得任意其他的内置对象,可以管理所有内置对象
 -->
 
 <!-- 四大作用域 -->
 <%
 	//存储数据
 	//pageContext是可以存储数据,但是其作用域只能供其本身的jsp页面使用
 	pageContext.setAttribute("a", "我是pageContext的数据");
 	String info=(String)pageContext.getAttribute("a");
 	out.write("<br>");
 	out.write(info);
 	
 	//request对象中的数据是可以形成多个页面共享数据,但是要通过请求转发的方式打开其他页面才能形成共享数据
 	//写法一
 	//request.setAttribute("b", "我是request的数据");
 	//写法二
 	//第一个参数表示要添加的数据的名称 第二个参数表示要存储的数据  第三个参数表示要把数据存储给哪个对象
 	pageContext.setAttribute("b", "我是request的数据", PageContext.REQUEST_SCOPE);
 	String b=(String)request.getAttribute("b");
 	out.write("<br>");
 	out.write(b);
 	//通过请求转发的方式跳转至five.jsp
 	//request.getRequestDispatcher("five.jsp").forward(request, response);
 	
 	//判断session是否是刚刚创建
 	//session对象中的数据可以供任何jsp和servlet页面进行共享
 	//但是一旦切换浏览器访问服务器,那么数据就不存在
 	//说明session对象能不能共享数据和浏览器有关
 	if(session.isNew()){
 		out.write("<br>");
 		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("<br>");
 	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("<br>");
 	out.write(d);
 %>
</body>
</html>

 在其他jsp页面也能获得其添加的数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%  
//通过运行看到效果会报错,报空指针错误,说明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);
%>
</body>
</html>

 findAttribute(String key)(该方法的作用,在后面章节的EL表达式中进行讲解和对比,这里占时不做演示)

依次从pageContext,request,session,application四个作用域中,查找响应的属性,如果找到了返回值,且结束本次查找。

如果找不到,返回一个null

本章内容结束!!!

以上是关于Jsp第七课 Jsp内置对象的学习和使用的主要内容,如果未能解决你的问题,请参考以下文章

Java——JSP/九大内置对象/四大域对象

JSP学习笔记-JSP内置对象

jsp和servlet学习总结

JSP内置对象的学习

jsp内置对象session出错问题

JavaWeb学习——JSP页面元素及九大内置对象