JSP 和JSTL

JSP 主要介绍

  • JSP : Java Server Page,是web服务端的动态资源
  • 相比html而言,html只为用户提供静态资源数据,而JSP可以在页面中嵌套java 代码,为用户提供动态数据
  • 相比servlet,servlet很难对数据进行排版,而jsp代码可以用java产生动态数据的同时,对数据进行排版
  • 在长期开发中,人们逐渐把servlet当作后台,把jsp当作页面模板(其实二者都是既可写前端,也可写后端)
  • jsp本质是一个servlet,jsp引擎会将jsp翻译成servlet,放入jvm里,生成class,存入tomcat–》work目录。
  • JSP在第一次使用时会被编译成为HttpJspPage类,该类是一个HttpServlet的子类

配置idea

  • file -->settings在这里插入图片描述

JSP的指令标签

  • 需求:将一些重复代码包含起来使用,(某些页面可能一些区域一直不变,变化的就是个局部区域)
  • 方法:将工具栏,头部信息,尾部信息等分成独立的文件,使用时候直接导入。
  • JSP中想实现上述包含的操作,可以 静态包含,动态包含,静态使用include指令,动态使用include动态标签。

include静态包含

  • 知道即可
<%@include file="test-head.jsp"%>

  • 静态包含 耦合度高,会生成一个源码文件,例如a页面包含b,c页面,会将b,c页面的内容编译整合进入a页面编译的内容
  • 所以几个页面中不可以有同名变量
  • 相当于直接复制内容,只会生成一个源码文件,不能出现同名变量,耦合度高运行效率高一点

动态包含

<jsp:include page="test-head.jsp"></jsp:include>
  • 动态包含 3个页面会生成3ge文件,相当于方法的调用,所以会出现多个源码文件,可以出现同名变量,耦合度低,效率高

JSP的四大域对象

  • 有四种属性的保存范围
  • page范围:pageContext :只在一个页面中保存属性,跳转之后无效
  • request:只在一次请求中保存,服务器跳转后依然有效
  • session:在一次会话中有效,无论何种跳转都可以用(不换浏览器有效,对于服务器而言,每一个客户端都是一个session)
  • application:在整个服务器 保存。(所有用户(session)都可以直接访问获得)

EL表达式(重点)

  • 简化JSP代码,语法结构 ${表达式}
  • 作用,获取域对象中的数据(相当于 request.getAttribute),不能操作局部变量或者全局变量
    • 例如:
    request.setAttribute("name","admin")
    ${name}
    
  • EL表达式中写的是 key(键值对中)
  • 作用域范围:
    • page:当前页面
    • request:一次请求
    • session:一次会话
    • application:整个应用程序
  • 获取指定范围的值
    • pageScope
    • requestScope
    • sessionScope
    • applicationScope
    • 例如:${requestScope.name},四个范围均可设置那么属性变量,取对应范围的属性变量。
    • El表达式默认取值范围依次从小范围到大范围。若4个范围都未找到,则返回空字符串。
  • EL表达式获取list值
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: yun
  Date: 2021/9/14
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
<%
    pageContext.setAttribute("name","zhang");
    request.setAttribute("name","zhang");
    session.setAttribute("name","zhang");
    application.setAttribute("name","zhang");
%>
<h3>获取数据</h3>
    ${pageScope.name}

<%
    List<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbbb");
    list.add("cccc");
    request.setAttribute("list",list);
%>
<h3>获取list指定下标值</h3>
${list[0]}<br>
获取list的长度${list.size()}<br>


<h3>获取map</h3>
<%
    Map map = new HashMap();
    map.put("aaa","111");
    map.put("bb","22");
    map.put("ccc","333");
    request.setAttribute("map",map);
%>
<h3>获取map</h3>
获取map中指定key的值,${map.aaa}  ,${map["aaa"]}
</body>

</html>

获取javaBean对象

  • 需要javabean类提供对应的属性的get,set方法
<%
    User user = new User();
    user.setUserid(123);
    user.setPassword("123");
    user.setName("tan");
    request.setAttribute("user",user);

%>
获取对象:${user}
获取密码,名字:${user.name},${user.userid}
package bean;

public class User  {
    private Integer userid;
    private String name;
    private String password;

    public Integer getUserid() {
        return userid;
    }

    public String getName() {
        return name;
    }

    public String getPassword() {
        return password;
    }

    public void setUserid(Integer userid) {
        this.userid = userid;
    }

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

    public void setPassword(String password) {
        this.password = password;
    }
}

empty 判断是否为空

<%


String s1 = "hello";
String s2 = "";
String s3 = null;
request.setAttribute("s1",s1);
request.setAttribute("s2",s2);
request.setAttribute("s3",s3);

// list
    List <String> list1 = null;
    List<String >list2 = new ArrayList<>();
    List <String>list3 = new ArrayList<>();
    list3.add("aaa");
    request.setAttribute("list1",list1);
    request.setAttribute("list2",list2);
    request.setAttribute("list3",list3);

    //javabean
    User user1 = null;
    User user2 = new User();
    User user3 = new User();
    user3.setName("zhang");
    request.setAttribute("user1",user1);
    request.setAttribute("user2",user2);
    request.setAttribute("user3",user3);


%>
<h3>empty</h3>
字符串判断 --${empty s1}  ${empty s2}  ${empty s3}
list判断  --${empty list1} ${empty list2}  ${empty list3}<br>
javabean判断  --${empty user1}  ${empty user2} ${empty user3}

在这里插入图片描述

  • 对于javabean对象的判断, new 了对象后,就已经在内存中有地址了,不为空

El运算

  • 将运算符写到 ${a 运算符 b}
  • 等值判断 a==b a eq d

JSTL介绍

  • 标签的使用 ,是JSP的标准标签库,用于解决常见问题,例如迭代集合,映射,数组,条件测试,数据库等操作
  • 【注】:JSTL的标签操作的是作用域中的数据
  • 配置
    • http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/在此链接下载在这里插入图片描述
    • 在web-inf 下新建个lib文件夹
    • 解压,将下面两个压缩包拷贝到指定目录下,(lib中)在这里插入图片描述
    • 在此处将刚刚的lib文件夹添加进去,勾选上,应用在这里插入图片描述
    • 添加入web环境成功
    • 出现了意外情况,导入成功后目录只剩External文件夹了,将下图圈的地方有个exclude folder 去掉。在这里插入图片描述
  • 使用
    • 在需要引入JSTL标签库的页面中引入指定标签库
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core "prefix="c"%>
    
    prefix 是自己起的别名,前缀(可任意,一般用c)
    • 常用标签
    • 可以通过下例看到,若无JSTL标签,则需要进行java代码与JSP代码的拼接,麻烦
      • if 标签
        <c:if test = “判断条件”
        …满足条件执行的代码
        </c:if>
        【注】:if标签没有对应的else,(可以使用if标签,设置完全相反的条件)
        <%--
          Created by IntelliJ IDEA.
          User: yun
          Date: 2021/9/15
          Time: 10:15
          To change this template use File | Settings | File Templates.
        --%>
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
        <html>
        <head>
            <title>JSTL的使用</title>
        </head>
        <body>
        <%--
        有标签库的情况
        --%>
            <%
                request.setAttribute("score",50);
            %>
            <c:if test="${score < 60}">
                <h2>小于60</h2>
            </c:if>
        <%--
        无标签库的情况
        --%>
        <%
            int score = 50;
        %>
        <%
            if (score<60){
        %>
        <h2>渣渣</h2>
        
        <%
        }
        %>
        </body>
        
        </html>
        
        
      • foreach标签
        <%--forecach 标签
            循环遍历
            1  <c:forEach  begin = "开始数"  end=“结束数” step = "间隔数" var= “限域变量名”>
              </c:forEach>
        
             2
             <c:forEach items = “要遍历的集合” var = "限域变量名">
             </c:forEach>
        
        --%>
            <c:forEach var="i" begin="1" end="9" step="1">
                <c:forEach var="j" begin="1" end="${i}" step="1">
                    ${i}*${j} = ${i*j}&nbsp;
                </c:forEach>
                <br>
            </c:forEach>
        
            <table border="1" style="border-collapse: collapse">
                <c:forEach var="i" begin="1" end="9" step="1">
                    <tr>
                        <c:forEach var="j" begin="1" end="${i}" step="1">
                          <td>
                                  ${i}*${j} = ${i*j}&nbsp;
                          </td>
                        </c:forEach>
                    </tr>
                </c:forEach>
            </table>
        <%
            List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("bbbb");
            list.add("cccc");
            request.setAttribute("list",list);
        %>
                <c:forEach var="i" items="${list}">
                    ${i}  <br>
                </c:forEach>
        
      在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值