06_tag.jsp
<%@ page import="com.el.entity.Student" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSP 标签</title>
</head>
<body>
<%--
JSP 标签的作用:替换 jsp 脚本;
1、流程判断(if语句、for语句等)
2、跳转页面(转发、重定向)
等等。。。
JSP 标签分类:
1、内置标签(也叫动作标签):不需要在 jsp 页面导入标签;
转发标签:<jsp:forward />
参数标签:<jsp:param />
包含标签:<jsp:include />
原理:包含与被包含的页面先各自翻译成 java 源文件,然后在运行时合并在一起;
这种包含叫做 动态包含;(先翻译再合并)
静态包含:<%@include page=""%>,把被包含页面的内容原封不动的拷贝到包含文件中,合并后翻译成一个
java 源文件,再编译运行;(先合并再翻译)
注意:
动态包含可以向被包含页面传递参数;
静态包含不可以向被包含页面传递参数;
2、jstl标签:需要在 jsp 页面中导入标签;
java standard tag library:java标准标签库;
jstl 一共有五套标签库:我们只学前面 3个标签库
1)、核心标签库(也叫 c 标签库):重点
2)、国际化标签库(也叫 fmt 标签库)
3)、EL 函数库(也叫 fn 标签库)
4)、xml 标签库(也叫 x 标签库):用于操作XML文件,存储XML数据;我们一般不在jsp页面中处理数据,所以不用;
5)、sql 标签库:用于连接数据库操作数据;我们也不会在 jsp 页面中操作数据库,所以这个标签库也不用;
使用 jstl 标签步骤:
1)、导入 jstl 支持的 jar 包;(包括 jstl.jar 和 standard.jar)
eclipse 和 myeclipse 创建的 web 项目会自动导入 jstl 依赖的 jar 包;
IntelliJ IDEA 需要手动导入 jstl jar 包;
2)、使用 tablig 指令导入标签库;
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注意:导入jar包以后,在 standard.jar/META-INF 下有很多 .tld 文件,可以在 .tld 文件中查看 uri;
3)、在 jsp 中使用标签;常用的标签如下:
<c:set></c:set> -- 保存数据
<c:out value=""></c:out> -- 获取数据
<c:if test=""></c:if> -- 单条件判断
<c:choose></c:choose> -- 多条件判断(这三个标签是一起的)
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
<c:forEach></c:forEach> -- 遍历数据(这两条标签是一起的)
<c:forTokens items="" delims=""></c:forTokens>
<c:redirect></c:redirect> -- 重定向
3、自定义标签:开发者自行定义,需要在 jsp 页面中导入;
--%>
<%--
/******************** JSP 内置标签的应用 ********************/
--%>
<%
// 用 jsp 脚本实现转发
// request.getRequestDispatcher("/05_EL.jsp").forward(request, response);
%>
<%-- 用 jsp 标签实现转发(替代上面的 jsp 脚本) --%>
<%--<jsp:forward page="/05_EL.jsp"/>--%>
<hr>
<%
// 用 jsp 脚本实现传参(在 06_tag2.jsp 页面中接收参数)
// request.getRequestDispatcher("/06_tag2.jsp?username=root&password=1234").forward(request,response);
%>
<%-- 使用 jsp 标签实现传参(替代上面的 jsp 脚本) --%>
<%--<jsp:forward page="06_tag2.jsp">--%>
<%--<jsp:param name="username" value="root"/> <%– <jsp:param>标签用来传递参数 –%>--%>
<%--<jsp:param name="password" value="1234"/>--%>
<%--</jsp:forward>--%>
<hr>
<%-- 动态包含 header.jsp 页面 --%>
<jsp:include page="comment/header.jsp"/>
<hr>
<%--
/******************** jstl 核心标签库的应用 ********************/
--%>
<%-- set 标签:保存数据(保存到域中),默认保存到 page 域 --%>
<c:set var="name" value="James"/>
<c:set var="age" value="22" scope="session"/> <%-- 将数据保存到 session 域 --%>
<%-- 使用 EL 表达式获取 set 标签保存的数据 --%>
name:${name}<br>
age1:${age}<br> <%-- 默认情况下是从 四个域中查找 --%>
age2:${requestScope.age}<br> <%-- 因为 age 是保存在 session 域中的,所以从 request 域中无法获取数据 --%>
age3:${sessionScope.age}<br> <%-- 还可以从指定的域中获取数据 --%>
<hr>
<%-- out 标签:获取数据(从域中获取) --%>
<c:out value="${name}"/><br> <%-- 输出 name 的值 --%>
<c:out value="${msg}" default="默认值"/><br> <%-- 如果获取的值不存在,可以设置一个默认值 --%>
<%-- escapeXml 表示是否进行转义;
默认为true,表示转义,即 <h3>标题3</h3> 按照普通文本原样输出;
如果为false,表示不转义,即 <h3>标题3</h3> 按照原有的 html 标签格式进行输出; --%>
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="false"/>
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"/>
<hr>
<%-- if 标签:单条件判断;test 的值为true,则 if 标签中可以输出内容,否则不能输出内容; --%>
<c:if test="true">
条件成立,可以输出
</c:if><br>
<%-- test 的值支持 EL 表达式 --%>
<c:if test="${empty msg}"> <%-- 如果 msg 为空,则条件成立,可以输出 --%>
条件成立,可以输出
</c:if>
<hr>
<%-- choose标签 + when标签 + otherwise标签:多条件判断 --%>
<c:set var="score" value="88"/>
<c:choose>
<c:when test="${score >= 90 && score <= 100}">
优秀
</c:when>
<c:when test="${score >= 80 && score < 90}">
良好
</c:when>
<c:when test="${score >= 70 && score < 80}">
一般
</c:when>
<c:when test="${score >= 60 && score < 70}">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
<hr>
<%-- foreach 标签:遍历数据 --%>
<%
// 定义一个 List 集合
List<Student> list = new ArrayList<>();
list.add(new Student("rose", "12"));
list.add(new Student("Lucy", "22"));
list.add(new Student("Lily", "32"));
// 将 list 集合放入 域对象中
pageContext.setAttribute("list", list);
// 定义一个 Map 集合
Map<String, Student> map = new HashMap<>();
map.put("101", new Student("rose", "12"));
map.put("102", new Student("Lucy", "22"));
map.put("103", new Student("Lily", "32"));
// 将 map 集合放入 域对象中
pageContext.setAttribute("map", map);
%>
<%--
var="" -- 遍历出的每个元素的名称,相当于 for (Cookie cookie : cookies) {} 中的 cookie 变量;
begin="" -- 开始遍历的元素索引(可以省略,默认从 0开始)
end="" -- 结果遍历的元素索引(可以省略,默认到结尾)
items="" -- 需要遍历的数据(集合)对象,相当于 list 或者 map 集合对象
step="" -- 步长,相当于 for(int i = 0; i < 10; i++) 中的 i++,每次加几(可以省略,默认步长为 1)
varStatus="" -- 当前正在遍历元素的状态对象(比如 count 属性,表示当前遍历元素的位置,从 1 开始)
--%>
<c:forEach var="stu" begin="0" end="2" items="${list}" step="1" varStatus="status">
序号:${status.count} - 姓名:${stu.name} -- 年龄:${stu.age}<br>
</c:forEach>
<br>
<%-- 遍历 map 集合 --%>
<c:forEach var="entry" items="${map}">
ID:${entry.key} - 姓名:${entry.value.name} -- 年龄:${entry.value.age}<br>
</c:forEach>
<hr>
<%-- forTokens 标签:循环特殊字符串(分割字符串) --%>
<%
// 定义一个变量
String str = "C++|C#|Java|Php";
pageContext.setAttribute("str", str); // 将数据放入域中
%>
<%-- delims:分割符 --%>
<c:forTokens var="s" items="${str}" delims="|">
${s}<br>
</c:forTokens>
<hr>
<%-- redirect 标签:重定向 --%>
<%--<c:redirect url="http://www.baidu.com"></c:redirect>--%>
</body>
</html>
06_tag2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>接收参数页面</title>
</head>
<body>
<%-- 接收参数 --%>
username:<%=request.getParameter("username") %><br>
password:<%=request.getParameter("password") %><br>
</body>
</html>
header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
网站头页面的内容。。。。
Student.java
package com.el.entity;
public class Student {
private String name;
private String age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Student() {
}
public Student(String name, String age) {
this.name = name;
this.age = age;
}
}
输出结果: