写在前面:
原理 | jsp--java--class--使用 |
脚本 | <% service方法 %> <%! 成员 %> <%= out.print() %> |
内置对象 | pageContext request response out session page exception config application |
注释 | <!-- --> <%-- --%> |
指令 | <%@指令 属性列表 %> page:contentType、language、errorPage、isErrorPage、buffer、import include:file taglib:prefix、uri |
${表达式} \${表达式} |
运算(符号/英文)、[not] empty |
${域名.键名} ${键名} 域:pageScope、requestScope、sessionScope、applicationScope |
${对象.属性} ${ list[index] } ${ map.key } ${ map['key'] } |
隐式对象:(四个域)、pageContext |
if | test |
choose | when、otherwise |
for | items、begin、end step、var、varStatus s.index、s.count |
1. JSP
介绍:
JSP:Java服务端页面,用于简化书写;修改后不用重启tomcat
tomcat作出响应前,会先找response的缓冲区,再找out的缓冲区
原理:
浏览器访问a.jsp;服务器找是否有这个a.jsp资源
如果有:将.jsp文件转成.java文件;编译.java文件,生成.class字节码文件;由字节码文件提供访问
因此,JSP本质是Servlet
JSP脚本:JSP定义Java代码的方式
方式一:<% Java代码区 %> -----在service方法中
方式二:<%! Java代码区 %> -----在成员位置(成员变量、成员方法、静态代码块等)
方式三:<%= Java代码区 %> -----在service方法的out.print(" ")中
JSP内置对象9个:(不需要创建和获取,直接使用---因为service方法中都有创建)
pageContext:当前页面共享数据,可获得其它八个对象
request:请求
response:响应
out:(JSPWriter)将数据输出到页面 .print .write
session:服务端会话技术
page:(Object)当前页面(servlet)
config:(ServletConfig)servlet的配置对象
exception:(Throwable)
application:(ServletConfig)域对象
指令3个:
用于配置jsp页面、导入资源文件
格式:<%@指令名 属性列表 %>
page:配置;
----------contentType 设置响应体的MIME类型和字符集,设置当前页面的编码
----------buffer 缓冲区大小,默认8kb
----------language 语言(java)
----------import 导包
----------errorPage 发生错误后跳转到的页面
----------isErrorPage 标识这个页面是不是错误页面,默认false,设为true时可以使用exception对象
include:导入页面;
----------file 要导入的页面
taglib:导入资源;需要先在WEB_INF下的lib文件夹下导入标签库的jar包
----------prefix 自定义的前缀
----------uri 标签的位置
注释:
<!-- --> 应用于html内容,这个注释会被发送到页面
<%-- --%> 应用于整个jsp,这个注释不会被发送到页面
2. EL表达式
介绍:
替换和简化JSP页面的java代码
JSP默认支持EL表达式;在page中设置isELIgnored='true' 则EL不被解析
语法:
格式:${表达式}
忽略单个EL表达式:\${表达式}
运算:
算数:3/4 , 3 div 4
比较
逻辑:&& , || , ! , and
空运算符:empty list , not empty str ;用于判断字符串集合数组等是否为null并且长度是否为0
取值:
只能从域对象中取值:${域名.键名}
域对象从小到大依次:pageScope、requestScope、sessionScope、applicationScope
${键名} :表示依次从最小的域中找是否有该键的值,直到找到为止;没有找到会显示空字符串
取值---对象:
${对象.属性名} :其实是执行对象的getter方法
-----逻辑视图:可以在类中定义getAb方法,使用${类对象.ab}获得getAb的返回值
list:${list[index]} (下标越界什么都不显示,不报错)
map:${map.key} ${map['key']} (单双引号到可以)
取值---隐式对象11个:
pageScope、requestScope、sessionScope、applicationScope
pageContext 也是一个隐式对象(也是JSP的内置对象),可以获得其它八个JSP内置对象
动态获取虚拟目录:${pageContext.request.contextPath}
3. JSTL
介绍:
JSP标准标签库;免费开源
用于替换和简化JSP页面的Java代码
使用:
导jar包:javax.servlet.jsp.jstl.jar、jstl-impl.jar(位置在WEB-INF的lib下,别忘了add as library)
引入标签库:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用标签:<c:标签 属性列表> </c:标签>
举例:<c:if test="true">abc</c:if>
常用标签:
if 的属性:test(必有):接受boolean表达式,如果为true,则显示标签体内容
choose:相当于switch(when--case、otherwise--default)
for 的属性:begin开始位置,end结束位置,var变量,step步长,varStatus循环状态对象;
items对象
<c:if test="true">abc</c:if>
<hr>
<%
int n = 1;
request.setAttribute("n", n);
%>
<c:choose>
<c:when test="${n>0}">${n}是正数</c:when>
<c:when test="${n<0}">${n}是负数</c:when>
<c:otherwise>${n}是零</c:otherwise>
</c:choose>
<hr>
<c:forEach begin="0" end="10" var="i" varStatus="s" step="2">
${i}
${s.index} <%-- 索引,从0开始 --%>
${s.count} <%-- 循环次数,从1开始 --%>
<br>
</c:forEach>
<hr>
<%
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="i">
${i}
<br>
</c:forEach>
<hr>