JSP 隐式对象

什么是 JSP 隐式对象?

  • JSP 隐式对象是在 JSP 翻译成 Servlet 的过程中创建的。
  • 这些对象可以直接在 service 方法中的脚本段中使用。
  • 它们由容器自动创建,并且可以通过对象访问。

JSP 中有多少个隐式对象?

容器中共有 9 种隐式对象

  1. Out
  2. 请求
  3. Response
  4. Config
  5. 应用
  6. Session
  7. PageContext
  8. Page
  9. Exception

一个接一个地学习

1) Out

  • Out 是一个隐式对象,用于将数据写入缓冲区并响应客户端发送输出。
  • Out 对象允许我们访问 Servlet 的输出流。
  • Out 是 javax.servlet.jsp.JspWriter 类的对象。
  • 在处理 Servlet 时,我们需要 PrintWriter 对象。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP1</title>
</head>
<body>
<% int num1=10;int num2=20;
out.println("num1 is " +num1);
out.println("num2 is "+num2);
%>
</body>
</html>

代码解释

代码行 11-12 – out 用于打印到输出流。

当我们执行上面的代码时,我们会得到以下输出。

Out in JSP

输出

  • 在输出中,我们得到了 num1 和 num2 的值。

2) Request

  • request 对象是 java.servlet.http.HttpServletRequest 的一个实例,它是 service 方法的参数之一。
  • 容器会为每个请求创建它。
  • 它用于请求信息,如参数、头部信息、服务器名称等。
  • 它使用 getParameter() 来访问请求参数。

示例

Implicit_jsp2.jsp (发送请求到 guru.jsp 的表单)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru form JSP2</title>
</head>
<body>
<form action="guru.jsp">
<input type="text" name="username">
<input type="submit" value="submit">
</form>
</body>
</html>

Guru.jsp (执行操作的地方)

Request in JSP

代码解释

代码行 10-13 : 在 implicit_jsp2.jsp (表单) 中发送请求,因此变量 username 被处理并发送到 guru.jsp,这是 JSP 的操作。

Guru.jsp

代码行 10-11: 这是操作 jsp,请求在此处处理,并且 username 从表单 jsp 获取。

当您执行上述代码时,您会得到以下输出

输出

Request in JSP

当您输入 test 并单击提交按钮时,您将获得以下输出“Welcome Test”。

Request in JSP

3) Response

  • “Response”是实现 HttpServletResponse 接口的类的实例。
  • 容器生成此对象并将其作为参数传递给 _jspservice() 方法。
  • “Response 对象”将由容器为每个请求创建。
  • 它代表可以发送给客户端的响应。
  • response 隐式对象用于设置内容类型、添加 cookie 和重定向到响应页面。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP4</title>
</head>
<body>
<%response.setContentType("text/html"); %>
</body>
</html>

代码解释

代码行 11: 在 response 对象中,我们可以设置内容类型。

这里我们只在 response 对象中设置了 content type,因此没有输出。

4) Config

  • “Config”的类型是 java.servlet.servletConfig。
  • 它由容器为每个 jsp 页面创建。
  • 它用于获取 web.xml 中的初始化参数。

示例

Web.xml (指定 Servlet 的名称和映射)

Config in JSP

Implicit_jsp5.jsp (获取 Servlet 名称的值)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP5</title>
</head>
<body>
<% String servletName = config.getServletName();
out.println("Servlet Name is " +servletName);%>
</body>
</html>

代码解释

在 web.xml 中

代码行 14-17: 在 web.xml 中,我们有 Servlet 到类的映射。

Implicit_jsp5.jsp

代码行 10-11: 要在 JSP 中获取 Servlet 名称,我们可以使用 config.getServletName,这将帮助我们获取 Servlet 的名称。

当您执行上述代码时,您会得到以下输出

Response in JSP

输出

  • Servlet 名称是“GuruServlet”,因为该名称存在于 web.xml 中。

5) Application

  • Application 对象 (代码行 10) 是 javax.servlet.ServletContext 的一个实例,用于获取 JSP 中的上下文信息和属性。
  • Application 对象由容器每应用程序创建一个,当应用程序部署时。
  • ServletContext 对象包含一组用于与 Servlet 容器交互的方法。我们可以找到有关 Servlet 容器的信息。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Implicit JSP6</title>
</head>
<body>
<% application.getContextPath(); %>
</body>
</html>

代码解释

  • 在上面的代码中,application 属性有助于获取 JSP 页面的上下文路径。

6) Session

  • session 持有 “httpsession” 对象 (代码行 10)。
  • Session 对象用于获取、设置和删除会话范围的属性,也用于获取会话信息。

示例

Implicit_jsp7 (设置了属性)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit JSP</title>
</head>
<body>
<% session.setAttribute("user","GuruJSP"); %>
<a href="implicit_jsp8.jsp">Click here to get user name</a>
</body>
</html>

Implicit_jsp8.jsp (getAttribute)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>implicit Guru JSP8</title>
</head>
<body>
<% String name = (String)session.getAttribute("user");
out.println("User Name is " +name);
%>
</body>
</html>

代码解释

Implicit_jsp7.jsp

代码行 11: 我们正在 session 变量中设置 user 属性,并且该值可以从任何调用它的 jsp ( _jsp8.jsp ) 的 session 中获取。

代码行 12: 我们在 href 中调用另一个 jsp,其中我们将获取 user 属性的值,该属性已在 (_jsp7.jsp) 中设置。

Implicit_jsp8.jsp

代码行 11: 我们正在从 session 对象中获取 user 属性的值并显示该值。

当您执行上述代码时,您会得到以下输出

Session in JSP

当您单击用户名链接时,您将获得以下输出。

Session in JSP

输出

  • 当我们在 implicit_jsp7.jsp 中单击链接时,我们会重定向到第二个 jsp 页面,即 (_jsp8.jsp) 页面,并且我们会从 user 属性的 session 对象中获取值 (_jsp7.jsp)。

7) PageContext

  • 此对象是 pagecontext 类型。
  • 它用于从特定范围获取、设置和删除属性。

范围有 4 种类型。

  • Page
  • 请求
  • Session
  • 应用

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP9</title>
</head>
<body>
<% pageContext.setAttribute("student","gurustudent",pageContext.PAGE_SCOPE);
String name = (String)pageContext.getAttribute("student");
out.println("student name is " +name);
%>
</body>
</html>

代码解释

代码行 11:我们正在使用 pageContext 对象设置属性,它有三个参数。

  • 范围

在上面的代码中,键是 student,值是“gurustudent”,而范围是 page 范围。这里范围是“page”,只能通过 page 范围获取。

代码行 12:我们正在使用 pageContext 获取属性的值。

当您执行上述代码时,您会得到以下输出

PageContext in JSP

输出

  • 输出将打印“student name is gurustudent”。

8) Page

  • Page 隐式变量保存当前执行的对应 jsp 的 Servlet 对象。
  • 充当当前 jsp 页面的 this 对象。

示例

在此示例中,我们使用 page 对象通过 toString 方法获取页面名称。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP10</title>
</head>
<body>
<% String pageName = page.toString();
out.println("Page Name is " +pageName);%>
</body>
</html>

代码解释

代码行 10-11:在此示例中,我们尝试使用 page 对象的 toString() 方法,并尝试获取 JSP 页面的字符串名称。

当您执行代码时,您会得到以下输出。

Page in JSP

输出

  • 输出是以上 jsp 页面的字符串名称。

9) Exception

  • Exception 是 Throwable 类的隐式对象。
  • 它用于 JSP 中的异常处理
  • exception 对象只能在错误页面中使用。示例:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP 11</title>
</head>
<body>
<%int[] num1={1,2,3,4};
out.println(num1[5]);%>
<%= exception %>
</body>
</html>

代码解释

代码行 10-12 – 它有一个数字数组,即 num1,有四个元素。在输出中,我们尝试打印数组列表中未声明的数组的第五个元素,即 num1。因此,它用于获取 jsp 的异常对象。

输出

Exception in JSP

我们在数组中得到了 ArrayIndexOfBoundsException,其中我们得到了一个 num1 数组的第五个元素。