认识与学习JSP
JSP核心技术
什么是JSP
| JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据 |
JSP最佳实践
| 不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术有各自的特点,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示交给jsp来做, 在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。 |
JSP语法
| JSP模版元素 JSP表达式 JSP脚本片断 JSP注释 JSP指令 JSP标签 JSP内置对象 如何查找JSP页面中的错误 |
JSP模板元素
| JSP页面中的HTML内容称之为JSP模版元素。 JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观 |
JSP脚本表达式
| JSP脚本表达式(expression)用于将程序数据输出到客户端 语法:<%= 变量或表达式 %> 举例:当前时间:<%= new java.util.Date() %> JSP脚本表达式中的变量或表达式后面不能有分号 |
JSP脚本片段
| JSP脚本片断,用于在JSP页面中编写多行Java代码。 语法: <% 多行java代码 %> 注意: JSP脚本片断中只能出现java代码,不能出现其它模板元素 JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。 案例: 1,在jsp脚本中定义一个时间变量,然后采用脚本表达式输出该变量 2,循环打印100行的表格 |
JSP声明
| JSP页面中编写的所有代码,默认会翻译到servlet的service方法中,而Jsp声明中的java代码被翻译到_jspService方法的外面。语法 <%! java代码 %> 观察生成的代码效果 |
JSP注释
| JSP注释的格式: <%-- 注释信息 --%> JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容. 注意:它与HTML中的注释有什么不同 |
JSP指令
| JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令: page指令 include指令 taglib指令 JSP指令的基本语法格式: <%@ 指令 属性名="值" %> 举例:<%@ page contentType="text/html;charset=utf-8"%> 如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。 <%@ page contentType="text/html; charset=utf-8" import="java.util.Date"%> 也可以这样写 <%@ page contentType="text/html;charset=utf-8"%> <%@ page import="java.util.Date"%> |
JSP的page指令
| page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。 JSP 2.0规范中定义的page指令的完整语法: <%@ page [ import="{package.class | package.*}, ..." ] [ errorPage="relative_url" ] [ isErrorPage="true | false" ] [ contentType= "text/html ; charset=ISO-8859-1" ] %> 可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔: <%@ page import="java.util.Date,java.sql.*,java.io.*"%> 上面的语句也可以改写为使用多条page指令的import属性来分别引入各个 |
include指令
| include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。 语法: <%@ include file=“被包含页面的绝对URL或相对URL"%> 其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。 细节: 被引入的文件必须遵循JSP语法。 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp 页面的方式处理它里面的内容, 为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。 案例: 网页头部显示当前时间,这个头部信息需要复用,那么就可以在多个页面进行引入操作 PageEncoding是jsp翻译成Java文件时用到的编码格式 ContentType是指服务器给客户端响应时的内容编码 |
taglib指令
| taglib指令用于在JSP页面中导入标签库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> |
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个对象分别是哪些,以及作用也是笔试经常考察的知识点。 request -- HttpServletRequest response -- HttpServletResponse config -- ServletConfig application -- ServletContext exception(只有在page指令中具有属性isErrorPage="true"时才有效)-- Exception session -- HttpSession page -- 当前类 out -- JspWriter pageContext -- PageContext |
pageContext对象和作用域
| pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据 getException方法返回exception隐式对象 getPage方法返回page隐式对象 getRequest方法返回request隐式对象 getResponse方法返回response隐式对象 getServletConfig方法返回config隐式对象 getServletContext方法返回application隐式对象 getSession方法返回session隐式对象 getOut方法返回out隐式对象 pageContext封装其它8大内置对象的意义 |
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) 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 |
JSP标签
| JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。 <jsp:include>标签 <jsp:forward>标签 <jsp:param>标签 |
<jsp:include>标签
| <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。 语法: <jsp:include page="relativeURL" /> page属性用于指定被引入资源的相对路径 |
<jsp:include>与include指令的比较
| 一个是动态导入,一个是静态导入 |
<jsp:forward>标签
| <jsp:forward>标签用于把请求转发给另外一个资源。 语法: <jsp:forward page="relativeURL | <%=expression%>" /> page属性用于指定请求转发到的资源的相对路径 |
<jsp:param>标签
| 当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。 语法1: <jsp:include page="hhy.jsp | <%=expression%>"> <jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include> 语法2: <jsp:forward page="relativeURL | <%=expression%>"> <jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:forward> |
EL
| EL表达式:expression language 表达式语言 它不是一种开发语言,是jsp中获取数据的一种规范 注意:EL表达式查找的范围顺序,以及如何获取请求的参数信息 案例一: <%-- JSP脚本来存放值,然后采用EL表达式来获取值 --%> <% request.setAttribute("el", "来自request域存放的数据"); %>
<%-- 通过EL表达式获取该值 --%> ${el} <%=request.getAttribute("el") %> 通过设置多个区域的数据,来观察EL表达式获取值的顺序 另外,怎样采用EL表达式获取到请求参数? 案例二: EL表达式对于null情况的处理,即不存在对应的key时,是怎么显示的? 案例三: 属性导航(对象获取属性,获取List的元素,获取Map的元素) <% Book book = new Book(1001,"Java探索之旅",99.9); request.setAttribute("book", book); %> ${book.bookName} <% List<Book> list = new ArrayList<Book>(); list.add(new Book(1001,"Java探索之旅",99.9)); list.add(new Book(1002,"技术探索之旅",199.9)); list.add(new Book(1003,"宇宙探索之旅",999.9));
request.setAttribute("list", list); %>
${list[0].bookName} <% Map<String,String> map = new HashMap<String,String>(); map.put("1001", "目标一:每天比昨天懂得多一点"); map.put("1002", "目标二:每个星期有一个专项的提升"); map.put("1003", "目标三:每个月有一个系统的提升");
request.setAttribute("map", map); %>
${map["1001"]} 案例四: 三元运算符结合结果来做信息提示 ${empty cart} ${empty cart ? "您的购物车尚无商品" : "您的购物车商品信息如下:" } 数据的回显 <% request.setAttribute("sex", 1); %> <input type="radio" name="sex" value="1" ${sex==1 ?"checked='checked'" : ""}/>男 <input type="radio" name="sex" value="0" ${sex==0 ? "checked='checked'" : ""}/>女 |
JSTL
什么是JSTLJSTL(JavaServerPages Standard Tag Library)JSP标准标签库 2、JSTL的作用使用JSTL实现JSP页面中逻辑处理。如判断、循环等。 3、使用JSTL1)在JSP页面添加taglib指令 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 2)使用JSTL标签 <c:if test="${empty cart}">您的购物车尚无商品</c:if> 4、常用标签介绍1)通用标签: set、 out、 remove
2)条件标签:if choose 3)迭带标签:foreach 案例一:实现普通for循环,打印多个数字 案例二:遍历一个集合数据,并实现隔行换色的效果 |
格式化
| 首先,引入 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 案例一:日期格式化 比如对象保存的属性为日期类型,希望展示的结果是我们期望的日期格式 案例二:格式化小数,保留两位小数点 案例三:百分比格式化 |
相关文章:
认识与学习JSP
JSP核心技术 什么是JSP JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm…...
MySql 各种 join
MySql 定义了很多join的方式,接下来我们用一个例子来讲解。 用到的表 本文用到了两个表s1,s2: 内外连接 测试 1 1 1.select * from s1 inner join s2 on(s1.id s2.id);: -------- | id | id | -------- | 3 | 3 | | 4 | 4 | --------2…...
【Android面试八股文】Android中操作多线程的方式有哪些?
文章目录 1. 使用 `Thread` 和 `Runnable`2. `AsyncTask`3. `Handler` 和 `Looper`4. `HandlerThread`5. `ThreadPoolExecutor`6. `IntentService`7. `RxJava`8. `Coroutine`(协程)9. `WorkManager`在Android开发中,有多种方式可以进行多线程操作。以下是主要的几种方式: 1…...
语义分割和目标检测的关系
目录 1.语义分割的目标 2.目标检测的目标 3.两种任务的异同之处 从大方向的任务特点上来说 (1)物体的位置 (2)物体的分类 从数据格式来说 (1)语义分割的数据格式 (2)目标检测的数据格式 1.语义分…...
SpringBoot 大文件基于md5实现分片上传、断点续传、秒传
SpringBoot 大文件基于md5实现分片上传、断点续传、秒传 SpringBoot 大文件基于md5实现分片上传、断点续传、秒传前言1. 基本概念1.1 分片上传1.2 断点续传1.3 秒传1.4 分片上传的实现 2. 分片上传前端实现2.1 什么是WebUploader?功能特点接口说明事件APIHook 机制 …...
数据资产治理与数据质量提升:构建完善的数据治理体系,确保数据资产的高质量与准确性
一、引言 随着信息技术的迅猛发展,数据已经成为企业和社会发展的重要资产。然而,数据资产的有效治理与数据质量的提升,是企业实现数字化转型、提升竞争力的关键。本文旨在探讨数据资产治理与数据质量提升的重要性,并提出构建完善…...
SylixOS下UDP组播测试程序
SylixOS下UDP组播测试 测试效果截图如下: udp组播发送测试程序。 /********************************************************************************************************* ** ** 中国软件开源组织 ** ** …...
Web前端快速开发平台:革命性工具,提升开发效率的新篇章
Web前端快速开发平台:革命性工具,提升开发效率的新篇章 在数字化时代的浪潮中,Web前端技术的快速发展与变革正在重塑我们的数字世界。为了应对这种快速变化,Web前端快速开发平台应运而生,为开发者们提供了更加高效、便…...
内窥镜系统设计简介
内窥镜系统设计简介 1. 源由2. 系统组成2.1 光学系统2.2 机械结构2.3 电子系统2.4 软件系统2.5 安全性和合规性2.6 研发与测试2.7 用户培训与支持 3. 研发过程3.1 光学系统Step 1:镜头设计Step 2:光源Step 3:成像传感器 3.2 机械结构Step 1&a…...
使用Spring Boot实现Redis多数据库缓存
Redis多数据库存储实现用户行为缓存 在我的系统中,为了优化用户行为数据的存储与访问效率,我引入了Redis缓存,并将数据分布在不同的Redis数据库中。通过这种方式,可以减少单一数据库的负载,提高系统的整体性能。 主要…...
揭秘newSingleThreadExecutor:深度解析与源码探秘
1. 概述 newSingleThreadExecutor是Java线程池框架中Executors类的一个静态方法,它返回一个线程池实例,该线程池维护一个单一的工作线程来执行任务。这个线程池的特性在于它保证了所有提交的任务会按照它们在队列中的顺序依次执行,而不会并发执行。它适用于需要保证任务顺序…...
使用python绘制三维散点图
使用python绘制三维散点图 三维散点图三维散点图的用途效果代码 三维散点图 三维散点图(3D Scatter Plot)是一种用于展示三维数据的图表。与二维散点图类似,三维散点图通过点在三维空间中的位置来表示数据点的三个特征。每个点在 x、y 和 z …...
Vue51-插件
一、插件的定义 vue里面的插件,类似于游戏的外挂。 vue中插件的本质:一个对象,里面必须包含install方法。 二、插件的使用 2-1、创建一个插件js文件(写在src中plugins.js) 2-2、应用插件:Vue.use(插件) …...
python将一个整数转为字符串列表
如果你想要将一个整数转换为字符串列表,其中每个数字(0-9)都是列表中的一个元素,你可以先将整数转换为字符串,然后遍历这个字符串,将每个字符添加到列表中。这里是一个简单的示例: # 假设你有一…...
PTA 6 - 20 汉诺塔问题(py 递归)
这道题是一道比较典型的递归问题,他跟斐波那契数列的本质是一样的,大家自己动手推理一下,非常好推 参考代码: def hanoi(n,a,b,c):global stepif n 1:print(a,"->",c)step 1else:hanoi(n-1,a,c,b)print(a,"…...
深度学习Day-20:DenseNet算法实战 乳腺癌识别
🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客 🍖 原作者:[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境:Python3.8编译器选择:Pycharm深度学习环境: torch1.12.1c…...
给类设置serialVersionUID
第一步打开idea设置窗口(setting窗口默认快捷键CtrlAltS) 第二步搜索找到Inspections 第三步勾选主窗口中Java->Serializations issues->下的Serializable class without serialVersionUID’项 ,并点击“OK”确认 第四步鼠标选中要加…...
Android之实现两段颜色样式不同的文字拼接进行富文本方式的显示
一、使用SpannableString进行拼接 1、显示例子 前面文字显示红色,后面显示白色,显示在一个TextView中,可以自动换行 发送人姓名: 发送信息内容2、TextView <TextViewandroid:id"id/tv_msg"android:layout_width"wrap_c…...
GenICam标准(五)
系列文章目录 GenICam标准(一) GenICam标准(二) GenICam标准(三) GenICam标准(四) GenICam标准(五) GenICam标准(六) 文章目录 系列文…...
《人生海海》读后感
麦家是写谍战的高手,《暗算》《风声》等等作品被搬上荧屏后,掀起了一阵一阵的收视狂潮。麦家声名远扬我自然是知道的,然而我对谍战似乎总是提不起兴趣,因此从来没有拜读过他的作品。这几天无聊时在网上找找看看,发现了…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
