EL和JSTL概述

jsp

在JSP中既可以书写java代码,同时还可以书写html标签

  • jsp中的注释:<%–注释内容–%>,添加注释的快捷键是:ctrl+/;

  • 在jsp中书写代码有三种方式,我们这里先介绍一种,格式:

    <% java代码 %>
    
  1. <% %>中书写的代码被直接解析成java代码

  2. jsp之所以可以编写html代码,其实本质上也是类似我们使用Servlet直接输出的。也就是说底层还是像我们之前做法一样进行标签拼接。html部分都被out.write(“”)方法以字符串的形式拼接,然后响应给浏览器

  3. 在这个java文件中有个_jspService,这个方法有两个参数request,response

  4. 由于我们自己编写的代码全部都落入到了service方法内部一开始就已经声明了request,response,session,application(ServletContext)等对象了,这些对象成为之jsp内置对象

jsp底层机制:

jsp文件 => .java文件 => .class文件
jsp文件 : 继承HttpServlet

JSP:书写java代码的三种方式

方式1:JSP脚本片段

脚本片段指的是一段java代码。书写格式:<% java 代码 %>

方式2:JSP脚本声明

脚本片段虽然可以嵌入java代码,但是如果要给当前的jsp中定义一些成员方法或者成员变量,就需要一个新的方式:脚本声明

说明:通过查看jsp的源代码发现,脚本片段的代码都会存在service方法中,而方法中是不可以定义一个方法的。

脚本声明的格式:<%! 书写Java代码 %>

方式3:JSP脚本表达式

虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果要向页面输出一些内容,还是需要使用原来的response对象来实现,这种方式比较繁琐。

JSP脚本表达式可以代替response向页面输出内容

JSP脚本表达式的格式:<%= 向浏览器输出的内容 %> 等价于:out.print( 向浏览器输出的内容)

示例:在页面输出信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%="传智播客"%>
<%="上海黑马"%>
<%
response.getWriter().print("response");
%>
</body>
</html>

注意:

上面代码中,我们书写代码的顺序是先:

<%="传智播客"%>
<%="上海黑马"%>

再:

response.getWriter().print("response");

可是浏览器查看数据的结果是

response 传智播客 上海黑马

原因:response.getWriter()获取的输出流是:PrintWriter。而脚本表达式<%=%> 等价于:out.print( 向浏览器输出的内容),并且这种方式获取的输出流是:JspWriter。其实导致上述输出结果前后顺序就是PrintWriter和JspWriter。

JspWriter:将输出的内容先放到jsp内置的缓冲区中,然后再刷新输出。

PrintWriter:是不使用jsp内置的缓冲区,直接将内容写到网页中。

结论:

1. 不要同时使用脚本表达式和response同时往页面输出信息,会出现顺序不一致。现象:response会出现在最前面(使用一种输出即可)
  1. 脚本表达式<%= str %> :在页面输出内容,在service方法中起作用

  2. 脚本片段<% %> :在service方法中,原样输出的代码片段;属于局部为,放在_jspService方法中

  3. 脚本声明:<%! String str = "黑马程序员" %> :定义成员变量

JSP:三大指令

指令概述

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出效果,而只是告诉引擎如何处理JSP页面中的其余部分。

指令用来声明JSP页面的一些属性,比如编码方式,文档类型。我们在servlet中也会声明我们使用的编码方式和响应的文档类型的,而JSP就是用指令来声明的。

JSP页面的三大指令:

  1. page指令
  2. taglib指令
  3. include指令

指令的格式:

<%@指令名 属性名="属性值"%>

page指令

作用:

page是jsp中必须使用的一个指令,用于设置JSP上各种页面的属性,告诉tomcat如何将一个JSP翻译成Servlet

书写格式:

<%@ page 属性名="属性值" %>

示例:
<%@ page contentType="text/html;charset=utf-8" %>
//说明:声明jsp页面的编码方式   //response.setContentType("text/html;charset=utf-8") 

可以放在JSP中任何位置,一般建议放在页面的最顶部

taglib指令

作用:

用于在JSP页面中导入JSTL标签库

书写格式:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

解释说明:表示引入外部的jstl标签库的
prefix="c" 表示前缀
uri="http://java.sun.com/jsp/jstl/core" 表示jstl标签库的地址

include指令

作用:

在一个JSP页面中静态包含另外一个JSP页面

书写格式:

<%@ include file="URL" %>  //指定要导入页面的地址

使用示例:

需求:课后的原型中的页面放到web文件夹下面。然后打开主页index.jsp.在主页中引入header.jsp页面

<!--引入头部-->
<div id="header">
    <%@ include file="header.jsp"%>
</div>

JSP:page指令

page是jsp中必须使用的一个指令,用于设置JSP上各种页面的属性,告诉tomcat如何将一个JSP翻译成Servlet

语法格式:<%@page 属性名="属性值" %> //通常书写在页面的顶部

page指令属性:导包

导包属性:

<%@page import="java.util.*"%>   //导入java.util下所有类

作用:相当于导包

**方式1:**每个page指令导入一个类

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>

**方式2:**一个page指令的import属性导入所有的包,包之间使用逗号分隔

<%@page import="java.util.Date,java.text.SimpleDateFormat"%>

page指令属性:编码

编码属性:

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

作用:设置响应编码

response.setContentType("text/html;charset=UTF-8");

page指令属性:错误页跳转

相关属性:

<%@ page language="java"  errorPage="error.jsp"%>
    errorPage="错误页面的URL" : 用于指定如果当前页面出错,转发到哪个页面去

<%@ page isErrorPage="true"%>    
    isErrorPage="false":默认是false,指定true表示是错误页面
	当前这个页面是否是一个错误页面,错误页面可以多使用一个内置对象:exception

错误页面跳转的3种设置:
1、通过page指令的errorPage属性指定:如果页面出错,转发到error.jsp这个页面

<%@ page errorPage="error.jsp"%>

代码演示:

<%--跳转到错误页面--%>
<%@page errorPage="../error.jsp" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    int i = 1 / 0;
%>
    hello world
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--声明是错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>错误页面</h2>
    <%=exception.getMessage()%>
</body>
</html>

页面效果:
请添加图片描述
2、通过web.xml文件指定错误码:响应状态码为404则跳转到404.jsp页面
可以在web.xml进行配置跳转到更加好看一些的页面。

<!-- 指定错误页面 -->
<error-page>
	<!-- 指定错误码 -->
	<error-code>404</error-code>
	<!-- 出错以后跳转到哪个页面 -->
	<location>/404.jsp</location>
</error-page>

404.jsp页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <img src="/404.jpg"/>
</body>
</html>

3、通过web.xml文件指定错误类型:发生空指针,则跳转到null.jsp页面

<!-- 指定错误的类型 -->
<error-page>
	<exception-type>java.lang.NullPointerException</exception-type>
	<location>/null.jsp</location>
</error-page>

小结

属性名作用
language=“java”指定JSP页面使用语言
import=“java.util.Date”导入包:
1. 每个import包入一个包
2. 一个import导入多个包,使用逗号分隔
errorPage=“relative_url”当前页面出错,转发到哪个错误页面
isErrorPage=“true|false”当前是否是一个错误页面
contentType=“文档类型;charset=编码表名称”指定页面类型和编码,不指定会有乱码

补充知识点:JSP内置对象

  • 内置对象:在JSP页面中不需要获取和创建,可以直接使用的对象

  • JSP一共有9个内置对象

    内置对象名作用
    pageContext域对象(当前页面中共享数据)
    request域对象(一次请求中共享数据)
    session域对象(一次会话中共享数据)
    application域对象(整个web应用中共享数据) 【ServletContext】
    response响应对象
    page当前页面对象(Servlet)
    out输出对象(JspWriter)
    configServlet配置对象(ServletConfig)
    exception异常对象

EL:概述

EL概述

表达式语言(Expression Language)

lambda表达式
xpath路径表达式 (XML)
正则表达式

表达式: 以简短的符号表示复杂的内容

EL也是表达式的一种,EL全称: Expression Language(中文的意思是EL表达式)

EL作用:代替jsp中脚本表达式<%=输出内容%>的功能,简化对java代码的操作

书写语法:${表达式}

<%
    String msg = (String) request.getAttribute("msg");
%>

<div>
    <font color="red"><%=msg%></font>
    
    <!-- 使用EL表达式 -->
    <font color="red">${msg}</font>
</div>

EL表达式可以从域对象中取值

EL:jsp的四大域对象

jsp四大域对象

JSP的四大域对象指的是:page域,request域,session域,application域。使用EL表达式从这4个域对象中取值。

域对象信息:

域对象在EL中的对象名称在servlet中的对象名说明
page域pageScopepageContext,属于javax.servlet.jsp.PageContext类的对象page域指的是当前JSP页面,其中存储的数据只在当前页面有效,因为jsp本质是servlet,所以page域只在一个servlet中有效。
request域requestScoperequest,属于javax.servlet.http.HttpServletRequest接口的对象request域:一次请求或请求链中request域
session域sessionScopesession,属于javax.servlet.http.HttpSession接口的对象session域:一次会话过程中,session域
application域applicationScopeapplication,属于javax.servlet.ServletContext接口的对象application域:服务启动后整个项目对应的ServletContext域

小结

  • 在jsp页面中存在4个域对象:(从小到大排列)
    1. page域对象: pageContext
    2. request域对象: request //HttpServletRequest
    3. session域对象:session //HttpSession
    4. application域对象: application //ServletContext
  • jsp中的4大域对象,在EL表达式中的体现:
    • 页面域: ${pageScope.key}
    • 请求域: ${requestScope.key}
    • 会话域: ${sessionScope.key}
    • 应用程序域: ${applicationScope.key}

EL:el表达式从四大域中取值

EL表达式从域对象取值方式

​ EL表达式从指定的域中取值的方式如下:

域对象取值方式
page域${pageScope.key}
request域${requestScope.key}
session域${sessionScope.key}
application域${applicationScope.key}

小结

  • 在使用el表达式时,可以不用指定具体的域对象,直接使用:${key} ,此时就会依次从:pageContext 、request、session、application域中取出对应key的数据 (从小到大)

EL:el表达式从Cookie中取值

  • 问题:如何使用EL表达式,获取Cookie的值?
  • 答案: ${cookie.cookie中的name名称.value}

JSTL:jstl标签的应用

jsp页面引入标签库

在JSP页面中通过以下标签,通过taglib标签引入JSTL资源:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

注意:

  1. prefix:是jstl标签在使用的时候的前缀;
  2. uri:是标签库的资源路径;

c:if标签介绍

<c:if test="判断条件"></c:if> 标签的作用相当于java中的if判断语句

test:if的判断条件

c:foreach标签的属性

请添加图片描述
解释说明:

  • var:
    • 在不循环对象的时候,保存的是控制循环的变量;在循环对象的时候,保存的是被循环对象中的数据。就是集合或者数组中的数据
  • items:
    • 定要循环的对象。(就是数组或者集合名字)
  • varStatus:
    • 保存了当前循环过程中的信息(循环的开始、结束、步长、次数等)
  • begin:
    • 设置循环的开始。起始索引,例如 int i=0
  • end:
    • 设置循环的结束.就是结束的值。例如:i<=arr.length-1中的arr.length-1
  • step:
    • 设置步长——间隔几次循环,执行一次循环体中的内容。例如:i++

在使用<c:forEach>标签时,需要注意如下几点说明:

  1. 如果指定begin属性,其值必须大于或等于零
  2. 如果指定步长(step属性),其值必须大于或等于1
  3. 如果items属性的值为null,则要处理的集合对象为空,这时不执行迭代操作
  4. 如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作
  5. 如果指定的end属性的值小于begin属性的值,不执行迭代操作;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值