六、JSP & EL & JSTL

一、jsp介绍

jsp作用
jsp全称java server pages(java服务器页面),本质是一个servlet。
它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。

jsp作用:将内容的生成和显示进行分离
用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容

jsp原理

六、JSP & EL & JSTL_第1张图片
jsp原理.png

jsp脚本
有三个基本的脚本元素,作用是使JAVA代码可以直接插入到HTML代码中。
声明标签
格式:<%! int a = 1; %>
作用:声明的变量在类的成员位置上
脚本片断
格式:<% int a = 1; out.println(a); %>
作用:内容会生成在_jspService()方法中
脚本表达式
格式:<%= "hello " + a %>
作用:它就相当于是out.println()将内容直接输出到页面中,注意表达式不能以分号结尾

jsp注释
在jsp页面中可以使用三种注释

可以使用html中注释  

可以对jsp脚本内容使用java注释  
 //单行注释  /* 多行注释 */  /**文档注释*/
可以使用jsp注释(推荐)
<%--  jsp注释  --%>

二、 jsp指令

jsp指令介绍
当我们创建一个jsp页面时,在页面第一行有一段代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
这个就是指令,对于指令它有以下作用
a. 用于指示JSP执行某些步骤
b. 用于指示JSP表现特定行为

jsp指令格式
格式:
<%@指令名 attr1=”” attr2=””%>
注意:
其中attr1和attr2表示指令中的属性,通常我们将JSP指令写在JSP文件的的最上方,但是这不是必须的。

jsp指令分类
JSP中有三大指令,分别是以下三个:
page
include
taglib
其中这三个指令中,page是最复杂的,我们会详细讲解(导入类,编码的设置等等);include指令表示静态包含,我们之前学习的请求包含属于动态包含;taglib指令是用来导入标签库。

3. jsp指令-page

重点属性:
import
作用:在jsp页面上导包操作.
这个属性可以有多个.
pageEncoding
作用:指定当前jsp页面的编码。这个编码是给服务器看的,服务器需要知道当前页面的编码,否则服务器无法正确的把jsp翻译成Java文件。
contentType
在jsp文件中有如下指令:
<%@page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
其中contentType属性的作用等同于response.setContentType(“text/html;charset=utf-8”)的作用。response的setContentType()方法这里我们就不再多说,当我们在jsp文件中提供了contentType属性,那么jsp对应的java文件中就会存在response.setContentType(“text/html;charset=utf-8”)这句代码。contentType属性的默认值是“text/html; charset=ISO-8859-1”,但是我们知道iso-8859-1并不支持中文,所以我们需要将charset的值修改为“utf-8“。

pageEncoding与contentType的区别与联系
pageEncoding与contentType都是page指令的属性,它们都是用来设置编码,有如下联系:
如果这两个属性只提供了其中一个,那么没有提供的那个属性的编码值就是提供的这个属性的编码值,例如:在jsp页面中设置了contentType=”text/html;charset=utf-8”,那么没有设置的pageEncoding的值就为utf-8,反之亦然;
如果两个属性都没有提供,那么两者的默认编码就是ISO-8859-1。
根据对这两个属性的讲解,它们有如下区别:
pageEncoding是设置当前页面的编码,该编码是给服务器看的,可以让服务器正确的将jsp文件翻译成Java文件;
contentType有两个作用:一是设置响应字符流的编码,二是设置Content-Type响应头,即通知浏览器使用什么编码方式解码响应信息。

其他属性
language
代表在jsp脚本中可以写的语言, 只有一个值 java
extends
它用于设置jsp翻译后的java类的父类. 要求必须是HttpServlet或其子类.
session
面上是否禁用session。可取值为true/false 如果值为false,在页面上不能使用session。
isELIgnored
用是否忽略el表达式.可取值为true/false 如果值为true,那么页面上的el表达式就不会被解析.
autoFlush与buffer
用于设置jsp中out流的默认缓冲区大小以及是否自动刷新.
errorPage
设置错误页面,当jsp中如果出现了异常,会自动跳转到指定的错误页面
isErrorPage
指示当前页面是一个错误页面,这时就可以使用一个内置对象 exception
通过这个内置对象就可以获取异常信息.

4. jsp指令-include和taglib

include
作用
include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
格式
<%@ include file=“filename” %>
功能分析
包含的是目标文件的源码;包含过来,一起翻译
main.jsp中的代码

<%
      String s = “abc”;
%>
<%include file=“part.jsp” %>

part.jsp中的代码
<%=s %> 没有定义变量s
尽管part.jsp本身没有错误但是运行main.jsp就可以正确引入part.jsp

taglib
作用
作用:是用于导入标签库.
格式
<%@taglib prefix="" uri="" %>
uri 标签文件的URI地址
prefix 标签组的命名空间前缀

5. jsp内置对象

jsp九个内置对象及其类型

六、JSP & EL & JSTL_第2张图片
jsp九个内置对象及其类型.png

内置对象 类型
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
page this(Servlet)
pageContext PageContext
exception Throwable
out JspWriter

jsp九个内置对象的创建过程
我们可以创建一个demo1.jsp页面,启动服务器,在浏览器中访问 demo1.jsp页面,在tomcat下的work目录中查找到它翻译后的demo1_jsp.java文件,在java文件中我们可以查找到每一个内置对象的创建。

request,response这两个对象是jspService的参数

final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;

java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
  response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}

注意:exception对象只有在jsp页面上设置了page指令的isErrorPage才会有exception对象。

jsp中的四个域对象
jsp有四个域对象,分别是:
application:域范围是整个应用;
session:域范围是整个会话,注意一个会话中只有一个用户,如果要统计站点的访问次数,使用的域是ServletContext,因为这个时候统计的是多个用户,而非一个用户;
request:域范围是整个请求链;
pageContext:域范围是一个jsp页面,在一个页面中存数据再取数据没有任何意义,所以这里所说的域指的是在当前jsp页面和当前jsp页面中使用的标签之间共享数据。

6. jsp内置对象pageContext的作用

获取其他内置对象
可以通过pageContext对象获取jsp中其他的内置对象. PageContext类中定义了如下八个方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父类中定义的,有了这些方法,pageContext对象自然能够获取其他八个内置对象了。

操作四个域对象
pageContext也是一个域对象,所以他有以下方法:
void setAttribute(String name,Object value)
Object getAttribute(String name);
Void removeAttribute(String name);
我们还可以利用以下方法操作其他域中的对象:
Object getAttribute(String name, int scope);
该方法的第一个参数是域属性的名称,第二个参数指定是从那个域中取出域属性;
在PageContext中已经定义了如下几个静态常量作为scope的可选值:
int APPLICATION_SCOPE:表示从application域中获取数据;
int PAGE_SCOPE:表示从pageContext域中获取数据;
int REQUEST_SCOPE:表示从request域中获取数据;
int SESSION_SCOPE:表示从session域中获取数据。
void setAttribute(String name,Object value,int scope);
该方法的第一个参数指的是域属性的名称,第二参数指的是域属性的值,第三个参数指定域属性保存的域,scope的取值同上;
void removeAttribute(String name,int scope);
该方法的第一个参数指的是域属性的名称,第二个参数指的是将指定域属性从哪个域中移出,scope的取值同上;

便捷查询域中数据
PageContext类的父类中定义了如下方法:
Object findAttribute(String name):该方法是从jsp的四个域pageContext、request、session、application依次查找指定名称的域属性,如果找到就停止,这说明如果这四个域中存在同名的属性,那么返回的数据是从page范围中获取的。即表示谁的域范围越小,谁的优先级越高。

7. jsp动作标签

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

常用的jsp标签
jsp:forward
标签是用来做请求转发,它与RequestDispatcher接口的forward()方法一样,唯一不同的是它是在jsp页面中使用。
jsp:include
标签的作用使用来包含其他jsp页面,之前学习的include指令属于静态包含,而include动作标签是动态包含,它和RequestDispatcher接口的include()方法一样,是运行级别的包含
jsp:param
标签作为标签和标签的子标签,用来给转发或包含的页面传递数据。

静态包含与动态包含的区别

六、JSP & EL & JSTL_第3张图片
静态包含与动态包含的区别.png

include标签与inclue指令区别:

  1. include指令是静态包含,包含文件中包含了被包含文件的内容.
    include标签是动态包含,它包含的是被包含文件执行后的结果.

  2. include指令不能带参数
    include标签是可以带参数的

三、EL表达式

EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。EL表达式的格式如下:
${表达式}
EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。

EL表达式的作用
为了使JSP写起来更加简单,更加安全,可以通过EL表达式来替换我们jsp页面上的脚本
EL主要作用:

  1. 获取数据:
    EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
  2. 执行运算:
    利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
  3. 获取web开发常用对象
    EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
  4. 调用Java方法
    EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

EL表达式使用时注意事项
EL表达式是JSP 2.0(JavaEE1.4)规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
注意:有些Tomcat服务器如不能使用EL表达式
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
以下为jsp,servlet,javaee,jdk版本之间的对应关系

jsp javaee servlet tomcat jdk
Jsp2.0 javaee1.4 servlet2.4 tomcat5.x jdk1.4
Jsp.2.0/2.1 javaee5.0 servlet2.5 tomcat6.0 jdk1.5
Jsp2.1 javaee6.0 servlet3.0 tomcat7.x jdk1.6

1. EL表达式获取数据

表达式之域查找

  1. pageContext--------------------${pageScope.xxx}
  2. request--------------------------${requestScope.xxx}
  3. session--------------------------${sessionScope.xxx}
  4. application---------------------${applicationScope.xxx}
    通过el获取时,如果没有查找到,会返回"".除了上面的获取方式外还有一种,例如
    ${requestScope[“xxx”]}
    关于.与[ ]区别
    [ ]与.在使用方式上是一样的.但是如果名称中包含了"."等特殊字符,就必须使用[ ]来获取.
    例如
    request.setAttribute("login.message", "登录失败");
    ${requestScope.login.message} 错误的
    ${requestScope["login.message"] }正确的
    如果没有写范围,会默认从page,request,session.application依次查找

EL表达式获取复杂数据
获取数组中数据
例如:${数组名称[索引] }
获取List中数据
例如:${集合名称[索引]}
获取Map中数据
例如:${集合名称.key名称}

EL表达式之javabean导航
如果在域中保存的是javaBean对象,那么也可以使用EL表达式来访问javaBean的属性,因为EL表达式只做读操作,所以javaBean一定要为属性提供get方法,而对set方法没有要求。使用EL表达式获取javaBean属性就是javaBean导航。

3. EL表达式执行运算

常见的运算符


六、JSP & EL & JSTL_第4张图片
EL表达式执行运算.png

empty我们在开发中检查对象是否为null或“空”或判断容器size是否为0
注意事项:
1 .EL表达式支持三元运算符

  1. EL表达式不可以嵌套
    ${a+${b}}这种是不允许的。
  2. EL中的加号问题:
    EL表达式中加号两边必须是数字或者字符串形式的数字

4. EL表达式内置对象

EL表达式的11个内置对象。11个内置对象如下所示:
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
initParam
cookie
pageContext
其中,pageScope,requestScope,sessionScope,applicationScope是域相关的内置对象,这里我们就不再多说。这11个内置对象中,有10个内置对象的类型是Map类型,只有pageContext的类型不是Map类型,它的类型是PageContext。

pageContext
EL表达式的11个内置对象中,有10个内置对象的类型是Map类型,只有pageContext的类型是PageContext。它的使用类似于我们jsp的内置对象pageContext,. 通过pageContext对象可以获取其他内置对象的任意的属性值。
常用操作:${pageContext.request.contextPath}

关于请求参数相关内置对象的介绍
请求参数相关的内置对象是:
param:该内置对象的类型是Map,可以用来获取值为单值的请求参数,其中key指的是请求参数的名称,value指的是请求参数的值,使用param获取请求参数与request.getParameter()方法一样。
paramValues:该内置对象的类型是Map,可以用来获取值为多值的请求参数,其中key是参数名,value是多个参数值组成的字符串数组。

注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。

关于请求头相关内置对象的介绍
与请求头相关的内置对象是:
header:该内置对象的类型是Map,用来获取值为单值的请求头信息,其中key代表的是请求头名称,value代表的是请求头的值;
headerValues:该内置对象的类型是Map,用来获取值为多值的请求头信息,key代表的是请求头名称,value代表的是请求头的多个值。

关于全局初始化参数的内置对象的介绍
我们再学习Servlet时,讲过在web.xml文件中配置全局初始化参数,并且全局初始化参数可以使用ServletContext对象获取,现在在EL表达式中内置了一个与初始化参数相关的对象:
initParam:该内置对象的类型是Map,用来获取web.xml文件中标签的参数值,其中key代表的是参数名,value代表的是参数值。

关于cookie相关内置对象的介绍
EL表达式也内置一个名为cookie的对象,该内置对象与cookie相关,如下:
cookie:该内置对象的类型为Map,其中key是Cookie的名字,value是Cookie对象本身。

5. EL函数使用

EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是有JSTL提供的,JSTL我们会在后面的课程中详解。EL函数库就是定义了一些有返回值的静态方法,然后通过EL表达式来调用它们
在jsp页面中使用taglib指令导入EL函数库,就可以在页面中使用函数库中的方法。另外,导入的函数库可以使用的前提是,我们的项目中有相关的jar包

EL函数库使用
要使用EL函数库,首先要在jsp文件的上面使用taglib指令导入函数库:
<%@ taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions”%>
其中,uri的值并不是一个网络路径,只是在定义函数库时,拟定的一个位置。
下面我们来了解EL函数库中的相关方法,具体如下:
String toUpperCase(String input):把字符串参数转换成大写,并返回;
String toLowerCase(String input):把字符串参数转换成小写,并返回;
int indexOf(String input, String substring):返回input中substring出现的索引位置;
boolean contains(String input, String substring):查看input中是否包含substring,包含返回true,否则返回false;
boolean containsIgnoreCase(String input, String substring):在忽略大小写的情况下,查看input中是否包含substring,包含返回true,否则返回false;
boolean startsWith(String input, String substring):判断input是否是以substring为前缀,如果是就返回true,否则就返回false;
boolean endsWith(String input, String substring):判断input是否是以substring为后缀,如果是就返回true,否则就返回false;
String substring(String input, int beginIndex, int endIndex):以beginIndex为开始值,endIndex为结束值,在input上截取子串;
String substringAfter(String input, String substring):获取input中,substring所在位置后面的字符串;
substringBefore(String input, String substring):获取input中,substring所在位置前面的字符串;
String escapeXml(String input):把input中“<”、“>“、”&“、”'“、“"”进行转义;
String trim(String input):去除input中的前后空格;
String replace(String input, String substringBefore, String substringAfter):将input中的substringBefore替换成substringAfter;
String[] split(String input, String delimiters):以delimiters为标识分割input,返回一个字符串数组;
int length(Object obj):可以获取字符串、数组、各种集合的长度!
String join(String array[], String separator):将array数组中的元素以separator连接起来,返回一个字符串。

示例代码


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>



<%
    String[] strs = {"a", "b","c"};//定义一个字符数组
    List list = new ArrayList();//定义一个list集合
    list.add("a");//向集合中添加一个字符
    pageContext.setAttribute("arr", strs);//将字符数据以arr的名字保存在page域中
    pageContext.setAttribute("list", list);//将list集合以list的名字保存在page域中
%>
    ${fn:length(arr) }
${fn:length(list) }
${fn:toLowerCase("Hello") }
${fn:toUpperCase("Hello") }
${fn:contains("abc", "a")}
${fn:containsIgnoreCase("abc", "Ab")}
${fn:contains(arr, "a")}
${fn:containsIgnoreCase(list, "A")}
${fn:endsWith("Hello.java", ".java")}
${fn:startsWith("Hello.java", "Hell")}
${fn:indexOf("Hello-World", "-")}
${fn:join(arr, "-")}
${fn:replace("Hello-World", "-", "+")}
${fn:join(fn:split("a;b;c;", ";"), "-")}
${fn:substring("0123456789", 6, 9)}
${fn:substring("0123456789", 5, -1)}
${fn:substringAfter("Hello-World", "-")}
${fn:substringBefore("Hello-World", "-")}
${fn:trim(" a b c ")}
${fn:escapeXml("")}

四、 JSTL

1. JSTL标签介绍

jstl标签库介绍
JSTL(JSP Standard Tag Library,jsp标准标签库)是Apache对EL表达式的扩展,也就是说JSTL依赖EL表达式。JSTL是标签语言,使用起来非常方便。但是它不是jsp内置的标签,所以用的时候需要我们自己导包,以及指定标签库。
如果你使用Myeclipse开发javaweb,那么把项目发布到Tomcat时,你会发现,Myeclipse会在当前工程的lib目录下存放jstl的jar包,如果没有使用Myeclipse开发,那么就需要自己导入这个jstl的jar包:jstl-1.2.jar。

jstl标签库功能介绍
Jstl标签库一共包含了四大标签库:
core:核心标签库,这是我们学习的重点;
fmt:格式化标签库,用的很少;
sql:数据库标签库,这个标签库已经过时,本文档不再对其进行介绍;
xml:xml标签库,这个标签库已经过时,本文档不再对其进行介绍。
另外Jstl标签库中还包含了jstl函数。

如何使用jstl标签库
除了jsp动作标签外,使用其他第三方的标签都需要做以下两件事:
a. 导入jar包;
b. 在使用标签的jsp页面中使用taglib指令导入标签库。
例如:
在jsp页面导入jstl的核心标签库:
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core”%>
其中:
prefix="c":指定标签库的前缀,这个前缀可以赋任意的值,但大家都会在使用core标签库时指定前缀为c;
uri="http://java.sun.com/jsp/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件。

jstl核心标签库标签介绍
JSTL core标签库中 12个标签

  1. c:out 输出内容到浏览器端
  2. c:set 设置值到四种数据范围,设置四个范围中java对象的一个属性值
  3. c:remove 用来删除四个数据范围的数据
  4. c:catch 捕获程序异常
  5. c:if 取代页面中if条件语句,记住没有c:else
  6. c:choose c:when c:otherwise 一起使用 ,取代if elseif else 结构 、switch-case 结构
  7. c:forEach 取代页面中for循环
  8. c:forTokens 切割字符串
  9. c:import 效果和include类似
  10. c:url 完成URL重写 (禁用cookie的session追踪 ) ---- 结合c:param完成 中文URL编码
  11. c:redirect 完成请求重定向
  12. c:param 设置参数 一般和c:url,c:redirect或者c:import一起使用.
    重点: c:if c:foreach c:set

2. JSTL核心标签

c:set
格式1:设置域中属性的值

例如:

格式2:设置域中对象属性的值

例如:

c:if
作用:页面上的逻辑判断
格式:

注意:
scope 用来表达式结果存放的域
若指定了标签的scope属性,则必须指定var属性
例如:


        三大于四


        三不大于四

c:choose与c:when c:otherwise
作用:用于指定多个条件选择的组合边界,它必须与标签一起使用。使用三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
格式:



语句


语句

 

例如:


    
        
            周1
        
        
            周2
        
        
            周3
        
        
            周4
        
        
            周5
        
        
            周6
        
        
            周7
        
        
            你估计来自火星
        
    

c:forEach

  1. begin属性
    设置循环变量从几开始

  2. end属性
    设置循环变量到几结束;

  3. step属性
    设置循环变量的步长

  4. var属性
    定义一个变量,用于接收循环或把数组或集合中遍历的每一个元素赋值给var指定的变量

  5. varStatus属性
    varStatus属性就是用来记录循环状态的,它可以创建一个循环变量vs,该循环变量有如下属性:
    count:用来记录循环元素的个数;
    index:用来记录所循环元素的下标;
    first:判断当前循环的元素是否是第一个元素;
    last:判断当前循环的元素是否是最后一个元素;
    current:代表当前循环的元素。

  6. items:属性
    指定要循环的变量,可以是一个数组也可以是一个集合,默认是支持EL表达式

  7. c:out
    格式:

    例如:
    在域中有
    username=”jack

    显示的效果为 超链接的jack

  1. c:remove
    作用:移除域中的属性
    格式:

    例如:


    注意:
    scope不写的时候,会把所有域中的同名的属性删除掉.

  2. c:catch
    作用:
    用于捕获嵌套在标签体中的内容抛出的异常
    格式:


...

例如:


        <%
            int i=0;
            int j=1;
            double k=j/i;
        %>
    
    
        将异常输出
  将异常信息输出
  1. c:forTokens
    作用:用指定的分隔符切分指定内容
    格式:


例如:


    
        ${a }-
    
  1. c:import
    作用:用于在JSP页面中导入一个URL地址指向的资源内容,其作用有点类似这个JSP标准标签
    最基本的使用

  2. c:url
    作用:用于在JSP页面中构造一个URL地址
    格式:

    例如:

  3. c:redirect
    作用:主要应用于重定向
    例如:

  4. c:param
    作用:在地址栏后面设置参数,一般和c:import ,c:url,c:redirect一起使用
    例如:


    
    

你可能感兴趣的:(六、JSP & EL & JSTL)