jsp
tomcat的work目录: tomcat服务器存放jsp运行时的临时文件
Jsp的执行过程
tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
tomcat服务器把java源文件编译成class字节码文件
tomcat服务器构造_01_hello_jsp类对象
为什么Jsp就是servlet
extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent
HttpJspBase类 就是集成servlet
Jsp的生命周期
1)翻译: jsp->java文件
2)编译: java文件->class文件(servlet程序)
3)构造方法(第1次访问)
4)init方法(第1次访问):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
语法: <%!-- jsp注释 --%>
html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。
指令:
include指令
作用: 在当前页面用于包含其他页面
语法: <%@include file="common/header.jsp"%>
原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一 个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
如果使用静态包含,被包含页面中不需要出现全局的html标签了(如html、head、 body)
page指令
作用: 告诉tomcat服务器如何翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包导入包,多个包之间用逗号分割
pageEncoding="utf-8" --告诉服务器使用什么编码翻译jsp文件
contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
errorPage="error.jsp"
isErrorPage="false"
buffer="8kb"
session="true"
isELIgnored="false"
taglib指令
配置全局的错误处理页面
<!-- 全局错误处理页面配置 --> <error-page> <error-code>500</error-code> <location>/common/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/common/404.html</location> </error-page>
9大内置对象
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
Out对象:out对象类型,JspWriter类,相当于带缓存的PrintWriter
当满足以下条件之一,缓冲区内容写出:
1)缓冲区满了
2)刷新缓存区
3)关闭缓存区
4)执行完毕jsp页面
pageContext对象
pageContext对象的类型是PageContext,叫jsp的上下文对象 可以获取其他八个内置对象
使用场景: 在自定义标签的时候,PageContext对象频繁使用到
本身是一个域对象
保存数据:
默认情况下,保存到page域 pageContext.setAttribute("name");
可以向四个域对象保存数据 pageContext.setAttribute("name",域范围常量)
读取数据
pageContext.getAttribute("name")
pageContext.getAttribute("name",域范围常量)
PageContext.PAGE_SCOPE ...
自动在四个域中搜索数据
pageContext.findAttribute("name");
顺序: page域 -> request域 -> session域- > context域(application域)
Jsp中的四个域对象
pageContext page域 只能在当前jsp页面中使用(当前页面)
request request域 只能在同一个请求中使用(转发)
session session域 只能在同一个会话(session对象)中使用(私有的)
application context域 只能在同一个web应用中使用。(全局的)
使用EL表达式替换掉jsp表达式
EL作用:向浏览器输出域对象中的变量值或表达式计算的结果
语法: ${变量或表达式}
输出基本数据类型变量
${name} 从四个域获取 域范围: pageScoep / requestScope / sessionScope / applicationScope
${pageScope.name} 指定域获取
jsp标签
标签的作用:替换jsp脚本
流程判断(if for循环) 跳转页面(转发,重定向)
Jsp标签分类
内置标签(动作标签): 不需要在jsp页面导入标签
jstl标签: 需要在jsp页面中导入标签
自定义标签 : 开发者自行定义,需要在jsp页面导入标签
动作标签
转发标签: <jsp:forward />
参数标签: <jsp:pararm/>
包含标签: <jsp:include/>
原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。
(先翻译再合并),动态包含
静态包含和动态包含的区别
1) 语法不同
静态包含语法: <%@inclue file="被包含的页面"%>
动态包含语法: <jsp:include page="被包含的页面">
2)参数传递不同
静态包含不能向被包含页面传递参数
动态包含可以向被包含页面传递参数
3)原理不同
静态包含: 先合并再翻译
动态包含: 先翻译再合并
JSTL标签: java标准标签库
核心标签库 (c标签库) 重点
国际化标签(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库)
sql标签库(sql标签库)
使用步骤:
导入jstl支持的jar包(标签背后隐藏的java代码)
使用taglib指令导入标签库 <%@taglib uri="tld文件的uri名称" prefix="简写" %>
核心标签库的重点标签:
保存数据:<c:set></c:set>
获取数据:<c:out value=""></c:out>
单条件判断:<c:if test=""></c:if>
多条件判断:
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循环数据
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向
<c:redirect></c:redirect>
<%--set标签 :保存数据(保存到域中)默认保存到page域 --%> <c:set var="name" value="rose" scope="request"></c:set> <%--out标签: 获取数据(从域中) default: 当value值为null时,使用默认值 escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认) --%> <c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out> <hr/> <%--if标签 :单条件判断--%> <c:if test="${!empty msg}"> 条件成立 </c:if> <hr/> <%--choose标签+when标签+otherwirse标签: 多条件判断 --%> <c:set var="score" value="56"></c:set> <c:choose> <c:when test="${score>=90 && score<=100}"> 优秀 </c:when> <c:when test="${score>=80 && score<90}"> 良好 </c:when> <c:when test="${score>=70 && score<80}"> 一般 </c:when> <c:when test="${score>=60 && score<70}"> 及格 </c:when> <c:otherwise> 不及格 </c:otherwise> </c:choose> <%-- forEach标签:循环 --%> <% //List List<Student> list = new ArrayList<Student>(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map<String,Student> map = new HashMap<String,Student>(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %> <hr/> <%-- begin="" : 从哪个元素开始遍历,从0开始.默认从0开始 end="": 到哪个元素结束。默认到最后一个元素 step="" : 步长 (每次加几) ,默认1 items="": 需要遍历的数据(集合) var="": 每个元素的名称 varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始) --%> <c:forEach items="${list}" var="student" varStatus="varSta"> 序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/> </c:forEach> <hr/> <c:forEach items="${map}" var="entry"> ${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/> </c:forEach> <hr/> <%-- forToken标签: 循环特殊字符串 --%> <% String str = "java-php-net-平面"; pageContext.setAttribute("str",str); %> <c:forTokens items="${str}" delims="-" var="s"> ${s }<br/> </c:forTokens> <%--redrict:重定向 --%> <c:redirect url="http://www.baidu.com"></c:redirect>
JavaBean
这个Java类必须具有一个无参的构造函数 属性必须私有化。
私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律