JavaWeb笔记之JSP

一、引言
二、JSP
2.1 概念
2.2 作用
三、JSP开发
3.1 创建JSP
3.1.1 编写代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>This is my first page</title>
</head>
<body><%=new java.util.Date() %>
</body>
</html> 3.1.2 访问JSP
3.2 JSP与Servlet

3.3 JSP实现原理

四、集成开发
4.1 脚本
4.1.1 普通脚本
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%//jsp中,使用小脚本嵌入java代码!out.println("hi");//打印内容在客户端页面System.out.println("hi");//打印内容在控制台
%>
</body>
</html> 4.1.2 声明脚本
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Object object = new Object(); %>
<%!//定义方法public void m1(){System.out.println("你好");}
%> 4.1.3 输出脚本
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp基本使用</title>
</head>
<body>
<p>今天的日期是: <%= new java.util.Date() %>
</p>
</body>
</html> 4.2 JSP注释
4.2.1 语法

4.2.2 注释
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp基础教程</title>
</head>
<body>
<%-- JSP注释在网页中不会被显示--%>
<!-- HTML注释在网页源代码中会显示 -->
<p>今天的日期是: <%= new java.util.Date() %>
</p>
</body>
</html> 4.3 JSP指令

4.3.1 page指令

4.3.2 include指令
<%@ include file="header.jsp"%>
...
...
<%@ include file="footer.jsp" %> 4.3.3 taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4.4 动作标签
4.4.1 include

<jsp:include page="index.jsp"/> 4.4.2 useBean
<jsp:useBean id="user" class="com.liuy.entity.User"/> 4.4.3 setProperty

<jsp:useBean id="user" class="com.liuy.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" /> 4.4.4 getProperty

<jsp:useBean id="user" class="com.liuy.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />
<jsp:getProperty name="user" property="name" /> 4.4.5 forward

<jsp:forward page="index.jsp" /> 4.4.6 param
<jsp:forward page="index.jsp"><!-- http请求参数传递--><jsp:param name="sex" value="nan" />
</jsp:forward> 4.5 内置对象

4.5.1 四大域对象
4.5.2 pageContext
<%pageContext.setAttribute("name",value);//当前页面作用域有效
%> 4.5.3 获取内置对象
<%pageContext.getRequest();//返回request内置对象pageContext.getResponse();//返回response内置对象pageContext.getServletConfig();//返回config内置对象pageContext.getException();//返回exception内置对象pageContext.getPage();//返回page内置对象pageContext.getOut();//返回out内置对象pageContext.getServletContext();//返回application内置对象pageContext.getSession();//返回session内置对象
%> 4.5.4 作用域
<%//操作其他作用域存储pageContext.setAttribute("name",value);//当前页面有效pageContext.setAttribute("name",value,PageContext.REQUEST_SCOPE);//request作用域pageContext.setAttribute("name",value,PageContext.SESSION_SCOPE);//session作用域pageContext.setAttribute("name",value,PageContext.APPLICATION_SCOPE);//application作用域
%><%//操作其他作用域获取pageContext.getAttribute("name");//当前页面作用域pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application作用域pageContext.findAttribute("name");//从pageContext ,request ,session ,application依次查找
%> 4.6 整合
五、EL表达式
5.1 概念
5.2 作用
5.3 EL的应用
5.3.1 案例
<%//存储在request作用域request.setAttribute("name","tom");request.setAttribute("age",18);
%>
${requestScope.name} <%--获取request作用域中name对应的值,找到就返回,没找到返回"" --%>
${name}<%--从最小作用域逐级查找name对应的值,找到就返回,没找到返回"" --%> 5.3.2 区别
5.4 获取引用类型
<%Emp e = new Emp();e.setName("gavin");e.setAge(19);request.setAttribute("e",e);
%>
${requestScope.e.name}<%-- 调用getName()方法 --%> 5.5 获取集合元素
<%int[] array = new int[]{1,2,3,4,5};request.setAttribute("array",array);List<Emp> emps = new ArrayList<>();emps.add(new Emp(1,"gavin",2000,19));emps.add(new Emp(2,"marry",3000,29));emps.add(new Emp(3,"jack",4000,39));request.setAttribute("emps",emps);Map<String,String> maps = new HashMap<>();maps.put("CN","中国");maps.put("FK","法国");maps.put("US","美国");request.setAttribute("maps",maps);
%>
${requestScope.array[0]}
${requestScope.emps[0]} <%-- 也可以用 ${requestScope.emps.get(0)} --%>
${requestScope.maps.CN} <%-- 也可以用 ${requestScope.maps["US"]} --> 5.6 运算符

5.6.1 执行运算
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>运算符</title>
</head>
<body><%request.setAttribute("num",1234);String ss = "123";request.setAttribute("ss",ss);%><h1>算术运算</h1>${num + 1}<br/>${num - 1}<br/>${num * 2}<br/>${num div 2}<br/>${num mod 2}<br/><hr/><h1>关系运算</h1>${num == 1234}<br/>${num != 1234}<br/>${num > 1200}<br/>${num < 1200}<br/>${num >= 1234}<br/>${num <= 1234}<br/><hr/><h1>逻辑运算</h1>${num %2==0 || num /2 ==1}<br/>${num % 2==0 && num % 4==0}<br/>${!(num > 1234)}<br/><hr/><h1>empty运算符</h1>${ss == null}<br/>${empty ss}<br/>
</body>
</html> 5.6.2 empty
<%String s1="";pageContext.setAttribute("s1", s1);String s2=null;pageContext.setAttribute("s2", s2);String s3="122222";pageContext.setAttribute("s3", s3);List list1 =new ArrayList();pageContext.setAttribute("list1", list1);
%>
<!-- empty关键只要内容是空true -->
${empty s1}<br>
${empty s2}<br>
${empty s3}<br>
${empty list1}<br> 5.7 隐式对象

5.7.1 上下文
<%=request.getContextPath() %>
${pageContext.request.contextPath} 5.7.2 获取Cookie
${cookie.username}//获取名为username的cookie对象
${cookie.password}//获取名为password的cookie对象
${cookie.password.value}//获取password的cookie的value值 六、JSTL
6.1 问题
6.2 概念
6.3 作用
6.4 使用
6.5 核心标签
6.5.1 条件标签
<!-- test属性中是条件,但是条件需要使用EL表达式来书写 -->
<h3>条件标签:if</h3>
<c:if test="${8>2 }">8大于2是成立的
</c:if>
<c:if test="${8<2 }">8小于2是成立的
</c:if> 6.5.2 choose
<c:when test="条件1">结果1< /c:when>
<c:when test="条件2">结果2< /c:when>
<c:when test="条件3">结果3< /c:when>
<c:otherwise >结果4< /c:otherwise>< /c:choose> <h3>条件标签:choose(等价于java中多重if)</h3>
<%-- 测试成绩等级 >90 优秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose><c:when test="${score>=90 }">优秀</c:when><c:when test="${score>=80 }">良好</c:when><c:when test="${score>=70 }">中等</c:when><c:when test="${score>=60 }">及格</c:when><c:otherwise>不及格</c:otherwise>
</c:choose> 6.5.3 foreach
<c:foreachvar="变量名"items="集合"begin="起始下标"end="结束下标"step="间隔长度"varstatus="遍历状态">
< /c:foreach> <h3>测试list集合遍历获取学生列表</h3><table border="1" width="80%" bordercolor="red" cellspacing="0"align="center"><tr><th>学号</th><th>姓名</th><th>成绩</th><th>班级</th><th>是否是第一个</th><th>是否是最后一个</th><th>计数count</th><th>索引index</th></tr>
<!-- varStatus:变量状态:遍历出的每一项内容的状态:first 是否是第一行last 是否是最后一行count 当前行数index 当前元素的下标--><!-- var :遍历出的每一项使用变量先存储items:集合(使用El表达式)--><c:forEach var="stu" items="${students}" varStatus="vs"><tr><td>${stu.id}</td><td>${stu.name}</td><td>${stu.score}</td><td>${stu.classes}</td><td>${vs.first}</td><td>${vs.last}</td><td>${vs.count}</td><td>${vs.index}</td></tr></c:forEach>
</table> 6.5.4 url
<c:url context='${pageContext.request.contextPath}' value='/xxxController' />
//在form表单的action中嵌套动态路径
<form action="<c:url context='${pageContext.request.contextPath}'
value='/xxxController' />">
</form> 6.6 fmt
<c:set var="now" value="<%=new java.util.Date()%>" /><p>日期格式化 (1): <fmt:formatDate type="time"value="${now}" /></p>
<p>日期格式化 (2): <fmt:formatDate type="date"value="${now}" /></p>
<p>日期格式化 (3): <fmt:formatDate type="both"value="${now}" /></p>
<p>日期格式化 (4): <fmt:formatDate type="both"dateStyle="short" timeStyle="short"value="${now}" /></p>
<p>日期格式化 (5): <fmt:formatDate type="both"dateStyle="medium" timeStyle="medium"value="${now}" /></p>
<p>日期格式化 (6): <fmt:formatDate type="both"dateStyle="long" timeStyle="long"value="${now}" /></p>
<p>日期格式化 (7): <fmt:formatDate pattern="yyyy-MM-dd"value="${now}" /></p>日期格式化 (1): 11:19:43
日期格式化 (2): 2016-6-26
日期格式化 (3): 2016-6-26 11:19:43
日期格式化 (4): 16-6-26 上午11:19
日期格式化 (5): 2016-6-26 11:19:43
日期格式化 (6): 2016年6月26日 上午11时19分43秒
日期格式化 (7): 2016-06-26 <c:set var="balance" value="120000.2309" /><p>格式化数字 (1): <fmt:formatNumber value="${balance}"type="currency"/></p>
<p>格式化数字 (2): <fmt:formatNumber type="number"maxIntegerDigits="3" value="${balance}" /></p>
<p>格式化数字 (3): <fmt:formatNumber type="number"maxFractionDigits="3" value="${balance}" /></p>
<p>格式化数字 (4): <fmt:formatNumber type="number"groupingUsed="false" value="${balance}" /></p>
<p>格式化数字 (5): <fmt:formatNumber type="percent"maxIntegerDigits="3" value="${balance}" /></p>
<p>格式化数字 (6): <fmt:formatNumber type="percent"minFractionDigits="10" value="${balance}" /></p>
<p>格式化数字 (7): <fmt:formatNumber type="percent"maxIntegerDigits="3" value="${balance}" /></p>
<p>格式化数字 (8): <fmt:formatNumber type="number"pattern="###.###E0" value="${balance}" /></p>
<p>美元 :
<fmt:setLocale value="en_US"/>
<fmt:formatNumber value="${balance}" type="currency"/></p>格式化数字 (1): ¥120,000.23
格式化数字 (2): 000.231
格式化数字 (3): 120,000.231
格式化数字 (4): 120000.231
格式化数字 (5): 023%
格式化数字 (6): 12,000,023.0900000000%
格式化数字 (7): 023%
格式化数字 (8): 120E3
美元 : $120,000.23 6.7 整合
七、MVC框架
7.1 MVC概念
7.2 详解

7.3 优点
7.4 应用
7.5 三层架构与MVC
7.5.1 三层架构

7.5.2 区别
相关文章:
JavaWeb笔记之JSP
一、引言 现有问题 在之前学习Servlet时,服务端通过Servlet响应客户端页面,有什么不足之处? 开发方式麻烦:继承父类、覆盖方法、配置Web.xml或注解。 代码修改麻烦:重新编译、部署、重启服务。 显示方式麻烦&#x…...
在x64上构建智能家居(home assistant)(二)(新版Debain12)连接Postgresql数据库
新版数据库安装基本和旧版相同,大部分可以参考旧版本在x64上构建智能家居(home assistant)(二)连接Postgresql数据库_homeassist 数据库-CSDN博客 新版本的home assistant系统安装,我在原来写的手顺上直接修改了,需要的可以查看在x64上构建智能家居(home…...
八股文打卡day6——计算机网络(6)
面试题:GET请求和POST请求的区别 我的回答: 1.作用不同:GET是用来获取服务器资源的;POST是用来向服务器提交资源的; 2.参数传递方式不同:GET请求参数一般写在URL中的,只能接收ASCII字符;POST的…...
【PHY6222】绑定详解
1.函数详解 bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void* pValue ) 设置绑定参数。 bStatus_t GAPBondMgr_GetParameter( uint16 param, void* pValue ) 获取绑定参数。 param: GAPBOND_PAIRING_MODE,配对模式,…...
vue事件绑定
vue提供了v-on事件绑定指令,用来辅助程序员为DOM元素绑定事件监听,语法格式如下: v-on:指令可以简写为 注意:原生DOM对象有onclick,oninput,onkeyup等原生事件,替换为vue的事件绑定…...
如何在服务器上部署springboot项目
在服务器上部署Spring Boot项目通常有以下步骤: 在服务器上安装Java运行环境:首先确保服务器上已经安装了Java运行环境(至少需要Java 8或以上版本)。 快速安装JDK命令: yum install java-1.8.0-openjdk.x86_64 打包S…...
基于Spring Boot的支教志愿者招聘网站
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的支教志愿者招聘网站,j…...
安装gnvm,nodejs,npm使用方法
安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址: https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录,如:d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…...
word导入导出-Apache POI 和 Poi-tl
word 文件读取 使用Apache POI Word 进行读取文件 使用poi 时如果报ClassNotFoundException 等错误,请注意请求以下maven 文件的版本 Apache POI Word 说明文档:Apache POI Word 说明文档 maven 解决依赖冲突教程:https://www.cnblogs.com/…...
Hadoop 集群环境搭建
目录 第一部分:系统安装... 3 1:图形化安装... 3 2:选择中文... 3 3:安装选项... 3 4:软件选项... 4 5:安装位置... 4 6:网络配置... 6 7:开始安装... 7 8:创建用户... 7…...
maven完结,你真的学完了吗
书接上文:必学的maven的起步-CSDN博客 分模块开发与设计 分模块开发: 创建模块书写代码模块 模块中需要其他的模块,就将他安装到仓库然后再dep中导入依赖通过maven指令安装模块到本地仓库(install) 聚合与继承 聚合…...
【Xcode】解决Unable to process request - PLA Update available
出现场景 IOS更新app时,使用Xcode上传新版本的包时,提示无法上传。 Unable to process request -PLA update available you currently dont have access to this membership resource. To resolve this issue ,agree to the latest program license a…...
力扣单调栈算法专题训练
目录 1 专题说明2 训练 1 专题说明 本博客用来计算力扣上的单调栈题目、解题思路和代码。 单调栈题目记录: 2232866美丽塔II 2 训练 题目1:2866美丽塔II。 解题思路:先计算出prefix[i],表示0~i满足递增情况下,0~i…...
【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理
于NI kb摘录 1.概述 对于NI RIO系列设备(CompactRIO、sbRIO、myRIO等)进行编程时,需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”,为用户提供图形用户界面(GUI),用于监控系统…...
关于游戏性能优化的技巧
关于游戏性能优化的技巧 游戏性能优化对象池Jobs、Burst、多线程间隔处理定时更新全局广播缓存组件缓存常用数据2D残影优化2D骨骼转GPU动画定时器优化DrawCall合批处理优化碰撞层优化粒子特效 游戏性能优化 好久没有在CSDN上面写文章了,今天突然看到鬼谷工作室技术…...
antdesignpro实现滚动加载分页数据
原理解析:每滚动一次相当于翻页,请求后端时给的页码参数要想办法加1,后端才能根据页码给出相应数据 注意后端收到页码参数之后要准确计算出每页的首行数据,关键逻辑代码: # 根据前端传的页码,进行计算下一…...
步兵 cocos2dx 加密和混淆
文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理,可以确保应用代码的安全性,同时提高性…...
【算法设计与分析】——动态规划算法
🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:…...
WPF组合控件TreeView+DataGrid之DataGrid封装
(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…...
PIL/Pillow
Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能,包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年,因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…...
C盘清理与优化:为Realistic Vision V5.1模型文件腾出空间
C盘清理与优化:为Realistic Vision V5.1模型文件腾出空间 你是不是也遇到过这种情况:电脑C盘突然飘红,系统提示空间不足,想下载个新的AI模型,比如最近很火的Realistic Vision V5.1,却发现根本没地方放。看…...
Java 设计模式・策略模式篇:从思想到代码实现
一、行为型模式 在面向对象的世界里,如何优雅地组织对象间的交互、分配职责,是每一位开发者都会反复思考的问题。直接硬编码交互逻辑固然简单,但当业务复杂度上升、对象协作关系变得错综复杂时,这种方式就会让代码变得僵化、难以…...
降AIGC哪家强?2026零成本保姆级教程:DeepSeek/Kimi/豆包专属降重指令实测与差异解析
很多时候大学生写论文逻辑太严谨、话术太规范,反而会导致AI率过高,且一旦AI率过高,轻则退回重改,重则取消答辩资格,这后果谁都担不起。 为了帮大家有效降低aigc率,这周我专门针对目前市面上最主流的三款大…...
OpenCV图像预处理失效全解析,深度解读光照不均、反光伪影、亚像素抖动下的鲁棒代码实现
第一章:OpenCV图像预处理失效的典型工业场景综述在工业视觉检测系统中,OpenCV常被用作图像预处理的核心工具,但其默认参数与理想假设在真实产线环境中频繁失效。光照剧烈波动、镜头污损、金属反光、高速运动拖影以及低信噪比成像等物理约束&a…...
告别重复造轮子,用快马ai一键生成tomcat高效开发工具集与配置模板
今天想和大家分享一个提升Tomcat开发效率的小技巧。作为一个经常和Tomcat打交道的开发者,我发现每次新建项目都要重复写一些基础工具类,特别浪费时间。最近在InsCode(快马)平台上尝试用AI生成了一套可复用的工具集,效果很不错。 数据库连接池…...
快速验证控制逻辑:用快马平台十分钟搭建pid算法仿真原型
今天想和大家分享一个快速验证PID控制算法的小技巧。作为一名自动化工程师,经常需要调试各种控制参数,传统方法要搭建物理实验环境或者用MATLAB仿真,都很费时。最近发现用InsCode(快马)平台可以十分钟就做出一个可交互的PID仿真原型ÿ…...
三三复制系统模式介绍
三三复制系统模式介绍:从底层逻辑到合规落地在社交电商与团队裂变领域,三三复制系统凭借其低门槛、高稳定性的特点,成为企业实现用户快速增长与业绩倍增的重要工具。不同于传统多级分销的复杂层级,三三复制系统以“三”为核心基数…...
基于CATIA有限元的焊装夹具Base板应力分析与优化设计
1. 为什么焊装夹具Base板需要应力分析? 在汽车制造领域,焊装夹具是确保车身焊接精度的关键设备。其中Base板作为夹具的支撑基础,承受着来自机器人抓手和工件的全部载荷。很多新手工程师常犯的错误是直接套用经验公式设计,结果要么…...
图结构AI Agent记忆机制深度解析:小白/程序员必备,收藏学习大模型前沿技术!
图结构AI Agent记忆机制深度解析:小白/程序员必备,收藏学习大模型前沿技术! 本文深入解析了基于图结构的AI Agent记忆机制,揭示了LLM驱动AI Agent面临的三大局限:知识截断、工具 incompetence 和性能饱和。文章强调记…...
咱们今天来唠唠机器人轨迹规划那点事儿。不少小伙伴在玩机械臂的时候总会遇到关节空间和笛卡尔空间轨迹规划的抉择困难症,这俩货到底有什么区别?直接上硬核代码
matlab笛卡尔空间和关节空间轨迹规划 关节空间机器臂多项式轨迹规划定做,353和333多项式轨迹规划和优化关节空间规划有个大杀器——多项式插值。比如要让机械臂从A点平滑运动到B点,咱们可以玩三次多项式(3-3-3)或者五次多项式&…...
