掘金 后端 ( ) • 2024-05-06 08:03

JSP内置对象是一组自动可用的对象,这些对象代表了与请求、响应和JSP页面容器环境相关的各种对象。你不需要显式地创建这些对象,它们由JSP容器提供。这些内置对象提供了对HTTP请求-响应模型的直接支持,并且简化了一些常见的任务比如获取用户数据,跟踪会话等。

JSP 内置对象列表

  1. request: HttpServletRequest 对象,表示客户端发起的请求。
  2. response: HttpServletResponse 对象,表示对客户端的响应。
  3. out: JspWriter 对象,用于向客户端发送输出。
  4. session: HttpSession 对象,用于管理与特定用户的会话。
  5. application: ServletContext 对象,代表整个Web应用程序的上下文。
  6. config: ServletConfig 对象,包含了Servlet的初始化参数。
  7. pageContext: PageContext 对象,提供了对JSP页面所有对象和命名空间的访问。
  8. page: 表示当前的Servlet实例,通常对用户不是太有用。
  9. exception: 表示JSP页面中发生的异常对象。

域(Scopes)

在JSP中,域指的是数据可以存活的时间和范围,也就是说,在域中存放的对象可以被Web应用程序中的其他组件访问。JSP 支持以下四种域:

  1. Page Scope: 仅限于本页内可用。
  2. Request Scope: 与一个请求的生命周期一致。
  3. Session Scope: 与用户的一个会话期间一致。
  4. Application Scope: 对所有用户的会话期间一致,只要应用程序启动,数据就会存在。

作用域从小到大的排序是:

  1. Page Scope:范围最小,只在当前页面有效,当页面处理完毕后,page scope 中的属性就不再可用了。
  2. Request Scope:范围较小,只在一次请求中有效,请求被转发到其他资源(比如另一个JSP,Servlet等)时,这些属性仍然可用。
  3. Session Scope:范围较大,跨越多次请求,在一个用户的多次请求之间共享数据,通常用于维护用户会话期间的状态。
  4. Application Scope:范围最大,跨越整个Web应用程序,所有的用户共享在此域中的属性,只要应用程序启动,这些属性就一直存在。

源码示例

以下是一个简单的JSP页面示例,它演示了如何使用这些内置对象和域来存取数据:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>内置对象和域示例</title>
</head>
<body>

<%-- 使用pageContext设置属性 --%>
<%
    pageContext.setAttribute("pageScope", "Page Scope Data");
    request.setAttribute("requestScope", "Request Scope Data");
    session.setAttribute("sessionScope", "Session Scope Data");
    application.setAttribute("applicationScope", "Application Scope Data");
%>

<p>Page Scope: <%= pageContext.getAttribute("pageScope") %></p>
<p>Request Scope: <%= request.getAttribute("requestScope") %></p>
<p>Session Scope: <%= session.getAttribute("sessionScope") %></p>
<p>Application Scope: <%= application.getAttribute("applicationScope") %></p>

</body>
</html>

在上述代码中,我们使用了内置对象pageContextrequestsessionapplication来设置不同范围的属性。然后,使用相同的对象来获取并显示这些属性值。

注意,在实际开发中,通常不鼓励直接在JSP页面中编写大量的Java代码。应该尽量使用JSP标准标签库(JSTL)或表达式语言(EL)来实现这些功能。

细节解析

每个内置对象有特定的方法和功能,比如:

  • pageContext: 这个对象提供了一个单一的API去管理不同的上下文对象,并且能够访问整个JSP页面的命名空间。它还提供了其他功能,如获取其他内置对象、错误信息等。
  • request: 通过这个对象,你可以访问客户端发送的所有请求信息,包括表单数据、查询字符串、头信息等。
  • response: 你可以使用这个对象来控制发送给客户端的响应,比如设置内容类型、编码方式、发送错误信息等。
  • session: 用这个对象可以追踪客户端的会话,可以在多个请求和页面间保持信息。
  • application: 通过该对象,你能够访问整个Web应用程序的环境,可以存储全局的配置信息或者共享数据。

注意

为了遵循MVC模式,你应该尽量避免在JSP页面中编写Java代码,因为这会导致表示层和控制层混杂在一起,从而降低应用程序的维护性。在实际应用中,应该尽量使用Servlet来处理业务逻辑,并且只在JSP页面中负责输出结果。