JavaWeb之JSP内置对象、el表达式、taglib指令jstl标签和自定义标签
JSP内置对象
内置对象指的是:JSP引擎在转换时期,在service方法的前面,帮我们提前准备好的一些对象.我们在<%%>代码块中,可以直接使用它们.
作用:这些对象包含了我们进行动态网页开发常用的一些对象.提供了大量的便于我们开发的功能,可以简化我们的开发过程.
九大内置对象
- request内置对象
详情请去HttpServletRequest和HttpServletResponse类查看博客Java_web(3)
- response内置对象
详情请去HttpServletRequest和HttpServletResponse类查看博客Java_web(3)
- pageContext内置对象
pageContext对象常用方法如下
1 | pageContext.setAttribute(String name,Object value,int scope) |
- session内置对象
详情请去Cookie和Session技术查看博客Java_web(4)
- application内置对象
详情请去ServletContext对象查看博客Java_web(3)
- out内置对象
out对象常用方法如下
1 | out.println():向客户端输出各种类型数据 |
1 | <% |
- config内置对象
详情请去ServletConfig对象查看博客Java_web(2)
- exception内置对象
详情请去JSP的错误处理页面查看博客Java_web(5)
JSP内置对象的四大域对象
九大内置对象中,包含四个较为特殊的对象.这四个对象我们称其为:域对象!
域对象存在一个特点: 都包含存储数据/删除数据/获取数据的方法,所谓的域,指的是存储的数据使用的作用域.
存储数据: setAttribute(String key,Object value);
获取数据: Object value = getAttribute(String key);
删除数据: removeAttribute(String key);
-
pageContext(一个JSP页面的域对象)
页面的上下文,存储在pageContext中的数据,域是最小的,只有当前请求的当前页面才可以使用.页面响应完毕对象就被垃圾回收了.
-
request(一次请求域对象)
请求对象,存储在request对象中的数据,只有当前请求,才可以使用!一次请求可能发生多次转发,所以有可能跨越多个Servlet/JSP页面.
-
session(一次会话域对象)
会话对象,存储在session对象中的数据,在当前会话中可以使用.一次会话可能包含多次请求.
-
application(一次服务域对象)
Servlet上下文对象,存储在application中的数据,在服务器关闭之前都可以使用.应用的一次启动,服务器中只会存在一个application对象,一次服务器启动中可能包含多次会话.
EL表达式
作用:用于快速的从域对象中取出数据,并将结果输出到网页中.
格式: ${ 表达式 }
-
EL表达式的使用
1.用于运算
${1+2+3+4+5} 输出的结果是: 15
2.用于取出域对象中的数据
访问存储的数据格式:
${存储的key}
访问存储的对象的属性:
格式1. ${存储的key.属性名} 格式2. ${存储的key["属性名"]} 格式3. 动态取值:指的是按照域对象中存储的一个属性名, 以及对象名, 从对象中取出属性值 ${存储的对象key[属性名的key]}
3.用于取出域对象中的集合/数组中的对象属性
格式1. ${存储的key[下标].属性名} 格式2. ${存储的key[下标]["属性名"]} 格式3. 动态取值:指的是按照域对象中存储的一个属性名,以及对象名,从对象中取出属性值 ${存储的对象key[下标][属性名的key]}
1 | //先建一个Person类,定义它的成员变量 |
-
EL表达式,取出数据的流程
寻找的顺序:从域范围小的到域范围大的
步骤:
1.先从pageContext中,寻找数据是否存在.
2.如果pageContext中不存在数据,则去request中寻找数据是否存在.
3.如果request中不存在数据,则去session中寻找数据是否存在.
4.如果session中不存在数据,则去application中寻找数据是否存在
5.如果application中不存在数据,则向网页输出: “”在上述的步骤中,一旦寻找到数据,则流程结束,将寻找到的数据输出到网页中.
-
EL表达式的运算
JSP三大指令
-
taglib指令
用于在JSP中,引入标签库.
语法格式:
<%@ taglib prefix=“短名称” uri=“地址”%>
prefix: 是引入的标签库的名称,用于区分引入的多个标签库,在使用标签库中的标签时,需要在前面加入库名
uri: 引入标签库的操作与网页中引入其他静态资源不一样.
引入静态资源(图片,音乐等等),使用相对路径.每一个标签库都拥有uri属性,引入标签库,不需要路径,只需要匹配uri就可以
-
JSTL标签库的使用
JSTL是一套JSP的标准标签库,使用时导入jstl.jar和standard.jar
1.IF标签
1 | <短名称:if test=""></短名称:if> |
2.choose + when + otherwise
1 | 类似Java中的: switch + case + default |
3.forEach标签
1 | 用于遍历集合或数组元素 |
1 | <%@page import="java.util.ArrayList"%> |
-
自定义标签库并使用
1
2
3
4
51.编写一个类, 继承SimpleTagSupport类
2.重写类的doTag方法 ,
3.在doTag方法中, 通过getJspContext() 方法 得到JSP的上下文.
4.通过上下文对象, 可以得到其他8大内置对象 , 通常我们是getOut()得到输出流, 向网页输出内容.
5.编写tld文件, 描述标签库和标签.1.新建tag目录,然后在此目录下创建MyTag.class继承SimpleTagSupport类,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52package tag;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
public class MyTag extends SimpleTagSupport {
private static ArrayList<String> data = new ArrayList<>();
static {
data.add("理想是人生的太阳。 —— 德莱赛");
data.add("真实是人生的命脉,是一切价值的根基。 —— 德莱塞");
data.add("真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。 —— 鲁迅");
data.add("人生须自重。 —— 黄宗羲");
data.add("在人生的道路上,当你的希望一个个落空的时候,你也要坚定,要沉着。 —— 朗费罗");
data.add("真理惟一可靠的标准就是永远自相符合。 —— 欧文");
data.add("竹子用了4年扎根,第五年一出头就被做成竹笋炒肉。");
data.add("公主病的成因没别的,不是丑就是穷。“那有钱又漂亮脾气却不好的呢?”那本来就是公主,不叫病。");
data.add("所谓的女汉子,只不过是因为长得丑而已,但凡有些爷们气质的漂亮姑娘,都被称为女王大人。");
data.add("腾不出时间来睡觉的人,迟早会腾出时间来生病;腾不出时间来恋爱的人,迟早会腾出时间来相亲。");
data.add("快乐分享错了人就成了显摆,难过分享错了人就成了矫情。");
data.add("请记住,你并不是一无所有,你还有病!哈哈");
data.add("鱼和熊掌不可兼得,但单身和穷可以!");
data.add("用钱当然买不到快乐,但只要你有钱,别人会想办法让你快乐。");
data.add("你才二十多岁,没有遇到对的人很正常,以后你就知道,大概遇不到了!");
data.add("这年头,当个宅男宅女,也得先买房子!");
data.add("能背后给你一刀的,往往是你信任的!");
data.add("失败并不可怕,可怕的是你还相信这句话。");
data.add("比一个人吃火锅更寂寞可怜的是,一个人没有钱吃火锅。");
data.add("你只知道人家化妆比你好看,却不知道,她们卸了妆,不仅比你好看,皮肤还吹弹可破。");
data.add("从前车马很慢,书信很远,一生只够爱一个人,但是能纳很多妾。");
data.add("岁月告诉我,除了快递,我啥也等不到!");
data.add("假如今天的你被生活辜负了,别伤心,因为明天生活还会继续辜负你!");
}
public void doTag() throws JspException, IOException {
JspContext context = getJspContext();
JspWriter out = context.getOut();
String text = getText();
out.print(text);
}
public String getText() {
Random r = new Random();
int i = r.nextInt(data.size());
return data.get(i);
}
}2.在web下的wen-inf创建xdl.tld,并输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- 注释 ,描述 -->
<description>这是兄弟连Java30期自定义的一个标签库</description>
<!-- 名称 -->
<display-name>XDL</display-name>
<!-- 版本 -->
<tlib-version>5.21</tlib-version>
<!-- 短名称 -->
<short-name>x</short-name>**
<!-- 用于匹配的uri -->
<uri>http://hahaha.heiheihei.com</uri>**
<!-- 在标签库中 一个tag节点 , 表示库中的一个自定义标签 -->
<tag>
<!-- 标签的描述 ,在使用时, 会提示 -->
<description>这个标签会向网页中输出一条鸡汤句子</description>
<!-- 标签的名称 -->
<name>djt</name>
<!-- 标签的类的全名 -->
<tag-class>tag.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>3.jsp页面使用自定义标签
1
2
3
4
5
6
7
8
9
10
11
12
13<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="x" uri="http://hahaha.heiheihei.com"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1><x:djt/></h1>
</body>
</html>