【JSP学习笔记】4.JSP 隐式对象及客户端请求

news2024/11/25 3:20:45

前言

本章介绍JSP的隐式对象及客户端请求。

JSP 隐式对象

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

JSP所支持的九大隐式对象:

对象描述
requestHttpServletRequest 接口的实例
responseHttpServletResponse 接口的实例
outJspWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关
configServletConfig类的实例
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page类似于Java类中的this关键字
ExceptionException类的对象,代表发生错误的JSP页面中对应的异常对象

request对象
request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。

request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。

response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。

response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。

out对象
out对象是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。

最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用buffered='false’属性来轻松关闭缓存。

JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter新增了一些专为处理缓存而设计的方法。还有就是,JspWriter类会抛出IOExceptions异常,而PrintWriter不会。

下表列出了我们将会用来输出boolean,char,int,double,String,object等类型数据的重要方法:

方法描述
out.print(dataType dt)输出Type类型的值
out.println(dataType dt)输出Type类型的值然后换行
out.flush()刷新输出流

session对象
session对象是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。

session对象用来跟踪在各个客户端请求间的会话。

application对象
application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。

这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。

通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。

config对象
config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。

这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。

以下是config对象的使用方法,不是很重要,所以不常用:

config.getServletName();

它返回包含在元素中的servlet名字,注意,元素在 WEB-INF\web.xml 文件中定义。

pageContext 对象
pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。

这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。

这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。

pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。

PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。

其中一个重要的方法就是 removeAttribute(),它可接受一个或两个参数。比如,pageContext.removeAttribute(“attrName”) 移除四个scope中相关属性,但是下面这种方法只移除特定 scope 中的相关属性:

pageContext.removeAttribute("attrName", PAGE_SCOPE);

page 对象
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。

page 对象就是this对象的同义词。

exception 对象
exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。

JSP 客户端请求

当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的。您可以查阅HTTP协议来获得更多的信息。

下表列出了浏览器端信息头的一些重要内容,在以后的网络编程中将会经常见到这些信息:

信息描述
Accept指定浏览器或其他客户端可以处理的MIME类型。它的值通常为 image/png 或 image/jpeg
Accept-Charset指定浏览器要使用的字符集。比如 ISO-8859-1
Accept-Encoding指定编码类型。它的值通常为 gzip 或compress
Accept-Language指定客户端首选语言,servlet会优先返回以当前语言构成的结果集,如果servlet支持这种语言的话。比如 en,en-us,ru等等
Authorization在访问受密码保护的网页时识别不同的用户
Connection表明客户端是否可以处理HTTP持久连接。持久连接允许客户端或浏览器在一个请求中获取多个文件。Keep-Alive 表示启用持久连接
Content-Length仅适用于POST请求,表示 POST 数据的字节数
Cookie返回先前发送给浏览器的cookies至服务器
Host指出原始URL中的主机名和端口号
If-Modified-Since表明只有当网页在指定的日期被修改后客户端才需要这个网页。 服务器发送304码给客户端,表示没有更新的资源
If-Unmodified-Since与If-Modified-Since相反, 只有文档在指定日期后仍未被修改过,操作才会成功
Referer标志着所引用页面的URL。比如,如果你在页面1,然后点了个链接至页面2,那么页面1的URL就会包含在浏览器请求页面2的信息头中
User-Agent用来区分不同浏览器或客户端发送的请求,并对不同类型的浏览器返回不同的内容

HttpServletRequest类
request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。

request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。

接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:

序号方法& 描述
1Cookie[] getCookies()
返回客户端所有的Cookie的数组
2Enumeration getAttributeNames()
返回request对象的所有属性名称的集合
3Enumeration getHeaderNames()
返回所有HTTP头的名称集合
4Enumeration getParameterNames()
返回请求中所有参数的集合
5HttpSession getSession()
返回request对应的session对象,如果没有,则创建一个
6HttpSession getSession(boolean create)
返回request对应的session对象,如果没有并且参数create为true,则返回一个新的session对象
7Locale getLocale()
返回当前页的Locale对象,可以在response中设置
8Object getAttribute(String name)
返回名称为name的属性值,如果不存在则返回null。
9ServletInputStream getInputStream()
返回请求的输入流
10String getAuthType()
返回认证方案的名称,用来保护servlet,比如 “BASIC” 或者 “SSL” 或 null 如果 JSP没设置保护措施
11String getCharacterEncoding()
返回request的字符编码集名称
12String getContentType()
返回request主体的MIME类型,若未知则返回null
13String getContextPath()
返回request URI中指明的上下文路径
14String getHeader(String name)
返回name指定的信息头
15String getMethod()
返回此request中的HTTP方法,比如 GET,,POST,或PUT
16String getParameter(String name)
返回此request中name指定的参数,若不存在则返回null
17String getPathInfo()
返回任何额外的与此request URL相关的路径
18String getProtocol()
返回此request所使用的协议名和版本
19String getQueryString()
返回此 request URL包含的查询字符串
20String getRemoteAddr()
返回客户端的IP地址
21String getRemoteHost()
返回客户端的完整名称
22String getRemoteUser()
返回客户端通过登录认证的用户,若用户未认证则返回null
23String getRequestURI()
返回request的URI
24String getRequestedSessionId()
返回request指定的session ID
25String getServletPath()
返回所请求的servlet路径
26String[] getParameterValues(String name)
返回指定名称的参数的所有值,若不存在则返回null
27boolean isSecure()
返回request是否使用了加密通道,比如HTTPS
28int getContentLength()
返回request主体所包含的字节数,若未知的返回-1
29int getIntHeader(String name)
返回指定名称的request信息头的值
30int getServerPort()
返回服务器端口号

HTTP信息头示例
在这个例子中,我们会使用HttpServletRequest类的getHeaderNames()方法来读取HTTP信息头。这个方法以枚举的形式返回当前HTTP请求的头信息。

获取Enumeration对象后,用标准的方式来遍历Enumeration对象,用hasMoreElements()方法来确定什么时候停止,用nextElement()方法来获得每个参数的名字。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>csdn教程(csdn.com)</title>
</head>
<body>
<h2>HTTP 头部请求实例</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
   Enumeration headerNames = request.getHeaderNames();
   while(headerNames.hasMoreElements()) {
      String paramName = (String)headerNames.nextElement();
      out.print("<tr><td>" + paramName + "</td>\n");
      String paramValue = request.getHeader(paramName);
      out.println("<td> " + paramValue + "</td></tr>\n");
   }
%>
</table>
</body>
</html>

访问main.jsp,将会得到以下结果:

在这里插入图片描述

您可以在上面代码中尝试HttpServletRequest类的其它方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文吃透Arthas常用命令!

Arthas 常用命令 简介 Arthas 是Alibaba开源的Java诊断工具&#xff0c;动态跟踪Java代码&#xff1b;实时监控JVM状态&#xff0c;可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作 。支持JDK 6&#xff0c;支持Linux/Mac/Windows。这个工具真的很好用&#xff0c;…

【C++】模板进阶--非类型模板参数模板特化及分离编译

文章目录一、非类型模板参数二、模板的特化1.模板特化的概念2.函数模板的特化3.类模板的特化3.1 全特化3.2 偏特化4.类模板特化应用示例三、模板的分离编译四、模板总结一、非类型模板参数 模板参数分为类型形参与非类型形参&#xff0c;其中&#xff0c;类型形参即出现在模板…

MBD-PMSM闭环控制模型(FOC算法)

目录 前面 Speed_and_Position_Estimator 获取HALL信号 HALL状态更新 计算转速 位置判断 ADC相电流/总线电流电压 获取AD值 计算实际值 低速高速切换 SlowLoopControl FastLoopControl 最后 前面 前面分析了BLDC的开环与闭环&#xff0c;接下来分析PMSM或者说FOC…

MySQL 异步复制、半同步复制、增强半同步复制(史上最全)

背景&#xff1a;来自于小伙伴问题 小伙伴的难题&#xff1a; mysql主从同步的时候&#xff0c;半同步和增强半同步是怎样的一个概念&#xff0c;我看网上说的有点不明不白的&#xff0c;也没找到合适的解释。 这里尼恩给大家做一下系统化、体系化的梳理。也一并把这个题目以…

【每天学习一点点】RocketMQ的架构、写数据、高效的数据查询索引、负载均衡

Rocket一、学习目标二、RocketMQ的架构运行图2.1、NameServer2.1.1 为什么需要NameServer2.1.1.1 不可以没有nameserver吗&#xff1f;2.1.2 NameServer需要单独部署吗2.1.3 Nameserver可以动态注册和注销Broker、Topic和Consume 是什么意思2.1.4 可以使用nacos的配置中心替代N…

成本与体验的“非零和博弈”

随着移动互联网和智能终端的普及&#xff0c;越来越多的海内外互联网企业开始发力短视频业务。在短视频用户全球化&#xff0c;短视频产品及内容消费井喷式增长的今天&#xff0c;用户开始逐渐对体验有了越来越高的要求。为了更清晰更流畅地播放&#xff0c;用户播放成本也随着…

TensorFlow GPU不可用,WSL2安装

这个帖子写给23年刚买电脑、系统是win11&#xff0c;tensorflow版本是2.10以上的兄弟们。不符合的可以去看其他答案了。 这是以我三天来的安装经历来写的&#xff0c;希望能给后来的兄弟们减少时间的浪费。 win11&#xff0c;安装的tensorflow的版本都是2.12的&#xff0c;但…

(二)Cmd Markdown 编辑阅读器的使用效果 | 以 Cmd Markdown 编辑阅读器为例

Cmd Markdown 编辑阅读器使用指南 &#xff08;一&#xff09;Cmd Markdown 编辑阅读器的使用示例 | 以 Cmd Markdown 编辑阅读器为例&#xff08;二&#xff09;Cmd Markdown 编辑阅读器的使用效果 | 以 Cmd Markdown 编辑阅读器为例 在 Cmd Markdown 编辑阅读器&#xff08; …

C语言实现Allan方差计算

Allan方差专有概念解释 1.量化噪声 量化噪声是一切量化操作所固有的噪声,只要进行数字量化编码采样,传感器输出的理想值与量化值之间就必然会存在微小的差别,量化噪声代表了传感器检测的最小分辨率水平。 2.角度随机游走 角度随机游走是宽带角速率白噪声积分的结果,即陀螺…

金三银四,大伙冲刺,SpringCloud 的 25 个面试考点

今天给大家分享SpringCloud高频面试题。 Spring Cloud核心知识总结 下面是一张Spring Cloud核心组件关系图&#xff1a; 从这张图中&#xff0c;其实我们是可以获取很多信息的&#xff0c;希望大家细细品尝。 话不多说&#xff0c;我们直接开始 Spring Cloud 连环炮。 连环炮…

直播协议:RTSP、RTP、RTCP、RTMP、HLS

流媒体传输一般采用HTTP/TCP(RTCP)协议来传输控制信息&#xff0c;而用UDP(RTP)协议来传输实时媒体数据&#xff08;TCP开销相对较大&#xff0c;所以不太适合传输实时数据&#xff09;。 流媒体传输一般都是采用建立在UDP协议上的RTP/RTSP等实时传输协议。为何要在UDP而不在T…

Spring事务:事务的基础 以及使用

目录 GTP前言 一、关于事务 1.事务的四大特性ACID 2.脏读、不可重复读、幻读 ① 脏读 ② 不可重复读 ③ 幻读 3.事务的隔离级别 4.事务的传播机制 ① Propagation.REQUIRED 默认 ② Propagation.SUPPORTS ③ Propagation.MANDATORY ④ Propagation.REQUIRES_NEW ⑤…

APK一键注入网络验证后台PHP源码ThinkPHP开发版

APK一键注入网络验证后台PHP源码ThinkPHP开发版 APK一键注入网络验证后台PHP源码ThinkPHP开发版 源码: https://url11.ctfile.com/d/25976711-55383299-827d49?p6724 &#xff08;访问密码&#xff1a;6724&#xff09; 修复 已去除登录提示到期问题。 功能简介 - 无注…

庄懂的TA笔记(十三)<特效-混合模式:四种主要透明通道用法 AC,AB,AD,自定义混合>

庄懂的TA笔记&#xff08;十三&#xff09;&#xff1c;特效-混合模式&#xff1a;四种主要透明通道用法 AC,AB,AD,自定义混合&#xff1e; 效果展示&#xff1a; 正文&#xff1a; 一、特效类大纲&#xff1a; 1、特效 透 2、特效 动 3、特效 映 二、特效&#xff1a;AC:透…

学习 Python 之 Pygame 开发魂斗罗(十三)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十三&#xff09;继续编写魂斗罗1. 创建敌人2类2. 编写敌人2类的draw()函数3. 编写敌人越界消失函数4. 编写敌人开火函数5. 把敌人2加入地图进行测试继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;十…

英特尔CEO基辛格:开创可持续计算新时代

近日&#xff0c;帕特基辛格作为英特尔CEO后&#xff0c;第一次来华访问。在2023英特尔可持续发展高峰论坛上&#xff0c;笔者有幸聆听他的演讲。他严谨又不乏幽默地给我们分享了英特尔如何践行可持续发展的思考和举措。 基辛格表示&#xff0c;身处科技行业&#xff0c;我们不…

Jetson Nano驱动机器人的左右两路电机

基于Jetson Nano板子搭建一个无人车&#xff0c;少不了减速电机驱动轮子滚动&#xff0c;那如何驱动呢&#xff1f;从Jetson.GPIO库文件来说&#xff0c;里面没有支持产生PWM的引脚&#xff0c;也就意味着Jetson nano没有硬件产生PWM的能力&#xff0c;所以我们不得不使用别的方…

容器的崛起——Docker与K8s的相爱相杀

容器的崛起 对于K8s启用docker&#xff0c;作为普通开发者的体感是&#xff0c;k8s不就是docker的集群操作吗&#xff1f;k8s弃用docker就像鱼反对水一样不可思议&#xff0c;那么这两个技术究竟是什么关系&#xff0c;Kubernetes 是如何一步步与 Docker 解耦的&#xff0c;请…

k8s学习-CKS真题-Runtime设置gVisor

目录题目环境搭建解题参考题目 该 cluster 使用 containerd 作为 CRI 运行时。containerd 的默认运行时处理程序是 runc。 containerd 已准备好支持额外的运行时处理程序 runsc (gVisor)。 Task 使用名为 runsc 的现有运行时处理程序&#xff0c;创建一个名为 untrusted 的 Ru…

MIPI D-PHYv2.5笔记(20) -- High-Speed Data-Clock Timing

PHY是在Forward Direction中的源同步接口&#xff08;source synchronous interface&#xff09;。无论是处于Forward还是Reverse信号模式&#xff0c;只能有一个时钟源。在Reverve Direction中&#xff0c;时钟是在Forward Direction中被发送的。 图1 Conceptual D-PHY Data a…