JSP
jsp概述
由SUN公司提供的动态web资源的开发技术,看起来非常像html,但是可以在JSP页面中写java代码,所以JSP是一种动态web资源开发技术
JSP技术的由来
- JSP的出现是为了解决Servlet在响应时不适合向外输出页面的问题
- Servlet本质上是一段java代码,非常适合处理逻辑,但是不合适向外输出页面,如
response.getWriter().write("<font color='red'>用户名已存在</font>");
- HTML适合用来开发页面,展示数据,但是HTML开发出来的页面本质上就是一个文档,无法展示动态的数据。
- JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据
- 所以JSP可以解决既要处理逻辑又要向外输出页面的难题
- JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的页面,其实就是翻译后的Servlet在向外输出
JSP语法
JSP表达式
-
<%= 脚本表达式 %>
-
在翻译过来的Servlet中,计算表达式的值原样输出
JSP脚本片段
<% 若干java语句 %>
在翻译过来的servlet中,脚本片段被复制粘贴到对应位置执行
翻译前:
<% for(int i=0; i<5; i++){ %>
Hello JSP~~~~~<br/>
<% } %>
翻译后:
for(int i=0; i<5; i++){
out.write("\r\n");
out.write("\t\tHello JSP~~~~~<br/>\r\n");
out.write("\t");
}
-
多个脚本片段之间的变量可以互相访问
<%String username = "lili"%> <%=username%>
-
在某一个脚本片段中的java代码可以是不完整的,但是要求在翻译过来的servlet中整体的代码必须是完整符合java语法的
-
任何文本,HTML标记,JSP元素必须在脚本片段之外
JSP指令
<%@ 指令名称 若干属性声明... %>
如
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- 不会直接产生输出,用来指挥JSP解析引擎如何来翻译当前JSP页面中其他部分的内容
page指令
- 用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般情况下最好放在JSP页面的最前面
格式:<%@ page ... %>
page指令属性介绍
-
[ language="java" ]
— 当前JSP使用的开发语言 -
[ import="{ package.class | package.*}, ..." ]
— 导入需要使用到的包 -
可以在一个page指令的import属性中导入多个包 也可以通过多个page指令来分别导包
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="utf-8" isErrorPage="true"%>
-
[ session="true | false" ]
- 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在JSP中使用session隐式对象。
- 但是这将导致一旦访问JSP就会调用
request.getSession()
方法,可能导致不必要的空间浪费。 - 如果确定JSP中不需要session可以设为false (默认为true)
-
[ pageEncoding="characterSet | ISO-8859-1" ]
— 指定编码,同[ contentType="text/html;charset=UTF-8 ]"
include指令
<%@ include file="" %>
– 实现页面包含的效果
多个JSP文件翻译成一个servlet,最终由这一个servlet向外输出数据,这是源文件级别的包含
示例:引入头部JSP和尾部JSP
<%--引入头部--%>
<%@include file="_head.jsp" %>
<%--引入尾部--%>
<%@include file="_foot.jsp" %>
taglib指令
- 导入JSTL标签库文件
pageContext隐式对象
-
隐式对象:不用创建,可以直接获取
-
代表当前JSP页面的运行环境的对象
-
作用范围:当前JSP页面
PageContext对象功能:
- 作为入口对象获取其他八大隐式对象
getPage()
— 返回page隐式对象
getRequest()
— request隐式对象
getResponse()
— response隐式对象
getServletConfig()
— config隐式对象
getServletContext()
— 返回application隐式对象
getSession()
— session隐式对象
getException()
— 返回exception隐式对象
getOut()
— 返回out隐式对象
- 其他八大对象也可以直接使用,但是在el表达式中只能通过pageContext获取。
- 本身也是一个域对象
setAttribute(String name, Object obj)
getAttribute(String name)
removeAttribute(String name)
getAttributeNames()
- 生命周期: 访问JSP页面开始时创建, 访问JSP页面结束时销毁
- 作用范围: 当前JSP页面
- 主要功能: 在当前JSP页面中共享数据
四大域对象的作用范围大小排序:ServletContext
> Session
> request
> pageContext
四大作用域的比较
ServletContext: 代表整个web应用的对象,在整个web应用范围内都可以访问到
- 生命周期: 在服务器加载web应用之后立即创建,web应用被移出容器时销毁
- 作用范围: 整个web应用
- 主要功能: 在整个web应用范围内共享数据
Session:
- 生命周期: 第一次调用
request.getSession()
方法时创建,销毁包括超时(如果30分钟不使用session)、自杀(调用invalidate()
)、意外身亡(当服务器意外关闭时 - 作用范围: 一次会话范围内
- 主要功能: 在整个会话范围内实现数据的共享
request: 代表HTTP请求的对象
- 生命周期: 一次请求开始时创建,一次请求结束后销毁
- 作用范围: 整个请求链
- 主要功能: 在一次请求中共享数据(注册失败后转发回注册页面提示错误消息)
pageContext: 代表JSP运行环境的对象
- 生命周期: 在开始访问JSP时创建, 访问JSP结束时销毁!
- 作用范围: 在整个JSP范围内
- 主要功能: 在整个JSP范围内共享数据
JSP标签技术
-
在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成页面非常的混乱,难于维护
-
于是 sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐不要在JSP页面中出现任何一行java代码
EL表达式
EL表达式,可以非常方便替代JSP页面中的JSP表达式(<%= %>)
基本结构: ${ 表达式 }
-
EL只能获取不能设置
-
EL只能获取不能遍历
EL表达式提供了如下功能:
获取数据
-
获取常量: 支持 数字 / 字符串 / 布尔值, 整个el表达式的值就是当前常量的值
-
获取变量: el表达式可以获取变量的值, 在获取时它的底层会调用pageContext的findAttribute()方法按照由小到大的顺序在四大作用中搜寻指定名称的值, 如果找到就直接返回该值, 如果找不到就什么也不输出
-
获取数组中的数据: 可以通过 数组变量名[数字] 来获取域中数组中的内容
-
获取集合中的数据: 可以通过 集合变量名[数字] 来获取域中集合中的内容
-
获取web应用的名称:
${pageContext.request.contextPath}
<%--获取数据--%>
<%--1. 获取常量--%>
${"lili"}
${3+8}
<%--2.获取变量--%>
<%--EL表达式可以获取域中的变量--%>
<%--从小到大查找--%>
<%
String user = "lili";
request.getSession().setAttribute("user",user);
String[] users = {"root", "Sam", "Tom"};
request.getSession().setAttribute("users",users);
List<String> list = new ArrayList<String>();
list.add("水浒传");
list.add("红楼梦");
pageContext.setAttribute("books",list);
Map<String, String> map = new HashMap<String, String>();
map.put("root","root");
map.put("zss","123");
request.setAttribute("mysql",map);
%>
<%-- 获取域中的变量 --%>
user : ${user}
users[0]: ${users[0]}
books[1]: ${books[1]}
map: ${mysql}
<%--获取web应用的名称--%>
<%=request.getContextPath()%>
<%--等价于--%>
${pageContext.request.contextPath}
执行运算
-
算术运算
在El表达式中,加号只是一个运算符,不能作为连接符使用 -
关系运算
关系运算符得到的是boolean值> < >= <= != == gt lt ge le ne eq -
逻辑运算
逻辑运算符得到的是boolean值
&& and
/|| or
/! Not
-
三元表达式
表达式 ? "xx" : "xx"
-
empty运算:
判断对象是否为空
<%-- 运算符 --%>
<%-- +只能运算不能拼接--%>
${"abc"}${1+3} </br>
<%-- 三元表达式--%>
${3>2?"大于":"小于"}</br>
${empty books} <%--false--%>
获取常用开发对象
-
el中内置了11个常用对象,可以不用预先存入域中就可以使用
-
代表当前JSP页面环境的pageContext对象
(1) pageContext - 有了它就意味着el中就有了其他八大隐式对象
-
代表四大作用域的隐式对象, 用来明确指定从哪个域中查找数据
(2)
pageScope — pageContext
(3)
requestScope — request
(4)
sessionScope — session
(5)
applicationScope — ServletContext
-
上面这四个对象只能代表四大作用域对象身上的那个域
-
请求参数组成的map
(6)
param - Map<String, String>
-
获取cookie
(7)
cookie -- Map<String, Cookie>
<%--el内置对象--%>
${requestScope.mysql}
${sessionScope.user}
<%--获取请求参数--%>
<%--获取get请求或者post请求的参数-->
${param.username}
${param.password}
<%--获取cookie--%>
<%
Cookie c1 = new Cookie("username", "Potter");
response.addCookie(c1);
%>
${cookie.username.value}
JSTL标签库
为javaweb开发人员提供的一套标准通用的标签库,可以和el配合起来替换JSP页面中的大部分的java代码
JSTL标签库子库:
-
核心标签库 (core) — c
-
国际化标签 fmt
-
数据库标签 sql --Servlet JSP
-
XML标签 xml
-
JSTL函数(EL函数) fn
JSTL核心标签库:
首先,需要导入标签库:
-
导入jar包:
jstl.jar
&standard.jar
并添加为库 -
在jsp最上面加上如下代码:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
往四大域中存入属性
<c:set>
标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
<%--向四大域中存入数据--%>
<%--var: 表示存入域中的属性的key--%>
<%--value: 表示存入域中属性的value--%>
<%--scope: 表示往哪个域中存入数据--%>
<c:set var="host" value="127.0.0.1" scope="request"></c:set>
<%--获取属性 ${key}--%>
${host}
-
var用来声明属性的名字, value用来指定属性的值
-
scope指定将属性存入哪一个域中,不加的话,默认是在pageScope中;四个域分别是:page (pageContext) / request / session / application (ServletContext)
条件表达式
<c:if test=""> 标签可以构造简单的 “if-then” 结构的条件表达式
<c:if test="${empty user}">请登录</c:if>
<c:if test="${!(empty user)}">欢迎${user}回来</c:if>
循环
**<c:forEach> **标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
<%--遍历数组--%>
<c:forEach items="${books}" var = "book">
${book} <br/>
</c:forEach>
- items:将要遍历的集合对象