JSP内置对象

内置对象指的是:JSP引擎在转换时期,在service方法的前面,帮我们提前准备好的一些对象.我们在<%%>代码块中,可以直接使用它们.

作用:这些对象包含了我们进行动态网页开发常用的一些对象.提供了大量的便于我们开发的功能,可以简化我们的开发过程.

九大内置对象


  • request内置对象

详情请去HttpServletRequest和HttpServletResponse类查看博客Java_web(3)

  • response内置对象

详情请去HttpServletRequest和HttpServletResponse类查看博客Java_web(3)

  • pageContext内置对象

pageContext对象常用方法如下

1
2
3
4
5
6
pageContext.setAttribute(String name,Object value,int scope)
pageContext.getAttribute(String name,int scope)
pageContext.getRequest()/getResponse()
pageContext.getSession()/getServletContext()
pageContext.getOut()/getPage()
pageContext.getServletConfig()/getException()
  • session内置对象

详情请去Cookie和Session技术查看博客Java_web(4)

  • application内置对象

详情请去ServletContext对象查看博客Java_web(3)

  • out内置对象

out对象常用方法如下

1
2
3
4
5
6
7
out.println():向客户端输出各种类型数据
out.newLine():输出一个换行符
out.close():关闭输出流
out.flush():输出缓冲区里的数据
out.clearBuffer():清除缓冲区里的数据,同时把数据输出到客户端
out.clear():清除缓冲区里的数据,但不把数据输出到客户端
out.getBufferSize():返回缓冲区的大小
1
2
3
4
<%
out.println("现在时间是:"+new java.util.Date());
out.println("现在时间是:大萨达");
%>
  • 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
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
//先建一个Person类,定义它的成员变量
<%@page import="demo2.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<%
String str1 = "床前明月光";
Person p = new Person("张三",18);
Person[] pers = {
new Person("张三",18),
new Person("李四",18),
new Person("王二",18),
new Person("麻子",18)
};

pageContext.setAttribute("k1", str1);
pageContext.setAttribute("k2", p);
pageContext.setAttribute("k3", pers);
%>
<h1>${ k1 }</h1>
<hr>
<h1>${ k2.name }</h1>
<h1>${ k2["name"] }</h1>
<%
pageContext.setAttribute("a", "age");
%>
<h1>${ k2[a] }</h1>
<hr>
<h1>${ k3[1].name }</h1>
<h1>${ k3[1]["name"] }</h1>
<h1>${ k3[1][a] }</h1>
</body>
</html>
  • 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
2
3
4
<短名称:if test=""></短名称:if>
test值: boolean值,可以是具体的boolean值,也可以是el表达式运算的结果
如果test值为true,则内容显示
如果test值为false,则内容不显示(内容不会通过流,输出到响应体中)

2.choose + when + otherwise

1
2
类似Java中的: switch + case + default
作用:用于多分支, 显示.

3.forEach标签

1
2
3
4
5
6
7
8
用于遍历集合或数组元素
格式:
<标签库名称:forEach items="" var="">

</标签库名称:forEach>
属性:
items : 使用el表达式, 从域对象中取出的要遍历的数组或集合对象.
var : 在进行遍历时, 数组或集合中的每一个元素被取出后, 会单独存储在pageContext中, var的值就是存储时的键
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
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="heihei" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>
<%
pageContext.setAttribute("flag", false);
%>
<heihei:if test="${ flag }">
从前有一座山 , 山上有座尼姑庵 , 庵里有个老尼姑 和 一个小姐姐 .
</heihei:if>
<hr>
<%pageContext.setAttribute("flag",6);%>
<heihei:choose>
<heihei:when test="${ flag==1 }">孔子东游 , 见两小儿辩日</heihei:when>
<heihei:when test="${ flag==2 }">千呼万唤始出来</heihei:when>
<heihei:when test="${ flag==3 }">白日依山尽</heihei:when>
<heihei:when test="${ flag==4 }">日照香炉生紫烟</heihei:when>
<heihei:when test="${ flag==5 }">万里江陵十日还</heihei:when>
<heihei:otherwise>停车坐爱枫林晚</heihei:otherwise>
</heihei:choose>
<hr>
<%
ArrayList<String> data = new ArrayList<>();
data.add("孔子东游 , 见两小儿辩日");
data.add("千呼万唤始出来");
data.add("白日依山尽");
data.add("日照香炉生紫烟");
data.add("万里江陵十日还");
data.add("停车坐爱枫林晚");
data.add("老骥伏枥志在千里");
pageContext.setAttribute("data", data);
%>
<heihei:forEach items="${data }" var="str">
<h1>${ str }</h1>
</heihei:forEach>
</body>
</html>
  • 自定义标签库并使用

    1
    2
    3
    4
    5
    1.编写一个类, 继承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
    52
    package 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("假如今天的你被生活辜负了,别伤心,因为明天生活还会继续辜负你!");
    }

    @Override
    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>