JAVA互联网架构学习之EL表达式&JSTL

来源:互联网 发布:在合肥找php工作好找吗 编辑:程序博客网 时间:2024/06/09 18:00

1.EL表达式

[1] 简介
> JSP表达式 <%= %> 用于向页面中输出一个对象。
> 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段。
> 使用EL表达式来代替JSP表达式 ,使用JSTL标签来代替JSP脚本片段。

> EL表达式用来向页面输出内容

getAttribute();//四个域对象都可以使用//作用不是接收请求参数,在使用getAttribute方法之前必须先使用setAttribute()将属性对方法域对象中;返回Object类型!

getParameter()://仅仅是request使用!用于接收请求参数【url,form表单中】;返回值String类型


[2] 基本语法
> ${表达式}


> EL表达式可以从域中获取属性。
- 使用 ${属性名}
- 如果只填写一个属性名,EL表达式会自动做全域查找。
 
- 所谓的全域查找,就是按照page request session  application四个域范围内分别,找到就返回属性,如果没找到什么都不返还。 
 
- 我们还可以指定去哪个域查找
pageScope
requestScope
sessionScope
applicationScope

- 例子:
查找request中属性
${requestScope.属性名}
查找session中的属性
${sessionScope.属性名}

- 注意:EL表达式只能获取域中的属性
EL表达式不能直接调用对象的方法

- 通过EL表达式读取对象的属性时,只需要${对象.属性名}
EL表达式会自动调用对象的对应的getter方法,通过将属性名首字母大写,然后加上一个get

注意:只要有属性,就可以一直点下去,也就说对象的属性是对象的话,我们也可以通过对象的属性的属性的方式调用!

- 当读取一些名字比较特殊的属性时,这种特殊值必须要指定域,例如属性名带-:
${requestScope['属性名']}



[3] 隐含对象
> EL中一共有11个内置对象。
- pageContext
类型 PageContext
它和JSP中pageContext是一个东西
作用 可以获取到JSP中其他的隐含对象

例如:可以获取项目名:
${pageContext.request.contextPath }


- pageScope
类型:Map<String,Object>
代表:page域中的属性
作用:可以获取到page域中的属性

- requestScope
类型:Map<String,Object>
代表:request域中的属性
作用:可以获取到request域中的属性

- sessionScope
类型:Map<String,Object>
代表:session域中的属性
作用:可以获取到session域中的属性

- applicatScope
类型:Map<String,Object>
代表:application域中的属性
作用:可以获取到application域中的属性


- param
类型: Map<String , String>
代表:用户发送的请求参数
作用:可以获取请求参数 
用法: ${param.参数名}

- paramValues
类型:Map<String , String[]>
代表:一个请求参数对应的多个值
用法: ${paramValues.参数名[索引]}

- header
作用:可以获取到用户发送的请求头
类型:Map<String , String>
例如:获取用户的系统信息 ${header['User-Agent']}

? - headerValues
类型: Map<String , String[]>
作用:可以获取一个头的多个值

? - initParam;
类型:Map<String , String>
作用:获取整个WEB应用的初始化参数

? - cookie
类型:Map<String , Cookie>
作用:用来获取Cookie




[4] 运算
> 在EL中可以直接使用运算符进行运算。

> 在EL中可以使用Empty元素符:
如果值为null , empty则返回 true
如果为空串, 则返回 true
空的集合    返回true

> 所以empty元素符经常用来判断集合或者字符串是否为空

2.JSTL(JSP Standard Tag Library)

[1] JSTL简介
> JSTL是JSP的标准标签库

> JSTL为我们提供了一些常用的标签,供我们日常开发使用(if 、 if...else 、遍历 、 日期格式化)

> 标签库
- core :核心标签库
- 最常用的一个标签库,也就是我们熟悉c标签。

- fn :函数标签库
- 函数标签库它需要结合EL表达式使用,主要定义了一些字符串操作的方法。

- fmt :格式化标签库
- 主要用来做日期、数字的格式化以及国际化
- 20151019 2015/10/19  10/19/2015
- 10000 10,000

- sql : 数据库标签库
- 主要用来在JSP中操作数据库的,已淘汰

- xml : xml标签库
- 主要用来在JSP操作解析XML文档,已淘汰

> JSTL的使用
使用JSTL需要先导入两个jar包
taglibs-standard-impl-1.2.1.jar   https://pan.baidu.com/s/1c8O7hk
taglibs-standard-spec-1.2.1.jar  https://pan.baidu.com/s/1cjghl0

[2] 核心标签库
- 导入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

- 核心标签库一般使用c作为前缀,所以我们也称核心标签库为c标签。
- c标签是我们JSTL中最常用的一个标签库,它里边封装了很多开发中常用的功能。
 
c:out
作用:向页面中输入一个内容,一般要结合EL表达式使用!
例子:<c:out value="" default="" escapeXml=""></c:out>
属性:
value : 要输出内容
default : 当内容为空时显示的默认值
escapeXml : 是否自动转义特殊字符,默认值为true 自动转义,一般不修改该属性

c:set
作用:向域中设置一个属性
例子:<c:set var="name" value="孙悟空" scope="request"></c:set>
属性:
var :向域中存储的属性名
value :向域中存储的属性值
scope :向那个域中添加属性,四个可选值(page request session application),默认是page

c:remove
作用:移除域中的一个属性
例子:<c:remove var="name" scope="session"/>
属性:
var :要移除的属性的名字
scope :要移除的属性所在的域,四个可选值(page request session application)
如果不设置该属性,则默认移除四个域中指定属性。

c:if
作用 :相当于java中if语句
例子:
<c:if test="${empty param.name }">
<h3>您没有输入name属性!</h3>
</c:if>
属性:
test :接收一个boolean类型的值
如果test的值为true则标签体执行
否则不执行标签体

c:choose c:when c:otherwise
作用:相当于if...else
例子:
<c:choose>
<c:when test="${param.score == 100 }">
<h3>恭喜您考了100分!</h3>
</c:when>
<c:otherwise>
<h3>恭喜你,你不及格!</h3>
</c:otherwise>
</c:choose>
属性:
when标签中的test属性:
接收一个boolean类型的值
如果test的值为true则标签体执行
否则不执行标签体

注意:在choose标签中可以指定多个when标签,但是只有一个when会执行。
当所有的when标签都不执行时,则otherwise标签执行。

c:when和c:otherwise不能脱离c:choose使用。


c:forEach
作用:可以在页面中对集合进行遍历
例子:
<c:forEach items="${list}" var="hero">
${hero} <br />
</c:forEach>

<c:forEach items="${map }" var="user">
${user.key} --- ${user.value} <br />
</c:forEach>
属性:
items:要遍历的集合
var:对集合中的对象引用的名字


注意:在遍历Map时,返回的是一组一组的键值对结构
我们可以通过对象.key获取键,通过对象.value获取值

作用:可以用来遍历一组数
例子:
<c:forEach begin="1" end="20" var="index" step="1">
<a href=#>${index}</a>
</c:forEach>
属性:
begin :开始的位置,注意begin不能小于0
end :结束的位置
var :引用的名字
step :步长,每次自增的大小

c:url
作用:可以创建一个完整的绝对路径
例子:
<c:url value="/index.jsp">
<c:param name="name" value="孙悟空"></c:param>
<c:param name="age" value="18"></c:param>
</c:url>
属性:
value:要设置的地址,注意该地址要以/开头,否则不会加上项目名
    在url标签中可以添加c:param标签,可以自动为地址拼接上请求参数。

c:redirect
作用:请求的重定向
例子:
<c:redirect url="/index.jsp">
<c:param name="name" value="唐僧"></c:param>
</c:redirect>
属性:
url:
重定向到目标地址,注意该地址不要自己添加项目名。

在redirect标签中可以添加c:param标签,可以自动为地址拼接上请求参数。

注意:redirect标签会自动为我们设置项目名,不需要我们手动设置!



设置绝对路径的三种方式:


1.<c:set var="ctx" value="${pageContext.request.contextPath }"></c:set>
使用这种方式,可以通过${ctx}在页面中代替项目名

2.使用<c:url value="/index.jsp"></c:url>
使用url标签,它会自动为绝对路径加上项目名

3.<base href="http://${pageContext.request.serverName }:${pageContext.request.serverPort }${pageContext.request.contextPath }/" />
使用base标签可以为页面中所有的相对路径,加上项目名

[3] 函数标签库

作用:函数标签库需要配合EL表达式使用,它里面的方法都是一些字符串的操作

引入函数标签库:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>


例子:

${fn:contains("hello","He") } <br /> 判断前一个字符串是否包含后一个字符串

${fn:containsIgnoreCase("hello","He") } <br /> 判断前一个字符串是否包含后一个字符串,不区分大小写

${fn:endsWith("hello","alo") }<br /> 判断前一个字符串是否以后一个字符串结尾

<!-- 自动将特殊字符转义 -->
${fn:escapeXml("<html></html>") }<br /> 自动将特殊字符进行转义

<!-- fn:join用于将一个String数组转换一个字符串,第二个参数代表的连接符 -->
${fn:join(strs,",") }<br /> 将一个String数组,以指定字符串拼接为一个新的字符串

${fn:split("a,b,c,d,e",",")[2] }<br /> 将一个字符串,以指定字符拆分为一个字符数组

${fn:trim("      abcd       ") }<br /> 去掉字符串的前后空格

剩下方法参照 alt+/

—— —— —— —— —— —— —— —— —— —— —— —— —— ——

今日所学

1.对EL表达式的使用方式、内置对象、运算符以及JSTL中的各种标签和c标签都进行了练习

2.解决了昨日的登录跳转问题,将登陆成功申请转发到查询表单servlet,再转发到主页,并在主页中使用EL表达式及c标签将查询结果输出到table中

3.制作了使用了EL表达式和c标签,并使用servlet发请求的书库增删改查页面。

今日问题

在初期尝试使用EL表达式输出集合对象时,EL表达式中不可以使用方法,使用get方法时一直失败,后用和数组样的形式并用.下去就成功运行

久坐尾椎骨非常疼,坐着疼站着也疼,公司的椅子的构造和桌子的高度比较反人类,预计下周买个腰垫


—— —— —— —— —— —— —— —— —— —— —— —— —— ——

今日讲的东西非常的基础,可以说是构造起jsp2.0的地基。我们需要把这些基础的东西搞懂记住,不能等用了再去翻API,再去百度,再去谷歌查法,罗马不是一天建成的,我们需要在最初的阶段就把一砖一瓦的工作练熟,提高以后的工作效率。EL表达式是非常便利的一种使用参数的方法,可以从请求中取出数据,也可以取前端的值,只要是我们可以将其命名的值并可以在当前页中获得的值,都可以通过EL表达式得到,之前我也使用过${"#id"}的方式获取input标签中的value,非常的方便。关于JSTL,昨天我有过疑惑,JSP中的java代码块十分的麻烦,影响编写也影响阅读,如此不便利的东西为何要使用。今日我的疑惑便迎刃而解了,果然学习不足知识短浅是会很大程度上局限自己的见识的。c标签的使用正如同java代码一样,判断、循环.....提供了我想要的所有简单的方法,还去掉了那些繁琐不美观的表达式。技术是动态的,是增长的,是美丽的。