JSP、EL表达式和JSTL标签库

JSP、EL表达式和JSTL标签库

1. JSP

1.1 什么是JSP

​ JSP——Java Server Page运行在服务器端的Java页面。JSP=HTML+Servlet。浏览器第一次访问JSP的时候,由Tomcat将JSP翻译成了Servlet,而且编译成字节码文件,只生成1次。若是这期间修改了JSP内容,就会从新生成。html

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 做用

  1. 用于输出做用域中的变量值java

  2. 用于进行各类运算:算术,逻辑,关系,三元运算等web

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")%>
&nbsp;
EL的写法:
${pageScope.name}
<hr>

JSP写法:
<%=request.getAttribute("name")%>
&nbsp;
EL的写法:
${requestScope.name}
<hr>

JSP写法:
<%=session.getAttribute("name")%>
&nbsp;
EL的写法:
${sessionScope.name}
<hr>

JSP写法:
<%=application.getAttribute("name")%>
&nbsp;
EL的写法:
${applicationScope.name}
<hr>

JSP写法:
<%=pageContext.findAttribute("name")%>
&nbsp;
EL的写法:
${name}
<hr>
</body>
</html>

2.3 EL能够使用的运算表达式

  1. 算术表达式: +,-,*,/,%
  2. 比较表达式: ==,!=,<,>,>=,<=
  3. 逻辑表达式:&&, ||, !
  4. 三元运算:$(逻辑判断?真值:假值)
  5. 判空表达式:${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标准标签库浏览器

使用步骤

  1. 导包jar,每一个标签底层其实都是用Java代码实现的。复制到web/WEB-INF/lib

在这里插入图片描述

  1. 建立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
  1. 使用
    • 使用<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>标签session

<%@ 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>