速成

导论

什么是JSP?

用处:创建Web应用程序。
对比Servlet:功能更多,如表达式语言、JSTL
组成:一个JSP页面由HTML和JSP标签组成。JSP页面比Servlet更容易维护,原因是设计与开发分离。
额外的功能:表达式语言、自定义标签。

JSP相对于Servlet的优势

对Servlet的扩展

JSP技术是对Servlet的扩展,在JSP中可以用Servlet的所有功能。
此外,JSP中还可以使用隐含对象、预定义标签、表达式语言和自定义标签等,使JSP开发更加简单

易于维护

JSP业务逻辑和表现逻辑分开,在Servlet技术中,我们将业务逻辑与表现逻辑混合在一起。

快速开发,不需要重新编译和部署

JSP页面修改之后,不需要重新编译和部署。

更少的代码

JSP中的各类标签可以减少代码

JSP的目录结构

JSP页面部署要点:把JSP页面放在WEB-INF文件夹之外的目录

image-20241009113256330

image-20241009113317360

JSP API

JSP API由两个包组成
javax.servlet.jsp
javax.servlet.jsp.tagext
javax.servlet.jsp包有两个接口和类
接口如下
JspPage
HttpJspPage
类如下:
image-20241009113650700

JSP脚本元素

JSP中,可以使用脚本元素在jsp页面编写代码。
脚本元素提供了在jsp中插入java代码的能力。
一共有三种类型的脚本元素

1
2
3
脚本标签  		<% java source code %>
表达式标签 <%= statement%>
声明标签 <%! field or method declaration %>

系统

JSP和JSTL

主要内容

image-20241015213018750

JSP基础语法

简介

JSP:javaServer Page SUN公司提供的动态网页编程技术,是java web 服务器端的动态资源
和html相比:html只能提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据
相比servlet而言,更容易排版
不管是JSP还是servlet都可以用于开发动态web资源,但是由于这两门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用
其实JSP就是一个Servlet,当我们第一次访问jsp的时候,jsp引擎都会将这个jsp翻译成一个servlet,这个问价存在tomcat(源码目录)中的work目录中

注释

在JSP中支持两种注释的语法操作
一种是显示注释,这种注释是允许客户端看见的;另一种是隐式注释,此种注释是客户端无法看见的
1、显示注释语法:从HTML风格继承而来
2、隐藏注释语法:从JAVA风格继承;JSP自己的注释

JSP的三种注释方式

1
2
3
1//注释,单行注释/*多行注释*/
2 <!-- HTML风格的注释-->
3、<%-- JSP注释 --%>

Scriptlet

在JSP中最重要的部分就是Scriptlet(脚本小程序),所有嵌入HTML代码中的java程序。
在jap中一共有三种Scriptlet代码:都必须使用Scriptlet标记出来

1
2
3
第一种<%  %>: java脚本段,可以定义局部变量、编写语句
第二种<%! %>:声明,可以定义全局(成员)变量、方法、类
第三种<%= %>表达式,数据的一个变量或者具体内容

但是现在不建议这样写(脚本和html写一起),因为这样写会导致页面耦合度非常高。

通过观察解析为java文件的代码jsp代码理解三种小脚本

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
<%--
Created by IntelliJ IDEA.
User: 薯片菌
Date: 16/10/2024
Time: 上午 7:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>scriptlet脚本小程序</title>
</head>
<body>
<%--
scriptlet 脚本小程序
jsp一共有三种scriptlet脚本小程序:
第一种:java脚本段,可以写java代码定义局部变量编写语句
<%
//可以写java代码
%>
生成的代码在servlet中的service方法体中
第二种:声明,声明全局变量、方法、类等
<%!
//声明全局变量
%>
生成的代码在servlet的类体中
第三种:输出表达式。
<%= 数值 %>
生成的代码在servlet中的service方法体中
--%>
<%--第一种--%>
<%
//定义局部变量
String str = "Hello Jsp";
//输出内容到控制台
System.out.println(str);
//输出到浏览器
out.print(str);
out.write("-----");
//输出全局变量
out.write("全局变量:"+num);
%>
<%!
//声明全局变量
int num = 10;
%>
<%--第三种--%>
<%= str%>

</body>
</html>

JSP的指令标签

include静态包含

使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域,而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域,现在又两种方法可以实现上述功能。

​ 方法一:再每个JSP页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容
​ 方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入
​ 很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,再JSP中如果想要实现包含操作,有两种做法:静态包含、动态包含,静态包含使用include指令即可,动态包含则需要使用include动作标签。
示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%--
Created by IntelliJ IDEA.
User: 薯片菌
Date: 16/10/2024
Time: 上午 8:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>底部内容</title>
</head>
<body>
<%@include file="Test005-header.jsp"%>
<h2>主体</h2>
<%@include file="Test005-footer.jsp"%>
</body>
</html>

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

include动态包含

1
<%@ include file = "要包含的文件路径" %> </jsp:include>

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,

注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!

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
<%--
Created by IntelliJ IDEA.
User: 薯片菌
Date: 16/10/2024
Time: 上午 11:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>include动态包含</title>
</head>
<body>
<%--include 动态包含
格式:
<%@ include file = "要包含的文件路径" %> </jsp:include>
特点
1、动态包含相当于方法的调用
2、动态包含会生成多个源码文件
3、可以定义同名变量
4、效率高,耦合度低
注:
当动态包含不需要传递参数时,include双标签之间不要有任何内容,包括换行和空格

使用动态包含传递参数
<jsp:include page="要包含的页面的路径">
<jsp:param name="参数名" value="参数值"/>
</jsp:include>
注:name属性不支持表达式,value属性支持表达式
获取参数:
request.getParameter(name);通过特定参数名获取参数值
--%>

<jsp:include page="Test005-header.jsp"></jsp:include>
<h2>主体内容</h2>
<%
int a = 1;
%>
<jsp:include page="Test005-footer.jsp"></jsp:include>

<%--动态包含传递参数--%>
<% String str = "hello";%>
<jsp:include page="Test005-footer.jsp">
<jsp:param name="uname" value="admin"/>
<jsp:param name="msg" value="<%=str%>"/>
</jsp:include>
</body>
</html>

JSP四大域对象

四种属性的范围

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

1、page范围
pageCountext:只在一个页面中保存属性,跳转之后无效
2、request范围
request:只在一次请求中保存,服务器跳转后依然有效
3、session范围
session:在一次会话范围中,无论何种跳转都可以使用
4、appliction范围

​ application: 在整个服务器上保存

image-20241022103827184

验证属性范围的特点

1、page
本页面取得,服务器端跳转( < jsp:forward > )后无效
2、request
服务器跳转有效,客户端跳转无效
如果是客户端跳转,则想打能与发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。

在自己设计的代码中,尽可能多的使用request比较合理

3、session
无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个seesion只保存在当前的浏览器中,并在相关的页面取得。
对于服务器而言,每一个连接到它的客户端都是一个session
如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application
4、application
所有application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得
只要通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有属性都消失了,所以需要重新设置。