文章目录
JSP
我们后面,或有替代 JSP的技术,比如 thymeleaf,vue等,但是对于 JavaEE 新手来说,JSP的学习是逃不掉的。各位在学习的时候,不要产生抵触情绪,花个两个小时,了解一项技术,无论它是否过时,也算是一种收获了。何况,jsp中的很多方法,在thymeleaf中,也是有其影子的。
JSP,是一种动态页面技术
是 java + html
何为动态页面?我们举个例子:
比如说,用户想查询所有书本信息,我们后台就会给前端传送一个 List 信息,但是 ,html因为已经固定好了,所以就算获取到了这个list,也无济于事
但是,JSP 就能根据传来的 List 信息,动态的更新页面的信息
这,就是动态页面
JSP小脚本
声明标签 <%!变量或者方法声明%>
表达式标签 <%= 表达式%> 在⻚面上显示的效果
程序代码标签 <%java代码%> ⻚面上动态展示内容
通过小脚本,可以在 JSP 中,写 Java 代码
JSP 原理
古早时期,程序员真的是在 Servlet 中,用流,将前端代码输出到页面上的(这可真的是折磨!),JSP,其实就是将这个折磨的过程,封装了一下,帮助我们,将前端的代码,用流输出出去
JSP 内置对象(9个)
如果面试问JSP(虽然不可能),那么,一定会问 JSP 的内置对象
JSP,一共有 9 种内置对象。
分别为:
request、response、session、application、out、pagecontext、config、page、exception
request 、response
Servlet中,能用的方法,他们基本都能用
page
相当于一个 this 指针,指向的是当前页面
pageContext < request < session < application
它们四个,都有 setAttribute()
和 setAttribute()
方法,区别在于它们的范围
这四个的所用范围,是不断变大的
pageContext
只在当前范围有效
request
只在一次请求有效
session
在一次会话(多次请求)中有效
但是换浏览器的话,数据就没了(因为不同浏览器/客户端 的sessionId 不一样)
application
在多个会话中,有效
即在整个服务器运行期间,都有效,我们换浏览器,数据照样能或得到
out
就是往页面中做输出的
<% out.print("---out") %>
等价于
<%="---out"%>
config
和 Servlet 中的 init()
方法中的 config 对象,用处是一样的
exception
JSP 指令
- Page指令
Page指令为容器提供当前⻚面的使用说明一个JSP⻚面可以包含多个page指令 Page指令的语法格式:
<%@ page attribute="value" %>
还有很多其他的操作,这里就不演示了,了解即可
- Include 指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含 的文件就好像是该JSP文件的一部分,会被同时编译执行。
类似于 html 中的 iframe,可以包含其他页面
语法如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
- Taglib 指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
语法如下:
<%@ taglib uri="uri" prefix="" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀(可自定义)。
我们后面用 JSTL 的时候,会需要使用这个指令的
常见状态码
200:成功
4xx:请求错误
5xx:服务器的业务代码出现错误
EL 表达式(常用)
我们在开发的时候,不回去使用小脚本去展示后台数据的
所以,我们需要借助 EL 表达式
==注意:==EL表达式如果想要读取变量,那么变量一定要放在作用域中
即下面这四个位置:pageContext,request,session,application
获取集合中的值
这里不展示 set,是因为 set 中的元素是无序的,无法通过下标获取,只能遍历获取
而遍历,需要用到后面的 JSTL 标签库
获取指定作用域的同名变量
如果 pageContext,request,session,application 这四个作用域中,都有一个同名变量,那么,会从作用域最小的开始找,即如果在 pageContext 中找到了,就不再往后找了,以此类推。
JSTL
JSTL是一个JSP标签集合
根据功能不同,可以分为下面五种:
- 核心标签
- 格式化标签
- sql标签
- xml标签
- jstl函数
注意,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/function | fn |
这里,我们只要了解 core 和 i18n即可,其他的仅做了解,后面会有其他前端的解决方式,来替代 JSP 的
引入方式
- 导入Maven依赖
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
- 用 tablib,引入对应标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签 core
表达式操作 out、set、remove、catch
流程控制 if、choose、when、otherwise
迭代操作 forEach、forTokens
URL操作 import、param、url、redirect
这里,我们只要掌握 foreach 和 if 即可,其他仅供了解
<c: foreach>
我们先在session中放一些数据:
<%
List<String> list = new ArrayList<>();
list.add("haha");
list.add("呵呵");
list.add("嘻嘻");
session.setAttribute("list",list);
%>
然后用 JSTL 获取信息:
<c:forEach items="${sessionScope.list}" varStatus="status" var="item">
${status.index}---${status.count} : ${item} <br/>
</c:forEach>
index 是从0开始的
count 是从1开始的
<c: if>
<c:if test="${name=='张三'}">
这是张三
</c:if>
格式化标签
这里,我们用的比较多的,就是将时间格式化
<%
session.setAttribute("date",new Date());
%>
<br/>
date = <fmt:formatDate value="${sessionScope.date}" pattern="yyyy-MM-dd"></fmt:formatDate>