Javaweb06-Jsp技术

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[]>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssldump一键分析网络流量(KALI工具系列二十二)

目录 1、KALI LINUX 简介 2、ssldump工具简介 3、在KALI中使用ssldump 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 监听指定网卡 4.2 指定端口 4.3 特定主机 4.4 解码文件 4.5 显示对话摘要 4.6 显示加密数据&#xff08;需要私钥&…

知识普及:什么是边缘计算(Edge Computing)?

边缘计算是一种分布式计算架构&#xff0c;它将数据处理、存储和服务功能移近数据产生的边缘位置&#xff0c;即接近数据源和用户的位置&#xff0c;而不是依赖中心化的数据中心或云计算平台。边缘计算的核心思想是在靠近终端设备的位置进行数据处理&#xff0c;以降低延迟、减…

Python开发者的7个PyCharm必备插件

大家好&#xff0c;本文将推荐使用7个必备的PyCharm IDE设置和插件&#xff0c;希望能帮助了解如何修改和增强IDE体验&#xff0c;使其更适合个人使用&#xff0c;毕竟作为开发者&#xff0c;大部分时间都是在这里工作。 1.String Manipulation 【链接】&#xff1a;https://…

c语言——扫雷游戏(简易版)

目录 前言游戏设计 前言 什么是扫雷游戏&#xff1f; 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 这个游戏对于c语言的初学者来说难度还是挺大的&#xff0c;那我就实现一个初学者也能快速学…

Android Media Framework(六)插件式编程与OMXStore

OpenMAX IL Spec阅读到上一节就结束了&#xff0c;这一节开始正式进入到Framework阅读阶段&#xff0c;我们将了解OpenMAX框架是如何与Android Framework连接的。 1、插件式编程 插件式编程&#xff08;Plugin-based Programming&#xff09;是一种软件开发模式&#xff0c;它…

JavaFX 概述

要从 JavaFX 中充分受益&#xff0c;了解 JavaFX 的设计方式以及对 JavaFX 包含的功能有一个很好的概述是很有用的。本文的目的是为您提供 JavaFX 概述。本文将首先介绍一般的 JavaFX 设计&#xff0c;然后介绍 JavaFX 中的各种特性。 如果您熟悉 Flash/Flex&#xff0c;您会发…

【后端】websocket学习笔记

文章目录 1. 消息推送常见方式1.1 轮询 VS 长轮询1.2 SSE&#xff08;server-sent event)服务器发送事件 2. websocket介绍2.1 介绍2.2 原理2.3 websoket API2.3.1 客户端【浏览器】API2.3.2 服务端API 3. 代码实现3.1 流程分析3.2 pom依赖3.3 配置类3.4 消息格式3.5 消息类 参…

【Css】纯css展开、收起超出的文本

效果 展开 收起 未超出 码 -webkit-line-clamp: 3; 设置限制行数 <div class"wrap"> <inputtype"checkbox"id"exp-txt"><div class"text"><labelfor"exp-txt"class"btn"></label&g…

纷享销客常见问题FAQ

运维和安全职责边界 应用专属是部署在客户私有云或者客户公有云租户的IT环境中的&#xff0c;由纷享销客与客户共同维护系统的稳定性。一般来说客户主要负责维护IT基础环境和账号权限的管理而纷享销客则负责在客户环境中进行应用系统的部署、优化和日常运维工作。在安全方面&am…

OrangePi AIpro 机器人仿真与人工智能应用测评

系列文章目录 前言 本篇文章分为2个部分&#xff0c;第一部分主要搭建了机器人的仿真环境&#xff08;ROS2 MuJoCo等&#xff09;&#xff0c;运行了机械臂及移动机器人相关示例程序&#xff1b;第二部分运行了OrangePi AIpro系统自带的示例程序及昇腾社区官方的示例程序&#…

马克·雷伯特访谈:机器人的未来及波士顿动力的创新之路

引言 机器人技术作为现代科技的前沿领域&#xff0c;始终吸引着大量的关注与研究。波士顿动力公司作为这一领域的领军者&#xff0c;其创始人兼前CEO马克雷伯特&#xff08;Marc Raibert&#xff09;近日在主持人莱克斯弗里德曼&#xff08;Lex Fridman&#xff09;的播客节目…

机器学习笔记 - 用于3D点云数据分割的Point Net的训练

一、数据集简述 ​在本教程中,我们将学习如何在斯坦福 3D 室内场景数据集 ( S3DIS )上训练 Point Net 进行语义分割。S3DIS 是一个 3D 数据集,包含来自多栋建筑的室内空间点云,占地面积超过 6000 平方米。Point Net使用整个点云,能够执行分类和分割任务。如果你一直在关注 …

【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…

SNAT和DNAT策略

1、SNAT策略及应用 SNAT应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能在Internet中被正常路由&#xff09; SNAT原理&#xff1a; 修改数据包的源地址。 SNAT转换前提条件&#xff1a; 局域网各主机已正确设置IP地址、子网掩码、默认…

库的制作 与 使用 (Linux下)

目录 动静态库的制作 前置知识 库的基本构造 问题 分析 要给什么文件 如何更好的让别人使用 库的生成 静态库的生成 makefile参考 动态库的生成 makefile参考&#xff08;包含动态库和静态库生成&#xff09; 库的使用 法一&#xff1a;放入系统路径 弊端 法二…

Android开发系列:高性能视图组件Surfaceview

一、Surfaceview概述 在Android应用开发领域&#xff0c;面对视频播放、游戏构建及相机实时预览等高性能需求场景&#xff0c;直接操控图像数据并即时展示于屏幕成为必要条件。传统View组件在此类情境下显现局限性&#xff1a; 性能瓶颈&#xff1a;传统View的绘制任务由UI主…

如何充分利用 Postgres 的内存设置

为了充分利用 PostgreSQL 的内存设置&#xff0c;你需要调整多个参数以优化数据库性能。这些参数包括共享缓冲区&#xff08;shared_buffers&#xff09;、工作内存&#xff08;work_mem&#xff09;、维护工作内存&#xff08;maintenance_work_mem&#xff09;、有效缓存大小…

命令词:引导行动的语言工具

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

《全职猎人》

《全职猎人》 [1-2]是日本漫画家富坚义博的作品。 1999年版改编电视动画由日本动画公司负责动画制作&#xff0c;于1999年10月16日&#xff0d;2001年3月30日在富士电视台播出&#xff0c;该动画的故事至贪婪之岛篇章结束&#xff0c;全92话。 该作在富坚义博老师天马行空的想…

markupsafe,一个神奇的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - markupsafe。 Github地址&#xff1a;https://github.com/pallets/markupsafe 在 Web 开发和模版渲染中&#xff0c;处理用户输入的数据时&#xff0c;防止 HTML 注入是至…