JSP的基本原理
什么是JSP
- jsp是一种用来开发动态web资源的技术。
- jsp的最大特点在于写jsp就像写html,但html只能提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据
JSP原理
- IE浏览器访问jsp页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)
JSP页面中的java代码服务器是如何执行的?
(先找到jsp页面,然后tomcat会生成一个jsp对应的java文件编译成class字节码的文件。然后加载class字节码文件,调用jsp的service方法。然后产生结果,并且把结果写回到client)
Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?
(Out输出流,代码打印输出到Client)
Web服务器在调用jsp时,会给jsp提供一些什么java对象?
JSP最佳实践
- 我们习惯于把Servlet作为web应用中的控制器组件来使用,而把jsp作为数据显示模板来使用
- Servlet只负责响应请求产生数据,并且把数据通过转发技术带给jsp,数据的显示jsp来做
JSP语法
JSP模板元素
- JSP页面中的HTML内容称之为JSP模板元素
- JSP模板元素定义了网页的显示基本骨架,即定义了页面的结构
JSP表达式
- 语法:<%= 变量或表达式字符串常量 %>
举例: <%= new java.util.Date()%> - JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print()将数据输给客户端
- JSP脚本表达式中的变量或表达式后面不能有分好(;)
JSP脚本片段
- JSP脚本片段用于在JSP页面中编写多行java代码
<%
多行java代码
%> - JSP脚本片段中只能出现java代码,不能出现其他模板元素
JSP引擎在翻译JSP页面时,会将其中的java代码原封不动的放到Servlet的_jspService中。 - 脚本片段中的多行java代码,最终被翻译到jspservice的方法体中
- 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
- 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
JSP声明
- JSP页面中编写的所有代码,默认会翻译到Servlet的service方法中,而JSP声明中的java代码被翻译到_jspService方法的外面。语法:
<%!
java代码
%> - 所以,JSP声明可以用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法
- 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明汇总
- JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象
什么是隐式对象?
JSP的隐式对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。
JSP注释
- JSP注释的格式:
<%– 注释信息 –%> - JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。
JSP指令
- JSP指令是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分
- JSP指令的基本语法格式
<%@ 指令 属性名=“值”%>
举例:
<%@ page contenttype=“text/html,charset=gb2312”%> - 如果一个指令有多个属性,那么这多个属性可以写在一个指令中,也可以分开来写
page指令
- page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session=“true | false” ]//true创建session对象
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ]
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet | ISO-8859-1" ]
%>
Include指令
- include指令用于引入其他JSP页面,如果使用include指令引入的其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个Servlet。所以include指令引入同城也称之为静态引入
- 语法:
<%@ include file=“被包含组件的绝对URL或相对URL”%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。 - 被引入的文件必须遵循JSP语法
- 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
- 由于使用include指令将会设计到2个JSP页面,并会把2个JSP翻译成一个Servlet,所以这2个JSP页面的指令不能冲突(除了pageEncodeing和导包除外)
JSP运行原理和九大隐式对象
- JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
- 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
- JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
- request: HttpServletRequest
- response: HttpServletResponse
- config: ServletConfig
- application :ServletContext
- exception: Throwable
- Session:HttpSession
- page: this Object
- out
out隐式对象用于向客户端发送文本数据
out对象是通过调用怕个Context对象的getOut方法返回的,其作用和用法和ServletResponse.getWriter方法非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中: - 设置page指令的buffer属性关闭了out对象的缓存功能
- out对象的缓冲区已满
整个JSP页面结束
pageContext