Jsp 的执行过程:
1、访问到jsp页面,tomcat 扫描到jsp文件,把%tomcat%/work把jsp文件翻译成java源文件
2、tomcat 服务器把java源文件编译成class字节码文件
3、tomcat 服务器构造jsp类对象,
4、tomcat 服务器调用jsp里面的方法,返回内容显示到游览器里面
注意:
1、jsp修改或者 被删除了,要走翻译和编译的过程
2、首次访问会编译,后面的访问不会编译
疑问:
为什么jsp就是servlet?
jsp继承了HttpJspBase,HttpJspBase继承了 HttpServlet ,所以jsp就是一个servlet。
Servlet 的生命周期:
1)构造方法
2)init方法
3)service方法
4)destroy方法
Jsp的生命周期
1)翻译:jsp-》java文件
2)编译:java文件-》class文件(servlet程序)
3)构造方法
4)init方法
5)service方法
6)destroy方法
JSP 语法:
模板:jsp页面中的html代码就是模板
语法:<%= "hello"%> <% 代码 %>
表达式:
表达式的原理就是翻译成out.write("变量");通过该方法向游览器写出内容;
表达式后不需要带分号
声明:
<% String a = "20" %> 局部变量
<% ! String b = "30" %> 全局变量
JSP的声明不能重复定义已经存在的方法
变量翻译成成员变量,方法翻译成成员方法
注释:
<! -- html 注释 --> 会翻译到页面上并且执行
<%-- jsp注释 -- > 不会翻译和执行
JSP 指令
Include 指令: 在当前页面包含其他页面
原理:把被包含的页面内容翻译到包含页面中,合并成翻译成一个java源文件,再编译运行,这种叫做静态包含
如果使用静态包含,被包含的页面中不需要出现全局的html标签了
page 指令
作用:告诉tomcat 如何去翻译jsp文件
<%@ page language = ''java'' --告诉服务器使用什么动态语言来翻译jsp文件
import = "java.util.*" -- 倒包
pageEncoding = "utf-8" --告诉服务器用什么编码翻译成java文件,同时编译成class文件
contentType="text/text charset=utf-8"
-- 服务器发送到游览器的编码方式,
相当于servlet 中的response.setContentType("text/html;charset=utf-8"):
errorPage: 指定当前页面的错误处理页面
isErrorPage:判断当前页面是不是错误处理页面 当值为true时,可以获取错误信息 <%=exception.getMessage%>
全局错误页面配置
< web-app>
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.jsp</location>
</error-page>
</web-app>
session: 是否可以使用sessin内置对象
buffer:jsp页面的缓存区的大小
isElIgnore :是否忽略EL表达式
Jsp的内置对象:
定义:HttpSession,ServletContext,ServletServletRequest类似的对象
已经创建好的,可以直接使用的对象,就是内置对象
共有9个:
内置对象名 | 类型 |
request | HttpServletRequest |
response | HttpServletResponse |
config | ServletConfig |
application | ServletContext |
session | HttpSession |
exception | Throwable |
out | JspWriter |
page | Object(this) |
pageContext | PageContext |
out对象:
类型:JspWriter类,相当于带缓存的PrintWriter
PrintWriter 直接向游览器写出内容
JspWriter 向缓存区写内容,缓存区默认大小8kb ,out.flush 刷新缓存区,out.getRemaining()剩余缓存区大小
pageContext对象:
pageContext :jsp的上下文对象
1、可以获取其他八个内置对象
在自定义标签的时候,PageContext对象会频繁使用
2、本身是一个域对象
pageContext.setAttribute("message","request 'smessage",PageContext.REQUEST_SCOPE);
request.getAttribute("message");
1、取数据原则,在哪个域中保存数据,就必须从哪个域中取
2、pageContext 作为域对象,可以往不同的域中保存对象
3、pageContext.findAttribute("message");
自动搜索,page -》 request -》 session-》context(application)
EL表达式:
jsp开发原则:尽量少写甚至不写java代码。
作用:向游览器输出域对象中的变量值或者表达式计算的结果
语法:${ var } 等价于 findAttribute
${pageScope.name} 从指定的域中获取
输出对象的属性值:
${ student.name } name指的是getName() 方法,而不是属性。
${ list[0].name } 等价于 ((List)pageContext.findAttribute("list")).get(0).getName()
${ map['100'].name } 等价于 pageContext.findAttribute("map").get("100").getName();
${10 + 5} 算数运算
${ name == null || name == "" } 等价于 ${emptyname}
标签:
作用:替换掉jsp的脚本
1、内置标签(动作标签):不需要在jsp页面的导入标签
2、jstl标签:需要在jsp页面中导入标签
3、自定义标签:开发者自定义
转发: <jsp:forward page = "/07.e12.jsp?name=eric" >
<jsp:param value="jacky" name="name"/>
</jsp:forward>
等价于 request.getRequestDispatcher("/09.action.jsp?name=eric").forward(request,response);
包含 :包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起
<jsp:include page =''/common/header.jsp''></jsp:include>
静态包含和动态包含的区别:
语法:
静态:<%@include file = ''被包含的页面''%>
动态:<jsp:include page=''common.jsp'' >
<jsp:param value =''lucy'' name = ''name''/>
</jsp:include>
区别:
静态包含不能向被包含页面传递参数,向合并再翻译
动态包含可以向被包含页面传递参数,先翻译再合并
JSTL标签库:javestandard tag libarary
核心标签库(c标签库)
国际化标签(fmt标签库)
el标签库(fn函数库)
xml标签库(x标签库)
sql标签库(sql标签库)
使用步骤:
1、导入jstl支持的jar包,
2、使用taglib命令导入标签库
<%@taglib uri="tld文件的uri名称" prefix="简写"%>
3、在jsp中使用标签
4、重点语句
保存数据 <c:set var="name"value="rose"></c:set>
${ name }
获取数据:<c:out value="${ name }"default="<h3>标题</h3>" escapeXml ="true"><c:out>
out标签:获取数据从域中
default:当value的值为null时,使用默认值
escapeXml:是否对value的值进行转义,false 不转,true 转
单条件判断<c:if test = "${10 > 5}">
条件成立
</c:if>
多条件判断:<c:choose>
<c:when test="${ score >=90 && score <= 100}">优秀</c:when>
<c:otherwise>其他</c:otherwise>
</c:choose>
循环数据:<c:forEach begin="0" end="2" step="1"items="${list}" var="stu" varStatus="varSta">
</c:forEach>
begin:开始元素
end:结束元素
step:步长
items:需要遍历的集合
var : 每个元素的名称
varStatus :当前正在遍历元素的状态元素 count属性:当前位置,1开始
特殊的字符串: str="java-php-net"
<c:forTokens item="${str}" delims="-"var="s">
${s}
</c:forTokens>
重定向: <c:redirecturl="http://www.baidu.com"></c:redirect>
JSP的缓存机制:
编码问题解析: