Javaweb06-Jsp技术

news2024/12/24 9:30:20

Jsp技术

一.Jsp的运行原理

**概述:**JSP是Java服务器页面,既可以写静态页面代码,也可以写动态页面代码

**特点:**跨平台性,业务代码相分离,组件重用,预编译

运行原理:

image-20240523172655455
  • 客户端发生请求到Jsp文件

  • Jsp容器将Jsp文件转换为Java源文件

  • 通过编译将其转换为.class文件,它就是一个Servlet

  • jspInit()初始化(整个生命周期只会执行一次)

    -> jspService()处理请求(通过多线程方法处理,由于转换编译第一次请求慢,之后会成为常驻内存快

    ->处理完请求,响应对象由Jsp容器接收,并返回客户端

    ->Jsp对象销毁前调用jspDestroy()

二.Jsp的基本语法

**基本构成:**HTML + Java + Jsp tab

1.Jsp脚本元素

  • Jsp scriptlets

Jsp scriptlets是Jsp中存放Java代码的片段,格式:

<% 代码(变量, 程序控制语句,Jsp内置对象) %>
//存放在jspService()中的逻辑处理
  • 声明标识

声明标识用于在整个Jsp中定义全局变量和方法,格式:

<%! 定义变量和方法等 %>

解释:

1.在声明方法中定义的变量是全局变量,是因为这相当于是在.class文件转换为servlet中的全局变量和方法,是不可以进行输出。的在Jsp scriptlets代码片段中定义的变量是相当于在jspService()方法中定义的方法,因此不可以定义方法,定义的变量也是局部变量

2.通过声明标识创建的变量和方法在当前JSP页面中有效,它的生命周期是从创建开始到服务器结束;代码片段创建的变量或方法,也是在当前JSP页面有效,但它的生命周期是页面关闭后就会被销毁。

  • Jsp表达式

用于向页面输出表达式,该表达式的最终结果将会转换为字符串,格式:

<%= expression =>

2.JSP注释

  • 同Java注释一样
//   /**/  /** */
  • 隐藏注释
<%-- 注释 --%>

网页源代码只显示出了HTML注释,而没有显示JSP的注释信息。这是因为Tomcat编译JSP文件时,会将HTML注释当成普通文本发送到客户端,而JSP页面中格式为“<%-- 注释信息 --%>”的内容则会被忽略,不会发送到客户端。

  • 动态注释:将HTML代码和<% Java代码 %>结合

3.Jsp指令

  • page指令:用来对页面的某些特征进行描述
<%@ page 属性名1="" 属性名2="" %>
属性名称取值范围描述
import包名,类名指定在JSP页面翻译成的Servlet源文件中导入的包或类。 可以声明多次,一个import可以导多个包,用逗号隔开。 默认导包java.lang;javax.servlet.;javax.servlet.jsp.; javax.servlet.http.*
languagejava指定JSP页面所用的脚本语言
sessiontrue/falsetrue:该Jsp有session内置对象
isErrorPagetrue/false指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,默认情况为false
errorPageJsp相对路径指定一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。
contentType指定当前JSP页面的MIME类型和字符编码
pageEncoding指定页面编码格式
  • include指令:在JSP页面中包含另一个JSP页面
<%@ include file="被包含文件的地址"%>

(1)被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。

(2)除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。

(3)file属性的设置值必须使用相对路径,这里的file属性指定的相对路径是相对于文件,不是相对于页面,一般不以“/”开头

(4)在应用include指令进行文件包含时建议在被包含页面中将,等标签删除。

  • taglib指令:通过taglib指令标识该页面中所使用的标签库
<%@ taglib prefix="指定标签的前缀" uri="标签的uri"%>

4.Jsp动态元素

  • 包含文件元素

**作用:**用于向当前页面引入其他的文件,被引入的文件可以是动态文件,也可以是静态文件

<jsp:include page="URL" flush="true/false"/>
//page:相对路径
//flush:是否将当前页面内容刷新到客户端,默认情况为falsh(同include指令一样)

include指令和jsp:include动态元素的区别

1.include指令中的file属性不可以为表达式,<jsp:include>可以
2.include指令是将被包含的文件原封不动的插入包含页,编译为一个java文件,使用<jsp:include>动作元素包含文件时,当该元素被执行时,程序会将请求转发到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页,继续执行后面的代码。
3.include指令存在变量冲突的问题
  • 请求转发元素

**作用:**可以将当前请求转发到其他Web资源

<jsp:forward page="相对路径"/>
//注意:标签要闭合

5.Jsp隐式对象

名称类型描述
outjavax.servlet.jsp.JspWriter用于页面输出
requestjavax.servlet.http.HttpServletRequest得到用户请求信息
responsejavax.servlet.http.HttpServletResponse服务器向客户端的回应信息
configjavax.servlet.ServletConfig服务器配置,可以取得初始化参数
sessionjavax.servlet.http.HttpSession用来保存用户的信息
applicationjavax.servlet.ServletContext所有用户的共享信息
pagejava.lang.Object指当前页面转换后的Servlet类的实例
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
exceptionjava.lang.Throwable表示JSP页面所发生的异常,在错误页中才起作用
  • out对象
image-20240616114618415

在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。如果想要通过out对象直接写入到Servlet可以使用page指令实现

<%@ page buffer="0kb" %>
  • pageContext对象

1.获得Jsp隐式对象

方法名功能描述
JspWriter getOut()用于获取out隐式对象
Object getPage()用于获取page隐式对象
ServletRequest getRequest()用于获取request隐式对象
ServletResponse getResponse()用于获取response隐式对象
HttpSession getSession()用于获取session隐式对象
Exception getException()用于获取exception隐式对象
ServletConfig getServletConfig()用于获取config隐式对象
ServletContext getServletContext()用于获取application隐式对象

2.域对象相关方法

方法名功能描述
void setAttribute(String name,Object value,int scope)用于设置pageContext对象的属性
Object getAttribute(String name,int scope)用于获取pageContext对象的属性
Object getAttribute(String name)用于获取scope范围为PAGE_SCOPE的属性
void removeAttribute(String name,int scope)用于删除指定范围内名称为name的属性
void removeAttribute(String name)用于删除所有范围内名称为name的属性
Object findAttribute(String name)用于从4个域对象中查找名称为name的属性(依次从page,request,session,application范围找,否则人返回null)
Enumeration getAttribute(int scope)获取某个范围的属性名
scope的作用范围:
pageContext.PAGE_SCOPE:表示页面范围。
pageContext.REQUEST_SCOPE:表示请求范围。
pageContext.SESSION_SCOPE:表示会话范围。
pageContext.APPLICATION_SCOPE:表示Web应用程序范围
  • exception对象

在JSP页面中,经常需要处理一些异常信息,处理异常信息可以通过exception对象实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。需要注意的是,exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage=“true”%>的页面。

三.EL表达式

1.EL表达式基本概念

  • EL表达式语法格式
${表达式}

作用:EL表达式用来获取域对象的值,如果域对象的值不存在的时候会返回空字符串,不会出现空指针异常

  • EL表达式的特点
1EL可以与JavaScript语句结合使用。
(2EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过“+”符号进行连接(如$ {number1+number2}),如果字符串不是数字的话,是不可以连接的会报错
(3EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
(4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
(5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
(6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
(7)在EL中,可以访问JSP的作用域(request、 session、 application 以及page)。
  • EL表达式中的变量就是域属性的名字
  • 点运算符:用来获取与属性的值
${user.name}
  • 方框运算符也可以获取域属性的值
${user["name"]}

注意下面情况只可以用方框运算符

1.如果属性名出现"-","?"等非字母和数字的符号
${user["My-name"]}    
2.如果要访问数组或集合中的元素
${user[index]}
  • empty运算符用于判断对象是否为null或为空
${empty empression}
  • 条件运算符
${A?B:C}
  • 在使用EL表达式时,没有数组下标越界,没有空指针异常,没有字符串拼接

2.EL隐式对象

  • pageContext对象

作用:获取JSP页面的隐式对象,可以使用EL中的pageContext隐式对象

隐式对象名称 返回值类型
pageContext对应于JSP页面中的pageContext对象pageContext
${pageContext.request.characterEncoding}
//相当于
pageContext.getRequest().getCharacterEncoding()
  • cookie对象

作用:获得客户端cookie信息

隐式对象名称 返回值类型
cookie用于获取使用者的cookie值,cookie的类型是MapMap<String, Cookie>
${cookie.cookie名字}<br/>
${cookie.cookie名字cookie名字.name}<br/>
${cookie.cookie名字.value}<br/>
  • initParam对象

作用:获得初始化参数的值

隐式对象名称 返回值类型
initParam表示一个保存了所有Web应用初始化参数的Map对象Map<String, String>
  • 四个域范围对象

作用:用来获取域属性和值

隐式对象名称 返回值类型
pageScope代表page域中用于保存属性的Map对象Map<String, Object>
requestScope代表request域中用于保存属性的Map对象Map<String, Object>
sessionScope代表session域中用于保存属性的Map对象Map<String, Object>
applicationScope代表application域中用于保存属性的Map对象Map<String, Object>
${pageScope.username}
${requestScope.username}
  • 获取参数对象
隐式对象名称 返回值类型
param表示一个保存了所有请求参数的Map对象Map<String, String>
paramValues表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String类型数组Map<String, String[]>
name:${param.name}<br/>
hobby1:${paramValues.hobby[0]}<br/>
hobby2:${paramValues.hobby[1]}<br/>
  • 获取请求头字段对象
隐式对象名称 返回值类型
header表示一个保存了所有http请求头字段的Map对象Map<String, String>
headerValues表示一个保存了所有http请求头字段的Map对象,返回String类型数组Map<String, String[]>

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

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

相关文章

页面置换算法的模拟实现

一. 实验内容 1. 假设某一个进程&#xff0c;在运行过程中需要访问的内容依次在320个地址中。为了模拟产生320个地址的值。首先实现在main函数中调用下面的函数随机产生320个地址的地址序列。 #include<unistd.h> void randarray(int a[],int k) { int i; float s;…

使用自定义注解进行权限校验

一&#xff0c;前言 对于一些重复性的操作我们可以用提取为util的方式进行处理&#xff0c;但也可以更简便一些&#xff0c;比如自定义个注解进行。选择看这篇文章的小伙伴想必都对注解不陌生&#xff0c;但是可能对它的工作原理不太清楚。这里我们用注解实现对接口的权限校验…

长亭网络通信基础2

DNAT 默认路由配置方式 VRRP 买两个路由器 拥有两个虚拟网关地址 当一个路由器坏了还能进行正常上网 相当于三层闭合 提供功能 长亭笔试考题解析 三层交换机结合了路由器和交换机的特点 交换机没有路由表 不在同一网段 不能直接通信 可以给交换机VLANif 给接口配置ip地址 先…

【云岚到家】-day03-1-门户等缓存方案选择

【云岚到家】-day03-1-门户-缓存方案选择 1 门户1.1 门户简介1.2 常见的技术方案1.2.1 需求1.2.2 常见门户1.2.2.1 Web门户1.2.2.2 移动应用门户1.2.2.3 总结 2 缓存技术方案2.1 需求分析2.1.1 界面原型2.2.2 缓存需求 3 SpringCache入门3.1 基础概念3.1.1 Redis客户端3.1.2 Sp…

循环队列

循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;First In First Out&#xff0c;先进先出&#xff09;原则并且队尾被连接在队首以形成一个循环。 这种结构克服了普通队列在元素入队和出队时需要移动大量元素的缺点。 在循环队列中&#xff0c;当元素…

轻松上手MYSQL:探索MySQL索引数据结构的奥秘-让数据库飞起来

​&#x1f308; 个人主页&#xff1a;danci_&#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》&#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ &#x1f44b; 大家好&#xff01;文本学习研…

Hadoop的读写流程

Hadoop分布式文件系统(HDFS)是Apache Hadoop项目的核心组件,它为大数据存储提供了一个可靠、可扩展的存储解决方案。本文将详细介绍HDFS的读写数据流程,包括数据的存储原理、读写过程以及优化策略。 一、HDFS简介 HDFS是一个高度容错的分布式文件系统,它设计用于运行在通…

python包管理器--- pip、conda、mamba的比较

1 pip 1.1 简介 pip是一个 Python 的包&#xff08;Package&#xff09;管理工具&#xff0c;用于从 PyPI 安装和管理 Python 标准库之外的其他包&#xff08;第三方包&#xff09;。从 Python 3.4 起&#xff0c;pip 已经成为 Python 安装程序的一部分&#xff0c;也是官方标准…

【chatbot-api开源项目】开发文档

chatbot-api 1. 需求分析1-1. 需求分析1-2. 系统流程图 2. 技术选型3. 项目开发3-1. 项目初始化3-2. 爬取接口获取问题接口回答问题接口创建对应对象 3-3. 调用AI3-4. 定时自动化回答 4. Docker部署5. 扩展5-1. 如果cookie失效了怎么处理5-2. 如何更好的对接多个回答系统 Gitee…

各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?

2023简直被人工智能相关话题席卷的一年。关于机器学习算法的热度&#xff0c;也再次飙升&#xff0c;网络上一些分享已经比较老了。那么今天借着查询和学习的机会&#xff0c;我也来浅浅分享下目前各种机器学习算法及其应用场景。 为了方便非专业的朋友阅读&#xff0c;我会从算…

揭秘神秘的种子:Adobe联合宾夕法尼亚大学发布文本到图像扩散模型大规模种子分析

文章链接&#xff1a;https://arxiv.org/pdf/2405.14828 最近对文本到图像&#xff08;T2I&#xff09;扩散模型的进展促进了创造性和逼真的图像合成。通过变化随机种子&#xff0c;可以为固定的文本提示生成各种图像。在技术上&#xff0c;种子控制着初始噪声&#xff0c;并…

FineReport简单介绍(2)

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在&#xff0c;FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

电商秒杀系统

一&#xff0c;细节 二&#xff0c;需要注意的细节 1.库存超卖问题 使用mysql数据库的 悲观锁 机制。在事务中使用 for update 语句&#xff0c;此时数据库会加锁&#xff0c;其他想要当前读的线程都会被阻塞&#xff0c;在事务处理完成之后释放这一条数据。该方法的缺点在于…

排序——希尔排序

希尔排序实际上是插入排序的优化&#xff0c;所以要先介绍插入排序。 目录 插入排序 思想 演示 代码实现 总结 希尔排序 思想 演示 代码 总结 插入排序 思想 又称直接插入排序。它的基本思想是将一个值插入到一个有序序列中。直至将所有的值都插入完。 演示 假设数…

工程设计问题---行星轮系设计问题

该问题的主要目标是使汽车传动比的最大误差最小。为了使最大误差最小&#xff0c;对自动行星传动系统的齿轮齿数进行了计算。该问题包含6个整数变量和11个不同几何约束和装配约束的约束。 参考文献&#xff1a; Abhishek Kumar, Guohua Wu, Mostafa Z. Ali, Rammohan Malliped…

国际统计年鉴(1995-2023年)

数据年份&#xff1a;1995-2023 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;《国际统计年鉴》是一部综合性的国际经济社会统计资料年刊&#xff0c;收录了世界200多个国家和地区的统计数据&#xff0c;并对其中40多个主要国家和地区的经济社会发展指标及国际组织发布…

ARIMA模型与ARIMA-GARCH模型预测时间序列

上世纪 70 年代初&#xff0c;Ljung 等人提出 ARIMA 模型&#xff0c;又称求和自回归移动平均模型。其思想 是针对于非平稳时间序列进行数学建模&#xff0c;将其通过差分运算后 进行相关数据刻画 &#xff0c;变为一个平稳的新序列&#xff0c;进而进行相关数据的刻画。 自 1…

Element-UI - 解决el-table中图片悬浮被遮挡问题

在开发中&#xff0c;发现element-ui在el-table中添加图片悬浮显示时&#xff0c;会被单元格遮挡的问题。通过查询得到的解决办法&#xff0c;大多是修改.el-table类中相关样式属性&#xff0c;但经过验证发现会影响到其他正常功能的使用。对于此问题解决其实也并不难&#xff…

计算机网络知识点全面总结回顾

物理层 OSI模型&#xff1a;数据链路层&#xff08;流量控制&#xff09;&#xff0c;从传输层开始端到端&#xff1b;每一层的元素都称为实体&#xff0c;同一层的是对等实体&#xff1b;三个重要概念&#xff1a;服务&#xff08;下层为上层提供调用&#xff09;&#xff0c…

非连续分配管理方式(重点)

目录 一. 基本分页存储管理1.1 什么是分页存储1.2 页表 二. 基本地址变换机构三. 具有快表的地址变换机构3.1 什么是快表3.2 引入快表后, 地址的变换过程3.3 局部性原理 四. 两级页表4.1 单级页表存在什么问题?如何解决?4.2 两级页表的原理、逻辑地址结构4.3 如何实现地址变换…