JSP大全

1 篇文章 0 订阅

EL表达式

什么是El表达式

Expression Language:表达式语言, jsp2.0之后内置在jsp里面

域对象:

request:一次请求中有效

session:一次会话中有效【多次请求】

ServletContext:整个应用中有效【全局共享】

存储:request.setAttribute(key,value);

取值:request.getAttribute(key);

jsp页面上获取request作用域中的数据:<%= request.getAttribute(key);%>

EL表达式:${key}

目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <%= %>)

EL语法

${el表达式}

EL表达式的用途

1.获取数据. 获取的是域(request,session,ServletContext)对象中存储的数据

2.EL执行运算(算术运算及逻辑运算)

El获取数据

获取简单数据类型数据

语法:${requestScope|sessionScope|applicationScope.属性名};

快捷写法:==${属性名}, 属性名就是存在域对象里面的key==

<%--
  Created by IntelliJ IDEA.
  User: shuaige
  Date: 2022/1/23
  Time: 8:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        需求:使用EL获取简单类型数据
        解决:
            1.先要将数据存入到域对象中
            2.在使用EL表达式获取
    --%>
    <%--java脚本  可以在里面编写java代码--%>
    <%
        //request、session、application是jsp的内置对象  内置对象:生来就有 已经创建好了 可以直接使用
        //request.setAttribute("name","admin");
        session.setAttribute("age",18);
        //jsp中的application对象就是Servlet中的ServletContext对象
        application.setAttribute("address","深圳");
​
        //在session作用域中也存储了一个name  三个选项:A:报错  B:获取request中 C:获取session中
        session.setAttribute("name","king");
        /*
        * 注意:
        * 使用简化方式获取域对象中存储的数据,会从域对象范围小的到大的进行查找[request-->session-->application(ServletContext)],找到就停止,找不到就继续查找,如果最终也没有找到,就返回空字符串""
        *
        * */
    %>
​
    <%--获取域对象中存储的数据--%>
    <h1>request-老方式:<%=request.getAttribute("name") %></h1>
    <h1>request-EL获取:${requestScope.name}</h1>
    <h1>简化方式:${name}</h1>
    <h1>session-老方式:<%=session.getAttribute("age") %></h1>
    <h1>session-EL获取:${sessionScope.age}</h1>
    <h1>简化方式:${age}</h1>
    <h1>application-老方式:<%=application.getAttribute("address") %></h1>
    <h1>application-EL获取:${applicationScope.address}</h1>
    <h1>简化方式:${address}</h1>
</body>
</html>

获取数组

语法: ${key[下标]} key就是域对象里面存的key

获取list

语法:${list属性名[index]}或者${list属性名.get(index)};list属性名就是存入域对象里面的key

获取Map

语法:${map属性名.键} 或 ${map属性名.get("键")} 或${map属性名[键],map属性名就是存入域对象里面的key }

注意:当map的键比较特殊(eg:"1"、"a.ba.c")时,此时使用点的方式会报错,可以选择使用[]的方式。

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
  Created by IntelliJ IDEA.
  User: shuaige
  Date: 2021/7/29
  Time: 8:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        需求:使用EL获取简单类型数据
        解决:
            1.先要将数据存入到域对象中
            2.在使用EL表达式获取
    --%>
    <%--java脚本  可以在里面编写java代码--%>
    <%
        //1.在域对象中存储数据
        //1.1:使用request域对象存储数组数据
        String[] names = {"张三","李四","王五"};
        request.setAttribute("names",names);
        //1.2:使用request域对象存储list集合
        List list = new ArrayList<>();
        list.add("篮球");
        list.add("足球");
        list.add("混球");
        request.setAttribute("list",list);
        //1.3:使用request域对象存储map集合
        Map<String,Object> map = new HashMap<>();
        map.put("cn","中国");
        map.put("jp","小日本");
        map.put("usa","漂亮国");
        //request.setAttribute("map",map);
        //1.4:特殊情况 key中包含特殊字符.  此时使用["key"]进行获取
        request.setAttribute("a.b.c","hahaha");
        map.put("big.cn","大中国");
        session.setAttribute("map",map);
    %>
​
    <%--获取域对象中存储的数据--%>
    <%--需求1:获取names数组中的第二个元素   语法:${key[下标]}  下标从0开始--%>
    <h1>${names[1]}</h1>
    <%--需求2:获取list集合中的第三个元素    语法:${key[下标]}  或 ${key.get(下标)}--%>
    <h1>${list[2]}</h1>
    <h1>${list.get(2)}</h1>
    <%--需求3:获取map集合中key为cn所对应的值value  语法:${key["map的key"]} 或者 ${key.get("map的key") 或者 ${key.map的key}--%>
    <h1>${map["cn"]}</h1>
    <h1>${map.get("cn")}</h1>
    <h1>${map.cn}</h1>
    <%--需求4:获取特殊key所对应存储的值--%>
    <h1>${requestScope["a.b.c"]}</h1>
    <h1>${map["big.cn"]}</h1>
    <h1>${map.get("big.cn")}</h1>
    <h1>${map.big.cn}</h1>
</body>
</html>

获取bean

==语法:${key.javabean属性}==

依赖getxxx()方法; eg: getPassword()---去掉get-->Password()----首字母小写--->password

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.itheima.bean.User" %><%--
  Created by IntelliJ IDEA.
  User: shuaige
  Date: 2021/7/29
  Time: 8:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        需求:使用EL获取简单类型数据
        解决:
            1.先要将数据存入到域对象中
            2.在使用EL表达式获取
    --%>
    <%--java脚本  可以在里面编写java代码--%>
    <%
        //1.创建一个javabean对象 存入到request作用域中
        User user = new User();
        user.setName("张三");
        user.setPwd("123");
        request.setAttribute("user",user);
    %>
​
    <%--获取域对象中存储的数据--%>
    <%--需求:获取user中的name属性值 语法:${key.javabean属性名称}--%>
    <h1>${user.name}</h1>
</body>
</html>
​

语法

  1. 获得简单类型的

${key}
  1. 获得数组类型的

${key[下标]}
  1. 获得List类型的

${key[index]} 或者${key.get(index)}
  1. 获得Map类型的

${key[map的键]}  或者 ${key.get(map的键)} 或者${key.map的键}   key是存到域对象里面的key
  1. 获得JavaBean类型的

//get方法 去除get之后的单词首字母小写 得到的就是javabean的属性 当然 规范使用时,javabean字段和属性一致
${key.javaBean属性}

注意:

使用getAttribute()方法获取域对象中不存在的数据返回null,使用EL表达式获取域对象中不存在的数据返回"", ​ 因此在页面显示时,通过EL表达式获取数据显示,客户体验感较好。

注意事项

[]和.方式的区别: 有特殊字符的要用[]

  • 获取的是三个域对象范围的值,存入三个域中

  • 能获取到则获取,获取不到返回" "字符串 ,不是返回null

  • ${域中属性名}:依次从requestScope|sessionScope|applicationScope中查找指定的属性

    若找到,立即返回,且结束该次查找

    若找不到返回""

  • 若属性名中出现了".""+""-"等特殊的符号的时候,快捷获取的方式不好使,必须使用以下方式:

    ${xxxScope["属性名"]}

特殊情况:

 <%
        request.setAttribute("a.b.c.d","rrr");
​
​
        Map<String,String> map = new HashMap<String,String>();
        map.put("a.akey","aaa");
        map.put("bkey","bbb");
        map.put("ckey","ccc");
        request.setAttribute("m",map);
​
    %>
​
    ${a.b.c.d}
    ${requestScope['a.b.c.d']}<br/>
​
    #{m['a.akey']}
​
    <br/>

EL执行运算

算术运算

+,-,*,/

+:加号在EL表达式中代表加运算,不作拼接使用,如果是数字的字符串形式,则EL表达式会自动进行类型转换,然后再进行算术运算

关系运算

< >= <= != ==

逻辑运算

&& || !

非空判断【重点】

empty,

1. 判断一个对象是否为null,为null返回true

2. 判断集合长度是否为0,集合为null或长度为0返回true

3. 判断一个字符串是否为 null或"",如果是则返回true

not empty

语法: ${empyt 属性名};属性名 就是域对象里面的key值

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.itheima.bean.User" %><%--
  Created by IntelliJ IDEA.
  User: shuaige
  Date: 2021/7/29
  Time: 8:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        需求:使用EL获取简单类型数据
        解决:
            1.先要将数据存入到域对象中
            2.在使用EL表达式获取
    --%>
    <%--java脚本  可以在里面编写java代码--%>
    <%
       request.setAttribute("age","100");
       request.setAttribute("name","admin");
       //1.1:存储一个null字符串或者空串""
        request.setAttribute("str1","");
        request.setAttribute("str2",null);
       //1.2:存储一个对象为null
        User user1 = null;
        User user2 = new User();
        request.setAttribute("user1",user1);
        request.setAttribute("user2",user2);
        //1.3:存储一个list集合 list集合长度为0 或者为null
        List list1 = null;
        List list2 = new ArrayList();
        request.setAttribute("list1",list1);
        request.setAttribute("list2",list2);
​
    %>
​
    <%--获取域对象中存储的数据--%>
    <%--EL会进行自动类型转换 +号表示加法运算 如果+号两边都是数字 则可以正常进行加法运算--%>
    <h1>${age+1}</h1>
    <%--+号在EL表达式中表示加法运算 不代表字符串拼接 如果+号两边有一方不能转换为数字 则执行运算报错--%>
    <%--<h1>${name+1}</h1>--%>
​
    <%--情况1:当字符串为null或""时,使用empty进行判断 返回true--%>
    <h3>${empty str1}</h3>
    <h3>${empty str2}</h3>
    <%--情况2:当对象为null时,使用empty进行判断 返回true--%>
    <h3>${empty user1}</h3>
    <h3>${empty user2}</h3>
    <%--情况3:当list集合为null或长度为0时 使用empty进行判断 返回true--%>
    <h3>${empty list1}</h3>
    <h3>${empty list2}</h3>
​
    <%--not empty  不为空返回true,为null返回false--%>
    <h3>${not empty list1}</h3>
</body>
</html>

JSTL标签库

什么是JSTL标签库

JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。这个JSTL标签库没有集成到JSP的, 要使用的话, 需要导jar包.

JSTL标签库的作用

为了简化在jsp页面上操作数据; eg: 遍历数据 判断数据

JSTL标签库的类别

2.1核心标签库使用步骤

  1. 导入jar包

  2. 在JSP页面上导入核心标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

if标签

  • 语法

<c:if test="el表达式${..}" [var="给之前的表达式的结果起个名字"] [scope="将结果保存在那个域中 默认page"]>
</c:if>
  • 实例

<%--
  Created by IntelliJ IDEA.
  User: shuaige
  Date: 2021/7/29
  Time: 10:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在指定页面引入jstl标签库 prefix:前缀 uri:jstl核心标签库的地址--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--先在域对象中存储一个数据--%>
    <%
        request.setAttribute("age",6);
    %>
    <%--使用if标签 判断年龄 如果年龄>7岁 可以上小学了--%>
    <%--test:必选项  表示if判断的条件,在里面可以使用el表达式进行判断 结果为true则执行c:if标签体中的内容
        var:可选属性 表示声明一个变量 用于存储test中条件判断的结果
        scope:表示将var这里声明的变量存入到指定的作用域中
        但是实际使用时,一般只会设置test属性,var和scope几乎不用
    --%>
    <c:if test="${age>7}" var="flag" scope="request">
        <h1>可以上小学了</h1>
    </c:if>
    <h2>回家玩泥巴去吧</h2>
    <h3>requestScope:${requestScope.flag}</h3>
    <h3>sessionScope:${sessionScope.flag}</h3>
</body>
</html>

choose标签

  • 实例

<body>
    <%
        request.setAttribute("age","6");
    %>
    <%--if只能做简单判断 如果想实现if-else,或者多重if判断 就需要使用到c:choose标签了--%>
    <%--需求:年龄大于7岁 可以上小学  年龄大于13岁 可以上中学  年龄大于18岁 可以上大学  如果年龄不满7岁 回家玩泥巴--%>
    <%--c:choose就是类似于多重if或switch判断--%>
    <c:choose>
        <c:when test="${age>18}">
            <h1>上大学</h1>
        </c:when>
        <c:when test="${age>13}">
            <h1>上中学</h1>
        </c:when>
        <c:when test="${age>7}">
            <h1>上小学</h1>
        </c:when>
        <c:otherwise>
            <h1>回家玩泥巴</h1>
        </c:otherwise>
    </c:choose>
</body>

foreach标签

简单的使用:

<%--
    var:增强for循环的迭代遍历  for(String str : strs){}   var==str
    begin:起始值
    end:结束值
    step:步长,间隔
--%>
<c:forEach var="i" begin="1" end="10" step="2">
    ${i}
</c:forEach>

复杂的使用:

c:forEach中的varStatus属性。

指向一个字符串,该字符串引用一个对象。  map.put("vs",一个对象);

    这个对象记录着当前遍历的元素的一些信息:

       index:返回索引。从0开始

      count:返回计数。从1开始

        last:是否是最后一个元素

         first:是否是第一个元素

<%--foreach实际使用   复杂使用--%>
    <%--使用场景:查询所有用户的场景:前台页面发起请求,到达后台处理,后台查询数据库得到所有用户的集合数据
        将用户集合数据存入到request作用域中,然后跳转到指定的jsp页面,最后在jsp页面获取到数据进行遍历显示--%>
    <%
        //模拟后台查询到所有用户列表数据 存储到request作用域中
        User user1 = new User();
        user1.setName("张三");
        user1.setPwd("123");
        User user2 = new User();
        user2.setName("李四");
        user2.setPwd("123");
        User user3 = new User();
        user3.setName("王五");
        user3.setPwd("123");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
​
        request.setAttribute("users",users);
    %>
​
    <%--前台使用表格展示所有用户 的姓名 需要用到foreach--%>
    <table border="1px" cellpadding="0" cellspacing="0" width="400px">
        <tr>
            <td>序号</td>
            <td>用户名</td>
        </tr>
        <%--每遍历一次 就执行一次foreach标签体中的内容 也就是输出一行用户记录--%>
        <%--items:要遍历的集合 使用el表达式获取  var:集合中的元素 迭代变量  集合中元素内容的展示 在html标签中获取也要使用EL表达式--%>
        <c:forEach items="${users}" var="user" varStatus="status">
            <tr>
                <td>${status.index +1}</td>
                <td>${user.name}</td>
            </tr>
        </c:forEach>
​
    </table>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值