JavaWEB必知必会-JSP&EL&JSTL

本文详细介绍了JSP的基础知识,包括JSP的本质——Servlet转换,JSP的基本语法,如脚本、注释和指令,以及九大内置对象中的out对象和pageContext对象的使用。接着,文章讲解了EL表达式,包括其内置对象和作用域,以及如何从域中获取数据。最后,介绍了JSTL标准标签库的核心功能,如<c:if>和<c:foreach>标签的使用,展示了它们在条件判断和循环中的应用。
摘要由CSDN通过智能技术生成

目录

  1. JSP
  2. EL
  3. JSTL

1 JSP技术

1.1 什么是jsp?

1.2 jsp的本质

jsp在第一次被访问时会被Web容器翻译成servlet.执行过程:

被翻译后的servlet在Tomcat的work目录中可以找到

打开hello_jsp.java,会发现其中有这样一段代码:

由此可见,jsp的本质,其实就是一个Servlet.

1.3 jsp基本语法

1.3.1 jsp脚本:

jsp脚本元素
1)<%java代码%>: jsp Scriptlets
<%%>内部的java代码就相当于写在Servlet的service()方法中的代码.因此在里面声明的变量是局部变量.并且不能在里面定义方法.
2)<%=java变量或表达式> : jsp表达式
内部的代码就相当于使用了service()方法中的out.print().
3)<%!java代码%> jsp声明语句
内部的java代码用于声明成员变量,或者成员方法.由于Servlet线程不安全,所以我们一般也不会声明成员变量.在声明的方法中定义的变量是方法的局部变量.
代码演示

1.3.2 jsp注释

不同的注释可见范围是不同
1)Html注释:
可见范围 jsp源码、翻译后的servlet、页面显示html源码

  • jsp源码

  • html查看网页源码


翻译后的servlet

2)java注释://单行注释 /多行注释/
可见范围 jsp源码 翻译后的servlet
jsp源码

翻译后的servlet

3)jsp注释:<%–注释内容–%>
可见范围 jsp源码可见

1.4 jsp指令

jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:

  1. page
  2. include
  3. taglib

1.4.1 page指令

属性最多的一个指令,根据不同的属性,指导整个页面特性.但在实际开发中,page指定默认即可.
格式:<%@ page 属性名1= “属性值1” 属性名2= “属性值2” …%>
常用属性如下:

  1. language:jsp脚本中可以嵌入的语言种类
  2. pageEncoding:当前jsp文件的本身编码—内部可以包含contentType
  3. contentType:response.setContentType(text/html;charset=UTF-8)
  4. session:是否jsp在翻译时自动创建session
  5. import:导入java的包
  6. errorPage:当当前页面出错后跳转到哪个页面
  7. isErrorPage:当前页面是一个处理错误的页面

1.4.2 include指令

1.4.2.1 指令说明

页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=“被包含的文件地址”%>

1.4.2.2 案例演示

demo2.jsp

now.jsp

然后我们访问demo2.jsp,效果如下:

注意,虽然我们写了两个jsp.但是静态包含不会生成两个servlet.在tomcat的work目录下,只有demo2_jsp.java.

但是打开demo2_jsp.java查看源码,它是已经把now.jsp的代码合并到了一个Servlet中.

1.4.3 taglib指令

用于在jsp页面中引入标签库(jstl标签库、struts2标签库),后面详解.
格式:<%@ taglib uri=“标签库地址” prefix=“前缀”%>

1.5 jsp内置对象

1.5.1 jsp九大内置对象

jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中可以直接使用这9个对象.

名称类型描述
outjavax.servlet.jsp.JspWriter用于页面输出
requestjavax.servlet.http.HttpServletRequest得到用户请求信息,
responsejavax.servlet.http.HttpServletResponse服务器向客户端的回应信息
configjavax.servlet.ServletConfig服务器配置,可以取得初始化参数
sessionjavax.servlet.http.HttpSession用来保存用户的信息
applicationjavax.servlet.ServletContext所有用户的共享信息
pagejava.lang.Object指当前页面转换后的Servlet类的实例
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
exceptionjava.lang.Throwable表示JSP页面所发生的异常,在错误页中才起作用

这9个内置对象中,request,response,cofig,session,application(ServletContext)这5个对象前面已经讲啦,page和exception几乎不用.所以我们重点讲out对象和pageContext对象.

1.5.2 out对象

1.5.2.1 对象说明
out对象的类型是javax.servlet.jsp.JspWriter.他的作用与ServletResponse.getWriter()所返回的PrintWriter对象非常相似,功能都是用来向客户端发送文本形式的响应.不同的是out对象类型是JspWriter,是一种带缓存的PrintWriter.如下图:

1.5.2.2 案例演示

demo3.jsp

测试结果

由此可见,out对象通过write()方法写入数据后,一直要等到整个JSP页面结束,out对象中缓冲区的数据才会真正写入servlet引擎提供的缓冲区中.而PrintWriter对象的write()方法是直接把数据写入servlet引擎的缓冲区中.Servlet引擎按照缓冲区中的数据存放顺序,向页面输出内容.

1.5.3 pageContext对象

1.5.3.1 pageContext说明

pageContext与page不是一个对象,大家注意区分.pageContext对象是javax.servlet.jsp.PageContext类的实例.代表当前JSP页面的运行环境.我们可以通过他,来获取其他8个内置对象.如:
pageContext.getOut() : 获取JspWriter对象
pageContext.getRequest(): 获取ServletRequest对象
pageContext还提供了数据存储功能,也是一个域对象.提供了以下方法

方法参数中,name是属性名,value是属性值,而scope是存放的范围,有以下几个取值:

  • pageContext.PAGE_SCOPE:页面范围
  • pageContext.REQUEST_SCOPE:请求范围
  • pageContext.SESSION_SCOPE:会话范围
  • pageContext.APPLICATION_SCOPE:WEB应用范围
1.5.3.2 案例演示

demo4.jsp

测试结果

1.6 jsp动作标签

JSP动作标签用来控制JSP的行为,执行一些常用的JSP页面动作.通过动作标签可以实现多行Java代码才能够实现的效果,如包含页面文件,实现请求转发等.

1.6.1 动态包含

可以使用<jsp:include page=” 页面”>实现动态包含.
创建demo5.jsp,使用动态包含jsp:include标签引入now.jsp

页面显示的效果:

在tomcat的work目录下,查看生产的java源文件:

那动态包含和静态包含有什么区别?

  1. 动态包含要求被引入的资源是一个独立的,可以被Web容器单独执行的实体.而include指令只能引入遵循JSP格式的文件.
  2. 动态包含是将JSP与被引入的JSP先分别翻译为java源文件,然后分别编译,再在运行时期进行包含. 而静态包含则是将JSP的源代码进行合并后,再统一生产java源文件,再执行编译成一个class文件.

1.6.2 请求转发

可以通过jsp动作标签进行请求的转发.格式如下:
<jsp:forward page=“要转发的资源” />

2 EL技术

2.1 EL表达式概述

EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要简化jsp页面中脚本的编写.书写格式: ${表达式}

2.2 EL 内置对象

分类内置对象名称描述
作用域pageScopepage作用域
requestScoperequest作用域
sessionScopesession作用域
applicationScopeapplication作用域
请求参数param获得一个请求参数
paramValues获得一组请求参数
请求头header获得一个请求头
headerValues获得一组请求头
JSP上下文对象pageContext
全局初始化参数initParam
cookiecookie

2.2.1 作用域

分别往四个作用域中存储数据,然后通过EL取出来,输出在页面上.
EL-demo1.jsp

测试结果

2.2.2 请求参数

创建form.html,提供表单,提交路径为EL-demo2.jsp.然后在EL-demo2.jsp中获取表单数据.
使用param对象获取单个表单值
使用paramValues对象,获取多个值(数组)
form.html

EL-demo2.jsp

测试结果

2.2.3 请求头

使用EL内置对象header获取请求头参数
EL-demo3.jsp

测试结果

2.2.4 上下文对象

通过EL获取上下文对象,使用最多的场景就是获取项目名称.
EL-demo4.jsp

这其实就相当于:因为EL表达式的对象导航,其实是在调用对象的get()方法.

测试结果

2.2.5 全局初始化参数

在web.xml中设置初始化参数.

EL-demo5.jsp

测试结果

2.2.6 cookie

通过EL的cookie对象,可以获取所有cookie的数组.通过对象导航的方式,可以获得对应名称的cookie
EL-demo6.jsp

测试结果

2.3 EL从域中取数据

EL最主要的作用是获得四大域中的数据,格式${EL表达式}

  • EL获得pageContext域中的值:$(pageContextScope.key);
  • EL获得request域中的值:$(requestScope.key);
  • EL获得session域中的值:$(sessionScope.key);
  • EL获得application域中的值:$(applicationScope.key);
  • EL从四个域中获得某个值$(key);

2.3.1 没找到属性

EL表达式依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找. 如果没找到,返回空串,而不是null.

  • 测试结果

2.3.2 获取各种数据

使用EL表达式分别对多种数据进行获取.分别有:

使用EL进行取值.

测试结果

3 JSTL技术

3.1 JSTL概述

JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要提到jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库.

标签库标签库的URI前缀
Corehttp://java.sun.com/jsp/jstl/corec
I18Nhttp://java.sun.com/jsp/jstl/fmtfmt
SQLhttp://java.sun.com/jsp/jstl/sqlsql
XMLhttp://java.sun.com/jsp/jstl/xmlx
Functionshttp://java.sun.com/jsp/jstl/functionsfn

3.2 JSTL的使用

要使用JSTL,首先需要导入其核心包和依赖包.

然后在jsp页面中通过taglib指令,引入标签库. 我们使用最多的就是核心库.

目前开发中,最常用的两个标签是<c:if>和<c:foreach>标签

3.2.1 <c:if>

<c:if>标签可在jsp页面中进行条件判断.如果有多种条件,就必须写多个<c:if>标签,因为JSTL中没有给我们提供else标签.
JSTL-if.jsp

测试结果
num值为3的时候:

修改num的值为4,页面结果

3.2.2 <c:foreach>

<c:foreach>标签可以指定多个属性:

  1. items:用于指定要迭代的集合对象
  2. var:把当前迭代到的元素保存到page域中的名称.
  3. varStatus:当前迭代对象的信息保存到page域中的名称.
  4. begin:迭代的起始索引.从0开始计数.
  5. setp:迭代的增量,也就是步长.
3.2.2.1 基本使用

  • 测试结果

3.2.2.2 带序号的使用


测试结果

3.2.2.3 遍历Map


测试结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miracle_PHP|JAVA|安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值