JSP 笔记

一、介绍

JSP<-->Java Server Page

JSP:Java Server Page

SUN 公司提供的动态网页编程技术,是 Java Web 服务器端动态资源

不管是 JSP 还是 Servlet,虽然都可以用于开发动态 web 资源。但由于这 2
门技术各自的特点,在长期的软件实践中,人们逐渐把 servlet 作为 web 应用
中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用。

其实 Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会
将这个 Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。

image.png

二、准备工作

1、配置Eclipse

这一步不是必须的,当然由于 eclipse 中有写默认的配置项我们觉得不是很完美,比如 字符编码,比如 HTML 的 DOCTYPE,我们可以在新建 JSP 页面之前就先修改为我们需要的。

image.png
image.png
image.png

2、新建JSP文件

选中当前项目中的WebContent-->快捷键ctrl+N,搜索jsp,选中JSP File-->给新的jsp文件取名

image.png

新建完成后的完整代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

三、基础语法

1、注释

显式注释 隐式注释
客户端可见 客户端不可见
继承HTML风格的注释 1、JSP自己的注释
2、继承Java风格的注释 // 单行 /*多行注释*/
3、<%-- 这是JSP注释 --%>

2、Scriptlet(重点)

Scriptlet(脚本小程序),指所有嵌入在HTML代码中的Java程序,都必须用 Scriptlet 标记出来,在JSP中一共有三种 Scriptlet 代码:

1) java脚本段

​ 语法:<% %>

​ // java 脚本段,可以定义局部变量、编写语句

​ 特点:被编译之后会生成在service方法体

2) 声明

​ 语法:**<%! %> **

​ // 可以定义全局(成员)变量、方法、类

​ 特点:被编译之后生成在servlet类体

3) 输出

​ 语法:**<%= %> **

​ // 表达式,输出一个变量、字面值或其它具体内容

​ 特点:被编译之后生成在service方法体中;相当于out.print()输出

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- Java脚本段 -->
    <%
        // 定义变量
        String str = "Hello JSP";
        // 输出到控制台
        System.out. println(str);
        // 输出到浏览器
        // out.print(str);
        response.getWriter().write(str);
    %>
    <br />
    <!-- 声明 -->  
    <%!String memberStr = "a member String"; %>
    <!-- 表达式 -->
    <%=memberStr %>
    <h2>This is a JSP page!</h2>
</body>
</html>

浏览器显示

image.png

3、JSP 的指令标签

JSP 的指令标签用来控制整个 jsp 的行为,就当前 JSP 页面的某些方面对 JSP 转换器作出指示。

image.png
1) page指令

​ 格式:<%@page 属性=“属性值” 属性=“属性值” %>

常用属性:contentType & pageEncoding

常用属性 解释
language 当前仅支持 Java 语言
contentType 响应类型及编码格式
pageEncoding 编码格式
inport 导包,仅 import 属性可多次设置
isErrorPage 处理报错信息的页面,默认为 false
errorPage 页面报错时,该跳转到什么页面

备注:JSP页面编码以contentType中的charset的值为准,如果未设置charset值,则以pageEncoding的属性值为准;如果都没有,则默认ISO-8859-1

下图为百度处理报错信息的页面【一般不会直接报Servlet Status code 404等】

image.png
2)include 静态包含

<%@ include file=”要包含的文件路径”%> 相对路径

<%@include file="include.jsp"%>
或
<%@include file="include.html"%>

静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在 servlet 引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起, 全部放到_jspService 方法中),所以只生成了一个 servlet,所以两个页面不能有同名的变量

运行效率高一点点。耦合性较高,不够灵活。

​ 3) taglib 导入标签库

当使用到第三方标签库时需要通过 taglib 标签进行导入。

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

4、JSP 动作标签

动作标签,它们被编译成执行某个操作的 Java 代码,例如访问某个 Java 对
象,或者调用某个方法。

jsp 的动作标签,与 html 提供的标签有本质的区别:

  • 动作标签是由 tomcat(服务器)来解释执行!与 java 代码一样,都是在服务器端执行

  • html 由浏览器来执行!

格式:

<jsp:动作标签...></jsp:动作标签>

include 动态包含

include 动作用于动态地包含另一个资源,它可以包含另一个 JSP 页面、一个 Servlet 或 者一个静态的 HTML 页面。

参数 无参 有参
格式 <jsp:include page="包含的页面路径"></jsp:include> <jsp:include page="包含的页面路径">
<jsp:param value="参数值" name="参数名"/>
</jsp:include>
特点 相当于方法的调用,会生成多个java文件;可以出现同名变量
备注 1、<jsp:include>双标签中不能包含任何内容,包括换行和空格,除非有参数<br />2、<jsp:param>的value属性值支持表达式,name属性值不支持
The name attribute of the jsp:param standard action does not accept
静态包含 动态包含
静态包含使用 include 指令即可 动态包含则需要使用 include 动作标签
静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在 servlet 引擎转译时,就把此文件内容包含了进去 动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来好比方法的调用。

5、九大内置对象

1、request 对象

request 对象是 javax.servlet.httpServletRequest 类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过 HTTP 协议传送到服务器的数据。(包括头信息.系统信息. 请求方式以及请求参数等)。

request 对象的作用域为一次请求。

2.response 对象

response 代表的是对客户端的响应,主要是将 JSP 容器处理过的对象传回到客户端。response 对象也具有作用域,它只在 JSP 页面内有效。

3.session 对象

session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。

session 对象内部使用 Map 类来保存数据,因此保存数据的格式为“Key/value”。 session 对象的 value 可以是复杂的对象类型,而不仅仅局限于字符串类型。

4.application 对象

application 对象可将信息保存在服务器中,直到服务器关闭,否则application 对象中保存的信息会在整个应用中都有效。

与 session 对象相比,application 对象生命周期更长,类似于系统的“全局变量”。

5.out 对象

out 对象用于在 Web 浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6.pageContext 对象

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的 out. request. reponse. session. application 等对象。

pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。

7.config 对象

config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象的 getServletConfig() 方法可以获取一个 config 对象。

当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个Servlet。

开发者可以在 web.xml 文件中为应用程序环境中的 Servlet 程序和 JSP 页面提供初始化参数。

8.page 对象

page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。 page 隐含对象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this 指针。

9.exception 对象

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true"的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。

excepation 对象和 Java 的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。

如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。


分类

  1. JSP四大域对象
    • pageContext.setAttribute("uname", "zhangsan");
    • request.setAttribute("uname", "lisi");
    • session.setAttribute("uname", "wangwu");
    • application.setAttribute("uname", "zhaoliu");
  2. 两个输出对象
    • out.print(config.getServletName());
    • response.getWriter().write("Hello!");
  3. 配置对象
    • out.print(config.getServletName());
  4. 当前jsp本身
    • page
  5. 异常信息对象 (只有jsp页面设置属性isErrorPage="true"才能使用)
    • out.print(exception.getMessage());

四、EL表达式

1、EL 语法和使用

EL(Expression Language) 是为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更 加简化。

​ 语法:${expression}

​ 备注:

  1. el 表达式一般操作的是域对象中的数据,操作不了局部变量。

  2. JSP中的四个域对象:

    • pageContext(本页面)
    • request(一次请求)
    • session(一次会话)
    • application(整个应用程序)
  3. EL 默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字符串 ””。

  4. 获取

    ${request.user.id} // 在request中获取user对象的id属性
    
  5. 使用 EL 表达式可以用来判断集合中是否有元素 ${empty list}

2、EL 运算

1) List 遍历
<%
    List<String> list = new ArrayList<String>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    request.setAttribute("list", list);
%>
${empty list}
<br /> ${list[1] }
<br />

2) 访问 map
<%
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("aaa", "111");
    map.put("bbb", 2222);
    map.put("ccc-a", 333);
    request.setAttribute("map", map);
%>
${empty map} ${map.aaa }
<br /> ${map["bbb"]}
<br /> ${map["ccc-a"]}
  1. 做+、-、*、/(或 div 表示)、%、==、<、>、<=、>=
<%
    String a = "aaa";
    String b = "aaa";
%>
    <%=a == b%>
    ${4 div 2 }
<br />

五、JSP 内置对象总结

目标

  • 掌握内置对象的主要作用
  • 掌握九个内置对象及其对应类型

在 JSP 之中,已经专门为用户的使用提供了许多的内置对象,所谓的内置对象主要是指所有的对象不用由用户自己进行对象的实例化操作,而可以直接进行使用

1) JSP 中有九个内置对象

No. 内置对象 类型 描述
1 pageContext javax.servlet.jsp.PageContext JSP的页面容器
2 request javax.servlet.http.HttpServletRequest 得到用户的请求信息
3 response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
4 session javax.servlet.http.HttpSession 用来保存每一个用户的信息
5 application javax.servlet.ServletContext 表示所有用户的共享信息
6 config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
7 out javax.servlet.jsp.JspWriter 页面输出
8 page java.lang.Object 表示从该页面中表示出来的一个Servlet实例
9 exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

2) JSP 内置对象四种属性范围(重点)

目标

⑴掌握属性的操作方法

⑵掌握 JSP 中的四种属性范围的作用

⑶掌握 pageContext 对象设置四种属性范围的方法

四种属性范围

在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以再多少个页面中保存并可以继续使用

  • page 范围 pageContext : 只在一个页面中保存属性,跳转之后无效
  • request 范围 request : 只在一次请求中保存,服务器跳转后依然有效
  • session 范围 session : 在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用
  • application 范围 application : 在整个服务器上保存,所有用户都可以用属性都有的操作方法

验证各个属性范围的特点

  • page: 本页面取得服务器端跳转()后无效

  • request : 服务器跳转()有效,客户端跳转(超链接)无效

    • 如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了
    • 如果希望不管是客户端还是服务器跳转,都可以保存的话,就需要继续扩大范围。
  • session : 无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的 session 了,因为每一个 session 只保存在当前的浏览器当中,并在相关的页面取得。

    • 对于服务器而言,每一个连接到它的客户端都是一个 session
    • 如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用
      application
  • application : 所有的 application 属性直接保存在服务器上,所有的用户(每一个 session)都可以直接访问取得

  • 只要是通过 application 设置的属性,则所有的 session 都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。

使用哪个范围呢?

在合理范围尽可能小

page 范围

page 范围是通过 pageContext 对象设置的,之前研究过的 page 属性范围中使用的是pageContext 进行属性设置的,但是从 javax.servlet.jsp.PageContext 类中可以发现,有以下的一种设置属性的方法:

public void setAttribute(String name, Object value, int scope)

在 PageContext 类中存在四个表示属性范围的常量,可以直接通过这些常量指定 scope:

pageContext.PAGE_SCOPE
pageContext.REQUEST_SCOPE
pageContext.SESSION_SCOPE
pageContext.APPLICATION_SCOPE

在其它页面取值时,需要指定对应的作用域,或者通过 EL 表达式

<%=pageContext.getAttribute("a",pageContext.SESSION_SCOPE)%>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,402评论 0 13
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,116评论 1 18
  • JSP 基本结构JSP 页面组成:模板文本(HTML,XML,纯文本),JSP 元素;JSP 元素:脚本元素,指令...
    jslancer阅读 829评论 0 11
  • 一、JSP基础 1.1什么是JSP JSP(Java ServerPage)是Java服务器端动态页面技术。是su...
    晨星资源阅读 1,137评论 0 6
  • jsp概述 jsp全称是 Java Server Page,它和servlet技术一样,都是SUN公司定义的一种用...
    持续进步者阅读 613评论 0 2