什么是jsp?
很久之前,我们的网页都是静态的,就是我们所看到的页面在编写好之后总是唯一的。后来有人便提出动态页面的概念,相应的就提出了Servlet。Servlet动态网页技术,是可以把Java语言嵌入到HTML页面上。那时候Servlet是个大忙人,它既要处理显示效果,又要处理数据,又要处理页面跳转,耦合度高,不方便代码维护,为了解决这个问题,SUN公司联合其他公司制定了JSP动态网页技术标准。事实上jsp是一个特殊的Servlet实例,它跟其他Servlet一样被Servlet容器执行,在这之前它需要先被jsp容器转换成Servlet,这个过程是在服务器端产生的,在第一次编译之后该Servlet实例便常驻内存。
jsp的运行机制
- jsp容器判断URL中对应的Servlet实例是否存在Servlet队列,实则执行第五步,否则执行第二步。
- jsp容器将jsp文件转换成Servlet源程序(.java)。
- jsp容器将Servlet源程序编译成字节码文件(.class)。
- Servlet容器加载字节码,创建该Servlet实例(该实例实际是返回给客户端的显示效果),此时会调用
jspInit()
进行初始化。 - jsp容器将响应返回到到客户端。
jsp基本语法
注释
注释有以下两种:
- HTML注释:``,这种方法注释在查看HTML源代码时可以被显示
- jsp注释:
<%-- 注释内容 --%>
,通过这种方法注释用户是看不到的
jsp指令
jsp指令有以下三种:
page指令
include指令
taglib指令
page指令page指令称为页面指令,用来定义jsp页面的全局属性。语法格式如下:
<%@ page [属性="值" 属性="值"]%>
比较重要的属性有以下几种:extends:指定jsp继承的父类。
import:用于导入jsp需要的Java包。其中Java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*这几个包本身已经被导入,无需再导入。
session:指定该jsp页面是否可用session对象。
isThreadSafe:指定该jsp页面是否支持多线程。
info:设置页面的相关信息。可以用
servlet.getServletInfo()
获取jsp页面中的文本信息。Errorpage:当jsp页面出错时,会调用该指令指定的错误处理页面。
isErrorPage:指定jsp页面能否进行异常处理。
contentType:指定页面支持的编码方式和响应的MIMe类型。默认为"text/html; charset = ISO-8859-1".
isELIgnored:指定是否支持EL表达式。
PS:导入多个包时用一个import指令,各个包之间用“,”隔开。
include指令include指令是加载文件指令,它在jsp被编译前就将文件加载进jsp中合并成一个新的jsp文件,因此当该文件改变时,jsp要重新被编译一次。include指令的格式如下:
<%@ include file = "path"%>
该指令只有一个属性file,该指令用于指向要加载的文件的相对地址。taglib指令taglib指令是用来引用标签库并设置标签库前缀,说白了就是自定义自己的jsp标记。格式如下:
<%@ taglib uri="标签库地址" prefix = "标签库前缀" %>
使用标记方式如下:
<标签库前缀:标签名 参数>
jsp脚本元素
jsp脚本元素有以下三种:
jsp声明语句
jsp表达式
jsp Scriptlets
jsp声明语句
jsp声明语句用于声明变量和方法,在jsp声明语句中声明的变量和方法对作为servlet的成员变量,在整个页面都有效。格式如下:
<%! 声明变量或方法 %>
jsp表达式
jsp表达式要求该表达式存在一个确定的值,该值会被显示在HTML页面上。格式如下:
<%= 表达式 %>
jsp Scriptlets
jsp Scriptlets是一段java代码段。当需要对页面输出内容进行一些复杂的操作的时候就需要用到jsp Scriptlets,在jsp Scriptlets声明的变量在调用的时候分配内存,调用结束内存释放。jsp Scriptlets格式如下:
<% java代码片段 %>
jsp动作元素
jsp动作元素有以下几种:
<jsp:include>
<jsp:forward>
<jsp:param>
<jsp:plugin>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
-
<jsp:include>
是包含标签,它跟包含指令不一样。包含指令是将包含页面整合进jsp页面中再编译。而包含元素包含的文件和jsp文件是两个独立的文件,在运行时单独对包含文件进行编译,把结果发送到客户端。只有在运行jsp页面的时候才会加载这些包含文件。格式如下:
<jsp:include page="被包含的页面" flush="true|false"></jsp:include>
- page:是被包含的文件的相对地址。
- flush:指定当缓冲区满时,是否将其清空。默认值为false。
<jsp:forward>
是重定向标签,当代码运行到该标签会想客户端发出响应,让客户端重新链接到指定的地址,之后的代码不被执行。格式如下:
<jsp:forward page="重定向的地址"></jsp:forward>
<jsp:param>
是传递参数的标签。它是以"名-值"对的形式来表示参数的。格式如下:
<jsp:param name="参数名" value="参数值">
向
<jsp:include>
包含的文件传递参数
<jsp:include page="page name" flush="false">
<jsp:param name="parameter name" value="parameter value"></jsp:param>
...
</jsp:include>
- 向
<jsp:forward>
页面传递参数
<jsp:forward page="forward target">
<jsp:param name="parameter name" value="parameter value"></jsp:param>
...
</jsp:forward>
PS:
<jsp:param>
传递的参数就会以“名-值”对的形式传递到调用它的页面中,参数的调用方法跟调用成员变量一样直接通过变量名调用。
-
<jsp:plugin>
可以将服务器端的javaBean或Applet下载到本地客户端执行。语法格式如下:
<jsp:plugin type="bean|applet" code="classFileName" codeBase="classFileURL">
...
</jsp:plugin>
type:指定插件类型。是Bean还是Applet。
code:指定执行的类名。必须以扩展名".class"结尾。
codeBase:指定被执行的java类所在目录。此外
<jsp:plugin>
相关的参数还有很多,这里只是举例必不可少的三个。<jsp:useBean>
用来装载一个将在jsp页面中使用额javaBean。语法格式如下:
<jsp:useBean id="beanInstanceName" class="className" scope="page|request|session|application"></jsp:useBean>
id:指定javaBean的实例名。
class:指定javaBean的全限类名。
-
scope:指定javaBean的作用域。
- page:指定javaBean实例只在本页面有限。
- request:指定JavaBean实例仅在本次请求有效。
- session:指定javaBean实例在本次会话有效。
- application:指定javaBean实例在本应用内一直有效。
<jsp:setProperty>
用于设置Bean内属性的值,它通过调用Bean的setter方法设置属性值。语法格式如下:
<jsp:setProperty name="beanInstanceName" property="propertyName" value="propertyValue"></jsp:setProperty>
<jsp:getProperty>
用于获取bean的属性值。语法格式如下:
<jsp:getProperty name="beanInstanceName" property="propertyName"></jsp:getProperty>
PS:bean中可以没有属性的声明,但必须有setter和getter方法,因为
<jsp:getProperty>
和<jsp:setProperty>
是通过调用bean实例中的setter方法和getter方法实现取值和赋值工作的。
jsp内置对象
jsp内置对象由jsp规范进行初始化,主要有以下几种:
request
response
pageContext
session
application
out
config
page
exception
-
request对象用于封装请求数据。一般用户在表单填写的数据会被封装成request对象,通过post方法传递给目标页面。request还相应提供了一些方法用于访问这些数据。主要方法有以下几个:
-
void setAttribute(attributeName, attributeValue)
:用于设置属性值。 -
Object getAttribute(attributeName, attributeValue)
:用于获取属性值。 -
String getParameter("parameterName")
:获取参数值。 -
Enumeration getParameterNames()
:获取所有的参数名的集合。 -
String[] getParameterValues("parameterName")
:获取parameterName的所有属性值的数组。 -
Map getParameterMap()
:获取所有属性名和属性值的Map对象。 -
void setCharacterEncoding()
:设置编码格式。
-
PS:setAttribute和getAttribute方法在转发时使用,当转发一个页面并传递参数时使用该方法设置和接受参数;其他方法主要用于获取表单数据。
-
response对象用于封装响应数据,其作用域是本页面。相关方法如下:
-
void addCookie(Cookie cookie)
:添加一个Cookie对象,用于在客户端保存特定信息。 -
void addHeader(name, value
):添加一个HTTP头信息,该头信息会被发送到客户端。 -
void containsHeader(name)
:判断是否含有名为"name"的头信息。 -
void sendError(int)
:向客户端发送错误的状态码。 -
void sendRedirect(url)
:向客户端发送重定向的url链接,让客户端跳转到该链接。 -
void setContentType(contentType)
:设置MIME类型和编码方式。 - pageContext对象不仅可以设置page范围的属性,还可以设置其他范围内的属性。通过pageContext可以访问request、response、out等对象。
-
-
session对象是会话对象,用来记录每个客户端的访问状态。session对象主要方法如下:
-
Object getAttribute(name)
:获取session范围内名为name的属性值。 -
void setAttribute(name, value)
:设置session范围内的属性。 -
void removeAttribute(name)
:删除session范围内名为name的属性。 -
Enumeration getAttributeNames()
:获取session中保存的所有属性名。 -
long getCreationTime()
:返回session被创建的时间。 -
String getId()
:返回session被创建时jsp容器分配的唯一标识。 -
long getLastAccessedTime()
:返回最后一次通过session发送请求的时间。 -
int getMaxInactiveInterval()
:返回session的失效时间,即两次请求间隔多长时间该session被取消,单位为秒。 -
boolean isNew()
:判断是否是新的session。 -
void invalidate()
:清空session内容。
-
application对象用于获取和设置servlet相关信息,application的生命周期是从服务器启动直到服务器关闭。主要方法如下:
void setAttribute(name, value)
:以"键-值"对的形式将一个对象的值存入application对象中。Object getAttribute(name)
:获取application中保存的属性的值。-
out对象是一个缓冲的输出流,用来向客户端返回信息。由于向客户端输出信息总是要连接,所以向客户端输出总是采用缓冲的形式。主要方法有以下几个:
-
public abstract void clear() throws java.io.IOException
:清除缓冲区的内容,但不将缓冲区的内容输出到客户端。 -
public abstract void clearBuffer() throws java.io.IOException
:清除缓冲区的内容,且将缓冲区的内容输出到客户端。 -
public abstract void close() throws java.io.IOException
:关闭输出流并输出缓冲区的数据。 -public abstract void flush() throws java.io.IOException
:输出缓冲区的数据。 -
public int getBufferSize()
:获取缓冲区大小。 -
public abstract int getRemaining()
:获取剩余缓冲区大小。 -
public boolean isAutoFlush()
:缓冲区是否进行自动清除。 -
public abstract void newLine() throws java.io.IOException
:输出一个换行符。 -
public abstract void print(String) throws java.io.IOException
:打印信息。 -
public abstract void println(String) throws java.io.IOException
:打印信息并换行。
-
-
config对象是ServletConfig类的一个实例,在servlet初始化时可以通过config对象想servlet传递信息。config常用的方法如下:
-
String getServletName()
:获得servlet名称。 -
ServletContext getServletContext()
:获得一个包含服务器相关信息的ServletContext对象。 -
String getInitParameter(name)
:获得servlet初始化参数。 -Enumeration getInitParameterNames()
:获得servlet初始化时所有参数的名字的枚举对象。
-
-
page对象是指当前的jsp页面本身,他是java.lang.Object类的对象,通过page对象可以很方便地调用servlet中定义的方法。常用方法如下:
-
class getClass()
:返回当前的类名。 -
int getHashCode()
:返回当前类的哈希码。 -
String toString()
:将此对象转换成字符串。 -
boolean equals(object)
:比较两个对象是否是相等。 -
void copy(object)
:将该对象复制到指定的object对象中。
-
-
exception对象java.lang.Throwable类的对象,用来处理页面错误和异常。常用方法如下:
-
String getMessage()
:返回异常对象的异常信息。 -
String getLocalizedMessage()
:返回本地化语言的异常信息。 -
void printStackTrace()
:打印异常的栈反向追踪痕迹。 -
String toString()
:返回异常的简单描述。
-
PS:使用异常对象时,应将page的isErrorPage属性设置为"true"。
javaBean的使用
javaBean是java语言描述的软件组件模型,其实际是一个java对象,通过将业务逻辑和对数据库的相关操作封装成javaBean对象,实现了java代码的复用,节省了程序员大量的宝贵时间。
javaBean的语法特征
- JavaBean是一个public类。
- JavaBean应当包含一个无参的构造函数。
- JavaBean获取或设置参数的方式都必须用标准的getter或setter函数,对于布尔型的属性可以用isXxx()方法。