1.概念
何为 JSP
-
java server pages Java 的服务器页面
-
主要作用是代替 Servlet 程序回传 html 页面的数据
-
jsp 页面和 html 页面一样,都是存放在 web 目录下。访问也跟访问 html 页面一样
-
http://ip:port/工程路径/b.jsp
JSP本质
-
jsp 页面本质上是一个 Servlet 程序(HttpJspBase 类直接地继承 HttpServlet 类)
-
底层通过输出流把 html 页面数据回传给客户端
2.JSP 语法
2.1 page指令
<%
属性
-
language: 表示 jsp 翻译后是什么语言文件。暂时只支持 java。
-
contentType: 表示 jsp 返回的数据类型,是源码中 response.setContentType()参数值
-
pageEncoding: 表示当前 jsp 页面文件本身的字符集。
-
import: 用于导包,导类
-
errorPage:设置当 jsp 页面运行时出错,自动跳转去的错误页面路径 /
-
isErrorPage:设置当前 jsp 页面是否是错误信息页面,默认false。true可以获取异常信息
-
session:设置访问当前 jsp 页面是否创建 HttpSession 对象。默认是 true。
-
extends:设置 jsp 翻译出来的 java 类的默认继承
-
out 输出流属性
-
autoFlush:设置out 输出流缓冲区满后,是否自动刷新,默认值true
-
buffer:设置 out 缓冲区大小,默认8kb
-
2.2 脚本
1.声明脚本:不常用
<%! 声明java代码 %>
给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块、内部类等
直接在中间写类属性
2.表达式脚本
<%=表达式%>
jsp 页面上输出数据
特点:
-
所有的表达式脚本都会被翻译到_jspService()方法中
-
表达式脚本都会被翻译成 out.print()输出到页面上
-
表达式脚本翻译的_jspService()方法中的对象都可以直接使用。
-
表达式不能以分号结束
3.代码脚本
<% java语句 %>
在 jsp 页面中编写功能(java 语句)
特点:
-
代码脚本翻译后在_jspService 方法中
-
代码脚本_jspService()方法中的现有对象可以直接使用
-
多个代码脚本块组合完成一个完整的 java 语句
-
代码脚本可以和表达式脚本组合使用,在 jsp 页面上输出数据
4.注释
html 注释 <!-- 这是 html 注释 -->
html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端
java 注释
jsp 注释 <%-- 这是 jsp 注释 --%>
3.JSP 对象
3.1 内置对象
jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象
-
request 请求对象
-
response 响应对象
-
pageContext jsp的上下文对象
-
session 会话对象
-
application ServletContext对象
-
config ServletConfig对象
-
out jsp输出流对象
-
page 指向当前jsp对象
-
exception 异常对象
3.2 域对象
-
pageContext(PageContextImpl 类) 当前 jsp 页面范围内有效
-
request (HttpServletRequest 类) 一次请求内有效
-
session (HttpSession 类) 一个会话范围内有效
(打开浏览器访问服务器,直到关闭浏览器)
-
application (ServletContext 类) 整个 web 工程范围内都有效
(只要 web 工程不停止,数据都在)
域对象是可以像 Map 一样存取数据的对象
四个域对象功能一样,不同的是数据的存取范围
使用的优先顺序从小到大:
pageContext < request < session < application
3.3 out输出和response.getWriter
一般情况在 jsp 页面中统一使用 out 来进行输出
避免打乱页面输出内容的顺序
out.write() 输出字符串
out.print() 输出任意数据
统一使用 out.print()来进行输出
4.JSP标签
4.1 静态包含
<%@ include file=""%>
file 属性指定包含的 jsp 页面的路径
地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ ,映射到代码的 web 目录
特点:
-
静态包含不会翻译包含的 jsp 页面
-
静态包含是把包含的 jsp 页面代码拷贝到包含的位置执行输出(通用的固定内容)
4.2 动态包含
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
</jsp:include >
page 属性是指定你要包含的 jsp 页面的路径
包含的内容执行输出到包含位置
特点:
-
动态包含会把包含的 jsp 页面也翻译成为 java 代码
-
动态包含底层调用被包含的 jsp 页面执行输出:
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
-
动态包含可以传递参数
4.3 转发
<jsp:forward page="/scope2.jsp"></jsp:forward >
请求转发标签,它的功能就是请求转发
page 属性设置请求转发的路径
5.EL表达式
Expression Language 表达式语言
代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出
EL 表达式的格式是:${表达式}
-
输出 null 值的时候,输出的是空串
-
主要是输出域对象中的数据:相同的 key,按照四个域的从小到大的顺序去进行搜索
-
输出 Bean 属性:
运算 ${ 运算表达式 }
-
关系、逻辑、算术
-
empty运算:判断一个数据是否为空,输出 true
-
值为 null 值的时候,为空
-
值为空串的时候,为空
-
值是 Object 类型数组,长度为零的时候
-
list 集合,元素个数为零
-
map 集合,元素个数为零
-
-
三元运算:表达式 1?表达式 2:表达式 3
如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值
-
. 点运算:输出 Bean 对象中某个属性
-
[]中括号运算:输出有序集合中某个元素的值;还可以输出 map 集合中 key 里含有特殊字符的 key 的值
隐含对象
可以直接使用
变量 类型 作用
pageContext PageContextImpl 获取 jsp 中的九大内置对象
pageScope Map<String,Object> 获取 pageContext 域中的数据
requestScope Map<String,Object> 获取 Request 域中的数据
sessionScope Map<String,Object> 获取 Session 域中的数据
applicationScope Map<String,Object> 获取 ServletContext 域中的数据
param Map<String,String> 获取请求参数的值
paramValues Map<String,String[]> 获取请求参数的值,获取多个值的时候使用。
header Map<String,String> 获取请求头的信息
headerValues Map<String,String[]> 获取请求头的信息,它可以获取多个值的情况
cookie Map<String,Cookie> 获取当前请求的 Cookie 信息
initParam Map<String,String> 获取web.xml<context-param>上下文参数
获取四个特定域中的属性
pageScope pageContext 域
requestScope Request 域
sessionScope Session 域
applicationScope ServletContext 域
pageContext 对象
1.协议: ${ pageContext.request.scheme }
2.服务器 ip:${ pageContext.request.serverName }
3.服务器端口:${ pageContext.request.serverPort }
4.获取工程路径:${ pageContext.request.contextPath }
5.获取请求方法:${ pageContext.request.method }
6.获取客户端 ip 地址:${ pageContext.request.remoteHost }
7.获取会话的 id 编号:${ pageContext.session.id }
6.JSTL标签库
JSP 标准标签库
功能范围 URI 前缀
核心标签库--重点 http://java.sun.com/jsp/jstl/core c
格式化 http://java.sun.com/jsp/jstl/fmt fmt
函数 http://java.sun.com/jsp/jstl/functions fn
数据库(不使用) http://java.sun.com/jsp/jstl/sql sql
XML(不使用) http://java.sun.com/jsp/jstl/xml x
使用:
先导入 jstl 标签库的 jar 包
-
taglibs-standard-impl-1.2.1.jar
-
taglibs-standard-spec-1.2.1.jar
taglib 指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core 核心库
1.<c:set />往域中保存数据
<c:set scope="session" var="abc" value="abcValue"/>
-
scope 属性设置保存域
-
page : PageContext 域(默认值)
-
request : Request 域
-
session : Session 域
-
application : ServletContext 域
-
-
var 属性设置 key
-
value 属性设置值
2.<c:if />
<c:if test=EL 表达式> 内容 < /c:if>
test 属性表示判断的条件(使用 EL 表达式输出)
3.< c:choose> 多路判断
< c:when>每一种判断情况</c:when >
< c:otherwise>剩下的情况</c:otherwise >
</c:choose >
要使用 jsp 注释
4.<c:forEach />遍历输出
<c:forEach begin="1" end="10" var="i"> 内容 < /c:forEach>
-
begin 开始的索引
-
end 结束的索引
-
var 循环变量(当前正在遍历的数据)
-
items 遍历的数据源(集合)
-
step 遍历的步长
-
varStatus 当前遍历到的数据的状态