文章目录
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>