JSP、EL表达式和JSTL标签库
文章目录
1. JSP
1.1 什么是JSP
JSP——Java Server Page运行在服务器端的Java页面。JSP=HTML+Servlet。浏览器第一次访问JSP的时候,由Tomcat将JSP翻译成了Servlet,并且编译成字节码文件,只生成1次。如果这期间修改了JSP内容,就会重新生成。
1.2 JSP的三种注释
三种注释 | 说明 |
---|---|
HTML | <!-- 注释 --> 只能注释静态内容,不能注释Java代码。通过浏览查看源代码可以看到的 |
Java | 与以前是一样的,在网页中看不到,但在翻译以后Servlet中可以看到。 // 单行注释 /* 多行注释 / /* 文档注释 */ |
JSP | <%-- 动态内容 --%> 可以注释JSP上任何元素网页中没有,在生成的Java源代码中也没有 |
1.3 JSP脚本元素
组成部分 | 功能 | 语法 |
---|---|---|
JSP代码片段 | 在JSP中执行Java代码 | <% Java代码; %> |
JSP脚本表达式 | 在JSP中输出变量值 | <%= 变量%> |
JSP声明 | 声明全局变量或方法 | <%! 声明 %> |
2. EL表达式
和JSP表达式的区别
区别 | JSP脚本表达式 | EL |
---|---|---|
语法 | <%=m%> | ${m} |
输出哪里的值 | 输出的是脚本变量<% int m= 5; %> | 输出的是作用域中的值 <% request.setAttribute(“m”,5); %> |
2.1 作用
-
用于输出作用域中的变量值
-
用于进行各种运算:算术,逻辑,关系,三元运算等
2.2 获取作用域的值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//向页面域中添加一个字符串
//pageContext.setAttribute("name", "页面域");
//请求域
request.setAttribute("name", "请求域");
//会话域
session.setAttribute("name", "会话域");
//上下文域
application.setAttribute("name", "上下文域");
%>
JSP写法:
<%=pageContext.getAttribute("name")%>
EL的写法:
${pageScope.name}
<hr>
JSP写法:
<%=request.getAttribute("name")%>
EL的写法:
${requestScope.name}
<hr>
JSP写法:
<%=session.getAttribute("name")%>
EL的写法:
${sessionScope.name}
<hr>
JSP写法:
<%=application.getAttribute("name")%>
EL的写法:
${applicationScope.name}
<hr>
JSP写法:
<%=pageContext.findAttribute("name")%>
EL的写法:
${name}
<hr>
</body>
</html>
2.3 EL可以使用的运算表达式
- 算术表达式: +,-,*,/,%
- 比较表达式: ==,!=,<,>,>=,<=
- 逻辑表达式:&&, ||, !
- 三元运算:$(逻辑判断?真值:假值)
- 判空表达式:${empty 变量名}
- 如果变量名为空,返回true
- 如果变量名为空串,返回true
- 如果变量名是一个没有元素的集合,返回true
示例
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>算术运算符</h2>
${1+1}<br>
${2-1}<br>
${1*1}<br>
${5 div 2}<br>
${5 /2 }<br>
${5 mod 2}<br>
${5%2}<br>
<h2>比较运算符</h2>
${1 eq 1}<br>
${1 != 1}<br>
${1 lt 2}<br>
${1 <= 1}<br>
${1 > 2}<br>
${1 >=1}<br>
<h2>关系运算符</h2>
${true and false}<br>
${true || false }<br>
${not true}<br>
<h2>三元运算</h2>
${5>6?"男":"女"}
<h2>判空表达式</h2>
${empty aaa} <br>
<%
pageContext.setAttribute("bbb","");
//集合中没有元素
List<String> names = new ArrayList<>();
names.add("白骨精");
pageContext.setAttribute("ccc", names);
%>
${empty bbb}<br>
${empty ccc}<br>
</body>
</html>
3. JSTL标签库
Java Standard Tag Library Java标准标签库
使用步骤
- 导包jar,每个标签底层其实都是用Java代码实现的。复制到web/WEB-INF/lib
- 创建JSP页面,引入标签库
<%--prefix表示前缀,固定为c,uri 标识 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
解释
JSTL | 前缀 | URI固定写法,标识的作用 | 作用 |
---|---|---|---|
核心标签库 | c | http://java.sun.com/jsp/jstl/core | 用于页面上的逻辑控制,如:if、forEach |
- 使用
- 使用<c:if>标签
- 使用<c:when>标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--prefix表示前缀,固定为c,uri 标识 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>标签</title>
</head>
<body>
<%--test后面使用EL表达式,判断是否为真,没有c:else标签--%>
<c:if test="${2>3}">
我是女生
</c:if>
<c:if test="${2<3}">
我是男生
</c:if>
<%--html内容 --%>
<form action="07-choose.jsp">
请输入分数:
<input type="text" name="score">
<input type="submit" value="评级">
</form>
<%--判断输入的参数是否为空 --%>
<c:if test="${not empty param.score}">
<%--使用c:choose标签,类似switch --%>
<c:choose>
<c:when test="${param.score >=80 && param.score<=100}">
<h2 style="color: red">优秀</h2>
</c:when>
<c:when test="${param.score >=60 && param.score<80}">
<h2 style="color: green">良好</h2>
</c:when>
<c:when test="${param.score >=0 && param.score<60}">
<h2 style="color: dodgerblue">不及格</h2>
</c:when>
<c:otherwise>
<h2 style="color: orange">分数不正确</h2>
</c:otherwise>
</c:choose>
</c:if>
</body>
</html>
使用<c:foreach>标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1">
<caption>学生信息表</caption>
<tr>
<th>状态</th>
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>成绩</th>
</tr>
<%--
items: 表示要遍历的集合,要使用EL
var: 变量名,表示集合中的每个元素对象
varStatus: 表示一个对象名字,当前的行对象。
有四个属性:
first: 第1个元素返回true
last: 最后1个元素返回true
count: 遍历到当前元素时,一共遍历了几个元素
index: 当前元素的索引号,从0开始
--%>
<c:forEach items="${students}" var="stu" varStatus="row">
<tr>
<td>${row.index}</td>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.gender?"男":"女"}</td>
<td>${stu.score}</td>
</tr>
</c:forEach>
</table>
</body>
</html>