当前位置: 首页 > news >正文

Java Web 应用开发基础 - JSP内置对象

每个JSP 页面在第一次被访问时,Web 容器都会把请求交给 JSP 引擎(即一个 Java 程序)去处理。JSP 引擎先将 JSP 翻译成一个 _jspServlet (实质上也是一个 Servlet) ,然后按照Servlet的调用方式进行调用。
JSP 第一次访问时会翻译成 Servlet,所以第一次访问通常会比较慢,但第二次访问,JSP 引擎如果发现 JSP 没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP 引擎在调用 JSP 对应的 _jspServlet 时,会传递和创建 9 个 Web 开发相关的对象供 _jspServlet 使用。
JSP 技术的设计者为便于开发人员在编写 JSP 页面时获得这些 Web 对象的引用,特意定义了 9 个相应的变量,开发人员在JSP 页面中通过这些变量就可以快速获得这 9 大对象的引用。

9大内置对象

  • pageContext: javax.servlet.jsp.PageContext
  • request: javax.servlet.http.HttpServletRequest
  • response: javax.servlet.http.HttpServletResponse
  • session: javax.servlet.http.HttpSession
  • application: javax.servlet.ServletContext
  • config: javax.servlet.ServletConfig
  • out: javax.servlet.jsp.JspWriter
  • page: java.lang.Object
  • exception: java.lang.Throwable

pageContext对象

pageContext 对象是 JSP 技术中最重要的一个对象,它代表 JSP 页面的运行环境,这个对象不仅封装了对其它 8 大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了 Web 开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

  • getException 方法返回 exception 隐式对象
  • getPage 方法返回 page 隐式对象
  • getRequest 方法返回 request 隐式对象
  • getResponse 方法返回 response 隐式对象
  • getServletConfig 方法返回 config 隐式对象
  • getServletContext 方法返回 application 隐式对象
  • getSession 方法返回 session 隐式对象
  • getOut 方法返回 out 隐式对象

pageContext 作为域对象

pageContext 对象可以作为容器来使用,因此可以将一些数据存储在 pageContext 对象中。

  • public void setAttribute(java.lang.String name,java.lang.Object value)
  • public java.lang.Object getAttribute(java.lang.String name)
  • public void removeAttribute(java.lang.String name)
  • public java.lang.Object findAttribute(java.lang.String name)

findAttribute方法按照查找顺序 “page→request→session→application” 在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null

pageContext 对象 findAttribute 方法查找属性值

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head><title>pageContext的findAttribute方法查找属性值</title>
</head>
<%pageContext.setAttribute(“name1”, “九格科技");request.setAttribute(“name2”, “教育培训");session.setAttribute(“name3”, “技术服务");application.setAttribute(“name4”, “电子商务");
%>
<%//使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型//查找name1属性,按照顺序"page→request→session→application"在这四个对象中去查找String refName1 = (String)pageContext.findAttribute("name1");String refName2 = (String)pageContext.findAttribute("name2");String refName3 = (String)pageContext.findAttribute("name3");String refName4 = (String)pageContext.findAttribute("name4");String refName5 = (String)pageContext.findAttribute("name5");//查找一个不存在的属性
%>
<h1>pageContext.findAttribute方法查找到的属性值:</h1>
<h3>pageContext对象的name1属性:<%=refName1%></h3>
<h3>request对象的name2属性:<%=refName2%></h3>
<h3>session对象的name3属性:<%=refName3%></h3>
<h3>application对象的name4属性:<%=refName4%></h3>
<h3>查找不存在的name5属性:<%=refName5%></h3>
<hr/>
<h1>使用EL表达式进行输出:</h1>
<h3>pageContext对象的name1属性:${name1}</h3>
<h3>request对象的name2属性:${name2}</h3>
<h3>session对象的name3属性:${name3}</h3>
<h3>application对象的name4属性:${name4}</h3>
<h3>不存在的name5属性:${name5}</h3>

pageContext 对象中封装了访问其它域

  • 访问其他域方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)
  • 其他域常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE 
  • 示例
pageContext.setAttribute(“name”,“九格科技",PageContext.SESSION_SCOPE);
String name= (String)pageContext.getAttribute("name",PageContext.SESSION_SCOPE); 

pageContext 的 forward 方法跳转到其他资源

PageContext 类中定义了一个 forward 方法(用来跳转页面) 来简化 RequestDispatcher.forward 方法

<%//使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)    //使用pageContext的forward方法跳转到index.jsp页面,/代表了当前的web应用   pageContext.forward("/index.jsp");//使用RequestDispatcher的forward方法实现的跳转方式//pageContext.getRequest().getRequestDispatcher("/index.jsp").forward(request, response);
%>

pageContext的 include 方法引入其他资源

<%pageContext.include("/jspfragments/header.jsp");
%>使用pageContext的include方法引入资源
<%pageContext.include("/jspfragments/footer.jsp");
%>
<hr/>
<%--
<jsp:include page="/jspfragments/header.jsp"/>
使用jsp:include标签引入资源
<jsp:include page="/jspfragments/footer.jsp"/>
--%>

request 对象

  • Web 服务器收到客户端的 HTTP 请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象、和代表响应的 response 对象。
  • HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

获得客户机信息

String requestUrl = request.getRequestURL().toString();//得到请求的URL地址
String requestUri = request.getRequestURI();//得到请求的资源

完整阅读:https://www.laobingbiji.com/page/202405081539180000000010367926.html

相关文章:

  • Android ANR简介
  • 指纹识别经典图书、开源算法库、开源数据库
  • C语言之指针详解(5)(含有易错笔试题)
  • 达梦授权某个模式给其它用户只读权限
  • ubuntu 22.04 appearance设置没有dock选项
  • 德勤:中国、印度等对ChatGPT等生成式AI应用,处领先地位
  • 27.Java中单例模式的实现方式
  • 大模型面试--大模型(LLMs)基础面
  • 史上最全的Linux常用命令、使用技巧汇总(超全面!简单明了!)
  • 头歌springboot初体验
  • RPA机器人流程自动化如何优化人力资源工作流程
  • 嵩山为什么称为五岳之尊
  • 【STM32踩坑】HAL固件库版本过高导致烧录后无法运行问题
  • mongodb5.0.5版本集群搭建
  • 27、python-第三章-6-判断语句的嵌套和猜数游戏
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angular Elements 及其运作原理
  • bearychat的java client
  • JAVA多线程机制解析-volatilesynchronized
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • PHP的Ev教程三(Periodic watcher)
  • React Native移动开发实战-3-实现页面间的数据传递
  • webpack+react项目初体验——记录我的webpack环境配置
  • 读懂package.json -- 依赖管理
  • 回顾 Swift 多平台移植进度 #2
  • 什么软件可以剪辑音乐?
  • 突破自己的技术思维
  • 在Unity中实现一个简单的消息管理器
  • 阿里云服务器如何修改远程端口?
  • #职场发展#其他
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (初研) Sentence-embedding fine-tune notebook
  • (二)fiber的基本认识
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (一)Linux+Windows下安装ffmpeg
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)母版页和相对路径
  • (转载)Linux 多线程条件变量同步
  • .DFS.
  • .Net 8.0 新的变化
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net6使用Sejil可视化日志
  • .NET框架
  • .NET企业级应用架构设计系列之技术选型
  • ??myeclipse+tomcat
  • @Bean有哪些属性
  • @GetMapping和@RequestMapping的区别
  • @JSONField或@JsonProperty注解使用
  • @RunWith注解作用