赞
踩
JSP(Java Server Page)是一种在HTML页面中掺杂java语句从而能够动态生成HTML页面的一种技术。JSP的出现改善了在servlet中利用java对象输出大量难读,难写的html标签的情况,从而使得servlet专注于控制器层,而JSP等其他相关技术专注于表现层,进一步确立了web 开发过程中MVC模式。
Jsp是往静态的html语言中插入动态的java语句,从而实现页面的动态输出。那么如何在html语句中实现java语句呢?
注释:<%- -%>
<%– 这里是注释 –%>
声明:<%! %>
<%! 这里是声明内容 %>
输出:<%= %>
<%=表达式(注意jsp表达式后面无需添加分号表示结束)%>
脚本:<% %>
<% 这里是java程序 %>
jsp总共包含9个内置对象。内置对象可以不要通过声明(new),就可以直接在jsp的脚本中进行使用;而在servlet中,仍需要new,所以jsp只是将这些对象内嵌了。等编译成servlet对象后,这9个内置对象要么就是编译后生成servlet的形参,要么就是servlet中service()方法的局部变量,因此在jsp的脚本中可以直接使用。
对象名 | 对象作用 |
---|---|
application | 代表当前整个web本身,存放在application中的数据可以供所有的servlet和jsp共享,无论哪次请求,无论哪次会话都有效。 |
config | config代表jsp配置信息的实例。一般来说,jsp中的该对象用的比较少,在servlet中用到config比较多,但是因为servlet中没有内置对象,因此要通过getServletConfig()方法来获取当前servlet的config实例对象。 |
exception | 当当前的jsp页面是错误处理页面时,也就是isError属性设为true时,exception对象才会被实例化。常用于输出错误信息和错误栈 |
out | 对应了servlet中的输出流对象,常常用于输出变量值和常亮。在之前我们提到过jsp的表达式输出,表达式输出的实质就是out对象的输出过程,因此在jsp中能够使用表达式输出的地方都能用到out对象来输出,但表达式输出更加的简洁。 |
page | 代表页面本身 |
pageContext | 代表页面上下文。注意页面上下文和页面本身不同。页面上下文可以用于页面之间的数据共享。通过这个对象可以获取page,request,session,application对象;还可以为参数设置的scope,从而使得参数可以在不同的scope之间共享。但一般page,request,session,application四个对象在jsp中已经内置,因此往往是在servlet中才会使用pageContext来获取我们想要的对象。 |
request | 代表当前请求。客户端的所有请求信息都被封装在这个对象当中,这也是我们最经常使用的一个对象。 |
response | 代表服务器对客户端请求的响应,一般响应分为输出流和重定向。在servlet中输出流通过response获取上面的out对象进行输出,重定向表示生成新的request向一个新的页面发出请求 |
session | 代表一次会话。当客户端浏览器与站点连接,会话建立;客户端关闭浏览器,会话结束。 |
out对象是一个缓冲的输出流,用来向客户端返回信息。由于向客户端输出信息总是要连接,所以向客户端输出总是采用缓冲的形式。当缓冲区满足如下条件是才会写入Servlet引擎提供的缓冲区:设置page指令的buffer属性关闭了out对象的缓存功能;out对象的缓冲区已满。整个JSP页面结束。
<%
out.println("aaa");
response.getWriter().write("bbb");
%>
"bbb会比aaa先输出"
常用方法:
void println() // 向客户端打印字符串
void clear() // 清除缓冲区的内容,如果在flush之后调用会抛出异常。
void clearBuffer() // 清除缓冲区的内容,如果在flush之后调用不会抛出异常
void flush() // 将缓冲区内容输出到客户端
int getBufferSize() // 返回缓冲区以字节数的大小,如不设缓冲区则为0
int getRemaining() // 返回缓冲区还剩余多少可用
boolean isAutoFlush() // 返回缓冲区满是,是自动清空还是抛出异常
void close() // 关闭输出流
request对象用于封装请求数据。一般用户在表单填写的数据会被封装成request对象,通过post方法传递给目标页面。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 的添加<Connector URIEncoding="UTF-8">
属性。
response对象用于封装响应数据,其作用域是本页面。相关方法如下:
String getCharacterEncoding() // 返回响应用的是何种字符编码
void setContentType() // 设置响应的MIME类型,一般为"text/html, charset=UTF-8"
PrintWriter getWriter() // 返回可以向客户端输出字符的一个对象
// PrintWriter与内置out对象的区别:PrintWriter对象的其输出总是提前于内置out对象,或者在out中手动flush
sendRedirect(loaction) // 重新定向客户端的请求
会话对象,用来记录每个客户端的访问状态。常用方法如下
long getCreationTime() // 返回session创建时间
String getId() // 返回session创建时JSP引擎为它设的唯一ID号
Object setAttribute() // 使用指定名称将对象绑定到此会话
Object getAttribute() // 返回与此会话中的指定名称绑定在一起的对象,没有返回null
String[] getValueNames() // 返回一个包含此session中所有可用属性的数组
int getMaxInactiveInterval() // 返回两次强求间隔多长时间此session被取消(单位秒)
void setMaxInactiveInterval() // 设置session存活时间
session的生命周期:
application对象用于获取和设置servlet相关信息,application的生命周期是从服务器启动直到服务器关闭
void setAttribute() // 使用指定名称将对象绑定到此会话
Object getAttribute() // 返回与此会话中的指定名称绑定在一起的对象,如果没有,返回null
Enumeration getAttributeNames() // 返回所有可用属性名的枚举
String getServerInfo() // 返回JSP(Servlet)引擎名及版本号
page对象就是指向当前jsp页面本身,有点像类中的this指针,它是java.lang.Object类的实例。常用方法就是Object类的成员方法。
class getClass() // 返回当前的类名。
int getHashCode() // 返回当前类的哈希码。
String toString() // 将此对象转换成字符串。
boolean equals(object) // 比较两个对象是否是相等。
void copy(object) // 将该对象复制到指定的object对象中。
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其他8个隐式对象的引用,其自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如include,forward其他资源、检索其他域对象中的属性等。
pageContext对象提供了对jsp页面内所有的对象及名字空间的访问。该对象可以访问到本页所在的Session,也可以取本页所在的application中的属性值。该对象相当也页面中所有功能的集大成者。该对象的本类名也叫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() // 查找各个域中的属性
Config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
ServletContext getServletContext() // 返回含有服务器信息的ServletContext对象
String getInitParameter() // 返回初始化参数的值
Enumeration getInitparameterNames() // 返回Servlet初始化所需所有参数的枚举
Exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个jsp页面要应用此对象,就必须报isErrorPage设为true,否则无法编译。
它实际上是java.lang.Throwable的对象。页面要想在有异常时得到处理,就要指定异常处理页面<% page errorPage=“exception.jsp”%>
String getMessage() // 返回描述异常的消息
String toString() // 返回关于异常的简短描述消息
void printStackTrace() // 显示异常及其栈轨迹
ThrowableFillInStackTrace() // 重写异常的执行栈轨迹
除此之外,在web开发过程中,还有一个重要的概念是cookie。
jsp的编译指令不直接生成输出,这些编译指令会通知jsp引擎或者servlet引擎对当前的jsp文件在进行编译的过程中起作用。
<%@ 编译指令名 属性名1=“属性值1” 属性名2=“属性值2” …%>
注意,各属性定义之间不要用符号分隔开<%@ page ...%>
page 的编译指令是针对当前页面,常用的属性有:
属性名 | 作用 |
---|---|
language | 声明当前页面脚本的语言,默认为java |
extends | 指定jsp编译成servlet之后所需要继承的类,或者所实现的接口 |
import | 常用的,用于导入当前脚本中可能使用到的其他包里面的类 |
info | 包含jsp的信息,一般作为当前jsp文件的说明用。可以通过getServletInfo()来获取 |
errorPage | 常用。指定当前jsp文件发生错误时,自动调用改属性值指定的jsp文件。如果不指定当前属性值,当发生错误时,会抛出异常信息给客户。 |
contentType | 指定生成网页的文件格式和编码字符集 |
isErrorPage | 用于指定当前jsp文件是否为错误处理jsp文件 |
一个常见的jsp编译指令的使用可能是:
<%--指定脚本语言是java,指定生成网页的文件格式和编码字符集--%>
<%@ page language="java" contentType="text/html; charset=GBK" %>
<%--指定导入的包的位置--%>
<%@ page import="java.package.*" %>
<%--指定当前jsp文件发生错误时,处理错误的jsp文件--%>
<%@ page errorPage="error.jsp" %>
<%--说明当前jsp文件不是用来处理错的jsp文件--%>
<%@ page isErrorPage="false"%>
<%@ include ...%>
include 用于指定当前页面包含另一个页面,通常是静态包含:
<%@ include file=”xxx.txt”%>
<%@ include file=”xxx.jsp”%>
jsp的include静态导入对象如果是一个jsp文件的话,静态导入的结果还会把目标jsp文件的编译指令导入进来,因此如果两个jsp文件的编译指令发生冲突,那么在容器生成servlet的过程中就会发生错误。
<%@ taglib ...%>
taglib 的编译指令作用由名字也可以知道,就是导入一个标签库,指定标签库的uri以及在当前jsp中使用该标签库中标签的prefix(前缀),就可以完成标签库的导入了。语法如下:
<%@ taglib uri=”xxx/yyy/zzz” prefix=”myTag” %>
<%-使用导入标签库的方式-%>
<myTag:tagName/>
jsp的动作指令有区别于编译指令,编译指令是jsp在通知容器进行编译的过程中起作用的,而动作指令则是在编译之后运行过程中起作用的。常见的jsp的动作指令有:
<jsp:forward ...>
forward动作指令是将当前页面的响应转到一个新的页面,这个新的页面会继续相应。注意:forward指令并不会生成一次新的请求request,这也就是说请求参数不会丢失,在新的页面中还是能够通过request.getParameter()方法获取参数值。除此之外,在转向新的页面之前,还可以通过jsp:param指令向request中添加额外参数。其完整使用语法如下:
<jsp:forward page="URL|<%=expression%>">
<jsp:param name="" value="" />
</jsp:forward>
转到的目标page不仅可以是相对路径下的合法url,还可以是jsp的表达式输出。
<jsp:include ...>
include动作指令和编译指令中的include指令作用相似,都是用于导入某个jsp文件。但include动作指令是一个动态导入指令,不同于静态include导入指令,区别在于:
动态导入指令只会导入被导入文件的主体body部分,其余部分不会导入,也就是说编译指令不会被导入,而静态在导入也会一并把编译指令导入;
动态导入指令并不是真正将被导入文件内容插入到自身,而是调用编译后的servlet中的include方法将被导入文件的主体body部分导入进来,而静态指令是两者合二为一生成一个servlet;
动态导入还可以利用jsp的param动作指令为被导入文件添加而外的参数;
jsp的include指令的语法如下:
<jsp:include page="{url|<%=expression%>}">
<jsp:param name="" value="" />
</jsp:include>
<jsp:param ...>
当使用<jsp:include>
和<jsp:forward>
标签引入或将请求转发给其它资源时,可以使用<jsp:param>
标签向这个资源传递参数。
<jsp:param>
标签的name属性用于指定参数名,value属性用于指定参数值。<jsp:include>
和<jsp:forward>
标签中可以使用多个<jsp:param>
标签来传递多个参数。<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。