jsp主要是为了解决Servlet程序输出html页面代码过于繁琐的事情~
在我们第一次访问jsp页面的时候 tomcat会在work/catalina/目录下产生jsp.java和class文件,可以发现jsp就是Servlet
jsp头部文件声明(page指令):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
上面是jsp文件的头声明。表示这是jsp页面。
language属性 值只能是java。 表示翻译的得到的是java语言的
contentType属性 设置响应头contentType的内容
pageEncoding属性 设置当前jsp页面的编码
import属性 给当前jsp页面导入需要使用的类包(可以导入java类~)
autoFlush属性 设置是否自动刷新out的缓冲区,默认为true
buffer属性 设置out的缓冲区大小。默认为8KB
errorPage属性 设置当前jsp发生错误后,需要跳转到哪个页面去显示错误信息
isErrorPage属性 设置当前jsp页面是否是错误页面。是的话,就可以使用exception异常对象,如果不加入的话, 错误处理文件就被当作正常文件处理, 这样的话,假定服务器端出错, 返回的状态码应该是 “500”, 但是因为出错后转到了错误处理页面并把出错页面当作正常页面返回给客户端,返回的 http status code 就变成了 200, 这样客户端就没有办法发现问题。而加入 isErrorPage="true"后, 错误处理页面会被当作出错页面处理, 返回的状态码"500"会原封不动的返回到客户端,利于客户端发现问题。
session 属性 设置当前jsp页面是否获取session对象,默认为true
extends 属性 给服务器厂商预留的jsp默认翻译的servlet继承于什么类 我们一般不做更改
jsp中的三种脚本:
1声明脚本:<%! %>
1定义全局变量 <%! private int i = 111; %>
2定义静态代码块<%! static {map = new HashMap()} %>
3定义方法 <%! public int a(){} %>
4定义内部类<%! public static class A{} %>
2表达式脚本:在jsp页面中输出数据<%=表达式 %> 会转换成out.print进行输出,被翻译之后在jspService方法中,并且你可以使用jspService方法中的对象(例如request)
1输出整型 <%=123 %>
2输出浮点型<%=12.12 %>
3输出字符串<%="sss"%>
4输出对象<%=map %>
3代码脚本:<%代码 %> 就是写java代码的地方 也可以使用request等在jspService方法里面的对象
一般可以表达式脚本和代码脚本嵌套使用进行输出:
<%for(int i =0;i<10;i++){ %>
<%=i %>
<%} %>
jsp三种注释:
1html注释:会被翻译到_jspService方法,然后以out.write输出到客户端
<!-- html注释 -->
2java注释:翻译后会被翻译到java源代码中
//java注释
3jsp注释:会被完全忽略掉~
<%-- 这是jsp注释--%>
**
jsp9大内置对象
**
1request 请求对象
2response 响应对象
3pageContext 当前jsp上下文对象
4session 会话对象
5applicatoin ServletContext对象
6config ServletConfig对象
7out 输出流对象
8page Object对象
9exception 异常对象
**
jsp四大域对象
**
1application(ServletContext) 作用域:整个web工程(只要服务器不停止 数据都会存在)
2session(HttpSession) 作用域:一次对话期间,浏览器打开到关闭期间
3request(HttpServletRequest) 作用域:每次请求,用tomcat服务器创建
4pageContext(pageContext) 作用域:jsp上下文(即同一个jsp页面中)
**
OUT和response:
**
out有自己的缓冲区 response有自己的输出缓冲区
调用flush可以刷新out缓冲区
1按正序把out的内容写到out缓冲区
2按正序把response的内容写到response输出缓冲区
3把out缓冲区的数据刷新追加到response缓冲区中
4把response缓冲区的数据刷新输出到客户端
jsp页面中我们一般用out进行输出 源码也是用out进行输出
out--[write print]:
write:可以输出字符串
print:可以输出任意数据
**
静态包含
**
<%@ include file="/" %> 因为jsp会翻译成java代码 所以/表示到工程名
注意: 直接把被包含的页面代码复制过来 只会翻译包含其他页面的jsp页面 被包含的jsp页面不会被翻译
静态包含适用于只输出html页面的jsp
静态包含发生在:JSP---->java文件阶段。
**
动态包含
**
<jsp:include page="">
<jsp:param value="xxx" name="aaa"> 把参数放到request域中 可以传递给子页面
</jsp:include >
1 包含页面把request response out输出对象传递给被包含的页面 所以公用同一个out缓冲区~
2 会把全部的jsp页面都翻译成为Servlet程序 然后再通过JspRuntimeLibrary.include(request response out)调用被包含的jsp页面的内容
动态包含适用于 被包含的jsp页面中包含了大量的java代码的
动态包含发生在:执行class文件阶段。动态加入。
**
请求转发
**
<jsp:forward page="/..."> </jsp:forward> 功能跟request.getRequestDispatcher一样
在jsp页面当中转发统一使用这个~
**
EL表达式:替代表达式脚本
**
${key}可以代替表达式脚本在jsp页面中输出域对象或者自定义对象的数据,比jsp表达式脚本更简洁,并且输出null值时输出空串
四个域都同时存在相同的key的域数据的时候 EL表达式会从小到大搜索四个域找到就输出
输出自定义对象的时候需要写好get方法
**
jstl标签库:替代代码脚本
**
引入:
JSTL由五个不同功能的标签库组成。
功能范围 URI 前缀
核心标签库--重点 http://java.sun.com/jsp/jstl/core c
格式化 http://java.sun.com/jsp/jstl/fmt fmt
函数 http://java.sun.com/jsp/jstl/functions fn
数据库(不使用) http://java.sun.com/jsp/jstl/sql sql
XML(不使用) http://java.sun.com/jsp/jstl/xml x
在jsp标签库中使用taglib指令引入标签库
CORE 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
XML 标签库
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
FMT 标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL 标签库
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
FUNCTIONS 标签库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
i.
<c:set scope var value /> 往域中保存数据 默认是page(即pageContext)
<c:set target="${map}" property value /> 修改域中的javaBean对象的某个属性或修改域中map对象的某个key的值。
ii. <c:if />
相当 于 if 语句判断。
<c:if text="${判断条件}">如果条件满足就输出这里的内容</c:if>
iii. <c:choose> <c:when> <c:otherwise>标签
是多路判断,相当于switch-case-default
<c:choose>
<c:when test="${}"></c:when>
<c:when test="${}"></c:when>
<c:when test="${}"></c:when>
<c:otherwise></c:otherwise>
</c:choose>
这个标签使用有几个需要注意的点:
1不能使用html注释 会报错~
2c:when标签的父标签一定要是c:choose
iv. <c:forEach />
做遍历(循环)
例子1:输出1到10
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
例子2:遍历map集合
<c:forEach items="${requestScope.map}" var="entry"> 这里也可以利用begin 和 end设置开始和结束的索引 step 设置遍历的步长
${entry} 输出键值对
${entry.key} 输出键
${entry.value} 输出值
</c:forEach>
foeEach还有一个 varStatus 属性的使用
**
自动跳转
**
用页面头信息 <meta http-equiv="Refresh" content="3;URL=${xxx}/index.htm"> 来设置三秒后自动跳转