文章目录
- JSP
- 1. 快速入门
- 2. page 指令
- 3. 三种常用脚本
- 声明脚本
- 表达式脚本
- 代码脚本
- 4. 注释
- 5. 内置对象
- 6. 域对象
- 7. 请求转发标签
- 8. EL 表达式
- 快速入门
- EL运算操作
- EL的11个隐含对象
- 四个特定域变量
- 9. JSTL
- 快速入门
- <c:set />
- <c:if />
- \<c:choose> \<c:when> \<c:otherwise>
- <c:forEach />
JSP
JSP 全称是 Java Server Pages,Java 的服务器页面,JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML。
相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码,为用户提供动态数据。
相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产 生动态数据的同时,也很容易对数据进行排版。
1. 快速入门
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<h1>JSP, 计算器</h1>
<%
int i = 20;
int j = 70;
int res = i + j;
out.println(i + " + " + j + " = " + res);
%>
</body>
</html>
jsp 页面不能像 HTML 页面, 直接用浏览器运行。只能通过浏览器访问 Tomcat 来访问jsp 页面。
jsp 页面本质是一个 Servlet 程序, 其性能是和 java 关联的。
第 1 次访问 jsp 页面的时候。Tomcat 服务器会把 jsp 页面解析成为一个 java 源文件。并 且 对 它 进 行 编 译 成 为 .class 字 节 码 程 序 。
2. page 指令
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
1)language 表示 jsp 翻译后是什么语言文件, 只支持 java
2)contentType 表示 jsp 返回的数据类型,对应源码中 response.setContentType()参数值
3)pageEncoding 属性 表示当前 jsp 页面文件本身的字符集
4)import 属性 跟 java 源代码中一样。用于导包,导类
3. 三种常用脚本
声明脚本
声明脚本的格式是:
<%! 声明 java 代码 %>
作用:定义 jsp 的需要属性、方法、静态代码块和内部类等
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%!
private String name = "tom";
private int age = 19;
private static String company;
static{
company = "csdn";
}
public String getName(){
return name;
}
%>
</body>
</html>
表达式脚本
表达式脚本的格式是:
<%=表达式%>
表达式脚本的作用是:在 jsp 页面上输出数据
表达式脚本中的表达式不能以分号结束
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%!
private String name = "tom";
private int age = 19;
private static String company;
static{
company = "csdn";
}
public String getName(){
return name;
}
%>
name = <%=name%><br/>
age = <%=age%>
</body>
</html>
代码脚本
代码脚本的语法是:
<% java 代码%>
代码脚本的作用是:可以在 jsp 页面中,编写我们需要的功能(使用 java )
可以由多个代码脚本块组合完成一个完整的 java 语句
代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
public class Monster {
private Integer id;
private String name;
private String skill;
public Monster(Integer id, String name, String skill) {
this.id = id;
this.name = name;
this.skill = skill;
}
public Integer getId() {
return id;}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
<%@ page import="com.lhs.Monster" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%
ArrayList<Monster> list = new ArrayList<>();
list.add(new Monster(1, "牛魔王", "芭蕉扇"));
list.add(new Monster(2, "蜘蛛精", "吐口水"));
%>
<table bgcolor="#f0f8ff" border="1px" width="500px">
<tr>
<td>id</td>
<td>name</td>
<td>skill</td>
</tr>
<%
for (int i = 0; i < list.size(); i++) {
Monster monster = list.get(i);
%>
<tr>
<td><%=monster.getId()%>
</td>
<td><%=monster.getName()%>
</td>
<td><%=monster.getSkill()%>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
4. 注释
<%--这是一行注释--%>
5. 内置对象
JSP 内置对象(已经创建好的对象, 可以直接使用),是指 Tomcat 在翻译 jsp 页面成为Servlet 后,内部提供的九大对象,叫内置对象
在JSP中,有9大内置对象可以在页面中直接使用,它们分别是:
1)request:代表客户端的请求,可以通过它获取请求参数、请求头信息等。
2)response:代表服务器对客户端的响应,可以通过它设置响应头、写入响应内容等。
3)pageContext:代表JSP页面的上下文,可以通过它获取其他内置对象、页面作用域中的属性等。
4)session:代表用户的会话,可以通过它在不同页面之间共享数据。
5)application:代表整个应用程序的上下文,可以通过它在不同用户之间共享数据。
6)out:代表输出流,可以通过它向客户端输出内容。
7)config:代表当前JSP页面的配置信息,可以通过它获取初始化参数等。
8)page:代表当前JSP页面本身,可以通过它调用页面的方法。
9)exception:代表在JSP页面中发生的异常,可以通过它获取异常信息。
<%@ page import="com.lhs.Monster" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%
//jsp 中可以使用的内置对象:不用创建,直接使用
out.println("out 对象..");
String age = request.getParameter("age");
//response.sendRedirect("http://www.baidu.com");
session.setAttribute("name", "jack");
//application 等价 servlet 的 servletContext
application.setAttribute("company", "csdn");
//本页面有效
pageContext.setAttribute("num1", 900);
//page
out.println("page= " + page);
//使用 config
String pwd = config.getInitParameter("pwd");
%>
</body>
</html>
6. 域对象
在JSP中,有四大域对象,它们分别是:page、request、session和application域。这些域对象可以用来在不同作用域中存储和共享数据,以便在整个应用程序中传递数据。
1)page域对象:page域对象是指当前JSP页面的作用域,即当前页面有效。在page域中存储的数据只能在当前页面中访问,其他页面无法访问。可以使用pageContext对象的setAttribute()和getAttribute()方法来存储和获取数据。
2)request域对象:request域对象是指客户端发起的请求的作用域,即在同一个请求周期内有效。在request域中存储的数据可以在同一个请求中的不同页面中共享和访问。可以使用request对象的setAttribute()和getAttribute()方法来存储和获取数据。
3)session域对象:session域对象是指用户会话的作用域,即在用户会话期间有效。在session域中存储的数据可以在同一个用户的不同请求中共享和访问。可以使用session对象的setAttribute()和getAttribute()方法来存储和获取数据。
4)application域对象:application域对象是指整个应用程序的作用域,即在整个应用程序生命周期内有效。在application域中存储的数据可以在整个应用程序中共享和访问。可以使用application对象的setAttribute()和getAttribute()方法来存储和获取数据。
域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存储范围
存储范围(作用域范围) pageContext < request < session < application
7. 请求转发标签
在JSP中,可以使用请求转发标签
<jsp:forward>
来将请求转发到另一个资源,比如另一个JSP页面、Servlet等。请求转发是在服务器端完成的,客户端浏览器不知道请求被转发到了另一个资源。
index.jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>这是首页</h1>
<jsp:forward page="target.jsp"/>
</body>
</html>
target.jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>目标页面</title>
</head>
<body>
<h1>这是目标页面</h1>
</body>
</html>
8. EL 表达式
EL 表达式全称:Expression Language,是表达式语言,主要用于代替 jsp 页面的表达式脚本<%=request.getAttribute(“xx”)%>
EL 表达式基本语法: ·
${key1}
快速入门
<%@ page import="com.lhs.Monster" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%
request.setAttribute("key", "value");
%>
key = ${key}
</body>
</html>
EL 表达式在输出 null 时,输出的是 “”
jsp 表达式脚本输出 null 的时,输出的是 “null” 字符串
获取对象信息:
<%@ page import="com.lhs.Monster" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%
Monster monster = new Monster(1, "牛魔王", "芭蕉扇");
pageContext.setAttribute("monster", monster);
%>
monster = ${monster}
id = ${monster.id}
name = ${monster.name}
skill = ${monster.skill}
</body>
</html>
EL运算操作
基本语法语法:${ 运算表达式 }
关系运算:
逻辑运算:
算术运算:
empty运算:empty 运算可以判断一个数据是否为空,如果为空,返回 true,否则返回 false
以下几种情况为空:
- 值为 null
- 值为空串的时
- 值是 Object 类型数组,长度为零
- list 集合,元素个数为零
- map 集合,元素个数为零
三元运算:表达式 1?表达式 2: 表达式 3(与java相同)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<%
request.setAttribute("k1", null);
request.setAttribute("k2", "");
request.setAttribute("k3", new Object[]{});
request.setAttribute("k4", new ArrayList<String>());
request.setAttribute("k5", new HashMap<String, Object>());
%>
k1 是否为空= ${empty k1}<br/>
k2 是否为空= ${empty k2}<br/>
k3 是否为空= ${empty k3}<br/>
k4 是否为空= ${empty k4}<br/>
k5 是否为空= ${empty k5}<br/>
<%
request.setAttribute("score", 90);
%>
你的成绩为: ${score >= 60 ? "及格": "不及格"}
</body>
</html>
EL的11个隐含对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<h1>pageContext 对象的使用</h1>
<%--
//通过 request 对象来获取和 HTTP 协议相关的数据
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
<hr/>
协议: ${ pageContext.request.scheme }<br>
服务器 ip:${ pageContext.request.serverName }<br>
服务器端口:${ pageContext.request.serverPort }<br>
工程路径:${ pageContext.request.contextPath }<br>
请求方法:${ pageContext.request.method }<br>
客户端 ip 地址:${ pageContext.request.remoteHost }<br>
会话 id :${ pageContext.session.id }<br>
<h1>使用 jsp 表达式脚本获取如上信息</h1>
ip 地址: <%=request.getRemoteHost() %> <br>
<h1>使用 el 表达式形式获取信息</h1>
<%
pageContext.setAttribute("req", request);
%>
ip 地址: ${req.remoteHost} <br>
获取请求方法: ${req.method} <br>
</body>
</html>
四个特定域变量
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<h1>EL 获取四个特定域中的属性</h1>
<%
pageContext.setAttribute("key1", "pageContext_key1 的值");
pageContext.setAttribute("key2", "pageContext_key2 的值");
request.setAttribute("key1", "request_key1 的值");
session.setAttribute("key1", "session_key1 的值");
application.setAttribute("key1", "application_key1 的值");
%>
<hr/>
application 的 key1: ${applicationScope.key1 }<br/>
pageContext 的 key1: ${pageScope.key1 }<br/>
session 的 key1: ${sessionScope.key1 }<br/>
request 的 key1: ${requestScope.key1 }<br/>
</body>
</html>
9. JSTL
JSTL 标签库 是指 JSP Standard Tag Library JSP 标准标签库
EL 表达式是为了替换 jsp 中的表达式脚本,JSTL 是为了替换代码脚本。这样 jsp 页面变得更佳简洁
快速入门
相关依赖:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<h1>JSTL 快速入门</h1>
<c:if test="${ 10 > 2 }">
<h1>10 > 2 为真</h1>
</c:if>
</body>
</html>
<c:set />
<c:set>
标签用于在JSP中设置一个变量或属性的值。它可以用来创建新的变量、重写现有变量或者设置作用域范围内的变量。等价 域对象.setAttribute(key,value);
scope 属性设置保存到哪个域
- page 表示 PageContext 域(默认值)
- request 表示 Request 域
- session 表示 Session 域
- application 表示 ServletContext 域
var 属性设置 key 是什么,value 属性设置值
<c:set scope="request" var="username" value="lxg"/>
<c:if />
<c:if />用来做 if 判断
test 属性表示判断的条件(用 EL 表达式输出)
<c:if test="${ 10 > 2 }">
<h1>10 > 2 为真</h1>
</c:if>
<c:choose> <c:when> <c:otherwise>
多路判断。跟 switch … case … default 非常接近
<% request.setAttribute("money", 1000); %>
<c:choose>
<c:when test="${ requestScope.money > 20000 }">
有钱人
</c:when>
<c:when test="${ requestScope.money > 10000 }">
比较有钱
</c:when>
<c:when test="${ requestScope.money > 5000 }">
没啥钱
</c:when>
<c:otherwise>吃了饭,没钱租房了</c:otherwise>
</c:choose>
<c:forEach />
c:forEach 标签 用来遍历输出, 主要有 4 种形式:
-
普通遍历输出 i 到 j
-
遍历数组
-
遍历 Map
-
遍历 List
<%@ page import="com.lhs.Monster" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<h1>c:forEach 标签</h1>
<hr/>
<h1>第 1 种遍历方式从 i 到 j</h1>
<c:forEach var="num" begin="1" end="10">
${num}
</c:forEach>
<hr/>
<h1>第 2 种遍历方式:遍历数组</h1>
<%
request.setAttribute("sports", new String[]{"打篮球", "乒乓球"});
%>
<c:forEach var="element" items="${sports}">
${element}
</c:forEach>
<hr/>
<h1>第 3 种遍历方式:遍历 Map</h1>
<%
Map<String, Object> map = new HashMap<>();
map.put("key1", "北京");
map.put("key2", "上海");
map.put("key3", "天津");
request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${requestScope.map}">
Key: ${entry.key}, Value: ${entry.value}
</c:forEach>
<hr/>
<h1>第 4 种遍历方式:遍历 List</h1>
<%
List<Monster> monsters = new ArrayList<>();
monsters.add(new Monster(100, "小妖怪", "巡山的"));
monsters.add(new Monster(200, "大妖怪", "做饭的"));
monsters.add(new Monster(300, "老妖怪", "打扫位置的"));
request.setAttribute("monsters", monsters);
%>
<c:forEach var="monster" items="${requestScope.monsters}">
ID: ${monster.id}, Name: ${monster.name}, Skill: ${monster.skill}
</c:forEach>
</body>
</html>
</body>
</html>