欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入理解JSP:揭秘九个内置对象与四种属性范围

最编程 2024-08-11 09:21:06
...

目录

九个内置对象 

四种属性范围

page属性范围(pageContext)

request属性范围

session属性范围

application属性范围 


九个内置对象 

比较熟悉的request.getParameter("参数名称"),显然request是一个类,而getParameter()是类中的方法,这个对象的实例化是由WEB容器帮助用户提供此对象的实例,这样的对象就被称为内置对象。在整个JSP之中一共提供有九个内置对象(背下来):

No 内置对象 类型 描述
01 request javax.servlet.http.HttpServletResquest 服务器端接收客户端发送的用户请求信息
02 response javax.servlet.http.HttpServletResponse 服务器端对客户端的回应信息
03 session

javax.servlet.http.HttpSession

保存每一个用户的信息
04 application javax.servlet.ServletContext 描述这个应用服务上下文
05 pageContext javax.servlet.jsp.PageContext 描述的是一个JSP页面的上下文信息
06 config javax.servlet.ServletConfig 取得一些初始化的配置信息
07 out javas.servlet.jsp.JspWriter 向客户端的浏览器进行HTML的输出
08 page java.lang.Object 描述一个JSP的页面
09 exception java.lang.Throwable 每一个JSP的页面都不需要强制处理异常

javaee api文档:https://docs.oracle.com/javaee/7/api/toc.htm

对于以上的九个内置对象,一定要记住对应的类型,因为在进行文档查询的时候是查询的对应的类型,而不是对象名称。web也属于一个标准。

如果要想编写代码,那么对于以上的对象以及对象的类型必须记熟练。

四种属性范围

在WEB开发里面,四种属性范围是最为核心的概念,也就是说理解了四种属性范围的特点以及应用,那么就可以编写出合理的web程序。(需要强记下来)

所谓的属性范围是指一个对象保存的有效范围,可能某个对象只能在某个页面使用,也可能在整个web服务器上使用,或者某个对象只允许一个用户使用。而如果要想进行对象的处理操作,可以采用如下的处理方法完成:

  • 设置属性:public void setAttribute(String name, Object value) ;

  • 取得属性:public Object getAttribute(String name);

  • 删除属性:public void removeAttribute(String name);

拥有以上方法的对象一共有四个:pageContext(很多的时候简化为page)、request、session、application。属性保存的范围越长,其占用内存空间就会越久,服务器的并发量就会降低。

page属性范围(pageContext)

所谓的page属性范围,指的是在一个页面设置的对象信息,只能在本页面中取得,如果发生了跳转则无法取得。

范例:定义一个scope_a.jsp页面,在这个页面设置和取得page属性

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	pageContext.setAttribute("name", "ren");
	pageContext.setAttribute("birthday", new Date());
%>
<% // 取得属性
	String myName = (String) pageContext.getAttribute("name");
	Date myBirthday = (Date) pageContext.getAttribute("birthday") ; 	
%>
<h1>属性内容:<%=myName %> , <%=myBirthday %></h1>

在本页面之中同时进行属性的设置与取得。于是观察一下跳转后属性属性是否可以继续取得。

范例:创建page_scope_a.jsp,该页面主要负责创建属性信息。

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	pageContext.setAttribute("name", "ren");
	pageContext.setAttribute("birthday", new Date());
%>
<jsp:forward page="page_scope_a.jsp"></jsp:forward>

范例:创建page_scope_b.jsp,负责属性的接收

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	String myName = (String) pageContext.getAttribute("name");
	Date myBirthday = (Date) pageContext.getAttribute("birthday");
%>
<h1>属性内容:<%=myName %><%=myBirthday %></h1>

使用page范围定义的属性只有在本页面有效,跳转后无效,占用内存时间是最短的。

request属性范围

如果希望在发生服务器端跳转后依然希望设置的属性可以取得,那么就可以采用request对象进行属性的处理。

范例:定义request_scope_a.jsp页面

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	request.setAttribute("name", "ren");
	request.setAttribute("birthday", new Date());
%>
<jsp:forward page="request_scope_b.jsp"/>

范例:定义request_scope_b.jsp页面

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	String myName = (String) request.getAttribute("name");
	Date myBirthday = (Date) request.getAttribute("birthday");
%>
<h1>属性内容:<%=myName %> , <%=myBirthday %></h1>

需要注意的是设置了request属性范围之后,不管你中间跳过了多少页面,该属性依然可以被保留下来。但是如果此时使用的超链接(改变地址、客户端跳转),由于地址发生了改变,那么此时设置的request属性就将消失了。

只要地址不发生改变,则该请求将继续保留,即request设置的内容继续被保留,而一旦地址发生了改变,则表示第二次请求,那么之前的请求内容都将彻底的消失。

session属性范围

如果现在希望一个属性,在服务端跳转和客户端跳转都能保存下来,那么就可以使用session解决此类问题。

范例:通过session_scope_a.jsp页面设置属性

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	session.setAttribute("name", "ren");
	session.setAttribute("birthday", new Date());
%>
<jsp:forward page="session_scope_b.jsp"/>

范例:通过服务器端跳转到session_scope_b.jsp页面,此属性会保留下来

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	String myName = (String) session.getAttribute("name");
	Date myBirthday = (Date) session.getAttribute("birthday");
%>
<h1>属性内容:<%=myName %> , <%=myBirthday %></h1>
<a href="session_scope_c.jsp">超链接</a> 

范例:通过客户端跳转一样会保留

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	String myName = (String) session.getAttribute("name");
	Date myBirthday = (Date) session.getAttribute("birthday");
%>
<h1>c-属性内容:<%=myName %> , <%=myBirthday %></h1>

只要是通过一个浏览器设置的session的属性,中间不管经过多少次的跳转操作,该属性会一直保留,一直到用户彻底关闭浏览器为止。session在以后的开发之中主要是作用于用户的登录检测,如:邮箱发邮件,不管跳转多少个页面,始终在你的账号下。在整web开发之中,每一个session对象都是保存的一个用户(线程)的信息,这些信息并不是所有的用户共享的。

application属性范围 

如果希望现在设置的属性所有的用户(线程)都可以看见,那么就可以将该属性保存在服务器上下问之中,那么这就可以通过application进行属性保存。

范例:设置application的属性

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	application.setAttribute("name", "ren");
	application.setAttribute("birthday", new Date());
%>
<a href="appplication_scope_b.jsp">超链接</a> 

范例:取得属性

<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<% // 设置属性
	String myName = (String) application.getAttribute("name");
	Date myBirthday = (Date) application.getAttribute("birthday");
%>
<h1>属性内容:<%=myName %><%=myBirthday %></h1>

将浏览器(注意是彻底关上,而不是关页面)关上,换一个浏览器也可以,依然可以取得:

这个属性已经保存在了Tomcat服务器之中,那么显然此时如果关闭了Tomcat服务器那么该属性一定会消失。此属性范围保存的是最长的,如果你在这个属性范围里面保存的对象数据过多,那么这个服务器的性能将严重下降,所以一般不要操作此类属性。