Java Web __ JSP技术
JSP概述
什么是JSP
在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术。
在JSP文件中,HTML代码与Java代码共同存在,
- HTML代码用来实现网页中静态内容的显示,
- Java代码用来实现网页中动态内容的显示。
Java代码必须包含在“<%”和“%>”之间
为了与普通HTML有所区别,JSP文件的扩展名为 .jsp。
JSP运行原理
当用户第一次访问JSP页面时,该页面都会被JspServlet翻译成一个Servlet源文件,然后将源文件编译为.class文件。
Servlet源文件和.class文件都放在“Tomcat安装目录/work/Catalina/localhost/应用名/”目录下。
由JSP文件翻译成的Servlet类带有包名,包名为org.apache.jsp,
因此simple.jsp生成的Servlet源文件和.class文件的目录结构如图所示。
从图中可以看出,simple.jsp文件被翻译成的class文件和Servlet源文件分别是simple_jsp.class和simple_jsp.java。
simple.jsp文件翻译后的Servlet类名为simple_jsp,它继承了org.apache.jasper.runtime.HttpJspBase类。
JSP基本语法
JSP模板元素
JSP模版元素就是指:JSP页面中的静态HTML内容
JSP页面可以包含HTML文件的所有静态内容。
作用:
定义网页的基本骨架,即定义页面的结构和外观。
JSP表达式
JSP表达式(expression)用于将程序数据输出到客户端。
它将要输出的变量或者表达式直接封装在下面的标记中
<%= expression %>
例如,对simple.jsp文件进行修改,将脚本片段修改为表达式:
<%= new java.util.Date().toLocaleString() %>
启动Tomcat服务器,在浏览器中再次输入URL地址访问simple.jsp页面,同样可以正确输出当前的访问时间。
注意
JSP表达式中的变量或表达式后面不能有分号(;)
JSP脚本片段
JSP脚本片断是指嵌套在<% 和 %>之中的一条或多条Java程序代码。
这些Java代码必须严格遵守Java语法规范,否则编译会报错。
语法格式:
<%
java代码
>%
注意:
-
需要在每个执行语句后都使用分号(;)结束。
-
可以出现多个脚本片段,并且这些脚本片段中的代码可以互相访问。
在两个或者多个脚本片段之间可以嵌套文本、HTML标记或其它JSP元素。 -
只要多个脚本片段及其它元素组合的结果是一个完整的Java语句,翻译后的Servlet程序就可以正常运行,并将结果显示出来。
-
脚本片断中的Java代码将被原封不动地移到由JSP页面所翻译成的Servlet的_jspService()方法中。
脚本片断之外的任何文本、HTML标记以及其它JSP元素也都会被转换成相应的Java程序代码插入到_jspService()方法的相应位置。
JSP声明
在JSP技术中提供了声明
被声明的Java代码将被翻译到Servlet的_jspService()方法之外,即在JSP声明中定义的都是成员方法、成员变量、静态方法、静态变量、静态代码块等。
语法格式:
<%!
java代码
>%
注意:
- 在一个JSP页面中可以有多个JSP声明,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java语句。
JSP注释
同其它各种编程语言一样,JSP也有自己的注释方式,其基本语法格式如下:
<%-- 注释信息 --%>
注意
,Tomcat在将JSP页面翻译成Servlet程序时,会忽略JSP页面中被注释的内容,不会将注释信息发送到客户端。
HTML注释
由于JSP页面中存在HTML代码,因此,在JSP页面中同样可以使用HTML注释。其基本语法格式如下:
<!-- -->
和jsp注释不同的是:
HTML注释的内容会被当做普通文本发送到客户端。
JSP指令
page指令
在JSP页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP页面采用的语言等,这时,可以通过page指令来实现。
语法格式
<%@ page 属性名= "属性值"%>
- page用于声明指令名称
- 属性用来指定JSP页面的某些特性。
常用属性:
利用web.xml文件配置通用的错误页面
在JSP程序中,如果为每个页面都利用errorPage属性
指定一个错误页面,这样的做法显然很繁琐。
这时,可以在web.xml文件中使用<error-page>
元素为整个Web应用程序设置错误处理页面,具体示例如下所示:
该段代码用于设置处理所有404和500状态码的页面,其中
<error-page>
元素用于指定当前JSP页面的错误处理页面<error-code>
元素用于指定服务器返回的状态码<location>
元素用于指定错误处理页面的路径
include指令
有时候,需要在JSP页面静态包含一个文件,例如HTML文件,文本文件等,这时,可以通过include指令来实现,
语法格式:****
<%@ include file="relativeURL"%>
file属性用于指定被引入文件的相对路径。
注意:
-
被引入的文件必须遵循JSP语法。
其内容可以包含普通JSP页面所具有的一切内容。 -
除了指令元素之外,被引入的文件中的其它元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。
-
file属性的设置值必须使用相对路径。
如果以“/”开头,表示相对于当前WEB应用程序的根目录。
隐式对象
JSP提供了9个隐式对象,它们是JSP默认创建的,可以直接在JSP页面使用。
9个隐式对象分别是:
out对象
out对象是javax.servlet.jsp.JspWriter类的实例对象,out对象的类型为JspWriter。
作用
在JSP页面中,向客户端发送文本内容。
说明:
out对象的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似。
不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的
PrintWriter。
JSP页面的out对象与Servlet引擎提供的缓冲区之间的工作关系!
从图可以看出,
- 在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,
- 只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。
样例:
结果:
从图中可以看出,尽管out.println语句位于response.getWriter().println语句之前,但它的输出内容却在后面。
由此可以说明:
- out对象通过print语句写入数据后,直到整个JSP页面结束,out对象中输入缓冲区的数据(即:first line)才真正写入到Serlvet引擎提供的缓冲区中,
- 而response.getWriter().println语句则是直接把内容(即:second line)写入Servlet引擎提供的缓冲区中,
- Servlet引擎按照缓冲区中的数据存放顺序输出内容。
pageContext对象
在JSP页面中,要想获取JSP的另外八个隐式对象,可以使用pageContext对象。
pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。
获取隐式对象的方法:
pageContext对象还提供了存储数据的功能。
pageContext对象存储数据是通过操作属性来实现的
操作属性的方法
- 参数name指定的是属性名称,
- 参数scope指定的是属性的作用范围。
作用范围有四个值:
- pageContext.PAGE_SCOPE:表示页面范围
- pageContext.REQUEST_SCOPE:表示请求范围
- pageContext.SESSION_SCOPE:表示会话范围
- pageContext.APPLICATION_SCOPE:表示Web应用程序范围
注意
当使用findAttribute()方法查找名称为name的属性时,会按照page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。
exception对象
在JSP页面中,经常需要处理一些异常信息,这时,可以通过exception对象来实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。
注意
page指令中指定了属性<%@ page isErrorPage=”true”%>
的页面。
exception对象只有在错误处理页面才可以使用,
JSP标签
<jsp:include>
标签
作用:
在JSP页面中,把其它资源的输出内容插入到当前JSP页面的输出内容中
语法格式
<jsp:include page="relativeURL" flush="true|false" />
- page属性用于指定被引入资源的相对路径,
- flush属性用于指定是否将当前页面的输出内容刷新到客户端
默认情况下,flush属性的值为false。
与include指令区别
-
<jsp:include>
标签中要引入的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。
而include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。 -
<jsp:include>
标签中引入的资源是在运行时才包含,而且只包含运行结果。
而include指令引入的资源是在编译时期包含,包含的是源代码。 -
<jsp:include>
标签运行原理与RequestDispatcher.include方法类似,即被包含的页面不能改变响应状态码或者设置响应头。
而include指令没有这方面的限制
<jsp:forward>
标签
作用:
将请求转发给另外一个资源
语法格式:
<jsp:forward page="relativeURL" />
page属性用于指定请求转发到的资源的相对路径,该路径是相对于当前JSP页面的URL。
实现原理:
<jsp:forward>
标签被翻译成了调用pageContext.forward方法的语句,- 并在调用后,使用return语句结束service()方法的执行流程
因此不会再执行<jsp:forward>
标签后的语句。
因此:
-
如果在JSP页面中直接调用pageContext.forward()方法,当forward()方法后还有语句需要执行时,程序会发生IllegalStateException异常。
-
但是,如果在JSP页面中使用
<jsp:forward>
标签,由于jsp:forward标签翻译的Servlet程序会使用return语句终止执行后面的语句,因此,程序会避免报错。