浏览器: http://localhost:8080/day12/01.hello.jsp
第1次访问jsp时:
1)tomcat服务器把jsp文件翻译成java源文件(work目录下)_01_hello_jsp.java
2)tomcat服务器把java源文件编译成class字节码 _01_hello_jsp.class
3)tomcat服务器构造类对象(_01_hello_jsp)
4)tomcat服务器调用类对象的方法(_01_hello_jsp中的方法)
第n次访问jsp时:
1)tomcat服务器调用类对象的方法(_01_hello_jsp中的方法) 只走第4步
注意:
1)当jsp文件内容发送变化,那么会重新翻译和编译jsp文件。
2)如果java源文件和class字节码删除了,第一次访问jsp时,也会重新翻译和编译。
public final class _01_hello_jsp extends org.apache.jasper.runtime.HttpJspBase
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {
结论: Jsp就是一个servlet文件!!!
(servlet的知识点在jsp中全部适用,但jsp的部分知识点未必在servlet都能适用!!!)
Servlet的生命周期:
1)构造方法(第一次访问时)
2)init方法(第一次访问时)
3)service方法(第n次访问时)
4)destroy方法
Jsp的生命周期:
1)翻译成java源文件(第一次访问时)
2)java源文件编译成class字节码(已经是servlet类)(第一次访问时)
3)构造方法(第一次访问时)
4)_jspInit()方法(第一次访问时)
5)_jspService方法(第n次访问时)
6)_jspDestroy()方法
taglib指令主要是用于导入jsp的标签库。
include指令用于导入其他页面文件。
语法: <%@include file="导入的页面路径"%>
注意:
1)包含与被包含的页面先合并内容翻译到一个java源文件中,再编译执行一个java文件。(先合 并再翻译),叫静态包含(源码包含)
2)被包含的页面不要使用全局的html标签。(html/head/title/body)
page指令主要是用于告诉tomcat服务器如何翻译jsp文件。(jsp->java文件)
<%@ page
language="java" --告诉服务器以什么语言来翻译jsp文件
import="java.util.*" --导包。多个包用逗号分隔 java.util.Date,java.text.SimleDateFromat
pageEncoding="utf-8" --jsp翻译成java文件时使用的编码
contentType="text/html; charset=utf-8" --服务器返回给浏览器的数据类型和编码
jsp中涉及中文编码问题:
1)保存jsp文件时的编码(另存为)
2)jsp翻译成java文件时的编码(pageEncoding)
3)服务器输出到浏览器的数据编码(contentType)
注意:
1)contentType属性如果不写,会参考pageEncoding的编码
2)在ecplise中开发jsp,保存文件时的编码会参考pageEncoding编码
结论:
在ecplise中开发jsp文件,只需要在page指令中设置pageEncoding的属性即可解决中文乱码问题!!
错误页面相关的:
errorPage="error.jsp" --指定错误页面
isErrorPage="false" --指定当前页面是否为错误页面。如果是true,那么就可以是exception内置对象,如果false,则不能使用exception内置对象。exception用于得到错误信息。
全局错误页面配置:
在web.xml文件中设置
通常配置两种错误:404 500
404
/common/404.html
500
/common/500.jsp
buffer="8kb" --jsp页面的缓存区大小
session="true" --是否打开session功能。是否可以使用session内置对象
isELIgnored="false" %> --是否忽略EL表达式。false,不忽略,可以使用EL;true,不能EL
在Jsp的开发过程中,开发者会频繁地使用到一些对象,例如Request,Session对象,ServletConfig,ServletContext,如果每次要使用这些对象都要去创建或者调用方法去得到就比较麻烦。Sun公司为了更加方便开发者在jsp文件中直接得到这些对象,直接就帮我们创建或得到好了这些对象,开发者直接使用这些对象即可,这些直接可以使用的对象就叫内置对象!
对象名 对应的类型 备注
request HttpServletRequest 请求对象,封装请求信息
response HttpServletResponse 响应对象,封装响应信息
config ServletConfig servlet配置对象,封装servlet配置信息
application ServletContext servlet的上下文对象,代表整个web应用环境
session HttpSession 会话对象。用于保存会话数据
exception Throwable 异常对象,用于封装异常信息
page Object 代表当前jsp翻译成java类对象
out JspWriter jsp页面缓存对象,相当于带缓存功能的PrintWriter
pageContext PageContext jsp的上下文件对象,代表当前jsp的环境
1)包含了其他8个内置对象的引用
Jsp文件翻译的java类
publicclass _02_out_jsp{
public void _jspService(HttpServletRequest rquest, HttpServetResponse response){
HttpSessionsession;
ServletConfigconfig;
......
//Sun设计了一个PageContext对象,用于存放其他8个内置对象
PageContext pageContext;
//调用method1
method1(pageContext) }
public void method1(PageContext pageContext){
//要使用8个内置对象
pageContext.getSession();
pageContext.getRequest();
pageContext.getResponse();
......
}
}
以上情况,在自定义标签中频繁使用到!!!
作用: 保存数据和获取数据,清除数据
方法:
getAttribute()
setAttribute()
removeAttribute();
保存数据: 默认情况,保存到page域中 pageContext.setAttribute(name,object);
可以指定域保存 pageContext.setAttribute(name,object,int 域范围)
域范围:PAGE_SCOPE, REQUET_SCOPE, SESSION_SCOPE , APPLICATION_SCOPE
取出数据:
默认情况,从page域取出 pageContext.getAttribute(name);
可以指定域取出 pageContext.getAttribute(name,int 域范围)
域范围:PAGE_SCOPE, REQUET_SCOPE, SESSION_SCOPE , APPLICATION_SCOPE
从四个域中搜索:
pageContext.findAttribute(name);
搜索顺序: page域-> request域 -> sesion域->application域
page域:处于同一个jsp页面中数据共享是有效的!!
request域:处于同一个请求中数据共享是有效的!!(使用转发)
session域:处于同一个会话中数据共享是有效的!!(同一个session对象)
application域:处于同一个web应用中数据共享是有效的!!
在jsp显示数据,可以使用jsp表达式向浏览器输出数据。可以使用java脚本来执行业务逻辑。
建议:开发者在jsp页面中要尽量减少java代码,甚至不用java代码
EL表达式用于替代jsp页面中的jsp表达式。
Jsp标签用于替代jsp页面中的jsp脚本。
EL表达式的作用:用于向浏览器输出域对象中的变量和表达式计算的结果
(EL表达式必须要求数据放在域对象中的!!!!)
语法: ${变量或表达式}