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 接…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...