JSP、EL表达式、JSTL笔记(自用)

参考资料:韩顺平笔记和黑马程序员,主要以黑马程序员为主,若有错误请批评指正

一、JSP

(1)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 是非常容易的事情, 几乎是无缝接轨.

(2)JSP指令

1.page指令

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

2.包含指令

作用:可以包含其他页面

<%@ include file="jsp_YuFa.jsp" %>

3.taglib指令

作用:可以引入外部标签库

(3)JSP 三种常用脚本

jsp的代码也是在<body></body>内写!!

1.声明脚本  <%!声明 java 代码 %>

作用:可以声明该jsp需要属性、方法、静态代码块和内部类

<%!
    //这里可以声明该jsp需要属性、方法、静态代码块和内部类

    //属性
    private String name="milo";
    private int age;
    private static  String company;

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

%>

2.表达式脚本 <%=表达式%>

作用:在 jsp 页面上输出数据

<%
    String name="milo";

%>

用户名:<%=name%>
工作:<%="java工程师"%>
年龄:<%=request.getParameter("age")%>

3.代码脚本 <%代码%>

作用:可以在 jsp 页面中,编写我们需要的功能(使用 java ),也就是说<% %>包的是java代码

通过代码来解释:

创建一个java程序 Monster类

package qzj;

public class Monster {
        private Integer id;
        private String name;
        private String skill;

    public Monster(Integer id, String name, String skill) {
        this.id = id;
        this.name = name;
        this.skill = skill;
    }

    public Monster() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}

创建一个jsp:

<%@ page import="java.util.ArrayList" %>
<%
//    创建ArrayList两个对象
    ArrayList<Monster> monsterlist = new ArrayList<>();
    monsterlist.add(new Monster(1,"milo","sock"));
    monsterlist.add(new Monster(2,"lucy","pite"));
%>

<table bgcolor="#4169e1" border="1px" width="300px">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>skill</th>
    </tr>

    <%
        for (int i = 0; i < monsterlist.size(); i++) {
            //先取出monster对象
            Monster monster = monsterlist.get(i);
    %>
                <tr>
                    <td><%=monster.getId()%></td>
                    <td><%=monster.getName()%></td>
                    <td><%=monster.getSkill()%></td>
                </tr>
    <%
        }
    %>

注意:

1.<%! 声明的是成员变量 %>

2.<% 声明的是局部变量 %>

3.声明方法要使用前者

(4)内置对象

1. out向客户端输出数据,out.println("");6. pageContext jsp页面的上下文,是一个域对象,可以setAttribue(),作用范围只是本页面
2. request客户端的http请求7. exception异常对象, getMessage()
3. response响应对象8. page代表jsp这个实例本身
4. session会话对象9. config对应ServletConfig
5. application对应ServletContext

(5)四大域对象(黑马视频课没有代码演示,之后回顾韩顺平视频课会补充)

1. pageContext (域对象,存放的数据只能在当前页面使用)

2. request (域对象,存放的数据在一次 request 请求有效)

3. session(域对象,存放的数据在一次会话有效)

4. application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大)

(6)请求转发标签

<jsp:forward page=" xxx.jsp"></jsp:forward> 是请求转发标签, 它的功能就是请求转发 。
page 属性设置请求转发的路径

二、EL表达式

介绍一下pageContext.setAttribute("a",b):是Java的JSP或Servlet API中的一个方法调用,用于将一个对象b绑定到一个名为"a"的属性上,并将其存储在pageContext对象中。

(1)快速入门

通过代码来演示3种方式获取数据:

EL 表达式基本语法: ${key1}, 你可以理解就是一个语法糖,比jsp代码更简洁

(2)EL表达式获取不同类型的数据

1.获取基本数据类型

  <%pageContext.setAttribute("num",10);%>
    基本数据类型:${num} <br>

2.获取自定义对象类型

Student类是我自己自定义的一个类

<%
    Student stu = new Student("球球",23);
    pageContext.setAttribute("stu",stu);
%>
自定义对象:${stu}<br><br>
    学生姓名:${stu.name}<br>
    学生年龄:${stu.age}<br>

3.获取数组类型

 <%
      String[] arr={"hello","word"};
      pageContext.setAttribute("arr",arr);
    %>
    获取数组:${arr} <br>
    获取具体数组元素:${arr[0]} <br>
    获取具体数组元素:${arr[1]}<br>
    8索引元素:${arr[8]}<br>
    0索引拼接1索引元素:${arr[0]}+${arr[1]}<br>

4.获取list集合类型

<%
        List list=new ArrayList<>();
        list.add(10);
        list.add("milo");
        pageContext.setAttribute("list",list);
    %>
    获取list集合:${list}<br>
    获取list0集合:${list[0]}<br>

5.获取map集合类型

 <%
        Map<String,Student> map=new HashMap<>();
        map.put("hm01",new Student("amy",10));
        map.put("hm02",new Student("kimi",30));
        pageContext.setAttribute("map",map);
    %>
    获取map集合:${map}<br>
    第一个学生对象:${map.hm01}<br>
    第二个学生对象:${map.hm02}<br>
    第一个学生对象的姓名:${map.hm01.name}<br>
    第一个学生对象的年龄:${map.hm01.age}<br>

6.获取空值数据 

<%pageContext.setAttribute("a",null);%>
    空值的数据:${a}<br>

7.EL表达式运算

<%--empty 如果为空,返回 true,否则返回 false--%>
<%
    String str1=null;
    String str2="";
    int[] arr={};
%>
${empty str1}<br>
${empty str2}<br>
${empty arr}<br>

<%--三元运算符  获取性别的数据,在对应的按钮上勾选--%>
<%
    pageContext.setAttribute("gender","women");
%>
<input type="radio" name="gender" value="men" ${gender=="men"?"checked":""}>男
<input type="radio" name="gender" value="women" ${gender=="women"?"checked":""}>女

(3)EL细节

<%--获取四大域对象数据--%>
<%
        pageContext.setAttribute("use1","kiki");
    request.setAttribute("use2","lulu");
    session.setAttribute("use3","mimi");
   application.setAttribute("use4","lala");
%>
${use1}
${use2}
${use3}
${use4}<br>

<%--隐式对象--%>
<%--1.获取虚拟目录名称--%>
<%=request.getContextPath()%> <br>
${pageContext.request.contextPath}<br>

(4)EL隐式对象

懒得打字惹看代码吧:

<%--pageContext对象 可以获取其他三个域对象和jsp中八个隐式对象--%>
${pageContext.request.contextPath}<br>

<%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%>
<%
    request.setAttribute("use","milo");
%>
${use}<br>
${requestScope.use}<br>

<%--header headerValues 获取请求头数据---%>
${header["connection"]}<br>
${headerValues["connection"][0]}<br>

<%--param paramValues 获取请求参效数据---%>
${param.usename}<br>
${paramValues.hobby[0]}<br>
${paramValues.hobby[1]}<br>

<%--initParam 获取全局配置的参数---%>
${initParam["pname"]}<br>

<%--cookie 获取cookie信息---%>
${cookie}<br>   <%--{Idea-2cfcf34f=jakarta.servlet.http.Cookie@171fed44, JSESSIONID=jakarta.servlet.http.Cookie@24a43aee}--%>
${cookie.JSESSIONID}<br> <%--jakarta.servlet.http.Cookie@24a43aee}--%>
${cookie.JSESSIONID.name}<br>   <%--JSESSIONID--%>
${cookie.JSESSIONID.value}<br>   <%--E07D133B96FBFEBDB32E268963E55760--%>

三、JSTL笔记

(1)JSTL 标签库介绍

1. JSTL 标签库 是指 JSP Standard Tag Library JSP 标准标签库

2. EL 表达式是为了替换 jsp 中的表达式脚本,JSTL 是为了替换代码脚本。这样 jsp 页面 变得更佳简洁

jstl是由5个标签库组成

使用jstl要导入这两个包

(2)JSTL的流程控制

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>流程控制</title>
</head>
<body>
<%--向域对象添加数据--%>
${pageContext.setAttribute("score","B")}
<%--判断--%>
<c:if test="${score eq 'A'}">优秀</c:if>

<%--对数据进行多条件判断--%>
<c:choose>
    <c:when test="${score eq 'A'}">优秀</c:when>
    <c:when test="${score eq 'B'}">良好</c:when>
    <c:when test="${score eq 'C'}">及格</c:when>
    <c:when test="${score eq 'D'}">差</c:when>
    <c:otherwise>成绩非法</c:otherwise>
</c:choose>
</body>
</html>

代码解释:

1.<%@taglib uri="" prefix=" "%> 是一个jsp指令,用于声明和引用一个自定义标签库(或标准标签库(standard tag library)。

2.

<c:if test="${score eq 'A'}">优秀</c:if> 这段代码的意思是:

  • <c:if>:开始一个条件判断。
  • test="${score eq 'A'}":设置测试条件。这里使用了 EL 表达式。${score eq 'A'} 检查变量 score 的值是否等于字符串 'A'
    • eq 是 EL 中的等于操作符。
    • score 是一个变量,它可能是在作用域中设置的一个属性。
    • 'A' 是一个字符串字面量。如果测试条件为真(即 score 的值等于 'A'),则显示文本优秀

3. <c:choose> 类似于 Java 中的 switch 语句。

(3)JSTL的循环

记得导包和标签库

<%@ page import="java.util.ArrayList" %>  //因为我使用了ArrayList
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--向域对象添加数据--%>
<%
    ArrayList<String> list=new ArrayList<>();
    list.add("aa");
    list.add("dd");
    list.add("bb");
    list.add("cc");
    pageContext.setAttribute("list",list);
%>

<%--遍历集合--%>
<c:forEach items="${list}" var="str">
    ${str} <br>
</c:forEach>

代码解释:

  • items="${list}"items 属性指定了要遍历的集合或数组。${list} 是一个EL 表达式,它引用了一个名为 list 的变量。包含要遍历的元素。

  • var="str"var 属性用于声明一个变量,该变量将代表当前正在迭代的元素。在这个例子中,每个从 list 中取出的元素都会被赋值给变量 str

  • ${str}:输出遍历的元素

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值