目录
- JSP
- EL
- 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包括三大指令:
- page
- include
- taglib
1.4.1 page指令
属性最多的一个指令,根据不同的属性,指导整个页面特性.但在实际开发中,page指定默认即可.
格式:<%@ page 属性名1= “属性值1” 属性名2= “属性值2” …%>
常用属性如下:
- language:jsp脚本中可以嵌入的语言种类
- pageEncoding:当前jsp文件的本身编码—内部可以包含contentType
- contentType:response.setContentType(text/html;charset=UTF-8)
- session:是否jsp在翻译时自动创建session
- import:导入java的包
- errorPage:当当前页面出错后跳转到哪个页面
- 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个对象.
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息, |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.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源文件:
那动态包含和静态包含有什么区别?
- 动态包含要求被引入的资源是一个独立的,可以被Web容器单独执行的实体.而include指令只能引入遵循JSP格式的文件.
- 动态包含是将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 内置对象
分类 | 内置对象名称 | 描述 |
---|---|---|
作用域 | pageScope | page作用域 |
requestScope | request作用域 | |
sessionScope | session作用域 | |
applicationScope | application作用域 | |
请求参数 | param | 获得一个请求参数 |
paramValues | 获得一组请求参数 | |
请求头 | header | 获得一个请求头 |
headerValues | 获得一组请求头 | |
JSP上下文对象 | pageContext | |
全局初始化参数 | initParam | |
cookie | cookie |
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 | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
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>标签可以指定多个属性:
- items:用于指定要迭代的集合对象
- var:把当前迭代到的元素保存到page域中的名称.
- varStatus:当前迭代对象的信息保存到page域中的名称.
- begin:迭代的起始索引.从0开始计数.
- setp:迭代的增量,也就是步长.
3.2.2.1 基本使用
- 测试结果
3.2.2.2 带序号的使用
测试结果
3.2.2.3 遍历Map
测试结果