JSP
# JSP
JSP是 Servlet设计的简化版,可在HTML页面添加 Java语言的脚本。JSP开发的Web应用可跨平台,也能在其他系统运行
*.html 静态页面
*.jsp 动态页面(嵌套Java和html代码)
# JSP 引入
声明标签 <%! 变量/方法 的声明%>
表达式 <%= 表达式%>
执行标签 <%java代码%>
# JSP 原理
当浏览器访问服务器时。地址后缀为 .jsp
,会先找 index.jsp
,找到随后进行翻译成 index_jsp.java
并对其进行编译,产生一个 index_jsp.class
进行加载运行
# JSP 内置对象
# request对象
request 对象是 javax.servlet.HttpServletRequest
类型的对象
该对象代表了客户端的请求信息,主要⽤于接受HTTP协议传送到服务器的数据
作用域:一次请求
点击详细说明HttpServletRequest (opens new window)
# response对象
response 对象是 javax.servlet.HttpServletResponse
类型的对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端
作用域:本页面
点击详细说明HttpServletResponse (opens new window)
# session对象
session 对象是由服务器自动创建的与用户请求相关的对象,每个会话都有对应的会话ID,用于保存信息,以及跟踪用户的操作状态 作用域:本次会话
点击详细说明HttpSession (opens new window)
# application对象
application对象 可将信息保存在服务器,直至服务器关闭(类似于全局变量) 作用域:服务器运行
点击详细说明ServletContext (opens new window)
# out对象
out对象 可在Web浏览器内输出信息,管理应用服务器上的输出缓冲区(输出完及时不关闭流)
点击详细说明ServletOutputStream (opens new window)
# pageContext对象
pageContext对象 用于获取任何范围的参数
更多方法说明ServletContext (opens new window)
# config对象
config对象 用于获取服务器的配置信息
使用前提需要 pageConext对象
的 getServletConfig() 方法
获取 config对象
更多方法说明ServletConfig (opens new window)
# page对象
page对象 代表JSP本身(类似于Java语言 的 this
)
# exception对象
exception对象 用于显示异常信息
在JSP页面 page指令
添加 isErrorPage = "true"
属性 和 errorPage="XXX.jsp"
页面才生效
如果页面异常则会生成 exception对象
并把 page指令
设定在错误页面中进行处理
更多方法说明ServletException (opens new window)
# JSP 指令
JSP指令 控制JSP编译器如何去生成servlet
page指令
定义网页依赖(脚本、异常、缓冲、...)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
属性 | 值 | 说明 |
---|---|---|
language | java、... | 解释JSP文件使用的语言 |
extends | 任何类的全名 | 编译时继承哪个类 |
import | 任何类的全名 | 引入类、包等... |
session | true、false | 设置JSP文件是否内置Session对象 (默认true) |
autoFlush | true、false | 是否运行缓存 (默认true) |
buffer | none、 指定KB | 指定缓存大小 (默认none) |
contentType | 文档类型 | 规定了生成内容的类型。当生成非HTML内容或者当前字符集并非默认字符集时使用 |
errorPage | 相对路径 | 指定 页面异常时转送的页面 |
isErrorPage | true、false | 指定页面是否显示错误提示页面 (默认false) |
isThreadSafe | true、false | 最终生成的servlet是否具有线程安全性 (默认false) |
pageEncoding | utf-8、... | 指定 编码类型 |
**Include指令** JSP可以通过
include指令来包含其他文件 并且同时编译运行
<%@ include file="相对url地址" %>`
Taglib指令
JSP允许自定义标签库,引入库、标签等...
<%@ taglib uri="标签库路径" prefix="指定标签库前缀" %>
# 状态码
状态码 | 消息 | 说明 |
---|---|---|
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下找到 |
400 | Bad Request | 服务器无法识别请求 |
403 | Forbidden | 禁止访问所请求的页面 |
404 | Not Found | 服务器无法找到所请求的页面 |
405 | Method Not Allowed | 请求中所指定的方法不被允许 |
500 | Internal Server Error | 请求不完整,服务器遇见出乎意料的状况 |
501 | Not Implemented | 请求不完整,服务器不提供所需要的功能 |
502 | Bad Gateway | 请求不完整,服务器中上游服务器接收了一个无效的响应 |
503 | Service Unavailable | 请求不完整,服务器暂时重启 / 关闭 |
505 | HTTP Version Not Supported | 服务器不支持指定的HTTP版本 |
# EL表达式
EL表达式可 讲话对象和变量 快速呈现出来
展示方式
默认展示:${需要展示的信息}
指定展示:${对象.key}
**默认获取顺序 ** 根据以下对象查找key值是否存在,存在则优先获取
- pageContext对象 (当前页面)
- request对象 (请求范围)
- session对象 (会话范围)
- application对象 (程序范围)
EL基本操作符
术语 | 定义 |
---|---|
算术 | +、-、*、/、% |
逻辑 | and、ro、not、&&、||、! |
关系 | ==、eq、!=、ne、gt、<=、le、>=、ge |
Empty | 判断前缀是否为null (应用==empty <域对象>== 返回 布尔值) |
类型 | 三目运算符 |
示例:
<%
pageContext.setAttribute("number",1);
pageContext.setAttribute("name","");
request.setAttribute("number",2);
session.setAttribute("number",3);
application.setAttribute("number",4);
%>
<h2>作用域数据获取:</h2>
<p>直接获取name:${number}</p>
<p>pageScope域获取name:${pageScope.number}</p>
<p>requestScope域获取name:${requestScope.number}</p>
<p>sessionScope域获取name:${sessionScope.number}</p>
<p>applicationScope域获取name:${applicationScope.number}</p>
<h2>表达式应用</h2>
<p>pageContext > session : ${number > sessionScope.number}</p>
<p>name 是否为空 : ${empty name}</p>
<p>session、application 获取最大值:${sessionScope.number > applicationScope.number?sessionScope.number:applicationScope.number}</p>
<%-- 浏览器结果
作用域数据获取:
直接获取name:1
pageScope域获取name:1
requestScope域获取name:2
sessionScope域获取name:3
applicationScope域获取name:4
表达式应用
pageContext > session : false
name 是否为空 : true
session、application 获取最大值:4
--%>
# JSTL
JSTL是⼀个JSP标签集合,它封装了JSP应用的通用核心功能(条件判断、循环迭代、...)
点击JSTL标签更多说明 (opens new window)
# JSTL引入
- 引入jar依赖:
standard.jar
、jstl.jar
- 在JSP文件的页面 引入相应功能范围的标签
<%@ taglib prefix="前缀" uri="功能范围路径" %>
功能范围 | uri | 前缀 |
---|---|---|
core | http://java.sun.com/jsp/jstl/core | c |
i18n | http://java.sun.com/jsp/jstl/fmt | fmt |
sql | http://java.sun.com/jsp/jstl/sql | sql |
xml | http://java.sun.com/jsp/jstl/xml | x |
functions | http://java.sun.com/jsp/jstl/functions | fn |
# 核心标签
引入:==<%@ 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
<c:set>标签 保存数据
属性 | 值说明 |
---|---|
value | 存储的值 |
var | 存入的变量名 |
scope | 指定变量范围 |
target | 对象类型 |
property | 指定target对象的属性值 |
<c:out>标签 输出数据
属性 | 值说明 |
---|---|
value | 输出的数据 |
default | 无输出则默认代替 |
escapeXml | 是否忽略XML特殊字符 |
<c:remove>标签 删除保存的数据
属性 | 值说明 |
---|---|
var | 移除的变量名 |
Scope | var变量的范围 |
<c:if>标签 if判断
属性 | 值说明 |
---|---|
test | 表达式的结果(true/false) |
var | 存储表达式结果的变量名 |
scope | var变量的范围 |
<c:choose>,<c:when>,<c:otherwise>标签 if-else 判断
属性 | 值说明 |
---|---|
test | 表达式的结果(true/false) |
<c:forEach>标签 循环循环
属性 | 值说明 |
---|---|
var | 迭代对象 |
items | 迭代的集合对象 |
varStatus | 迭代对象的相关成员信息 |
begin | 开始迭代的位置 |
end | 结束迭代的位置 |
step | 每次迭代的间隔数 |
# 应用实例
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri ="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>JSTL 测试</h1>
<h2>表达式操作 标签</h2>
<h3>set存数据</h3>
<c:set var="name" value="Sanscan12" scope="session"/>
<c:set var="name" value="Sanscan12" scope="application"/>
<h3>out显示数据</h3>
sessionScope-name = <c:out value="${sessionScope.name}"/> <br>
<%--sessionScope-name = Sanscan12--%>
name = <c:out value="null" default="Error"/> <br>
<%--name = null--%>
<h3>remove移除数据</h3>
移除 application-name数据!<c:remove var="name" scope="application"/> <br>
<%--移除 application-name数据!--%>
applicationScope-name = <c:out value="${applicationScope.name}" default="Error"/> <br>
<%--applicationScope-name = Error--%>
sessionScope-name = <c:out value="${sessionScope.name}" default="Error"/> <br>
<%--sessionScope-name = Sanscan12--%>
<h2>流程控制 标签</h2>
<h3>if判断</h3>
Sans 是本人?<c:if test="${name=='Sans'}" var="result" />
<c:out value="${result}"/><br>
<%--Sans 是本人? false--%>
Sanscan12 是本人?<c:if test="${name=='Sanscan12'}" >true</c:if> <br>
<%--Sanscan12 是本人?true--%>
<h3>if-else判断</h3>
Sanscan12 是本人?
<c:choose>
<c:when test="${name=='Sanscan12'}">
Yes
</c:when>
<c:otherwise>
No
</c:otherwise>
</c:choose>
<%-- Sanscan12 是本人? Yes --%>
<h3>forEach循环</h3>
<%
List list = new ArrayList();
list.add("123");
list.add("456");
list.add("789");
pageContext.setAttribute("ulist",list);
%>
<c:forEach var="name" items="${ulist}" varStatus="sta">
<%-- 个数-索引-值 --%>
${sta.count} --> ${sta.index} --> ${name} <br>
</c:forEach>
<%--
1 --> 0 --> 123
2 --> 1 --> 456
3 --> 2 --> 789
--%>
<c:forEach var="i" begin="1" end="10" step="1">
${i}
</c:forEach>
<h2>格式化 标签</h2>
<h3>日期格式化 --> 字符串</h3>
<%pageContext.setAttribute("nowDate",new Date());%>
nowDate:<fmt:formatDate value="${nowDate}"/> <br>
<%--2021年4月17日--%>
YYYYMMdd-nowDate:<fmt:formatDate value="${nowDate}" pattern="YYYY-MM-dd"/> <br>
<%--2021-04-17--%>
date-nowDate:<fmt:formatDate value="${nowDate}" type="date"/> <br>
<%--2021年4月17日--%>
time-nowTime:<fmt:formatDate value="${nowDate}" type="time"/> <br>
<%--上午10:38:38--%>
both-now:<fmt:formatDate value="${nowDate}" type="both"/> <br>
<%--2021年4月17日 上午10:38:38--%>
<%--<h3>字符串格式化 --> 日期</h3>--%>
<%--Format:<fmt:parseDate value="${nowDate}" var="test"/> <br>--%>
<%--YYYY:<fmt:parseDate value="${nowDate}" var="forDate2" pattern="YYYY"/> <br>--%>
<h3>数字格式化</h3>
type-currency-value(3.14): <fmt:formatNumber value="3.14" type="currency"/> <br>
<%--¥3.14--%>
type-percent-value(3.14): <fmt:formatNumber value="3.14" type="percent"/> <br>
<%--314%--%>
maxIntegerDigits(4)-value(314159.26): <fmt:formatNumber value="314159.26" maxIntegerDigits="4"/> <br>
<%--4,159.26--%>
maxFractionDigits(2)-value(3.14159): <fmt:formatNumber value="3.14159" maxFractionDigits="2"/> <br>
<%--3.14--%>
maxFractionDigits(2)-value(3.14559): <fmt:formatNumber value="3.14559" maxFractionDigits="2"/> <br>
<%--3.15--%>
pattern(0.###E0)-value(0.31415926535897): <fmt:formatNumber value="0.31415926535897" pattern="0.###E0"/> <br>
<%--3.142E-1--%>
pattern(00.###E0)-value(0.31415926535897): <fmt:formatNumber value="0.31415926535897" pattern="00.###E0"/> <br>
<%--31.416E-2--%>
pattern(0.###E0)-value(31415926535897): <fmt:formatNumber value="31415926535897" pattern="0.###E0"/> <br>
<%--3.142E13--%>
</body>
</html>