JSP介绍
1.JSP简介
- JSP全称为Java Server Pages,中文名叫Java服务器页面。
- JSP是在传统的HTML网页中插入Java程序段,从而形成JSP文件
- JSP可近似认为是HTML+Java
JSP和传统HTML进行比较
- *.html 静态⻚⾯(包含固定的⻚⾯内容)
- *.jsp 动态⻚⾯(⻚⾯数据可以动态更新,⽀持嵌套java代码和html代码)
JSP的相关特点
- 跨平台:它能表现出在不同系统下的运行。
- 支持分离网络逻辑和网络设计。
- 支持可重用的基于组件设计。
本质上,JSP本质上就是Servlet,并且Servlet展示信息的不方便问题后,才引入JSP的概念。
2.JSP的基本使用
2.1 JSP中嵌套Java语句
page指令:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
...
...
<body>
<%! int i=10;%> <!--成员变量-->
<%! public void show(){}%> <!--成员⽅法-->
<%=i%> <!--输出变量值-->
</body>
<%--jsp注释-->
--html注释会在页面上展示
<!--html注释-->
首先,进行指令说明。其次在<body>
标签内部嵌套基本的Java语句
3.JSP工作原理(以访问http://localhost:8080/test/index.jsp为例子)
- 首先,浏览器访问前面项目的jsp文件后,服务器会发现jsp文件后缀,它会根据路径找到对应的index.jsp文件。
- jsp文件会被翻译成index_jsp.java文件,并对这个Java文件进行编译,产生一个index_jsp.class文件并让class文件进行加载运行。
- 最后将JSP翻译成Java文件,它让JSP所有HTML代码通过流进行输出,也就是编译成class被虚拟机加载。
- 加载完后,它将JSP中的HTML代码以流的⽅式写回浏览器。所以在JSP中展示出了HTML代码。
可以看出,它的本质就像Servlet,都是通过客户端进行访问处理,进入服务器端。服务器端根据其中的Java语言和HTML语言进行相应处理进行返回响应处理。
4.JSP内置对象
JSP中⼀共预先定义了9个对象,分别为:request
、response
、session
、application
、out
、 pagecontext
、config
、page
、exception
其中的疑惑可以访问我前面的Servlet的内置对象讲解。
4.1 request对象
<% request.setAttribute("a1","aaa");%>
<%=request.getAttribute("a1")%>
上面的代码中,我们进行很基本的存值并将其中的值进行取出。
4.2 response对象
<% response.sendRedirect("");>
上面是重定向函数,进行跳转页面。
4.3 session对象
session的作用域在当前会话期间。
<% session.setAttribute("b1","bbb");>
<%=session.getAttribute("b1")%>
如上面4.1所展示的一样,进行存值和取值。
4.4 application对象
application
表示的是整个程序在运行的期间,它的作用于在于整个程序运行。
<% application.setAttribute("c1","ccc");>
<%=application.getAttribute("c1")%>
4.5 page对象
page
表示的是**’当前的页面‘,跟this
有异曲同工之处。可见,它的作用于在于当前页面**。
<% pageContext.setAttribute("d1","ddd");>
<%=pageContext.getAttribute("d1")%>
4.6 out对象
out
对象主要用于输出
<% out.print("<script>alert("输出成功!")</script>")%>
4.7 config对象
config
对象主要用于配置信息,获取初始化参数
<%config.getInitParamenter("")%>
4.8 exception对象
exception
对象用于展示错误信息。
<% exception.getMessage()%>
5.JSP的指令
JSP指令⽤来设置整个JSP⻚⾯相关的属性,如⽹⻚的编码⽅式和脚本语⾔。
指令名称的描述
page
定义⽹⻚依赖属性,⽐如脚本语⾔、error⻚⾯、缓存需求等等include
包含其他⽂件taglib
引⼊标签库的定义
5.1 page指令
比如在JSP文件中创建一个List
类后,会自动在Page
指令中设置List
包
--语法格式
<%@ page attribute="value" %>
后续的page指令介绍不在后续中展示出来。
5.2 including指令
JSP可以通过include指令来包含其他⽂件。被包含的⽂件可以是JSP⽂件、HTML⽂件或⽂本⽂件。包含的⽂件就好像是该JSP⽂件的⼀部分,会被同时编译执⾏。
--语法格式
<%@ include file="⽂件相对 url 地址" %>
include 指令中的⽂件名实际上是⼀个相对的 URL 地址。
5.3 Taglib指令
JSP API允许⽤户⾃定义标签,⼀个⾃定义标签库就是⾃定义标签的集合。 Taglib指令引⼊⼀个⾃定义标签集合的定义,包括库路径、⾃定义标签。
<%@ taglib uri="uri" prefix="" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀(可⾃定义)。
6.状态码
比如说网页常见的404就是无法识别的意思。它的大致意思就是将对应的状态环节的问题进行反馈。
如下展示的是http中的状态码列表
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
7.EL表达式
Expression Language表达式语言语法格式
${需要展示信息的名字}
当表达式没有指定变量或者对象的范围时, 那么容器会依次从pageContext—>request—>session—>application
中查找该变量或对象。当然,我们可以通过隐含对象获得指定作⽤域的值。
上面的“没有指定变量”可以认为是没有在作用域中的变量。这要求首先要进行其存值的操作——setAttribute()
。
7.1 基础操作符
单个变量:${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}
8.JSTL
- JSP标准标签库(JSTL)是⼀个JSP标签集合,它封装了JSP应⽤的通⽤核⼼功能。
- JSTL支持通用的、结构化任务。比如循环迭代,条件判断,XML文档操作等等。并且它提供一个框架使用集成的JSTL自定义标签。
8.1 JSTL的使用
JSTL的存在即合理,它在于简化JSP页面编写代码,加大代码的可用性。
1.首先下载JSP标准标签库
- 官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 菜鸟编程下载地址:jakarta-taglibs-standard-1.1.2.zip
2.创建新项目,项目部署步骤不变。
3.下载该包
将jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。
4.在JSP⻚⾯中引⼊<%@ taglib prefix=”⻚⾯使⽤的名称” uri=”功能范围的路径”%>
例如:使用其中的核心标签库core
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
8.2 核心标签
语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核⼼标签的分类
- 表达式操作 out、set、remove、catch
- 流程控制 if、choose、when、otherwise
- 迭代操作 forEach、forTokens
- URL操作 import、param、url、redirect
Set标签
语法格式:
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"/>
<c:set>
主要⽤来将变量存储⾄JSP范围中
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要存储的值 | 否 | 主体的内容 |
target | 要修改的属性所属的对象 | 否 | 无 |
property | 要修改的属性 | 否 | 无 |
var | 存储信息的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | Page |
【示例】
<c:set var="uname" value="张三" scope="session" ></c:set>
out标签
语法格式:
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
<c:out>
主要⽤来显示数据的内容
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要输出的内容 | 是 | 无 |
default | 输出的默认值 | 否 | 主体中的内容 |
escapeXml | 是否忽略XML特殊字符 | 否 | true |
remove标签
语法格式:
<c:remove var="<string>" scope="<string>"/>
<c:remove>
主要负责移除变量
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
var | 要移除的变量名称 | 是 | 无 |
scope | 变量所属的作用域 | 否 | 所有作用域 |
if标签
语法格式
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | page |
流程控制choose,when,otherwise
<c:choose>,<c:when>,<c:otherwise> 作⽤相当于if-else
<c:choose>
标签与Java switch
语句的功能一样,用于在众多选项中做出选择。
switch
语句中有case
,而<c:choose>
标签中对应有<cwhen>
,switch语句中有default
,而<c:choose>
标签中有c:otherwise
。
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
forEach标签
<c:forEach>
循环控制,它可以将数组,集合(Collection)
中的成员循序浏览⼀遍。
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
...
8.3 格式化标签
1、fmt:formatDate
作⽤:将⽇期类型格式化为指定模式的字符串
- 属性
value
:将要被格式化的数据 pattern
:格式化的模式,与SimpleDateFormat的参数设置⼀样var
:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在⻚⾯scope
:变量存放的域属性空间,默认pagetype
:其取值为date、time、both,表示给出的value是⽇期、时间、还是两者都包含,默认是date
2、fmt:parseDate
作⽤:⽤于将指定字符串转化为⽇期类型
<fmt:parseDate value="${now }" pattern="yyyy-MM-dd" var="today"/>
Value
服务器获取的时间Pattern
:转换的格式Var
:⻚⾯显示的变量
3、fmt:formatNumber
按照指定格式对数字进⾏格式化
maxIntegerDigits
:整数部分最多的位数
minIntegerDigits
:整数部分最少的位数
maxFrctionDigits
:⼩数部分最多的位数
minFrctionDigits
:⼩数部分最少的位数
var
:存储格式化结果的变量
scope
:var
属性的作⽤域
integerOnly
:是否只解析整型数true或者浮点数false