JSP相关知识二
学习JSP之前,首先要了解一个JSP页面到底有哪些内容构成?从一个页面上看,它由指令、表达式、小脚本、声明、注释,静态内容六部分构成,其中表达式、小脚本、声明和注释都是可以选择。接下来就分别说一下这六部分:
1. 指令
在JSP页面中指令的书写形式为<%@指令名 属性="属性值"%>,一共有三种指令:
Page指令:通常位于jsp页面的顶端,同一个页面可以有多个page指令,书写形式为<%@page 属性1="属性值" 属性2="属性值1,属性值2"...属性n="属性值n"%>,属性值有:language,指定jsp页面使用的脚本语言,默认值为java,该属性不需要写也行;import,通过该属性来引用脚本语言中使用到的类文件,无默认值,下面给出的包在JSP编译时已经导入了,所以就不需要再指明了:java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*;contentType,用来指定jsp页面所采用的编码格式及文件类型,默认值为text/html,ISO-8859-1;pageEncoding:默认值为ISO-8859-1;
特别说明:pageEncoding是jsp文件本身的编码,contentType的charset是指服务器发给客户端时的内容编码,contentType更常用。
include指令:将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句,采用指令形式的包含叫做静态包含。语法格式:<%@ include file="绝对路径或相对路径" %>。
taglib指令:引用自定义的标签库;使用标签库定义新的自定义标签,在JSP页面中启用定制行为。
2. 注释
JSP注释也有三种:a. HTML注释,书写为 <!--注释-->,这种注释在客户端可见的(通过查看源代码可以看到);b. JSP注释,书写为<%--注释--%>,这种注释在客户端不可见,又叫做服务器端注释;c. JSP脚本注释://单行注释 /**/多行注释。
3. 小脚本
在JSP页面可执行的java代码,书写形式为<%java代码%>。
4. 声明
在jsp中定义变量或方法,书写形式为<%! java代码 %>,很少使用它来定义变量,原因是Servlet是一个单实例对象,用声明语句定义的变量只有一个,每个用户都可访问到它,在多用户访问时会造成不可预料的错误。
5. 表达式
在jsp页面中执行的表达式,<%=表达式%>表达式不以分号结尾,以分号结尾会报错,使用较少,后面会用EL表达式来替代。
6. 静态内容
JSP页面中的静态内容指的是JSP页面在建立时包含的html代码。
了解JSP页面的构成后,接下来说一下JSP页面的生命周期:
了解了JSP的生命周期后,接下来看一下JSP中的九大内置对象。什么是内置对象呢?JSP内置对象就是Web容器创建的一组对象,不使用new关键字就可以实现内置对象的使用。
在JSP中有九大内置对象:out,request,response,session,application,page,pageContext,exception,config,其中常用的有request,response,session,application,out。接下来将详细说明常用的内置对象,简单了解下非常用内置对象。
a. request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:
返回值类型 | 方法 | 说明 |
String | getParameter(String name) | 返回name指定参数的参数值 |
String[] | getParameterValues(String name) | 返回包含参数name的所有值得数组 |
void | setAttribute(String,Object) | 存储此请求中属性 |
Object | getAttribute(String name) | 返回指定属性的属性值 |
getRequsetDispatcher() | 实现服务器端的请求转发 | |
String | getContentType() | 得到请求体的MIME类型 |
String | getProtocol() | 返回请求用的协议类型及版本号 |
String | getServerName() | 返回接受请求的服务器主机名 |
String | getRemoteAddr() | 请求客户端的IP地址 |
在使用request内置对象时,可能会出现中文乱码问题,可以这么解决:<%requset.setCharacterEncoding("utf-8")%>,但是此方法解决不了url传递中文产生的乱码问题,要想解决,还需修改Tomcat的配置文件,URIEncoding="utf-8"。
b. response对象
response对象包含了响应客户请求的有关信息,但在jsp中很少直接用到它(在实现下载时会用到)。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次的访问有效,其他页面的response对象对当前页面无效。常用方法如下:
返回值类型 | 方法 | 说明 |
String | getCharacterEncoding() | 返回响应用的是何种字符编码 |
void | setContentType(String type) | 设置响应的MIME类型 |
PrintWriter | getWriter() | 返回可以向客户端输出字符的一个对象 |
sendRedirect(java.lang.String location) | 重新定向客户端的请求 |
Tips:printwriter对象打印输出 总是先于out内置对象打印输出。
c. session对象
session表示客户端与服务器的一次会话;Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览整个网站所花费的时间;session实际上是一个特定的时间概念。session保存在服务器的内存当中。session对象是一个jsp内置对象;session对象在第一个jsp页面被装载时自动创建,完成会话期管理;从一个客户打开浏览器并连接到服务器开始,到客户端浏览器关闭,被称为一个会话;当一个客户访问一个服务器时,可能会在服务器几个界面之间切换,服务器应当通过某种方法知道这是一个客户,就需要session对象;session对象是HttpSession类的实例。session对象常用的方法:
返回值类型 | 方法 | 说明 |
long | getCreateTime() | 返回session创建时间 |
String | getId() | 返回session创建时jsp引擎为它设的唯一ID号 |
Object | setAttribute(String name,Object value) | 使用指定名称将对象绑定到此会话 |
Object | getAttribute(String name) | 返回与此会话中的指定名称绑定在一起的对象,如 果没有对象绑定在该名称下,则返回null |
String[] | getValueNames() | 返回一个包含此session中所有可用属性的数组 |
int | getMaxInactiveInterval() | 返回两次请求间隔多长时间此session被取消(单位秒) |
Session的生命周期:
Session的生命周期分为三个阶段:创建,活动,销毁。
创建阶段:当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
活动阶段:某次会话当中通过超链接打开的新页面属于同一次会话。只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话;除非本次会话的所有页面都关闭后再重新访问某个jsp或者Servlet将会创建新的会话。
Warning:当关闭浏览器后,原有会话还存在,旧的sessionId仍然存在于服务端(除非session超时才会销毁),只不过再也没有客户端会携带它然后交与服务端校验。
销毁阶段:session销毁有三种方式:1. 调用了session.invalidate()方法;2. session过期(超时);3. 服务器重新启动,服务器重启后所有session销毁。实际上这里有个
session持久化问题,持久化为FALSE的情况下,Tomcat关闭时,触发Session destroy事件,否则只有等到设置的超时时间才触发。设置持久化的位置在$TOMCAT_HOME$/conf/context.xml这个文件中有个注释<!-- <Manager pathname="" /> --> 默认为注释掉的,即配置为持久化,此时重启服务器不销毁。如果取消注释也就是取消持久化,重启服务器就会销毁session。
给session设置过期时间:
Tomcat默认session超时时间为30分钟;设置session超时有两种方式:1. session.setMaxInactiveInterval(时间);单位是秒;2. 在web.xml中配置
1 <session-config> 2 <session-timeout> 3 10(单位是分钟) 4 </session-timeout> 5 </session-config>
d. application对象
application对象实现了用户间数据的共享,可存放全局变量;application开始于服务器的启动,终止于服务器的关闭,是存活范围最大的对象;在整个服务器运行过程中,application对象只有一个。在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作;在任何地方对application对象属性的操作,都将影响到其他用户对此的访问;服务器的启动和关闭决定了application对象的生命;application对象是ServletContext类的实例。
返回值类型 | 方法 | 说明 |
void | setAttribute(String name,Object value) | 使用指定名称将对象绑定到此会话 |
Object | getAttribute(String name) | 返回与此会话中指定名称绑定在一起的对象,如果没有对象 绑定在该名称下,则返回null |
String | getRealPath() | 返回资源在服务器上的绝对路径 |
e. out对象
out对象是jspWriter类的实例,是向客户端输出内容常用的对象。out对象内部实现了一个缓冲对象,用以实现数据的缓冲,解决缓冲区两边的速度不对等问题。
Tips:out.println()和<br>两个都是换行,一个是源代码的换行,一个是页面元素的换行
out对象常用的方法:
返回值类型 | 方法 | 说明 |
void | println() | 向客户端打印字符串 |
void | clear() | 清除缓冲区的内容,如果在flush之后调用会抛出异常 |
void | clearBuffer() | 清除缓冲区的内容,如果在flush之后调用不会抛出异常 |
void | flush() | 将缓冲区内容输出到客户端 |
void | close() | 关闭输出流 |
f. page对象
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例。
g. pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值,pageContext对象相当于页面中所有功能的集大成者,pageContext对象的本类名也叫pageContext。pageContext对象常用方法:
返回值类型 | 方法 | 说明 |
JspWriter | getOut() | 返回当前客户端响应被使用的JspWriter流(out) |
HttpSession | getSession() | 返回当前页中的HttpSession对象(session) |
Object | getPage() | 返回当前页的Object对象(page) |
ServletRequest | getRequest() | 返回当前页的ServletRequest对象(request) |
ServletResponse | getRespnese() | 返回当前页的ServletResponse对象(response) |
void | setAttribute(String name,Object attribute) | 设置属性及属性值 |
Object | getAttribute(String name,int scope) | 在指定范围内取属性的值 |
h. Config对象
config对象是在一个Servlet初始化时,jsp引擎向它传递消息用的,此消息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。
i. Exception对象
exception对象是一个异常对象,当一个页面在运行过程中发生了一个异常,就产生这个对象。如果一个jsp页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象。