JSP

JSP概述

JSP(Java Server Pages)是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。JSP是一种Java Servlet主要用于实现Java Web应用程序的用户界面部分

JSP原理

JSP最终也会被转换成一个Java类,JSP本质上就是一个Servlet

image-20220324005200077

在JSP页面中,JAVA代码会被原封不动地输出,HTML代码会被转换为out.write("<html>\r\n");


JSP所需依赖

Tomcat版本:10.0.14

Tomcat 10想要使用JSP,需要搭配当前同样最新的jakarta.Servlet

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
<!-- Servlet依赖 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>

<!-- JSP依赖 -->
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
</dependency>

<!-- JSTL表达式的依赖 -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>

JSP基础语法

JSP作为Java技术的一种应用,在支持Java所有语法的基础上,还拥有一些扩充语法

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
<%--
JSP表达式:
- 作用:将程序的输出,输出到客户端
- 形式: <%= 变量 或者 表达式 %>
--%>
<%= new java.util.Date() %>

<%-- 分隔符 --%>
<hr>

<%-- java脚本片段 --%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
// 输出到前端页面
out.println("<h1>Sum=" + sum + "</h1>");
%>

<%-- JSP声明 --%>
<%!
static {
System.out.println("Loading Servlet!");
}

private int globalVar = 0;

public void hunter() {
System.out.println("进入了方法hunter!");
}
%>
  • JSP声明会被编译到JSP生成的Java类中,其他的就会被生成到_jspService方法中。
  • JSP的注释不会在客户端显示,HTML的注释会显示。

JSP内置对象及作用域

9大内置对象

  • PageContext

    pageContext.setAttribute() 保存的数据只在一个页面中有效

  • Request

    request.setAttribute() 保存的数据只在一次请求中有效请求转发会携带这个数据

  • Session

    session.setAttribute() 保存的数据在一次会话中有效,从打开浏览器到关闭浏览器

  • Application (ServletContext)

    application.setAttribute() 保存的数据只在服务器中有效,从打开服务器到关闭服务器

  • Response

  • config (ServletConfig)

  • out

  • page

  • exception


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
<%-- 在一个JSP中,使用内置对象 --%>
<%
pageContext.setAttribute("name1", "特叔服务1");
request.setAttribute("name2", "特叔服务2");
session.setAttribute("name3", "特叔服务3");
application.setAttribute("name4", "特叔服务4");

// 请求转发可以drequest设置的属性
// 效果等价于 application.getRequestDispatcher("/getInitParam").forward(request, response);
pageContext.forward("/pageDemo01.jsp");
%>


<%-- 在另一个JSP中,尝试读取上述JSP设置的参数 --%>
<%
// 不同于getAttribute 只从pageContext本身中寻找属性,
// findAttribute是按作用域范围从小到大寻找,pageContext -> request -> session -> application
String name1 = (String) pageContext.findAttribute("name1"); // 找不到
String name2 = (String) pageContext.findAttribute("name2"); // 找不到
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
%>

<%-- EL表达式 --%>
<h1>${name1}</h1>
<h1>${name2}</h1>
<h1>${name3}</h1>
<h1>${name4}</h1>

EL表达式、JSP标签、JSTL标签

EL(Expression Language)表达式${ }

  • 获取数据

  • 执行运算

  • 获取web开发的常用对象

    例如获取表单中的数据:

    ${param.参数名}

    1
    <input type="text" name="username" value="${param.username}">

JSP标签

1
2
3
4
5
6
7
8
9
10
11
12
<%-- 在页面被请求时引入别的文件,如head.jsp、foot.jsp --%>
<%-- jsp:include --%>

<%--
如下JSP标签的效果:
请求转发至 http://localhost:8080/jsptag2.jsp?name=hunter&age=88
--%>

<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="hunter"></jsp:param>
<jsp:param name="age" value="88"></jsp:param>
</jsp:forward>

JSTL(JSP Standard Tag Library)标签

JSTL标签库的使用是为了弥补HTML标签的不足,它自定义了许多标签,标签的功能和Java代码一样。

核心库

1
2
<%-- 引入JSTL核心标签库,才能引用JSTL core标签 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 描述
<c:out> 用于在JSP中显示数据,就像<%= ... >
<c:set> 用于保存数据
<c:remove> 用于删除数据
<c:if> 和if一样
<c:choose> switch case —— switch
<c:when> switch case —— case
<c:otherwise> switch case —— default
<c:forEach> 迭代标签
<c:url> 使用可选的查询参数来创造一个URL

示例

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<%-- ------------------ <c:if> 和 <c:out> 示例 -------------------- --%>
<form action="coreif.jsp" method="get">
<%-- EL表达式获取表单中的数据 ${param.username} --%>
<label>
<input type="text" name="username" value="${param.username}">
</label>
<input type="submit" value="登录">
</form>

<%-- 判断如果提交的用户名是管理员,则登录成功 --%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员,您好"/>
</c:if>

<c:out value="${isAdmin}"/>


<%-- ------------ <c:set>、<c:choose>、<c:when> 示例 ---------------- --%>
<c:set var="score" value="85" />
<c:choose>
<c:when test="${score >= 90}">
你的成绩为优秀
</c:when>
<c:when test="${score >= 80}">
你的成绩为良好
</c:when>
<c:when test="${score >= 70}">
你的成绩为一般
</c:when>
<c:when test="${score >= 60}">
你的成绩为及格
</c:when>
<c:when test="${score < 60}">
你的成绩为不及格
</c:when>
</c:choose>


<%-- ------------------------ <c:forEach> 示例 -------------------------- --%>
<%
List<String> people = new ArrayList<>();
people.add("赵1");
people.add("赵2");
people.add("赵3");
people.add("赵4");
people.add("赵5");
request.setAttribute("list", people);
%>

<%--
var:每一次遍历出来的变量
items:要遍历的对象
--%>
<c:forEach var="person" items="${list}">
<c:out value="${person}"/> <br>
</c:forEach>

<%--
var:每一次遍历出来的变量
items:要遍历的对象
begin:开始的下标
end:结束的下标
step:步长
--%>
<hr>

<c:forEach var="person" items="${list}" begin="1" end="3" step="2">
<c:out value="${person}"/> <br>
</c:forEach>