JSP
Java Server Page
一个特殊的页面,等于HTML+java代码
运行在服务端,实际不是页面,Tomcat中有一个用于处理url-pattern为 *.jsp的请求,会找到对应的jsp文件,将jsp文件转换成servlet类,在这个servlet中处理数据,并完成数据和html的组装,最后返回给浏览器一个组装完成的静态HTML页面
用于简化书写
JSP脚本
- <% code %> : 最后会出现在Servlet的service方法中,service方法中能执行什么代码,这里就能写什么代码
- <%! code %> : 最后会出现在Servlet中的定义成员变量的位置
- <%= code %>:相当于输出语句,会将code中的表达式,输出到页面上
JSP内置对象(一共有9个)
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,可获取其他8个对象 |
request | HttpServletRequest | 一次请求的request |
session | HttpSession | 一次会话的session |
application | ServletContext | 当前web应用的上下文 |
response | HttpServletResponse | 一次请求的response |
page | Object(this) | 当前Servlet对象 |
out | JspWriter | 输出流对象 |
exception | Throwable | 异常 |
out : 字符输出流,可以对页面进行输出。与response.getWriter()类似
- response.getWriter() 无论定义在什么地方,都会先于out输出,这是因为tomcat在输出时,会先找response的缓冲区,再去找jsp内置对象out的缓冲区。所以,response的缓冲区的数据,永远都会在out之前输出
- 所以在JSP页面中,尽可能用out,一致输出
JSP指令
<%@ 指令名称 属性1=值1 属性2=值2 ...%>
共有3种
- page : 用来配置JSP页面
- contentType:等同于response.setContentType
- import:导入java包
- errorPage:当前jsp执行java代码出现异常后,跳转到的页面
- isErrorPage:标识当前jsp页面是否是错误页面
- true:可以使用内置对象exception
- false:默认值,不可使用内置对象exception
- include:用来包含其他的jsp页面
- taglib:导入JSTL标签库等资源
EL表达式
-
定义:Expression Language 表达式语言
-
作用:替换和简化JSP页面中java代码的编写
-
语法:
${EL表达式}
-
注意
-
JSP默认支持EL表达式
-
若不想解析EL表达式,可以在JSP文件头加上
<%@ page isELIgnored="true" %>
这样整个页面的EL表达式都将被展示为字符串
也可以在EL表达式之前加上反斜杠,忽略单个EL表达式
\${4 > 3}
-
-
EL表达式的使用
-
做运算
-
算数运算符:
+ - * / mod
-
比较运算符:
> < >= <= == !=
-
逻辑运算符:
&& || !
或者and or not
-
空运算符:
empty
空运算符,主要用于判断字符串,集合,数组是否为null,长度是否为0
${empty list}
判断域中的一个名为list的属性值为null或大小为0时,该表达式为true${not empty list}
判断是否不为null,或长度>0
-
-
取值
-
EL表达式只能从域对象中获取值(JSP的内置对象中,只有4个对象是域对象)
-
语法
-
${域名称.键名}
从指定的域对象中获取键值-
域名称
- pageScope -> pageContext
- requestScope -> request
- sessionScope -> session
- applicationScope -> application
-
例子:在request域中存储了name=zhangsan
则
${requestScope.name}
则能拿到zhangsan。若EL表达式获取不到值,则表现为空字符串
-
-
${键名}
: 默认会依次从范围最小的域对象中查找是否有该键对应的值,直到找到为止。若在不同域对象中存储的键名都不同,则可以简化书写,不必指定域名称
-
-
获取对象中的属性值
${域名称.键名.属性名}
- > 本质上会调用对象的getter方法<% User user = new User(); user.setName("yogurt"); user.setAge(23); user.setBirthday(new Date()); request.setAttribute("user",user); %> <h3> 获取对象中的属性值 <!-- 同归对象的属性来获取 getter方法,去掉get,将剩余部分首字母变小写,就可以,类似于BeanUtils对类设置属性时的机制,它找的是set/get方法 --> </h3> ${user.name} ${user.age}
-
获取List中的值
${域名称.键名[索引]}
-
获取Map中的值
${域名称.键名.key名称}
${域名称.键名.["key名称"]}
-
-
EL表达式的隐式对象
共11个,类似于JSP的内置对象,学习1个就可以了
-
pageContext
类似于JSP的pageContext,可以直接获取JSP的其他8个对象
${pageContext.request.contextPath}
可以获取到项目的虚拟目录。动态获取虚拟目录。要记得,重定向是让客户端重新发起一次请求,故要添加虚拟目录。而转发是在服务端进行的,已经在项目的上下文中,其当前目录已经是虚拟目录了,故不需要设置虚拟目录
-
-
JSTL
-
概念:JavaServer Page Tag Library JSP标准标签库
- 是由apache组织提供的开源免费的jsp标签
-
作用:用于简化和替换jsp页面上的java代码
-
使用步骤:
-
导入JSTL相关jar包
-
引入标签库:用taglib指令
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
使用标签
-
-
常用的JSTL标签
-
if:相当于java的if语句
属性:
-
test:必填属性,接收boolean表达式(一般结合EL表达式)
若表达式为true,显示标签体内的内容
<c:if test="${not empty list}"> 开始遍历... </c:if>
注意if标签没有对应else,若要实现else,则需要再写一个if
-
-
choose:相当于java的switch语句
choose
when
otherwise
-
foreach:相当于java的for循环
属性
- begin 开始值
- end 结束值
- var 临时变量
- step 步长
- varStatus 状态,可以获取当前迭代的位置
-