JSP全称Java Server Pages(Java服务器页面),是一种动态网页开发技术
Java servlet的简化设计,主要用于实现Java web应用程序的用户界面部分
使用JSP标签在HTML网页中插入Java代码(动态部分用Java编写),标签通常以<%开头、以%>结束
JSP就是在HTML页面中嵌入java代码,通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页
用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行
JSP将网页逻辑与网页设计的显示分离
html与jsp主要区别:
.html 是静态页面,包含固定的页面内容
.jsp 是动态页面,页面数据可以动态更新,支持嵌套java代码和html代码
当浏览器访问页面、服务器发现后缀为.jsp的文件时会根据路径找到index.jsp文件,并将index.jsp翻译成index_jsp.java文件并进行编译,产生index_jsp.class文件,将class文件加载运行
将JSP翻译成java文件,是将JSP中的所有的HTML代码通过流进行输出、最终翻译成class后被虚拟机加载,本质是servlet,往回响应(响应回去就是把JSP中的HTML代码以流的方式写回浏览器)
JSP生命周期,即从创建到销毁的整个过程,
类似于servlet生命周期(Servlet工作原理与生命周期),JSP生命周期还包括将JSP文件编译成servlet
编译阶段:
servlet容器解析JSP文件、将JSP文件转为servlet,随后编译servlet源文件、生成servlet类
初始化阶段:jspInit()
加载与JSP对应的servlet类,创建实例并调用它的初始化方法
(一般来说只执行一次)
执行阶段:_jspService()
调用与JSP对应的servlet实例的服务方法(一切与请求相关的交互行为,直到被销毁)
销毁阶段:jspDestroy()
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
代码示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>life.jsp</title>
</head>
<body>
<%!
private int initVar=0;
private int serviceVar=0;
private int destroyVar=0;
%>
<%!
public void jspInit(){
initVar++;
System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
}
public void jspDestroy(){
destroyVar++;
System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次");
}
%>
<%
serviceVar++;
System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");
String content1="初始化次数 : "+initVar;
String content2="响应客户请求次数 : "+serviceVar;
String content3="销毁次数 : "+destroyVar;
%>
<h1>JSP demo</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p>
</body>
</html>
<!-- html注释内容,查看源码时能看到 -->
<%-- jsp注释,查看⻚⾯源码时看不到 --%>
主要注释:
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
HTML注释,通过浏览器查看网页源代码时可以看见注释内容 | |
<% | 代表静态 <%常量 |
%> | 代表静态 %> 常量 |
\’ | 在属性中使用的单引号 |
\" | 在属性中使用的双引号 |
使用小脚本:<% java代码%>
基本格式:
声明标签:
<%!变量或者⽅法声明%>
表达式标签:
<%= 表达式%> 在⻚⾯上显示的效果
程序代码标签:
<%java代码%> ⻚⾯上动态展示内容
page指令:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
代码示例:
<body>
<%! int i=10;%><!--成员变量-->
<%! public void show(){}%> <!--成员⽅法-->
<%=i%> <!--输出变量值-->
</body>
如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
脚本程序可以包含任意Java语句、变量、方法或表达式,只要它们在脚本语言中有效
任何文本、HTML标签、JSP元素必须写在脚本程序的外面
语法格式:
一、
<% 代码片段 %>
二、等价的xml格式:
<jsp:scriptlet>
代码片段
</jsp:scriptlet>
一个声明语句可以声明一个或多个变量、方法
一、
<%! declaration; [ declaration; ]+ ... %>
二、等价的xml语句
<jsp:declaration>
代码片段
</jsp:declaration>
代码示例:
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
一个JSP表达式中包含的脚本语言表达式先被转化成String,再插入到表达式出现的地方
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式
一、
<%= 表达式 %>
二、 等价的xml语句
<jsp:expression>
表达式
</jsp:expression>
代码示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
</head>
<body>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body>
</html>
输出:
今天的日期是: 2021-9-21 13:40:07
JSP指令用来设置JSP页面相关的属性
语法格式:
<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值
三种指令标签:
指令名称 | 描述 |
---|---|
<%@ page … %> | 定义页面依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义(可以是自定义标签) |
Page指令为容器提供当前页面的使用说明⼀个JSP页面可以包含多个page指令
Page指令的语法格式:
<%@ page attribute="value" %>
属性名 | 属性值 | 描述 |
---|---|---|
language | java | 解释该JSP⽂件时采⽤的语⾔,⼀般为java语⾔,默认为java |
extends | 任何类的全名 | 编译该JSP⽂件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等⽅法 |
import | 任何包名、类名 | 引⼊该JSP中⽤到的类、包等,import是唯⼀可以声明多次的page指令属性,⼀个import可以引⽤uogelei,中间⽤英⽂逗号隔开<%@ page import=包名.类名,包名.类名%> |
session | true、false | 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使⽤,否则反之,默认为true |
autoFlush | true,false | 是否运⾏缓存,如果为true,则使⽤out.println()等⽅法输出的字符串并不是⽴刻到达客户端服务器的,⽽是暂时存到缓存⾥,缓存满了或者程序⾏完毕或者执⾏out.flush()操作时才到客户端,默认为true |
buffer | none或者数字KB | 指定缓存大小,当autoFlush设为true时有效,例如<%@ pagebuffer=10kb%> |
isThreadSafe | true,false | 是否线程安全,如果为true,则运⾏多个线程同时运⾏该jsp程序,否则只运⾏⼀个线程,其余线程等待,默认为false |
isErrorPage | true,false | 指定该页面是否为错误显示页面,如果为true,则该JSP内置有⼀个Exception对象exception,可直接使⽤,否则没有,默认为false |
errorPage | 某个JSP⻚⾯的相对路径 | 指明⼀个错误⻚⾯,如果该JSP程序抛出⼀个未捕捉的异常,则转到errorPage指定的⻚⾯,errorPage指定的⻚⾯通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常 |
contentType | 有效的⽂档类型 | 客户端浏览器根据该属性判断⽂档类型,例如 HTML格式为text/html、纯⽂本格式为text/plain、JPG图像为image/jpeg、GIF图像image/gifWORD⽂档为application/msword,该属性常跟着charset设置编码⼀起,作⽤是通知服务器和浏览器都使⽤同⼀个码表 |
pageEncoding | UTF8,ISO8859-1等 |
JSP可以通过include指令来包含其他文件
被包含的文件可以是JSP文件、HTML文件或文本文件,包含的文件可以看作是JSP文件的一部分,会被同时编译执行
include 指令中的文件名实际上是⼀个相对的 URL 地址,如果没有给文件关联⼀个路径,JSP编译器默认在当前路径下寻找
语法格式:
<%@ include file="⽂件相对 url 地址" %>
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签
uri属性确定标签库的位置,prefix属性指定标签库的前缀(可⾃定义)
语法格式:
<%@ taglib uri="uri" prefix="" %>
JSP中⼀共预先定义了9个对象:request、response、session、application、out、pagecontext、config、page、exception
作用:
代表客户端的请求信息,接受通过HTTP协议传送到服务器的数据(包括头信息、系统信息、请求方式以及请求参数等)
所属类型: javax.servlet.httpServletRequest
request对象的作用域为一次请求
作用:
代表对客户端的响应,将JSP容器处理过的对象传回到客户端
所属类型:HttpServletResponse
作用域:只在JSP页面内有效
由服务器自动创建的与用户请求相关的对象
服务器为每个用户都生成⼀个session对象,用于保存该用户的信息,跟踪用户的操作状态
session对象内部使用Map类来保存数据,保存数据的格式为 “Key/value”
session对象的value不仅仅局限于字符串类型
作用:
将信息保存在服务器中,直到服务器关闭(期间application对象中保存的信息会在整个应用中都有效)
与session对象相比,application对象生命周期更长,类似于系统的“全局变量”
作用:
在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区
在使用out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间
待数据输出完毕后,要及时关闭输出流
代码示例:
out.print("");
作用:
取得任何范围的参数
通过它可以获取 JSP页面的out、request、reponse、session、application 等对象
pageContext对象的创建和初始化都由容器完成,在JSP页面中可以直接使用pageContext对象
作用:
取得服务器的配置信息
通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象
当⼀个Servlet 初始化时,容器把某些信息通过config对象传递给这个Servlet,开发者可以在web.xml文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数
代码示例:
//将image路径转换成服务器端的路径
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>
page 对象代表JSP本身,只有在JSP页面内才合法
page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针
作用:
显示异常信息,只有在包含 isErrorPage=“true” 的页面中使用
在⼀般的JSP页面中使用该对象将无法编译JSP文件
如果在JSP页面中出现没有捕获到的异常,会生成 exception 对象,并把exception 对象传送到在page指令中设定的错误页面中,再在错误页面中处理相应的exception 对象
状态码 | 消息 | 描述 |
---|---|---|
100 | Continue | 只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求 |
101 | Switching Protocols | 服务器交换机协议 |
200 | OK | 请求被确认 |
201 | Created | 请求时完整的,新的资源被创建 |
202 | Accepted | 请求被接受,但未处理完 |
300 | Multiple Choices | 一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接 |
301 | Moved Permanently | 被请求的页面已经移动到了新的URL下 |
302 | Found | 被请求的页面暂时性地移动到了新的URL下 |
303 | See Other | 被请求的页面可以在一个不同的URL下找到 |
306 | Unused | 已经不再使用此状态码,但状态码被保留 |
307 | Temporary Redirect | 被请求的页面暂时性地移动到了新的URL下 |
400 | Bad Request | 服务器无法识别请求 |
401 | Unauthorized | 被请求的页面需要用户名和密码 |
402 | Payment Required | 目前还不能使用此状态码 |
403 | Forbidden | 禁止访问所请求的页面 |
404 | Not Found | 服务器无法找到所请求的页面 |
405 | Method Not Allowed | 请求中所指定的方法不被允许 |
406 | Not Acceptable | 服务器只能创建一个客户端无法接受的响应 |
407 | Proxy Authentication Required | 在请求被服务前必须认证一个代理服务器 |
408 | Request Timeout | 请求时间超过了服务器所能等待的时间,连接被断开 |
409 | Conflict | 请求有矛盾的地方 |
410 | Gone | 被请求的页面不再可用 |
411 | Length Required "Content-Length"没有被定义,服务器拒绝接受请求 | |
412 | Precondition Failed | 请求的前提条件被服务器评估为false |
413 | Request Entity Too Large | 因为请求的实体太大,服务器拒绝接受请求 |
414 | Request-url Too Long | 服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息 |
415 | Unsupported Media Type | 服务器拒绝接受请求,因为媒体类型不被支持 |
500 | Internal Server Error | 请求不完整,服务器遇见了出乎意料的状况 |
501 | Not Implemented | 请求不完整,服务器不提供所需要的功能 |
502 | Bad Gateway | 请求不完整,服务器从上游服务器接受了一个无效的响应 |
503 | Service Unavailable | 请求不完整,服务器暂时重启或关闭 |
504 | Gateway Timeout | 网关超时 |
505 | HTTP Version Not Supported | 服务器不支持所指定的HTTP版本 |
在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分
在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式
语法:
${需要展示信息的名字}
当表达式没有指定变量或者对象的范围时:
容器会依次从pageContext—>request—>session—>application中查找该变量或对象,
通过隐含对象获得指定作⽤域的值:
pageScope对象,⽤于获取当前⻚⾯的属性值
requestScope对象,⽤于获取请求范围的属性值
sessionScope对象,⽤于获取会话范围的属性值
applicationScope对象,⽤于获取程序范围的属性值
语法:
${requestScope.key}
基础操作符:
术语 | 定义 |
---|---|
算术型 | + 、-、 * /(div) 除 、 %(mod) 余数 |
逻辑型 | and、&&、or、||、!、not |
关系型 | ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进⾏⽐较,或与布尔型、字符串型、整型或浮点型⽂字进⾏⽐较 |
Empty | Empty操作符是⼀个前缀操作符⽤于判断⼀个值是否为null或者为empty如String str =“”; ${empty str} 返回值为true |
条件型 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C |
代码示例:
单个变量:${a+10}<br>
单个变量:${s}<br>
单个对象:${key.属性名}
//对象类型
Users u=new Users();
u.setName("王⽼五");
u.setPass("abc");
pageContext.setAttribute("u1",u);
user.name=${u1.name}
user.pass=${u1.pass}
// list集合对象:
List list=new ArrayList();
list.add("刘能");
list.add(30);
list.add(u);
pageContext.setAttribute("list2",list);
list1=${list2[0]}<br/>
list2=${list2[1]}<br/>
list3=${list2[2].pass}<br/>
// map集合:
k1=${map1.k1}<br>
k2=${map1.k2.username}--- ${map1.k2.password}
判断变量是否有值或是否存在: ${empty key值}
List list2=new ArrayList();
list2.add("aa");
request.setAttribute("list222",list2);
判断list中是否有数据: ${empty list222}
JSP标准标签库(JSTL)是JSP标签集合,封装了JSP应用的通用核心功能
JSTL支持通用的、结构化的任务(迭代、条件判断、XML文档操作、国际化标签、SQL标签),还提供了一个框架来使用集成JSTL的自定义标签,根据JSTL标签所提供的功能,可以将其分为5个类别:核心标签、格式化标签、sql标签、xml标签、jstl函数
作用:
简化jsp⻚⾯编写代码
语法格式:
①standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下
②在JSP页面中引入<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>
功能范围 | 前缀 | uri |
---|---|---|
core | c | http://java/sun.com/jsp/jstl/core |
i18n | fmt | http://java/sun.com/jsp/jstl/fmt |
sql | sql | http://java/sun.com/jsp/jstl/sql |
xml | x | http://java/sun.com/jsp/jstl/xml |
functions | fn | http://java/sun.com/jsp/jstl/function |
核心标签是最常用的 JSTL标签
引用核心标签库语法:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签分类:
① <c:set>
主要⽤来将变量存储⾄JSP范围中 或是JavaBean的属性或Map对象中
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
Value | 要被存储的值 | 否 | ⽆ |
var | 存⼊的变量名称 | 否 | ⽆ |
scope | var变量的JSP范围 | 否 | Page |
target | JavaBean或Map对象 | 否 | ⽆ |
property | 指定target对象的属性 | 否 | ⽆ |
② <c:out>
主要用来显示数据的内容
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
value | 需要显示出来的值 | 是 | ⽆ |
default | 如果value的值为null,则显示default的值 | 否 | ⽆ |
escapeXml | 是否转换特殊字符,如:<转换成 & lt; | 否 | True |
③ <c:remove>
主要负责移除变量
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
Var | 欲移除的变量名称 | 是 | ⽆ |
Scope | var变量的jsp范围 | 否 | Page |
④ <c:if>
主要用于进行if判断,如果为true,则输出标签体中的内容
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
Test | 表达式的结果为true,则执⾏体内容,false则相反 | 是 | ⽆ |
var | 如果用来存储test运算的结果(true或false) | 否 | ⽆ |
scope | Var变量的JSP范围 | 否 | page |
⑤ <c:choose>,<c:when>,<c:otherwise>
作用相当于if-else
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
test | 如果表达式的结果为true,则执⾏体内容,false则相反 | 是 | ⽆ |
⑥ <c:forEach>
循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
var | ⽤来存放现在指定的成员 | 是 | ⽆ |
items | 被迭代的集合对象 | 否 | ⽆ |
varStatus | ⽤来存放现在指的相关成员信息 | 否 | ⽆ |
begin | 开始的位置 | 否 | 0 |
end | 结束的位置 | 否 | 最后⼀个成员 |
step | 每次迭代的间隔数 | 否 | 1 |
格式化标签:
① fmt:formatDate
属性 | 描述 |
---|---|
value | 将要被格式化的数据 |
pattern | 格式化的模式,与SimpleDateFormat的参数设置⼀样 |
var | 格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在⻚⾯ |
scope | 变量存放的域属性空间,默认page |
type | 其取值为date、time、both,表示给出的value是⽇期、时间、还是两者都包含,默认是date |
②fmt:parseDate
属性 | 描述 |
---|---|
Value | 服务器获取的时间 |
Pattern | 转换的格式 |
Var | 页面显示的变量 |
③ fmt:formatNumber
属性 | 描述 |
---|---|
maxIntegerDigits | 整数部分最多的位数 |
minIntegerDigits | 整数部分最少的位数 |
maxFrctionDigits | 小数部分最多的位数 |
minFrctionDigits | 小数部分最少的位数 |
var | 存储格式化结果的变量 |
scope | var属性的作⽤域 |
integerOnly | 是否只解析整型数true或者浮点数false |