一、JSP简介
1.1 JSP是什么?
JSP是动态网页开发技术,也就是说网页里的数据不再是死的,与数据库会互动数据。
JSP的代码是以在HTML中镶嵌java的代码,HTML生成静态内容,java生成动态内容。
JSP中的HTML代码称为模版元素,java代码称为JSP脚本片段。
1.2 JSP的优点
(1)可以直接在HTML网页中动态嵌入元素,性能更加优越
(2)服务器调用的是已经编译好的JSP文件
(3)拥有强大的企业级Java API
(4)JSP页面可以与处理业务逻辑的servlet一起使用
(5)编写和修改HTML网页比较容易,不需要在servlet中使用大量的输出语句
(6)JSP开发的web应用可以跨平台使用
1.3 JSP的缺点
(1)JSP技术极大的增加了产品的复杂性.为了获得 系统的跨平台功能和产品伸缩能力,java系统开发了多种产品,如,JRE,JDK,J2EE,EJB,JSWDK,JavaBeans ,只有有效地将它们组合在一起,才能产生强大的功能.(部署有难度)
(2)java的高效率运行需要占用大量的内存和硬盘空间. 一方面,java的高速运行是通过 .class文件常驻内存来实现的.另一方面,还需要硬盘空间来存储一系列的.java 文件和.class文件以及对应的版本文件.(硬件要求高)
(3)JSP程序调试困难.JSP页面执行时, 首先被转换为 .java文件(Servlet), 然后将.java文件编译为字节码文件. 这样,出错信息实际上指向的是转换后的那个.java文件(Servlet), 而不是JSP本身. (调试有难度)
1.4 JSP的处理流程
(1)浏览器发送一个HTTP请求
(2)web服务器将请求传递给JSP引擎
(3)JSP引擎将JSP文件转化成servlet
(4)JSP引擎将servlet编译成可执行类,并将请求传递给servlet引擎
(5)servlet引擎载入并执行servlet类,生成HTML格式的输出并嵌入到HTTP响应中,上传给web服务器
(6)web服务器以静态HTML网页的形式将HTTP响应返回到浏览器
1.5 JSP的生命周期
JSP的生命周期就是从创建到销毁的整个过程。与servlet的生命周期类似,只是还包括将JSP文件编译成servlet的阶段。
1、编译阶段
当浏览器请求JSP页面时,JSP引擎首先会检查是否需要编译这个JSP文件。只有在该文件从没有被编译过,或在上次编译之后有过变更,才会编译该文件。
编译过程包括三个步骤:解析JSP文件、将JSP文件转化成servlet、编译servlet
2、初始化阶段
加载编译生成的servlet类,调用jspInit()方法进行初始化,如建立数据库连接或打开文件等。和servlet一样,程序一般只初始化一次。
3、执行阶段
调用_jspService()方法,处理与请求相关的交互行为。该方法在每个请求中被调用一次并产生与之对应的响应。
4、销毁阶段
调用jspDestroy()方法执行清理工作,如释放数据库连接或关闭文件等。
1.6 JSP运行原理及过程?
-本质上jsp只是一个带有.jsp后缀的脚本语言文件,并不能直接在jvm(虚拟机)上运行,所以需要将其转换为一个Servlet类,才能通过jvm解释执行:
1)客户端发送请求到服务器,web容器通过jsp引擎将jsp文件转换为一个Servlet类源文件(.java)(如果是第一次访问或jsp文件被修改过,那么将会重新转换为一个新的Servlet类)
2)转换过来的Servlet类进一步被java编译器编译成字节码文件(.class)
3)字节码文件被系统类加载器装载到jvm上,开始初始化、执行
三、JSP注释
1、HTML注释:
2、JSP注释:<%-- 注释内容 --%>
注:它们有一个区别,HTML注释内容在网页中查看源代码时可以看见,而JSP注释内容看不见,且JSP注释可能会阻止java代码的执行。
四、基本语法
1、脚本程序
脚本程序包含任意的Java语句、变量、方法或表达式。任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
<% %>
2、JSP声明
声明语句可以声明任意变量、方法,供后面的Java代码使用。
<%! declaration; %>
3、JSP表达式
表达式的值先被转化成String,再将其插入到表达式所在的地方。
<%= expression %>
4、JSP注释
可以为代码行注释,也可以为代码块注释。
<%-- annotation --%>
5、JSP指令
用来设置与整个JSP页面相关的属性。JSP有三种指令标签:page、include和taglib。
5.1 page指令
定义页面的依赖属性,提供当前页面的使用说明,如脚本语言、error页面、缓存等。
<%@ page attribute="value" %>
与page指令相关的属性:
·buffer,指定out对象使用的缓冲区大小
·autoFlush,控制out对象的缓冲区
·contentType,指定当前页面的MIME类型和字符编码
·errorPage,指定当页面发生异常时转向的错误处理页面
·isErrorPage,指定当前页面是否可以作为其他页面的错误处理页面
·extends,指定servlet继承的类
·import,导入使用的Java类
·info,定义页面的描述信息
·language,定义页面使用的脚本语言,默认是Java
·session,指定页面是否使用session
·isThreadSafe,指定页面的访问是否为线程安全
·isELIgnored,指定是否执行EL表达式
·isScriptingEnabled,指定脚本元素能否被使用
5.2 include指令
通过该指令来包含其他文件,被包含的文件如同页面的一部分,会被同时编译执行。
<%@ include file="name" %>
指令中的文件名实际上是一个相对的URL地址,默认是当前路径。
5.3 taglib指令
引入标签库,可以是自定义标签。
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
6、JSP行为
JSP行为标签是一些预定义的函数,用来控制servlet引擎,实现特殊操作。
所有的动作元素都有两个属性:id和scope。id属性是元素的唯一标识,scope属性是元素的生命周期。
6.1 jsp:include元素
在当前页面中包含静态或动态资源。插入文件的时间是在页面被请求的时候。
page属性是被包含的资源的相对URL地址。flush属性是定义在包含资源前是否刷新缓冲区。
6.2 jsp:useBean元素
用来加载一个在页面中使用的JavaBean组件。
class属性指定Bean的完整包名。type属性指定引用该对象的变量类型。
6.3 jsp:setProperty元素
用来设置已经实例化的Bean对象的属性。
name属性表示要设置属性的Bean。property属性表示要设置哪个属性。value属性用来指定Bean属性的值。param属性指定用哪个请求参数来设置Bean属性的值。
如果jsp:setProperty元素位于jsp:useBean元素外部,不管是新创建一个Bean实例,还是已有一个Bean实例,都会执行。如果jsp:setProperty元素位于jsp:useBean元素内部,只有在新创建一个Bean实例时才会执行。
6.4 jsp:getProperty元素
获取指定Bean对象的属性值。
name属性是要检索的Bean的名称。property属性表示要获取的属性。
6.5 jsp:forward元素
将请求转发给其他页面。
page属性是一个相对URL。
6.6 jsp:plugin元素
用于在生成的HTML页面中包含JavaBean对象。
6.7 jsp:element、jsp:attribute、jsp:body元素
定义动态的XML元素、元素的属性以及元素的内容。
6.8 JSP:text元素
允许在JSP页面和文档中使用写入文本的模板,该模板只能包含文本和EL表达式。
7、JSP四种作用域
JSP中的四种作用域包括page、request、session和application,具体来说:
a、page是代表一个页面相关的对象和属性。一个页面由一个编译好的java servlet类(可以带有include指令,但不可以带有include动作)表示。这既包括servlet又包括编译成servlet的jsp页面。
b、request是代表与web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个web组件(由于forware指令和include动作的关系)
c、session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个web回话也可以经常跨域多个客户机请求。
d、application是代表与整个web应用程序相关的对象和属性。这实质上是跨域整个web应用程序,包括多个页面、请求和回话的一个全局作用域。
五、JSP内置对象(隐含对象)
1、内置对象简介
JSP内置对象是Web容器创建的一组对象,不使用new关键字就可以使用的内置对象。
2、四种作用域范围
application_SCOPE:作用于整个Web应用,多个用户之间共享。
session_SCOPE:作用于整个Web应用,单个用户之间共享。
request_SCOPE:作用于请求,转发间请求共享。
page_SCOPE:作用于当前页面,当前页面可见。
3、out对象
缓冲区:Buffer,即内存中的一块区域用来保存临时数据
out对象:是JspWriter类的实例,是向客户端发送文本常用的对象,是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。当缓冲区满足如下条件是才会写入Servlet引擎提供的缓冲区:设置page指令的buffer属性关闭了out对象的缓存功能;out对象的缓冲区已满。整个JSP页面结束。
<%
out.println("aaa");
response.getWriter().write("bbb");%>
"bbb会比aaa先输出"
4、request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户端的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
//request常用方法:
String getParameter();返回指定参数的参数值
String[] getParameterValues();返回指定参数的所有值
void setAttribute();存储此请求中的属性
object getAttribute();返回指定属性的属性值
String getContentType();得到请求体的MIME类型
String getProtocol();返回请求用的协议及版本号
String getServerName();返回接受请求的服务器主机名
int getServerPort();返回服务器接受此请求的端口号
String getCharacterEncoding();返回字符编码方式
void setContentEncoding();设置请求的字符编码方式
int getContentLength();返回请求体的长度(以字节数)
String getRemoteAddr();返回发送此请求的客户端IP地址
String getRealPath(String path);返回一个虚拟路径的真实路径或相对路径的绝对路径
StringgetContextPath();返回上下文路径,即项目的根目录
中文乱码问题:request.setCharacterEncoding("UTF-8");
URL中中文乱码问题:Tomcat的/conf/server.xml 的添加
5、response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,及访问一个页面时,该页面内的response对象只能对这次访问有效,其他的response对象对当前页面无效。
//response对象的常用方法
String getCharacterEncoding();返回响应用的是何种字符编码
void setContentType();设置响应的MIME类型,一般为"text/html, charset=UTF-8"
PrintWriter getWriter();返回可以向客户端输出字符的一个对象("注意比较:PrintWriter与内置out对象的区别,PrintWriter对象的其输出总是提前于内置out对象,或者在out中手动flush")
sendRedirect(loaction);重新定向客户端的请求
请求重定向:是客户端行为,response。sendRedirect(),从本质上将等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
请求转发:是服务器行为,request.getRequestDispatcher().forward();是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
6、session对象
session表示客户端与服务器的一次会话,Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
在服务器的内存中,为不同的用户保存着不同的session。
session对象是一个JSP内置的对象。
session对象在第一个JSP页面被装载是自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
当一个客户访问一个服务器时,肯能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
session对象是HttpSession类的实例。
//session的常用方法
long getCreationTime();返回session创建时间
String getId();返回session创建时JSP引擎为它设的唯一ID号
Object setAttribute();使用指定名称将对象绑定到此会话
Object getAttribute();返回与此会话中的指定名称绑定在一起的对象,没有返回null
String[] getValueNames();返回一个包含此session中所有可用属性的数组
int getMaxInactiveInterval();返回两次强求间隔多长时间此session被取消(单位秒)
void setMaxInactiveInterval();设置session存活时间。
session的生命周期:
创建:当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
活动: 某次会话当中通过超链接打开的新页面属于同一次会话。只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。除非本次会话的所有页面都关闭后,在重新访问某个jsp或者Servlet将会创建新的会话(但此时原有会话还存在,这个就的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后教育服务端校验,直到该会话超时。)。
销毁:有三种销毁方式
1、调用了session.invalidate()方法
2、Session过期(超时)可以在web.xml中配置Session超时时间
3、服务器重新启动
7、application对象
application对象实现了用户间数据的共享,可存放全局变量。
application开始于服务器的启动,终止于服务器的关闭。
在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
服务器的启动和关闭决定了application对象的生命。
application对象是ServletContext类的实例。
//application的常用方法
void setAttribute();使用指定名称将对象绑定到此会话
Object getAttribute();返回与此会话中的指定名称绑定在一起的对象,如果没有,返回null
Enumeration getAttributeNames();返回所有可用属性名的枚举
String getServerInfo();返回JSP(Servlet)引擎名及版本号
8、page对象
page对象就是指向当前jsp页面本身,有点像类中的this指针,它是java.lang.Object类的实例。常用方法就是Object类的成员方法。
9、pageContext对象
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其他8个隐式对象的引用,其自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如include,forward其他资源、检索其他域对象中的属性等。
pageContext对象提供了对jsp页面内所有的对象及名字空间的访问。该对象可以访问到本页所在的Session,也可以取本页所在的application中的属性值。该对象相当也页面中所有功能的集大成者。该对象的本类名也叫pageContext。
//pageContext的常用方法
JspWriter getOut();返回当前客户端响应被使用的out对象
HttpSession getSession();返回当前页中的Session对象
Object getPage();返回当前页的page对象
ServletRequest getRequest();返回当前页的Request对象
ServletResponse getResponse();返回当前页的Response对象
void setAttribute();设置属性及属性值
Object getAttribute();在指定范围内取属性的值
int getAttributeScope();返回某属性的作用范围
void forward();跳转到另一个页面,地址栏不变
void include();包含另一个页面,
PageContext.APPLICATION_SCOPE代表各个域的常量
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute();查找各个域中的属性
10、Config对象
Config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
//Config的常用方法
ServletContext getServletContext();返回含有服务器信息的ServletContext对象
String getInitParameter();返回初始化参数的值
Enumeration getInitparameterNames();返回Servlet初始化所需所有参数的枚举
11、Exception对象
Exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个jsp页面要应用此对象,就必须报isErrorPage设为true,否则无法编译。它实际上是java.lang.Throwable的对象。页面要想在有异常时得到处理,就要指定异常处理页面<% page errorPage="exception.jsp"%>
//exception的常用方法
String getMessage();返回描述异常的消息
String toString();返回关于异常的简短描述消息
void printStackTrace();显示异常及其栈轨迹
ThrowableFillInStackTrace();重写异常的执行栈轨迹