1、JSP的引入
Servlet作用:用Java语言开发动态资源的技术
Jsp的作用:用Java语言(+html)开发动态资源的技术。Jsp就是Servlet
JSP的特点
- JSP的运行必须交给Tomcat服务器
tomcat的work目录:tomcat存放Jsp运行时的临时文件 - Jsp页面既可以写html代码,也可以写Java代码
(html页面不能写Java代码。而Jsp页面可以写Java代码)
2、JSP的执行过程
1)、访问到01.hello.jsp页面时,Tomcat扫描到jsp文件,在/work目录把jsp文件翻译成Java源文件 (翻译)
2)、tomcat服务器把Java源文件编译成class字节码文件 (编译)
(_01_hello_jsp.java -> _01_hello_jsp.class)
3)、tomcat服务器构造_01_hello_jsp对象
4)、tomcat服务器调用_01_hello_jsp类里面的方法,返回内容显示到浏览器。
第一次访问jsp页面:(1)->(2)->(3)->(4)
第二次访问:(4)
为什么jsp就是Servlet
jsp文件被翻译成Java源文件:_01_hello_jsp extends org.apache.jasper.runtime.HttpJspBase
HttpJspBase
类继承自HttpServlet
Servlet生命周期:
- 构造方法 (第一次访问)
- init() (第一次访问)
- service()
- destroy()
Jsp生命周期:
- 翻译:jsp->Java文件
- 编译:Java文件->class文件
- 构造方法
- init方法 _jspInit()
- service方法 _jspService()
- destroy方法 _jspDestory()
第一次访问:1)->2)->3)->4)->5)
第N次访问:5)
3、Jsp语法
1、格式
<%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8"%>
2、jsp表达式
作用: 向浏览器输出变量的值或表达式计算的结果
注意: 表达式的原理就是翻译成out.print(“变量” ),通过该方法向浏览器写出内容,表达式后面不需要带分号结束。
<%=变量或表达式%>
3、jsp脚本
<%
java 代码
%>
4、jsp声明
变量:成员变量
方法:成员方法
<%! 变量和方法 %>
5、jsp注释
<!-- html注释,会被解析到Java文件中并传到浏览器,在jsp中不能使用HTML注释容易出错 -->
<%-- jsp注释,不会被解析到Java文件中 -->
4、jsp的指令
1)include指令
作用:在当前页面包含其他页面
原理:把被包含的页面内容翻译到包含页面中并合成翻译一个Java源文件 静态包含。被包含页面中不需要出现html全局标签,只需要出现中的内容。
<%@include file="文件目录"%>
2)page指令
作用:告诉tomcat服务器如何翻译JSP文件
<%@ page
language="java" 告诉服务器是用什么动态语言翻译JSP文件
import="java.util.*" 告诉服务器Java文件使用什么包,多个包用逗号分隔
pageEncoding="utf-8" 告诉服务器使用什么编码翻译JSP文件,当没有其他编码设置时,下面编码也参考此编码,以及MyEclipse对于jsp的编码也参考此编码
contentType="text/html;charset=utf-8" 服务器发送给浏览器数据类型和编码
errorPage="error.jsp" 指示当前页面出错后跳转的页面(可以在web.xml中配置全局错误跳转页面)
isErrorPage="false" false表示不是错误处理页面,不能使用exception;true就是错误处理页面,可以使用exception对象
buffer="8kb" jsp页面的缓存区大小。
session="true" 是否开启session功能。false,不能用session内置对象;true,可以使用session内置对象
isELIgnored="false" 是否忽略EL表达式。
%>
web.xml中配置全局错误跳转页面(jsp中的errorPage 页面优先)
<!--服务器出错返回500 -->
<error-page>
<error-code>500</error-page>
<location>/common/500.jsp</location>
</error-page>
<!-- 当访问一个不存在页面时返回404错误 -->
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
3)、taglib指令
5、Jsp的内置对象
Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,而开发者只需要直接使用这些对象调用方法即可!,这些创建好的对象就叫内置对象!!!!
9大内置对象
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
其中request、response、config、context以及session和Servlet中对象一样
1)out对象
JspWriter类,相当于带缓存的PrintWriter(response.getWriter()
该方法返回PrintWriter)
缓冲区的大小就是上面page命令中设置的 buffer="8kb"
当满足以下条件之一,缓冲区内容写出:
- 缓冲区满了
- 刷新缓存区
- 关闭缓存区
- 执行完毕jsp页面
2)pageContext对象
pageContext对象的类型是PageContext,叫jsp的上下文对象,可以获取其他八个内置对象。是一个域对象
作用范围:在一个jsp页面内
6、jsp中域对象的使用
Servlet中含有三个域对象:ServletContext context域、HttpServletRequet request域、HttpSession session域 。在jsp中又增加一个域对象PageContext page域 。
这些域对象的作用主要用于保存共享数据。
pageContext.setAttribute("name");
默认情况下上述保存数据方式会将数据保存到pageContext域中
也可以指定数据保存到指定域中。
pageContext.setAttribute("message", "pageContext");
pageContext.setAttribute("message", "requset",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("message", "Session", PageContext.SESSION_SCOPE);
pageContext.setAttribute("message", "application", PageContext.APPLICATION_SCOPE);
获取域对象中数据时可以使用:
<%=pageContext.getAttribute("message", PageContext.PAGE_SCOPE) %>
也可以不指定域,则默认是在pageContext 中取数据。还可以使用下述方法取数据
<%=pageContext.findAttribute("message") %>
自动在四个域中搜索数据
顺序: page域 -> request域 -> session域- > context域(application域)