JSP
一个jsp页面在被访问的时候,会由jsp翻译引擎翻译为一个servlet文件去执行,向页面输出数据。
实验:寻找jsp对应的servlet文件→控制台→日志中c盘路径→work→找找找
模板元素
原本页面中的html内容被jsp引擎翻译为servlet
脚本表达式
<%=jsp表达式%>,其中可以填写一个直接量,或者是一个有返回值的表达式。脚本表达式被servlet引擎翻译为servlet文件后,以out.print的方法将表达式结果输出到页面中
脚本片段
<%脚本片段%>
脚本片段的内容会原封不动出现在servlet文件对应的位置,按照java代码执行,脚本片段书写时可以不完整,但是要保证可以拼接成完整的正确的java语句
JSP声明
<!%%> 成员位置
JSP注释
<%–注释–%>,被翻译到servlet文件时被抛弃掉了,找不到了,慎用。
<%//Java注释%>
JSP指令
本身不会产生任何输出,用于规定jsp引擎如何翻译jsp页面。
指令 | 形式 | 作用 |
---|---|---|
page | <%@page contentType=" " import= " " session="fasle" errorPage=" " pageEncoding=" " %> | 指定jsp翻译引擎属性 ,一个页面中可以出现多次,可以出现在页面中的任意一行。 |
include | <%@include file=" "%> | 引入页面 |
taglib |
隐式对象
直接在jsp页面获取与使用
原对象 | jsp隐式对象 |
---|---|
servlet | page |
request | request |
response | response |
servletconfig | config |
servletcontext | application |
session | session |
exception | exception |
out | out |
pageContext | pageContext |
pageContext
- 获取其他8个隐式对象 封装了8个get方法
- 便捷的请求转发
- pageContext.forward()
- 作为域对象使用
- 生命周期 访问jsp→结束访问jsp
- setAttribute getAttribute removeAttribute getAttributeNames
- 当前jsp页面共享数据
- 操作其他域中属性
<head>
<title>操作域中属性</title>
<%
//指定域中设置属性
pageContext.setAttribute("country","China",PageContext.APPLICATION_SCOPE);
//china在web应用范围,重启结束
pageContext.setAttribute("country", "US",PageContext.SESSION_SCOPE);
//session的范围,一次会话,关闭浏览器结束
pageContext.setAttribute("country", "UK",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("country", "Japan",PageContext.PAGE_SCOPE);
%>
<%=pageContext.getAttribute("country",PageContext.APPLICATION_SCOPE)%>;
<%=pageContext.getAttribute("country",PageContext.SESSION_SCOPE)%>;
<%=pageContext.getAttribute("country",PageContext.REQUEST_SCOPE)%>;
<%=pageContext.getAttribute("country",PageContext.PAGE_SCOPE)%>;
</head>
- 自动搜寻域
//在四个域中由小到大搜索指定名称的域属性
pageContext.findAttribute("country");
四大作用域
items | 作用范围与意义 | 生命周期 |
---|---|---|
ServletContext | 代表web应用,在整个web应用范围内共享数据 | Tomact加载web应用→被移除容器或者Tomcat服务器关闭 |
session | 代表会话的对象,在会话范围内共享数据 | request.getSession→session.invalidate主动 / 服务器意外关闭或服务器正常关闭–序列化到磁盘上(钝化)/ 超时关闭30min |
request | 代表请求的对象,整个请求链中共享数据 | 发出请求request对象创建→request对象销毁 |
pageContext | 代表当前jsp页面的对象,整个jsp页面内共享数据 | 访问jsp页面,pageContext对象产生→结束访问页面,pageContext对象销毁 |
标签技术 用html代替java语句
- 不能设置值,只能获取值
- 不能遍历值
el表达式
- ${ }←<%=jsp表达式%>
- 只能获取四个域中的属性
获取常量、变量
//常量
<%=123%>
${123}
//变量
<%=pageContext.getAttribute("name")%>
${pageScope.name}
<%=session.getAttribute("name")%>
${sessionScope.name}
<%=application.getAttribute("name")%>
${applicationScope.name}
<%=request.getAttribute("name")%>
${requestScope.name}
//自动搜寻域
<%=pageContext.findAttribute("name")%>
${name}
获取web应用的虚拟路径
<%=pageContext.getRequest().getContextPath()%>
${pagetContext.request.contextPath}
获取数组、链表、映射、JavaBean中的数据
插一嘴,不是缺省应用路径名要填完整
- 数组
<%
String[] arr = {"a","b","c"};
//要添加到域中才能获取
pageContext.setAttribute("arr",arr);
%>
${arr[0]}
- 链表
${list[1]}
- 映射
<%
Map map = new HashMap<String,String>();
map.put("name","张无忌");
map.put("wife","赵敏");
pageContext.setAttribute("map",map);
%>
${map["wife"]}
- JavaBean 封装数据提供方法
在一个类中提供私有化属性的get、set方法,一个私有化属性具有get、set就是javabean属性。
alt+ins shift选择
el表达式—获取计算结果
算术运算
${3/2}//1.5
${3+"2"}//5
逻辑运算 && || ! and or not
关系运算 > < == >= <= !=
empty null 空 ${empty str}
<%
Map map1 = new HashMap();
pageContext.setAttribute("map1",map1);
%>
${empty map1?"空的":"不是空的"}
el表达式的11个内置对象
作用域 | 意义 |
---|---|
pageScope | 代表page域的内置对象 |
requestScope | 代表request域的内置对象 |
sessionScope | 代表session域的内置对象 |
applicationScope | 代表servletcontext域的内置对象 |
请求头 | 意义 |
---|---|
header | 代表请求头的对象 |
headerValues | 代表一些请求头对象, |
请求参数 | 意义 |
---|---|
param | 代表请求参数的对象 |
paramValues | 代表一些请求参数对象 |
初始化配置参数 | 意义 |
---|---|
initParam | 获取指定名称的初始化参数 |
cookie信息 | 意义 |
---|---|
initParam | 获取指定名称的cookie值→Map<String,Cookie> |
item | 意义 |
---|---|
pageContext | 代表页面上下文的对象 |
补充
在el表达中 对于request对象,使用 setAttribute / getContextPath 这两种方法时,代表两个不同的request对象
- requestScope
- pageContext.request.contextPath
jstl
jstl可以设置修改值,用来弥补el表达式的缺陷
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- 设置 c:set
<c:set></set>
//设置变量
<c:set scope="request" var="name" value="zjn"></c:set>
${name}
//操作映射
<%
Map map = new HashMap<String,String>();
//要想获取值,要先将map放到域中
pageContext.setAttribute("map",map);
%>
//设置map的值
<c:set target="${map}" property="name" value="张无忌"></c:set>
${map.name}
//操作javabean,get,set方法已经省略
/*
public class Person {
private String name;
private int age;
private String addr;
public Person() {
}
public Person(String name, int age, String addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
}
*/
<%
Person p = new Person("周芷若",28,"峨眉派");
pageContext.setAttribute("person","p");
%>
<c:set target="${person}" property="name" value="赵敏" > </c:set>
${p.name}
- 删除值 c:remove
<%
pageContext.setAttribute("soldier","吕布");
request.setAttribute("soldier","典韦");
session.setAttribute("soldier","狂铁");
application.setAttribute("soldier","李信");
%>
<c:remove var="soldier" scope="session"></remove>
//如果不指定域,就全部删除了
<c:remove var="soldier"></remove>
${requestScope.soldier}
- 判断
<c:if test="条件">
条件<c:choose> <c:when test="条件">
条件要用${}括起来
<c:if test="${3>2}">test为判断条件,为true输出标签之间内容,为flase无内容输出</c:if>
<c:choose>
<c:when test="${1>2}"></c:when>
<c:when test="${1==2}"></c:when>
<c:when test="${1<2}"></c:when>
<c:otherwise></c:otherwise>
<c:choose>
- 遍历 forEach
<c:forEach begin="0" end="100" step="2" var="i">
${i}
</c:forEach>
//varStatus varStatus封装了当前遍历的状态
/*
current当前这次迭代的(集合中的)项
index当前这次迭代从 0 开始的迭代索引
count当前这次迭代从 1 开始的迭代计数
first用来表明当前这轮迭代是否为第一次迭代的标志
last用来表明当前这轮迭代是否为最后一次迭代的标志
begin属性值
end属性值
step属性值
*/
<c:forEach begin="0" end="100" step="2" var="i" varStatus="sta">
${stat.count}
${stat.index}
</c:forEach>
- 遍历数据结构
<%
List list = new ArrayList();
list.add("123");
list.add(123);
list.add(true);
pageContext.setAttribute("list",list);
%>
<c:foEach items="${list}" var="i">
${i}
</c:foEach>