Javaweb学习笔记之JSP(六):JSP 内置标签 和 JSTL 核心标签库

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"/> &lt;%&ndash; <jsp:param>标签用来传递参数 &ndash;%&gt;--%>
        <%--<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;
    }
}

输出结果:

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值