服务器渲染技术-JSP



为什么需要jsp

  • html文件不能多态获取数据,而servlet输出html又很麻烦
  • jsp = html + java片段 + 标签 + javascript + css

jsp基本介绍

  1. JSP全称是Java Server Pages,Java 的服务器页面,就是服务器端渲染技术
  2. JSP这门技术的最大的特点在于,写JSP就像在写HTML
    ● 相比html而言,html只能为用户提供静态数据,而JSP技术允许在页面中嵌套java代码,为用户提供动态数据
    ● 相比Servlet而言,Servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
  3. jsp技术基于Servlet,你可以理解成JSP就是对Servlet的包装.
  4. 会使用JSP的程序员,再使用thymeleaf是非常容易的事情,几乎是无缝接轨

注意事项和细节

  • jsp页面不能像HTML页面,直接用浏览器运行。只能通过浏览器访问Tomcat来访问jsp页面

jsp运行原理

  1. jsp页面本质是一个 Servlet程序(本质就是java程序),其性能是和java关联的。
  2. 第1次访问jsp页面的时候。Tomcat服务器会把jsp页面解析成为一个java源文件。并且对它进行编译成为.class字节码程序。(其本质就是一个servlet)

jsp本质就是一个Servlet(类)

  1. 第一次运行jsp文件时,tomcat会解析成class文件(对应一个jsp类)
  2. jsp类继承HttpJspBase,HttpJspBase继承HttpServlet
  3. 结论:jsp本质就是servlet
  4. 因为jsp类还继承HttpJspPage,所以就有更强的功能

在这里插入图片描述

page指令

<page contentType="text/html;charset=UTF-8" language="java"%>
  1. language表示jsp翻译后是什么语言文件,只支持java
  2. contentType表示jsp返回的数据类型,对应源码中 response.setContentType()参数值
  3. pageEncoding属性表示当前jsp页面文件本身的字符集
  4. import属性跟iava源代码中一样。用于导包,导类

jsp三种常用脚本

声明脚本

  1. 声明脚本的格式是:<%! 声明java代码 %>
  2. 作用:定义jsp的需要属性、方法、静态代码块和内部类等(相当于定义一个类)
<body>
<%!
    //这里我们可以声明该sp需要使用的属性,方法,静态代码块,内部类
    //1.属性
    private String name = "tom";
    private int age;
    private static String company ;

    //方法
    public String getName(){
        return name;
    }

    //静态代码块
    static {
        company = "px";
    }
%>
</body>


表达式脚本基本语法

  1. 表达式脚本的格式是:<%= 表达式 %>
  2. 表达式脚本的作用是:在jsp页面上输出数据
  3. 脚本中的表达式不能以分号结束。
<body>
<h1>个人信息</h1>
<%
    String name = "张三";
    String email = request.getParameter("email");
%>
用户名: <%=name%><br/>
工作: <%="java工程师"%><br/>
年龄: <%=request.getParameter("age")%><br/>
电子邮件: <%=email%>
</body>


代码脚本

  1. 代码脚本的语法是:<% java代码 %>(代码块)
  2. 代码脚本的作用是:可以在jsp页面中,编写我们需要的功能(使用java )
  3. 可以由多个代码脚本块组合完成一个完整的java语句。
  4. 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据
    <%
        for (int i = 0; i < monsters.size(); i++) {
            Monster monster = monsters.get(i);
    %>
    <tr>
        <td><%=monster.getId()%></td>
        <td><%=monster.getName()%></td>
        <td><%=monster.getKill()%></td>
    </tr>
    <%--for循环最后的括号用<% %>括起来,表示从上面for到最后的'}'循环monsters.size()--%>
    <%
        }
    %>

jsp内置对象

  • JSP内置对象(已经创建好的对象,直接使用inbuild),是指Tomcat在翻译jsp页面成为Servlet后,内部提供的九大对象,叫内置对象
对象解释
out向客户端输出数据,out.println(“”");
JspWrite
request客户端的http请求
HttpServletRequest
response响应对象
HttpServletRespone
session会话对象
HttpSession
application对应ServletContext
ServletContext
pageContextjsp页面的上下文,是一个域对象,可以setAttribue(),作用范围只是本页面
exception异常对象
Exception
page代表jsp这个实例本身
this
config对应ServletConfig
ServletConfig


jsp四大域对象
域对象:在作用范围内存数据或者取数据的对象(域:作用范围)
变量的作用范围在类、代码块、方法中
而在web、ssm、springboot中,作用范围是在页面之间

域对象范围
pageContext域对象,存放的数据只能在当前页面使用
request域对象,存放的数据在一次request请求有效
session域对象,存放的数据在一次会话有效
application域对象,存放的数据在整个web应用运行期间有效
请求转发标签
<jsp:forward page="bb.jsp"></jsp:forward>


EL表达式

  • EL表达式主要是代替 jsp页面的表达式脚本<%=request.getAttribute("xx")%>
  • EL表达式基本语法:${key1}
  • EL表达式在输出null时,输出的是""
    jsp表达式脚本输出null的时,输出的是"null"字符串

EL常用输出

//    private String name; //书名
//    private String[] writer; //作者
//    private List<String> reader;//读者
//    private Map<String, String> topics;//评价

<h1>el表达式输出</h1>
全部信息: ${bookkey}

//输出单个对象
书名: ${bookkey.name}

//输出数组
作者数组信息: ${bookkey.writer}
第一个作者: ${bookkey.writer[0]}

//输出List
全部读者信息: ${bookkey.reader}
第一个读者信息: ${bookkey.reader.get(0)}
第二个读者信息: ${bookkey.reader[1]}

//输出Map
全部评论信息: ${bookkey.topics}<br/>
topic1评论信息: ${bookkey.topics.get("topic1")}
topic2评论信息: ${bookkey.topics["topic2"]}


EL运算符
1.基本语法语法:${运算表达式}

num1 > num2 = ${num1 > num2}


EL empty运算

  1. empty运算可以判断一个数据是否为空,如果为空,返回true,否则返回false
  2. 以下几种情况为空
    ● 值为null
    ● 值为空串的时
    ● 值是Object类型数组,长度为零o
    ● list集合,元素个数为零
    ●map集合,元素个数为零
k1是否为空 = ${empty k1}


EL三元运算

  1. 表达式1?表达式2:表达式3
  2. 如果表达式1的值为真,返回表达式2的值,反之,返回表达式3的值。
score是否及格 = ${score > 60 ? "及格" : "不及格"}


EL获取四个特定域中的属性

  • 如果${requestScope .k1}那么就明确的指定从request域对象取出数据
  • 如果${k1},这是就按照从小到大的域范围去获取 pageContext->request->session->application
pageContext取出k1数据 = ${pageScope.k1}
request取出k1数据 = ${requestScope.k1}
session取出k1数据 = ${sessionScope.k1}
application取出k1数据 = ${applicationScope.k1}


JSTL

  • JSTL是为了替换代码脚本。这样jsp页面变得更佳简洁

注意事项

  • <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 要放在行首
  • 导入jstl jar包后,要重新发布web工程,否则不识别jstl

c:set标签
<c:set />set标签可以往域中保存数据

  1. 等价域对象.setAttribute(key,value);
  2. scope属性设置保存到哪个域
    ● page表示 PageContext域(默认值)
    ● request表示Request域
    ● session表示 Session域
    ● application表示 ServletContext域
  3. var属性设置key是什么
  4. value属性设置值
<c:set scope="request" var="name" value="px"></c:set>


c:if标签

  1. if 标签用来做if 判断。
  2. test属性表示判断的条件(用耻L表达式输出)
<c:if test="${num1 > num2}">
    <h1>${num1} > ${num2}</h1>
</c:if>


c:choose标签

  • 多路判断。跟switch … case … default非常接近
<c:choose>
    <c:when test="${score > 90}">
        <h1>分数${score}: 优秀</h1>
    </c:when>
    <c:when test="${score > 80}">
        <h1>分数${score}: 良好</h1>
    </c:when>
    <c:otherwise>
        <h1>分数${score}: 再接再厉</h1>
    </c:otherwise>
</c:choose>


c:foreach标签
第一种遍历方式 从i 到 j

<%--
    1. 遍历152. 输出 begin属性设置开始的索引end属性设置结束的索引
    3. var属性表示循环的变量(也是当前正在遍历到的数据)
    4. 等价于for (int i = 1; i <= 5; i++) {}
    5. 在默认情况下,i每次会递地1
--%>
    <c:forEach begin="1" end="5" var="i">
        <li>排名: ${i}</li>
    </c:forEach>


第二种遍历方式 遍历数组

<%--
    <c:forEach items="${requestScope.sports}" var="item"/>
    1. items遍历的集合/数组
    2. var遍历到的数据
    3.等价for(0bject item: arr){}
--%>
<c:forEach items="${requestScope.sourses}" var="sourse">
    科目名称: ${sourse}<br/>
</c:forEach>


第三种遍历方式 遍历Map

<%--
    1. items遍历的map集合
    2. var遍历到的数据
    3. entry.key取出key
    4. entry.value取出值
--%>
<c:forEach items="${requestScope.map}" var="sport">
    运动名称: ${sport.key} -- ${sport.value}<br/>
</c:forEach>


第四种遍历方式 遍历List

<c:forEach items="${requestScope.monsters}" var="monster">
    妖怪信息: ${monster.id} -- ${monster.name} -- ${monster.kill}<br/>
</c:forEach>


为什么用jsp

在这里插入图片描述
在这里插入图片描述

JSP基本介绍

在这里插入图片描述

jsp基础使用

在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: 14126
  Date: 2022/3/20
  Time: 11:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp简单的求和计算器</title>
</head>
<body>
<h1>jsp简单的求和计算器</h1>
<%
    //1.在jsp的该标签中,可以写java代码
    int i = 10;
    int j = 20;
    int res = i + j;
    //2. jsp中内置对象,可以直接使用,比如 out
    out.println(i + "+" + j + "=" + res);
%>
</body>
</html>

注意事项
在这里插入图片描述
在这里插入图片描述

jsp运行原理

在这里插入图片描述
在这里插入图片描述
jsp文件对应源文件以及对应的字节码文件
在这里插入图片描述
jsp对应的源文件继承了HttpJspBase
在这里插入图片描述
jsp本质就是一个Servlet(类)

  1. sum.jsp ->sum jsp.class
  2. sum jsp继承HttpJspBase
  3. HttpJspBase继承了 HttpServlet
  4. 结论sum.jsp本质就是servlet
  5. 因为sum isp类还继承 HttpJspBase所以就有更强的功能

在这里插入图片描述

page指令

在这里插入图片描述

jsp三种常用脚本

声明脚本

本质就是定义类
在这里插入图片描述
<%! 代码 %> 就当一个类的来使用

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp声明脚本</title>
</head>
<body>
<%!
    //这里我们可以声明该sp需要使用的属性,方法,静态代码块,内部类
    //老师一句话:也就是给 statement.jsp对应的statement_jsp类定义成员
    //1.属性
    private String name = "tom";
    private int age;
    private static String company ;

    //方法
    public String getName(){
        return name;
    }

    //静态代码块
    static {
        company = "px";
    }
%>
</body>
</html>

查看statement_jsp.class文件
在这里插入图片描述

表达式脚本基本语法

在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表达式脚本的使用</title>
</head>
<body>
<h1>个人信息</h1>
<%
    String name = "张三";
    String email = request.getParameter("email");
%>
用户名: <%=name%><br/>
工作: <%="java工程师"%><br/>
年龄: <%=request.getParameter("age")%><br/>
电子邮件: <%=email%>
</body>
</html>

访问 http://localhost:8080/jsp/expression.jsp?age=110&email=px@qq.com
在这里插入图片描述

代码脚本

在这里插入图片描述

<%@ page import="java.util.ArrayList" %>
<%@ page import="com.study.entity.Monster" %><%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>代码脚本</title>
</head>
<body>
<h1>代码脚本</h1>
<%
    //创建ArrayList,放入两个对象
    ArrayList<Monster> monsters = new ArrayList<>();
    monsters.add(new Monster(1,"张三","千里眼"));
    monsters.add(new Monster(2,"李四","顺风耳"));
%>
<table bgcolor="#f5f5dc" border="1px" width="300px">
    <tr>
        <th>id</th>
        <th>姓名</th>
        <th>技能</th>
    </tr>
    <%--可以由多个代码脚本块组合完成一个完整的java语句--%>
    <%
        for (int i = 0; i < monsters.size(); i++) {
            Monster monster = monsters.get(i);
    %>
    <tr>
        <td><%=monster.getId()%></td>
        <td><%=monster.getName()%></td>
        <td><%=monster.getKill()%></td>
    </tr>
    <%--for循环最后的括号用<% %>括起来,表示从上面for到最后的'}'循环monsters.size()--%>
    <%
        }
    %>
</table>
</body>
</html>

查看javacode_js.java
在这里插入图片描述

jsp的注释

在这里插入图片描述

jsp内置对象

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
inbulid.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>内置对象</title>
</head>
<body>
<%
    //梳理jsp内置对象
    //out 类型是JspWriter 父类就是Writer
    out.println("out.println");
    //request是HttpServlet
    request.getParameter("age");
    //response就是HttpServletResponse
    response.sendRedirect("http://www.baidu.com");
    //session就是HttpSession
    session.setAttribute("job", "PHP工程师");
    //application类型就是ServletContext
    application.setAttribute("name", "张三");
    //pageContext可以存放数据(属性),但是该数据只能在本页面使用
    pageContext.setAttribute("age", 100);
    //exception异常对象使用比较少

    //page内置对象,类似this(这个页面本身)

    //config内置对象的类型就是ServletConfig
    String pwd = config.getInitParameter("pwd");

%>
</body>
</html>

Hiservlet

package com.study;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author 珀筱
 */
public class HiServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //梳理servlet可以使用那些对象
        PrintWriter writer = response.getWriter();
        writer.println("haha");
        request.getParameter("age");
        response.setContentType("text/html; charset=utf-8");
        HttpSession session = request.getSession();
        session.setAttribute("job", "java工程师");
        ServletConfig servletConfig = getServletConfig();
        String pwd = servletConfig.getInitParameter("pwd");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

jsp四大域对象

域对象:在作用范围内存数据或者取数据的对象
域:代表作用范围

变量的作用范围在类、代码块、方法中
而在web、ssm、sprintboot中,也有域范围,而这个域范围是在页面之间的作用范围

web中,域范围指在不同的页面之间,在多个文件之前的范围
作用:存取数据
在这里插入图片描述

pagecontext

在这里插入图片描述

request

在这里插入图片描述

session

在这里插入图片描述

application

在这里插入图片描述

在这里插入图片描述

jsp域对象实例

scope1.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope1</title>
</head>
<body>
<%
    //在不同的域对象中,放入数据
    //1.因为四个域对象,是不同的对象,因此name(key)相同时,并不会冲突
    pageContext.setAttribute("k1", "pageContext数据(k1)");
    request.setAttribute("k1", "request数据(k1)");
    session.setAttribute("k1", "session数据(k1)");  //tomcat解析到这,会向浏览器发送sessionID
    application.setAttribute("k1", "application数据(k1)");
%>
<h1>四个域对象,在本页获取数据的情况</h1>
pageContext-k1 = <%=pageContext.getAttribute("k1")%><br/>
request-k1 = <%=request.getAttribute("k1")%><br/>
session-k1 = <%=session.getAttribute("k1")%><br/>
application-k1 = <%=application.getAttribute("k1")%>
</body>
</html>

scope2.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope2</title>
</head>
<body>
<h1>在scope2获取数据的情况</h1>
pageContext-k1 = <%=pageContext.getAttribute("k1")%><br/>
request-k1 = <%=request.getAttribute("k1")%><br/>
session-k1 = <%=session.getAttribute("k1")%><br/>
application-k1 = <%=application.getAttribute("k1")%>
</body>
</html>

访问当前页面

访问: http://localhost:8080/jsp/scope1.jsp
scope1.jsp 都可以访问到
在这里插入图片描述

请求转发,访问其他页面

在scope1转发到scope2
在这里插入图片描述

访问:http://localhost:8080/jsp/scope1.jsp
在这里插入图片描述

请求重定向访问其他页面

在scope1请求重定向到scope2
在这里插入图片描述
访问:http://localhost:8080/jsp/scope1.jsp
在这里插入图片描述

不带JessionID访问

换一个浏览器,访问:http://localhost:8080/jsp/scope2.jsp
在这里插入图片描述

jsp请求转发标签

在这里插入图片描述
aa.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>aa.jsp</title>
</head>
<body>
<h1>aa.jsp页面</h1>
<%--
jsp:forward本质就是等价request.getRequestDispatcher("/bb.jsp").forward(request, response);
--%>
<jsp:forward page="bb.jsp"></jsp:forward>
</body>
</html>


bb.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>bb.jsp</title>
</head>
<body>
<h1>bb.jsp页面</h1>
</body>
</html>

访问:http://localhost:8080/jsp/aa.jsp
在这里插入图片描述

一个小测验

在这里插入图片描述
在这里插入图片描述
calUI.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>计算页面</title>
</head>
<script type="text/javascript">
    function check() {
        //得到num1 和 num2
        var num1 = document.getElementById("num1").value;
        var num2 = document.getElementById("num2").value;

        var reg = /^[-]?([1-9]\d*|0)$/;

        //验证一下
        if (!reg.test(num1)) { //如果验证失败
            alert("num1不是整数");
            return false; //放弃提交
        }
        if (!reg.test(num2)) {
            alert("num2不是整数");
            return false;
        }

        return true; //提交到action
    }
</script>
<%
    Object errorNum1 = request.getAttribute("errorNum1");
    Object errorNum2 = request.getAttribute("errorNum2");
    if(errorNum1 == null){
        errorNum1 = "";
    }
    if(errorNum2 == null){
        errorNum2 = "";
    }
%>
<body>
<form action="<%=request.getContextPath()%>/calServlet" onsubmit="return check()">

    num1: <input type="text" id="num1" name="num1"><%=errorNum1%><br/>
    num2: <input type="text" id="num2" name="num2"><%=errorNum2%><br/>
    运算符号: <select name="oper">
    <option value="+">+</option>
    <option value="-">-</option>
    <option value="*">*</option>
    <option value="/">/</option>
</select><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

calRes.jsp

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>计算结果页面</title>
</head>
<body>
 <h1>计算结果</h1>
<%=request.getAttribute("res")%><br/>
<a href="<%=request.getContextPath()%>/cal/calUI.jsp">返回再玩一次</a>
</body>
</html>

webUtils.java

package com.study.utils;

import java.util.regex.Pattern;

/**
 * @author 珀筱
 */
@SuppressWarnings({"all"})
public class WebUtils {
    public static double pasterDouble(String strNum, Double defaultNum) {
        try {
            return Double.parseDouble(strNum);
        } catch (NumberFormatException e) {
            System.out.println("strNum 无法转换成Double类型");
            return defaultNum;
        }
    }

    public static boolean checkNum(String strNum) {
        String reg = "^[-]?([1-9]\\d*|0)$";
        return Pattern.matches(reg, strNum);
    }
}

calservlet.java

package com.study;

import com.study.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Pattern;

/**
 * @author 珀筱
 */
public class CalServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //校验
        String strNum1 = request.getParameter("num1");
        String strNum2 = request.getParameter("num2");
        String checkInfo = "";
        if (!WebUtils.checkNum(strNum1)) {
            checkInfo = "num1错误: " + strNum1;
            request.setAttribute("errorNum1",checkInfo);
            request.getRequestDispatcher("/cal/calUI.jsp").forward(request, response);
            return;

        }
        if (!WebUtils.checkNum(strNum2)) {
            checkInfo = "num2错误: " + strNum2;
            request.setAttribute("errorNum2",checkInfo);
            request.getRequestDispatcher("/cal/calUI.jsp").forward(request, response);
            return;
        }
        //1.接收到的数据进行转化为 --> double
        double num1 = WebUtils.pasterDouble(strNum1, 0.0);
        double num2 = WebUtils.pasterDouble(strNum2, 0.0);
        String oper = request.getParameter("oper");
        double res = 0.0; //使用变量来接收结果
        //2.完成计算
        if ("+".equals(oper)) {
            res = num1 + num2;
        } else if ("-".equals(oper)) {
            res = num1 - num2;
        } else if ("*".equals(oper)) {
            res = num1 * num2;
        } else if ("/".equals(oper)) {
            res = num1 / num2;
        } else {
            System.out.println("输入的符号不正确");
        }
        //3.把结果保存到域对象[request, session,servletContext]
        //因为一次请求对应一次计算,所以我建议将结果保存到request
        //思路:把结果组织到一个字符串中.,方便我们在下一个页面显示
        //java基础: String.format,可以格式化字符串
        String formatRes = String.format("%s %s %s = %s", num1, oper, num2, res);
        //4.转发显示页面 calRes.jsp
        request.setAttribute("res", formatRes);
        request.getRequestDispatcher("/cal/calRes.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

EL表达式

在这里插入图片描述

简单使用

EL表达式在输出null时,输出的是""
jsp表达式脚本输出null的时,输出的是"null"字符串

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el表达式</title>
</head>
<body>
<%
    request.setAttribute("name","张三");
%>
<!--
    如果name为null,request.setAttribute("name") 返回的是null
    如果name为null,${name}返回的是""
-->
<h1>jsp表达式</h1>
name = <%=request.getAttribute("name")%>
<h1>el表达式</h1>
name = ${name}
</body>
</html>

访问:http://localhost:8080/el/el_qs.jsp
在这里插入图片描述

EL常用输出

<%@ page import="com.study.entity.Book" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el表达式输出</title>
</head>
<body>
<%
    //1.创建book对象
    Book book = new Book();
    //初始化book对象
//    private String name; //书名
//    private String[] writer; //作者
//    private List<String> reader;//读者
//    private Map<String, String> topics;//评价

    book.setName("东游记");
    book.setWriter(new String[]{"张三", "李四"});

    ArrayList<String> readers = new ArrayList<>();
    readers.add("jack");
    readers.add("tom");
    book.setReader(readers);

    HashMap<String, String> hm = new HashMap<>();
    hm.put("topic1", "不错,我喜欢");
    hm.put("topic2", "66666");
    book.setTopics(hm);

    //把book放入request中
    request.setAttribute("bookkey", book);
%>
<h1>el表达式输出</h1>
全部信息: ${bookkey}<br/>

书名: ${bookkey.name}<br/>

作者数组信息: ${bookkey.writer}<br/>
第一个作者: ${bookkey.writer[0]}<br/>

全部读者信息: ${bookkey.reader}<br/>
第一个读者信息: ${bookkey.reader.get(0)}<br/>
第二个读者信息: ${bookkey.reader[1]}

全部评论信息: ${bookkey.topics}<br/>
topic1评论信息: ${bookkey.topics.get("topic1")}<br/>
topic2评论信息: ${bookkey.topics["topic2"]}
</body>
</html>

在这里插入图片描述

EL运算符

在这里插入图片描述
在这里插入图片描述

<body>
<%
    request.setAttribute("num1",90);
    request.setAttribute("num2",30);
%>
num1 + num2 = ${num1 + num2}<br/>
num1 > num2 = ${num1 > num2}
</body>

在这里插入图片描述

EL empty运算

在这里插入图片描述

<body>
<%
    request.setAttribute("k1","");
    request.setAttribute("k2",null);
    request.setAttribute("k3",new Object[]{});
    request.setAttribute("k4",new ArrayList<>());
    request.setAttribute("k5",new HashMap<>());
%>
k1是否为空 = ${empty k1}<br/>
k2是否为空 = ${empty k2}<br/>
k3是否为空 = ${empty k3}<br/>
k4是否为空 = ${empty k4}<br/>
k5是否为空 = ${empty k5}
</body>

在这里插入图片描述

EL三元运算

在这里插入图片描述

<%
    request.setAttribute("score", 61);
%>
score是否及格 = ${score > 60 ? "及格" : "不及格"}

在这里插入图片描述

EL获取四个特定域中的属性

在这里插入图片描述

<body>
<%
    pageContext.setAttribute("k1","pageContext-k1数据");
    request.setAttribute("k1","request-k1数据");
    session.setAttribute("k1","session-k1数据");
    application.setAttribute("k1","application-k1数据");
%>
<h1>jsp取出域对象中的数据</h1>
request中的k1数据 = <%=request.getAttribute("k1")%><br/>
<h1>el取出域对象中的数据</h1>
pageContext取出k1数据 = ${pageScope.k1}<br/>
request取出k1数据 = ${requestScope.k1}<br/>
session取出k1数据 = ${sessionScope.k1}<br/>
application取出k1数据 = ${applicationScope.k1}<br/>
</body>

在这里插入图片描述

EL获取http相关信息

<body>
<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 : ${ paqeContext.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>

在这里插入图片描述

JSTL

在导包时,注意一定是lib目录,不能会报错
在这里插入图片描述
在这里插入图片描述

c:set标签

在这里插入图片描述

<body>
<%
    request.setAttribute("email","px@qq.com");
%>
<c:set scope="request" var="name" value="px"></c:set>
</body>

c:if标签

如果为真,就会执行标签中间的代码
在这里插入图片描述

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:set scope="request" var="num1" value="20"></c:set>
<c:set scope="request" var="num2" value="10"></c:set>
<c:if test="${num1 > num2}">
    <h1>${num1} > ${num2}</h1>
</c:if>
</body>
</html>

在这里插入图片描述

c:choose标签

在这里插入图片描述

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    request.setAttribute("score",90);
%>
<c:choose>
    <c:when test="${score > 90}">
        <h1>分数${score}: 优秀</h1>
    </c:when>
    <c:when test="${score > 80}">
        <h1>分数${score}: 良好</h1>
    </c:when>
    <c:otherwise>
        <h1>分数${score}: 再接再厉</h1>
    </c:otherwise>
</c:choose>
</body>
</html>

在这里插入图片描述

如果session对象和application对象都有同一个对象(k1),那么只有把服务器端的session上的k1对象清除掉,才会匹配到application的k1对象
在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    pageContext.setAttribute("k1","pageContext的k1");
    request.setAttribute("k1","request的k1");
    session.setAttribute("k1","session的k1");
    application.setAttribute("k1","application的k1");
%>
<h1>输出k1的值: ${k1}</h1>
</body>
</html>

在这里插入图片描述

c:foreach标签

在这里插入图片描述

第一种遍历方式 从i 到 j

从i 到 j
在这里插入图片描述

<ui>
<%--
    1. 遍历152. 输出 begin属性设置开始的索引end属性设置结束的索引
    3. var属性表示循环的变量(也是当前正在遍历到的数据)
    4. 等价于for (int i = 1; i <= 5; i++) {}
    5. 在默认情况下,i每次会递地1
--%>
    <c:forEach begin="1" end="5" var="i">
        <li>排名: ${i}</li>
    </c:forEach>
</ui>

在这里插入图片描述

第二种遍历方式 遍历数组

遍历数组

<%--
    <c:forEach items="${requestScope.sports}" var="item"/>
    1. items遍历的集合/数组
    2. var遍历到的数据
    3.等价for(0bject item: arr){}
--%>
<%
    request.setAttribute("sourses",new String[]{"语文","数学","英语"});
%>
<c:forEach items="${requestScope.sourses}" var="sourse">
    科目名称: ${sourse}<br/>
</c:forEach>

在这里插入图片描述

第三种遍历方式 遍历Map

遍历Map

<%--
    1. items遍历的map集合
    2. var遍历到的数据
    3. entry.key取出key
    4. entry.value取出值
--%>
<%
    HashMap<String, String> map = new HashMap<>();
    map.put("key1", "跑步");
    map.put("key2", "篮球");
    map.put("key3", "足球");
    request.setAttribute("map", map);
%>
<c:forEach items="${requestScope.map}" var="sport">
    运动名称: ${sport.key} -- ${sport.value}<br/>
</c:forEach>

在这里插入图片描述

第四种遍历方式 遍历List

遍历List

<%
    ArrayList<Monster> monsters = new ArrayList<>();
    monsters.add(new Monster(1,"老虎精","吃面条"));
    monsters.add(new Monster(2,"蜘蛛精","吐口水"));
    monsters.add(new Monster(1,"乌龟精","吞鸡蛋"));
    request.setAttribute("monsters",monsters);
%>
<c:forEach items="${requestScope.monsters}" var="monster">
    妖怪信息: ${monster.id} -- ${monster.name} -- ${monster.kill}<br/>
</c:forEach>

在这里插入图片描述

小测验

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
query.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查询页面</title>
</head>
<body>
<h1>查询妖怪</h1>
<a href="/jsp/dataServlet">查询所有妖怪</a><br/>
---------------------------
</body>
</html>

dataServlet

package com.study;

import com.study.entity.Monster;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;

/**
 * @author 珀筱
 */
public class DataServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ArrayList<Monster> monsters = new ArrayList<>();
        monsters.add(new Monster(100, "小妖怪", "巡山", 345.7));
        monsters.add(new Monster(200, "大妖怪", "做饭的", 1345.7));
        monsters.add(new Monster(300, "老妖怪", "打扫位置的", 11345.7));
        request.setAttribute("monsters", monsters);
        request.getRequestDispatcher("/show.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

show.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: 珀筱
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table bgcolor="#f5f5dc" border="1px" width="300px">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>job</th>
        <th>sal</th>
    </tr>
    <c:forEach items="${requestScope.monsters}" var="monster">
        <c:if test="${monster.id > 150}">
            <tr>
                <td>${monster.id}</td>
                <td>${monster.name}</td>
                <td>${monster.job}</td>
                <td>${monster.sal}</td>
            </tr>
        </c:if>
    </c:forEach>
</table>
</body>
</html>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值