JSP
JSP页面就是带有JSP元素的常规Web页面,它由静态内容和动态内容构成。其中,静态内容指HTML元素,动态内容(JSP元素)包括指令元素、脚本元素、动作元素、注释等内容。
JSP简介
JSP就是Servlet的一个子类或者说就是一种Servlet。
JSP即Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码也java代码同在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。为了与传统HTML有所区别,JSP文件的扩展名为.jsp。
JSP技术所开发的Web应用程序是基于Java的,它可以用一种简洁而快速的方法从java程序生成Web页面,其使用具有如下几点特征:
- 跨平台:由于JSP是基于Java语言的,它可以使用Java API,也具有java一次编译多次运行的特点。
- 业务代码分离:在使用JSP技术开发Web应用时,可以将页面的开发与应用程序的开发分离开。开发人员使用HTML来设计界面,使用JSP标签和脚本程序来动态生成页面上的内容。在服务器端,JSP引擎(这里指Tomcat)负责解析JSP标签和脚本程序,生成所请求的内容,并将执行结果,以HTML页面的形式返回到浏览器。
- 组件重用:JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在整个项目都可以重复使用这个JavaBean,同时,JavaBean也可以应用到其他Java应用程序中
- 预编译:预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译,编译好的代码江别保存,下次访问直接访问编译好的代码,这样可以提高服务端访问速度且节约服务器CPU资源
JSP运行原理
JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。在一个JSP文件第一次被请求时,JSP引擎(tomcat)把该JSP文件转换成一个Servlet,二者引擎本身也是一个Servlet
JSP的运行过程具体如下:
(1)客户端发出请求,请求访问JSP文件。
(2) JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回出错信息。
(3)如果转换成功,则JSP容器将生成的Java源文件编译成相应的字节码文件*class。该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它。
JSP脚本元素
JSP脚本元素是指嵌套在<%和%>之中的一条或多条Java程序代码。通过JSP脚本元素可以将Java代码嵌入HTML页面中,所有可执行的Java代码,都可以通过JSP脚本来执行。
JSP脚本元素主要包含如下三种类型:
- JSP Scriptlets
- JSP 声明语句
- JSP 表达式
1.JSP Scriptlets
JSP Scriptlets是一段代码段。当需要使用Java实现一些复杂操作或控制时,可以使用它。JSP Scriptlets的语法格式如下所示:
<%java 代码(变量、方法、语句等)%>
在JSP Scriptlets 中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占有的内部空间。
2.JSP 声明语句
JSP的声明语句用于声明变量和方法,它以“<%!”开始,以“%>”结束,其语法格式如下所示
<%!
定义的变量或方法等
%>
在上述语法格式中,被声明的Java代码被编译到Servlet的_jspServlet()方法之外,即在JSP声明语句中定义的都是成员方法,成员变量、静态方法、静态变量、静态代码块等,在JSP声明语句中声明的方法,在整个JSP页面内有效。
在一个JSP页面中可以有多个JSP声明语句,单个声明中的Java可以不完整,但多个声明组合后的结果必须时完整的java语句。
标题
首先使用<%! 和%>定义了两个变量a 、b以及print()方法,然后使用了<% 和%>输出了两个常量的和,以及print()方法中的返回信息。启动项目后,在浏览器地址栏中输入url地址,访问jsp文件。
注意<%!和%>里面定义的变量是成员变量,方法是全局的方法,此处只是“声明",也就是定义,变量或方法都没有被调用。<%和%>里面定义的是局部变量,不能定义方法(因为Java方法中不能再嵌套定义方法),代码块操作可以将结果输出到浏览器。总之,<%!和%>是用来定义成员变量属性和方法的,<%和%>主要是用来输出内容的,因此如果涉及到了成员变量的操作,那么应该使用<%!和%>,而如果是涉及到了输出内容的时候,就使用<%和%>。
3.JSP表达式
用于将程序数据输出到客户端,它将要输出的变量或者表达式直接封装在以“<%=”开头和以“%>”结尾的标记中,其基本的语法格式如下所示:
<%= expresson %>
在上述语法格式中,JSP表达式中的将“expression”表达式结果暑促和到浏览器。例如,将body中的元素修改为如下:
<%=a+b %>
<%=print()%>
浏览器中再次访问上述jsp同样可以得到原来的结果。
注意:
- “<%=”和“%=>”标记之间插入的是表达式,不能插入语句;
- “<%=”是一个完整的符号,“<%”和“=”之间不能有空格;
- JSP表达式中的变量或表达式后面不能有分号;
JSP注释
同其他各种编程语言语言,JSP也有自己的注释方式,其基本语法格式如下:
<%–注释信息–%>
需要注意的是Tomcat在将JSP页面翻译成Servlet程序时,会忽略JSP页面中被注释的内容,不会将其翻译到客户端。
启动Tomcat服务器,在浏览器中输入url访问jsp页面,再右键查看源代码,发现只能看到HTML的注释,看不到jsp的注释。
JSP注释、Java注释、HTML注释对比:
<%–jsp注释–%>
<% //java注释 %>
<!–html注释 -->
JSP指令
为了设置JSP页面中的一些信息,Sun公司提供了JSP指令,JSP2.0提供了page、include和taglib三种指令,每种指令都定义了各自的属性。接下来主要讲一下page和include指令。
page指令
在JSP页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP页面采用的语言等,这时可以通过page指令来实现,格式如下:
<%@ page 属性名 1=“属性值1” 属性名2=“属性值2”…%>
在上面的语法格式中,page用于声明指令名称,属性用来指定JSP页面的某些特性。page指令提供了一系列与JSP页面相关的属性:如下图所示:
除了import包之外其他属性都只能出现一次,page指令的属性名称都是区分大小写的。且page指令对整个页面都有效,而且与其书写的位置无关,但是习惯上把page指令写在JSP页面的最前面。
例子:
include指令
实际开发时,有时需要在JSP页面静态包含一个文件,例如HTML文件,文本文件等,这时,可以通过include指令来实现,include指令的具体语法格式如下所示:
<%@ include file==“被包含的文件地址”%>
include指令只有一个file属性,该属性用来指定插入到JSP页面目标位置的文件资源
**例子:**include.jsp文件中使用include指令将date.jsp文件包含其中
启动tomcat服务器,在浏览器中输入地址,浏览器的显示结果如图
注意:
- 被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。
- 除了指令元素(page指令,include指令)之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入位置与include指令在当前JSP页面中的位置保持一致。
JSP内置对象
内置对象的概述
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0提供了9个隐式(内置)对象,他们是JSP默认创建的,可以直接在JSP页面中使用。这9个隐式对象如下表所示:
out、request、response、config、session、application、page、pageContext、exception。由于request、response、config、session和application所属的类及其用法在前面的章节都已经讲解过了,而page对象在JSP页面中很少被用到。因此下面将对out和pageContext对象进行详细的讲解。
out对象
在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用于ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓冲功能的PrintWriter。接下来,通过一张图来描述JSP页面的out对象于Servlet引擎提供的缓冲区之间的工作关系,如下如图所示:
从上图可以看出,在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区。
实例:
启动Tomcat服务器,在浏览器地址栏中访问该jsp的url地址,结果如图
从图中可以看出,尽管out.println语句位于response.getWriter().println语句之前,但它的输出内容却在后面。由此可以说明,out对象通过print语句写入数据后,直到整个JSP页面结束,out对象中输入缓冲区的数据(即first line)才真正写入Servlet引擎提供的缓冲区中,而response.getWriter().println语句则是直接把内容(second line)写入Servlet引擎按照缓冲区中的,Sevlet引擎按照缓冲区中的数据存放顺序输出内容。
pageContext对象
在JSP页面中,使用pageContext对象可以获取JSP的其他八个隐式对象。PageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他饮食对象的方法。PageContext对象获取隐式对象的方法,如下表所示:
表中列举了pageContext获取其他隐式对象的方法,这样,当传递一个pageContext对象就可以轻松的获取其他8个隐式对象了。
pageContext对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。PageContext对象存储数据是通过操作属性来是实现的,表1-4列举了pageContext操作属性的一系列方法,具体如下:setAttribute、getAttribute、removeAttribute、findAttribute
上表列举了pageContext对象操作属性的相关方法,其中参数name指定的是属性名称,参数scope指定的是属性的作用范围。pageContext 对象的作用范围有4个值,具体如下:
- PageContext.PAGE_ SCOPE:表示页面范围
- PageContext. REQUEST_ SCOPE:表示请求范围
- PageContext. SESSION_ SCOPE:表示会话范围
- PageContext APPLICATION SCOPE:表示Web应用程序范围
范围:page<request<session<application,需要注意的是,当使用findAttribute()方法查找名称为name的属性时,会按照page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。接下来,通过一个案例来演示pageContext对象的使用。
案例:
在day12项目的WebContent目录下创建-一个名称为pageContext.jsp的页面,编辑后代码如下所示。
在上述代码中首先使用pageContext获取了request对象,并设置page范围内属性;然后使用获取的request对象设置了request范围内属性,接下来使用pageContext对象获得page和request范围内的相应属性,最后使用JSP表达式输出数据。
结果如下:
JSP的四个域范围:
PageContext常量名 | 描述 | 作用域名称 | 域对象类型 |
---|---|---|---|
PageScope | 当前页面中有效 | pageContext | PageContext |
RequestScope | 一次请求页面范围 | request | HttpServlet |
SessionScope | 一次会话范围 | session | HttpSession |
application | 表示一个web项目 | 整个web项目共享 | ServletContext |
- page:表示当前页,通常没用。jsp标签底层使用。
- request:表示一次请求。通常一次请求就一个页面,但如果使用请求转发,可以设计多个页面。
- session:表示一次会话,可以在多次请求之间共享数据。
- application:表示一个web应用,可以在整个web项目之间共享数据。