JSP
1、概念
Java Server Pages :Java服务器端页面
可以理解:一个特殊的页面,既可以指定定义HTML标签,又可以定义Java代码
用于简化书写
本质是一个Servlet
与HTML的区别
HTML只能为用户提供静态数据
JSP技术允许在页面中嵌套Java代码,为用户提供动态数据
与Servlet的区别
Servlet很难对数据进行排版
JSP除了可以用Java代码产生动态数据额同时,也容易对数据进行排版
2、原理
3、基础语法
注释
显示注释:允许客户端看见,从HTML风格继承而来
隐示注释:客户端无法看见,从Java风格继承;JSP自己的注释
1、//注释,单行注释 /*多行注释*/
2、<!-- HTML风格的注释 -->
3、<%-- JSP注释 --%>
Scriptlet(脚本小程序)
所有嵌入在HTML代码中的Java程序
三种Scriptlet,都必须使用 Scriptlet 标记出来
- <% %>:Java脚本段,可以定义局部变量,编写语句
生成的代码在Servlet中的service方法体中 - <%! %>:声明,可以定义全局变量、方法、类
生成的代码在Servlet的类体中 - <%= %>:输出表达式,数据一个变量或具体内容
生成的代码在Servlet中的service方法体中,相当于out.print()输出
4、JSP的指令标签
1. include静态包含
格式:<%@ include file = "要包含的文件路径" %> <!-- 相对路径-->
特点:
1. 将内容进行了直接的替换
2. 静态包含只会生成一个源码文件,最终内容全在_JSPService方法体中(源码文件中)
3 .不能出现同名变量
4.运行效率高一些,耦合性较高,不够灵活
2. include动态包含
格式:<jsp:include page = "要包含页面地址"> <jsp:include>
特点:
1. 动态包含相当于方法的调用
2. 动态包含会生成多个源码文件
3. 可以定义同名文件
4. 效率高,耦合度低
注意:
当动态包含不需要传递参数时,include双标签之间不要加任何内容,包括空格,除非确认要使用参数,否则报错
使用动态包含传递蚕食
<jsp:include page = "">
<jsp:parm name="参数名" value="参数值"/>
<jsp:include>
name属性不支持表达式
value属性支持表达式
获取参数:
request.getParameter(name) 通过指定参数名获取参数
5、四大域对象
1、四种属性范围
- page范围
pageContext:只在一个页面中保存属性,跳转之后无效 - request范围
request:只在一次请求中保存,服务器跳转后依然有效 - session范围
session:在一次会话范围中,无论何种跳转都可以使用 - application范围
application:在整个服务器上保存
方法 | 类型 | 描述 |
---|---|---|
public void setAttribute(String name,Object o) | 普通 | 设置属性的名称及内容 |
public Object getAttribute(String name) | 普通 | 根据属性名称取属性 |
public void removeAttribute(String name) | 普通 | 删除指定的属性 |
2、属性范围的特点
- page
本页面取得服务器端跳转(jsp:forward)后失效 - request
服务器跳转有效,客户端跳转无效 - session
无论是客户端还是服务器端都可以取得,但是重新开启一个新的浏览器,则无法取得之前设置的session。 - application
所有的application属性直接保存在服务器上
在合理范围尽可能小,避免资源浪费
6、EL表达式
概念
EL(Expression Language)是为了使JSP写起来更加简单。
语法
语法结构:¥{expression}
EL表达式一般操作的都是域对象中的数据,操作不了局部变量
EL默认查找方式为从小到大查找
获取数据
1、获取域对象的值
${uname}
获取指定域对象的值
${pageScope.uname}
${requestScope.uname}
${sessionScope.uname}
${applicationScope.uname}
2、获取List
获取list指定下标的值
${list[下标]}
获取集合的长度
${list.size()}
注:
list代表的是限域变量名
3、获取Map
${map["key"]}或${map.key}
注:
map代表的是存在域对象中的变量名(限域变量名)
4、获取JavaBean对象
${user} 获取对象
${user.uname}或${JavaBean对象.get属性名()} 获取对象中的属性
5、empty
判断域对象是否为空
为空,返回true
不为空,返回false;
如果域对象是字符串:
不存在,空字符串,null:返回true
如果域对象是List:
null,没有长度:返回true
如果域对象是Map:
null,空map对象:true
如果域对象是JavaBean:
null:true
空对象:false
判断域对象不为空
${!empty 限域对象名}
EL表达式运算
1、等值比较
== 或 eq
${aa==bb}
${aa eq bb}
2、算术运算
加法:+
减法:-
乘法:*
除法:/或div
${a +b}
${a div b}
3、大小比较
大于: >
小于: <
大于等于:>=
小于等于:<=
${aa > bb}
7、JSTL
Java Server Page Standard Tag Libray(JSTL):JSP标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题
<%@taglib uri="" prefix="" %>
需要的jar包
standard.jar和jstl.jar
核心标签库
http://java.sun.com/jsp/jstl/core
包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等
条件动作标签
使用该标签先引入核心标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Java | JSTL |
---|---|
if、if…else | if |
switch…case…default | choose…when…otherwise |
if标签
if标签先对某个条件进行测试,如果该条件运算结果为true,则处理它的主体内容,测试结果保存在一个Boolean对象中,并创建一 个限域变量来引用Boolean对象。可以利用var属性设置限域变量名,利用scope属性来指定其作用范围。
<c:if test="<boolean>" var="<string>" scope="<string>">
....
1、标签操作的一般都是域对象
2、if标签没有else,如果想要else的效果,就需要设置两个完全相反的条件
</c:if>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var属性的作用域 可取值:page、request、session、application | 否 | page |
choose、when和otherwise标签
<c:choose>
<c:wen test="<boolean>">
...
</c:when>
<c:wen test="<boolean>">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
属性:
- choose没有属性
- when标签只有一个test属性,必须属性
- otherwise标签没有属性
注: - choose标签和otherwise标签没有属性,而when标签有一个必须的test属性
- choose标签中必须包含至少一个when标签,可以没有otherwise标签
- otherwise标签必须在最后一个when标签之后
- choose标签中只能有when标签和otherwise标签,而when标签和otherwise标签可以嵌套其他标签
- otherwise标签只有在所有的when标签都不满足情况下才运行
迭代标签
使用该标签先引入核心标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
forEach标签
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
</c:forEach>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
items | 要被循环的数据 | 否 | 无 |
forEach varStatus属性:
- **index:**从0开始的迭代索引时,本次的位置
- **count:**从1开始的迭代时,本次的位置
- **first:**用来表明当前这轮迭代是否为第一次迭代的标志
- **last:**用来表明当前这轮迭代是否为最后一次迭代的标志
<c:forEach begin="开始数" end="结束数" step="迭代数" var="限域变量名">
</c:forEach>
相当于
for(int i = 0 ; i < 10;i++){
}
格式化标签库
http://java.sun.com/jsp/jstl/fmt
用来格式化显示数据的工作,比如:对不同区域的日期格式化等
格式化动作标签
JSTL提供了格式化和解析数字和日期的标签,我们讨论里面有: formatNumber.、formatDate、parseNumber及parseDate.
使用该标签先引入格式化标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/fmt"%>
formatNumber标签
formatNumber标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
<fmt:formatNamber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要格式化的数值 | 是 | 无 |
type | number(数值型默认)、currency(货币类型)或percent(百分比类型)类型 | 否 | Number |
var | 限域变量名,用来接收格式化后的结果 | 否 | Print to page |
scope | var属性的作用域(page、request、session、application) | 否 | page |
注意:
- 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
- 默认的类型(type) 的取值为number。可取值: number数值型、percent百分比类型、 currency货币型
formatDate标签
<fmt:formatDate
value="<string>"
type="<string>”
datestyle="<string>"
timestyle="<string>"
pattern="<string>"
timeZone=" <string>"
var="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要格式化的日期 | 是 | 无 |
type | date、time或both | 否 | date |
dateStyle | full、long、medium、short或default | 否 | default |
timeStyle | full、long、medium、short或default | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
parseNumber标签
parseNumber标签用来解析数字,百分数,货币。(parseNumber 标签可以将数字、货币或百分比类型的字符串转换成数值型。)
<fmt:parseNumber
value="<string>"
type="<string>"
var="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要解析的数字 | 否 | Body |
type | number、currency、percent | 否 | number |
var | 存储待解析数字的变量 | 否 | print to page |
scope | var属性的作用域 | 否 | page |
parseDate标签
<fmt:parseDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
var="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | date、time、both | 否 | date |
dateStyle | full、long、medium、short、default | 否 | default |
timeStyle | full、long、medium、short、default | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 村吃格式化日志变量范围 | 否 | 页面 |