Jsp的作用:用java语言(+html语言)开发动态资源的技术!!!
2.问题: 为什么Jsp就是servlet!!!
jsp翻译的java文件:
<span style="font-size:18px;">public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
HttpJspBase类:
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {</span>
结论: Jsp就是一个servlet程序!!!
servlet的技术可以用在jsp程序中
jsp的技术并不是全部适用于servlet程序!
Jsp的生命周期:
1)翻译: jsp->java文件
2)编译: java文件->class文件(servlet程序)
3)构造方法(第1次访问)
4)init方法(第1次访问):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
3.jsp语法:
⒈jsp脚本表达式:<%=变量或表达式%>
作用: 向浏览器输出变量的值或表达式计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束。
⒉jsp脚本片段:<%java代码 %>
作用: 执行java代码
注意:
1)原理把脚本中java代码原封不动拷贝到_jspService方法中执行。
2)单个脚本片段可以不完整,但整个jsp页面所有的脚本片段必须是完整的,遵循java语法。
⒊jsp声明:<%! 变量或方法 %>
作用: 声明jsp的变量或方法
注意:
1)变量翻译成成员变量,方法翻译成成员方法。
2)jsp声明不能使用九大隐式对象,九大隐式对象的作用域只在JspService()中。
⒋jsp注释:<%!-- jsp注释 --%>
注意:
1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。
4.jsp的三大指令: page include taglib(jsp指令不会做任何输出)
jsp指令基本的语法格式: <%@ page 属性名="值" %>
⒈page指令用于定义jsp页面的各种属性,无论page指令在jsp的任何位置,都作用于整个jsp页面。
<%@pagelanguage="java"告诉服务器使用什么动态语言来翻译jsp文件%>
extends="package.class"指定该jsp继承哪个类
import="java.util.*"导入jsp页面中所需的java包,默认导入lang包和javax.servlet包
session="true|false"默认为true,访问jsp页面时获取或创建session,若为false,则不自动创建session
并且手动创建session时需要导入session所有java包。
buffer="none|8kb|sieze kb" 设置jsp输出流缓冲区的大小,默认为8kb,使用out对象输出是先写到该缓冲区中,
设为none则直接输出给浏览器。
autoFlush="true|false"设置缓冲区满自动刷新,这个设置的是response.getWriter()输出流的缓冲区。
isThreadSafe="true|false" 设置线程安全问题,默认为false指线程不安全,设为true则表示线程安全,其实是
实现了SingleThreadModel接口。
info="text"
errorPage="uri|url"设置错误处理页面。
isErrorPage="true|false" 用来标记错误处理页面,默认为false指不是错误处理页面,若设为true则表示
该jsp是错误处理页面,调用时才会传入Exception对象,才能在jsp中调用这个对象。
contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
pageEncoding="utf-8" 告诉服务器使用什么编码翻译jsp文件(成java文件)
isELIgnored="true|false" 默认为false指将EL表达式按EL格式处理,设为true则表示EL表达式按字符串处理。
⒉include指令:用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,
那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的相对路径。 file属性的设置值必须使用相对路径,如果以“/”开头,
表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
细节:被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,
所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
动态导入:request.getRequestDispatcher("").include(request,response);这个是动态导入,
当使用到时,才会将另一个资源导入,并且会翻译成2个Servlet,效率低。
⒊taglib指令:用于导入标签库。
<%@ taglib uri="" prefix="" %>
5.jsp运行原理:1.每个jsp页面在第一次被访问时,web容器会将请求交给jsp引擎去处理,
jsp引擎先将jsp页面翻译成java源文件,2.再将源文件编译成class字节码文件,
3.构造该jsp页面类对象,4.调用其-jspService(),返回内容显示到服务器,
当第二次访问时,若服务器发现jsp页面没有改动,则直接调用其-jspService(),
返回内容显示到服务器,若发现jsp页面经过改动,则按第一步重新运行。
6.九大隐式对象:
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
Exception(要设置isErrorPage属性,才会将这个对象传入到jsp页面中)
注:JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令
的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法
返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能out对象的缓冲区已满
整个JSP页面结束
7.pageContext对象:
1)可以获取其他八个内置对象
2)本身是一个域对象
保存数据
1)默认情况下,保存到page域
pageContext.setAttribute("name");
2)可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)
#获取数据
1)默认情况下,从page域获取
pageContext.getAttribute("name")
2)可以从四个域中获取数据
pageContext.getAttribute("name",域范围常量)
域范围常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
3)自动在四个域中搜索数据
pageContext.findAttribute("name");(EL表达式默认使用的就是这个方法)
顺序: page域 -> request域 -> session域- > context域(application域)
4)引入和跳转到其他资源
pageContext中有forward 和include方法。