概念
JSP 是Java Server Page 的缩写,是Servlet 的简化。它是由Sun 公司提出的,并由许多公司参与制定的一种动态网页标准。
其主要特点是在HTML 页面中加入Java 代码片段,或者使用各种JSP 标签,包括使用用户标签,构成JSP 网页。
【早期使用JSP 页面的用户非常广泛,一个Web 应用可以全部由JSP 页面组成,只辅以少量的JavaBean 即可。自J2EE 标准出现以后,人们逐渐认识到使用JSP充当过多的角色是不合适的Q 因此, JSP 慢慢发展成学一的表现层技术,不再承担业务逻辑组件及持久层组件的责任。】
JSP 是Servlet 的扩展,在没有JSP 之前,就已经出现了Servlet 技术。Servlet 是利用输出流动态生成HTML 页面,包括每一个HTML 标签和每个在HTML 页面中出现的内容。
注释
JSP 注释用于表明在程序开发过程中的开发提示,它不会输出到客户端。
JSP 注释的格式如下:
〈%--在注释内容--%>
与JSP 注释形成对比的是HTML 注释, HTML 注释的格式是
<!--注释内容-->
JSP 页面会编译成一个Servlet 类,每个Servlet 在容器中只有一个实例:而在JSP 中声明的变量是类的成员变量,成员变量只在创建实例时初始化,该变量的值将一直保存,直到实例销毁。值得注意的是, infoO的值也可正常输出。因为JSP 声明的方法其实是在JSP 编译生成的Servlet 类的方法一Java 里的方法是不能独立存在的,即使在JSP 页面中也不行。
表达式
JSP 提供了一种输出表达式值的简单方法,输出表达式值的格式如下:
〈%=表达式%〉
脚本
JSP 脚本的应用非常广泛,可通过Java 代码镶嵌在HTML 代码中,即使用JSP 脚本。
因此,所有能在Java 程序中执行的代码,都可以通过JSP 脚本执行。
看下面的代码:
<! -- Java 脚本,这些脚本会对HTML 的标签产生作用一〉
〈%
for(int i = 0 ; i < 10 ; i++) {
%〉
<td><%=i%></td>
<%}%>
上面的JSP 页面,其简单的循环将导致<tr/>标签循环10 次,即生成一个10 行
的表格,并在表格中输出表达式值
三个编译指令
JSP 的编译指令是通知JSP 引擎的消息,它不直接生成输出。编译指令都有默认值,因此开发人员无须为每个指令设置值。
常见的编译指令有三个。
page: 该指令是针对当前页面的指令。
include: 用于指定如何包含另一个页面。
tablib: 用于定义和访问自定义标签。
编译指令的格式如下:
<%@ 编译指令名 属性名="属性值"…%>
page 指令
page 指令,通常位于JSP 页面的顶端,对同一个页面可以有多个page 指令。
page指令的语法格式如下:
〈%@ page
[language="Java"]
[extends="package.class"]
[import= "package. class | package. *},…"]
[session=true | false"]
[buffer="none | 8kb | size kb"]
[autoFlush="true | false"]
[isThreadSafe="true | false"]
[info="text"]
[errorPage="relativeURL"]
[contentType=mimeType[ ;charset=characterSet]" | "text/html;charSet= ISO-8859-1"]
[isErrorPage=" true | false"]
%〉
下面依次介绍page 的各个属性。
language: 声明当前JSP 页面使用的脚本语言的种类,因为页面是JSP 页面,该属性的值通常都是java 。
extends: 确定JSP 程序编译时所产生的Java 类,需要继承的父类,或者需要实现的接口的全限定类名。
import: 用来导入包,下面几个包是默认自动导入的,不需要显式导入。默认导入的包有: java .lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet. http
session: 设定这个JSP 页面是否需要HTIP session 。
buffer: 指定输出缓冲区的大小。输出缓冲区的JSP 内部对象: out 用于缓存JSP页面对客户浏览器的输出,默认值为8k,可以设置为none ,也可以设置为其他的值,单位为kb 。
autoFlush: 当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。设置为true 时为正常输出:如果设置为false ,会在buffer 溢出时产生一个异常。
info: 设置该JSP 程序的信息,也可以看做其说明,可以通过Servlet. getServletInfo
方法获取该值。如果在JSP 页面中,可直接调用getServletInfo方法获取该值,因为JSP 页面的实质就是Servlet 。
errorPage: 指定错误处理页面。如果本程序产生了异常或者错误,而该JSP 页面没有对应的处理代码,则会自动调用该指令所指定的JSP 页面。使用JSP 页面时,可以不处理异常,即使是checked 异常。
isErroePage: 设置本JSP 页面是否为错误处理程序。如果该页面本身己是错误处理页面,则无须使用errorPage 属性。
contentType: 用于设定生成网页的文件格式和编码方式,即MIME 类型和页面宇符集类型,默认的MIME 类型是textlhtml; 默认的字符集为ISO-8859-1。
include 指令
使用include 指令,可以将一个外部文件嵌入到当前JSP 文件中,同时解析这个页面
中的JSP 语句(如果有的话)。这是个静态的include 语旬,不会检查所包含JSP 页面的变化。
include 既可以包含静态的文本,也可以包含动态的JSP 页面。静态的编译指令
include ,是将被包含的页面加入进来,生成一个完整的页面。
include 编译指令的语法:
〈%@ include file="relativeURLSpec" %〉
如果被嵌入的文件经常需要改变,建议使用<jsp:include>操作指令,因为它是动态的include 语句。
JSP 的7 个动作指令
动作指令与编译指令不间,编译指令是通知Servlet 引擎的处理消息,而动作指令只
是运行时的脚本动作。编译指令在将JSP 编译成Servlet 时起作用:处理指令通常可替换
成Java 脚本,是JSP 脚本的标准化写法。
JSP 动作指令主要有如下7 个。
jsp:forward: 执行页面转向,将请求的处理转发到下一个页面。
jsp:param: 用于传递参数,必须与其他支持参数曲标签一起使用。
jsp:include: 用于动态引入一个JSP 页面。
jsp:p1ugin: 用于下载JavaBean 或Applet 到客户端执行。
jsp:useBean: 使用JavaBean 。
jsp:setProperty: 修改JavaBean 实例的属性值。
jsp:getProperty: 获取JavaBean 实例的属性值。
【forward 指令】
forward 指令用于将页面响应控制转发给另外的页面。既可以转发给静态的HTML
页面,也可以转发到动态的JSP 页面,或者转发到容器中的Servlet
JSP 的forward 指令的格式如下:
对于JSP 1. 0 ,使用如下语法:
<jsp: forward page=" {relativeURL | <%=expression%>}"/>
对于JSP 1. 1 以上,可使用如下语法:
<jsp:forward page=" { relativeURL | <%=expression %>}">
{<jsp:param.../>}
</jsp:forward>
<jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
【include 指令】
include 指令是一个动态include 指令,也用于导入某个页面,它的导入会每次检查
被导入页面的改变。下面是include 指令的使用格式:
<jsp: include page=" {relativeURL I <%=expression%>}" flush= “true” />
或者
<jsp:include page="{relativeURL I <%=expression%>}" flush="true 与
<jsp:param name="parameterName" value="patameterValue"l>
</jsp:include>
flush 属性用于指定输出缓存是否转移到被导入文件中。如果指定为true,则包含在被导入文件中:如果指定为false,则包含在原文件中。对于JSP 1.1旧版本,只能设置为false。
对于第二种格式,可用于在导入页面中加入参数值。
【useBean, setProperty, getProperty 指令】
这三个都是与JavaBean 相关的指令,其中第一个指令用于在JSP 页面中初始化一个Java 实例; setProperty 指令用于修改JavaBean 实例的属性; getProperty 用于获取JavaBean实例的属性。
useBean 的语法格式如下:
<jsp:useBean id="name" class="classname" scope="page | request | session | application" />
id 属性是JavaBean 的实例名, class 属性确定JavaBean 的实现类。
其中scope 属性用于确定JavaBean 实例的生存范围,该范围有以下四个值。
page: 该JavaBean 实例仅在该页面有效。
request: 该JavaBean 实例在本次请求有效。
session: 该JavaBean 实例在本次session 内有效。
application: 该JavaBean 实例在本应用内一直有效。
setProperty 的语法格式如下:
<jsp:setProperty name="BeanName" proterty="propertyName" value="value"/>
其中name 属性确定需要设定JavaBean 的实例名; property 属性确定需要设置的属性名; value 属性则确定需要设置的属性值。
getProperty 的语法格式如下:
<jsp:setProperty name="BeanName" proterty="propertyName" />
其中name'属性确定需要输出的JavaBean 的实例名; property 属性确定需要输出的属性名。
【plugin 指令】
plugin 指令主要用于下载服务器端的JavaB ean 或Applet 到客户端执行。由于程序在
客户端执行,因此客户端必须安装虚拟机。
plugin 的语法格式如下:
<jsp:plugin type=bean | applet"
code="classFileName"
codebase="classFileDiretoryName"
[name=" instanceName"]
[archive="URLtoArchive"]
algin= "bottom 1 top I middle 1 left 1 right"]
[heigh="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPiexels"]
[jreversion=JREVersionNumber11.2"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"]>
[<jsp:parames>
[jsp:param name="parameterName" value="parameterValue"I>]
</jsp:params>]
[<jsp:fallback>text message for user that can no see the plugin
</jsp:fallback> ]
</jsp:plugin>
关于这些属性的说明如下。
type: 指定被执行的Java 程序的类型。
code: 指定被执行的文件名,该属性值必须以" .class" 扩展名结尾。
codebase: 指定被执行文件所在的目录。
name: 给该程序起一个名字用来标识该程序。
archive: 指向一些要预先载入的将要使用到的类的路径。
hspace,vspace: 显示左右,上下的留白。
jreversion: 能正确运行该程序必需的JRE 版本,默认值是1.2
nsplugin,ieplugin:Netscape Navigator, Internet Exploer下载运行所需JRE 的地址。
<jsp:fallback>指令:当不能正确显示该Applet 时,代替显示的提示信息。
【pararn 指令】
可以与以下三个指令结合使用:
jsp:include
jsp:forward
jsp:plugin
当与include 指令结合使用时, pararn 指令用于将参数值传入被导入的页面:当与
forward 指令结合使用时, pararn 指令用于将参数值传入被转向的页面:当与plugin 指令
结合使用时,则用于将参数传入页面中的JavaBean 实例或Applet 实例。
pararn 指令的语法格式如下:
<jsp:param name="pararnName" value="paramValue"/>
9 个内置对象
application: javax.servlet. ServletContext 的实例,该实例代表JSP 所属的Web 应用
本身,可用于JSP 页面,或者Servlet 之间交换信息。
常用的方法有
getAttribute(String attNarne) , setAttribute(String attNarne , String attValue)
和getInitParameter(String paramNarne)等。
config: javax.servlet. ServletConfig 的实例,该实例代表该JSP 的配置信息。
常用的方法有
getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事实上, JSP 页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet 中有效。
exception: java.lang.Throwable 的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page 的isErrorPage 属性为true 时,该对象才可以使用。常用的方法有getMessageO和printStackTrace等。
out: javax.servlet.jsp.JspWriter 的实例,该实例代表JSP 页面的输出流,用于输出内容,形成HTML 页面。
page: 代表该页面本身,通常没有太大用处。也就是Servlet 中的this ,其类型就是生成的Servlet 。
pageContext: javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext和getServletConfig等。
request: javax.servlet. http:HttpServletRequest 的实例,该对象封装了一次请求,客
户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参
数必须使用该对象。常用的方法有getPararneter(String paramNarne),
getPararneterValues(String paramName),
setAttribute(String atttibuteName,Object attributeValue),
getAttribute(String attributeName)和setCharacterEncoding(String env)等。
response: javax.servlet.http.HttpServletResponse 的实例,代表服务器对客户端的响应。通常,也很少使用该对象直接响应,输出响应使用out 对象,而response 对象常用于重定向。常用的方法有sendRedirect(j ava.lang.String location)等。
session: javax.servlet.http.HttpSession 的实例,该对象代表一次会话。从客户端浏览器与站点建立连接起,开始会话,直到关闭浏览器时结束会话。常用的方法有:
getAttribute(String attName), setAttribute(String attName, String attValue)等。
JSP 定义
JSP 属性定义使用<jsp-property-group/>元素配置,主要包括如下四个方面。
·是否允许使用表达式语言:使用<el-ignored/>元素确定,默认值为false 。
·是否允许使用Java 脚本:使用<scripting-invalid/>元素确定,默认值为false 。
·声明JSP 页面的编码:使用<page-encoding/>元素确定。
·使用隐式包含:使用<include-prelude/>和<include-codal>元素确定。
看下面的配置文件:
<?xm1 version="1.0" encoding="ISO-8859-1"?>
<!--Serv1et2.4 以上版本的Web 应用配置的根元素->
<web-app xm1ns=''http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=''http://www.w3.org /2 001/XMLSchema-instance''
xsi:schemaLocation=''http://java.sun.com/xml/ns/j2ee http://java.sun.com
/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<1-- 关于JSP 的配置信息-->
<jsp-config>
<]sp-property-group>
<!-- 对哪个文件应用配置-->
<url-pattern>/test1.jsp</url-pattern>
<!--忽略表达式语言-->
<el-ignored>true</el-ignored>
<'--页面编码方式-->
<page-encoding>GBK</page-encoding>
<'--不允许使用Java 脚本-->
<scripting-invalid>true</scripting-invalid>
<'--隐式导入页面头-->
〈工nclude-prelude>/inc/top.jspf</inc1ude-prelude>
<'--隐式导入页面尾-->
<include-coda>/inc/bottom.jspf</include-coda>
</jsp-property-group>
<]sp-property-group>
<1- 对哪个文件应用配置->
<url-pattern>/test2.jsp</url-pattern>
<el-ignored>false</el-ignored>
<!-- 页面编码方苯-->
<page-encoding>GBK</page-encoding>
<!一允许使用Java 脚本一〉
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
</jsp-config>
</web-app>
注意:如果在不允许使用Java 脚本的页面中使用Java 脚本,则页面将出现错误。
即test1 .jsp 页面中不允许出现Java 脚本。
表达式语言的内置对象
使用表达式语言可以直接获取请求参数,可获取页面中某个JavaBean 的属性值,获取请求头及获取session 属性值等,这些都得益于表达式语言的内置对象。
表达式语言包含如下11 个内置对象。
pageContext: 代表该页面的pageContext 对象,与JSP 的pageContext 内置对象相同。
pageScope: 用于获取page 范围的属性值。
requestScope: 用于获取request 范围的属性值。
sessionScope: 用于获取session 范围的属性值。
applicationScope: 用于获取application 范围的属性值。
param: 用于获取请求的参数值。
paramValues: 用于获取请求的参数值,与param 的区别在于,该对象用于获取属
性值为数组的属性值。
header: 用于获取请求头的属性值。
headerValues: 用于获取请求头的属性值,与header 的区别在于,该对象用于获取属性值为数组的属性值。
initParam: 用于获取请求Web 应用的初始化参数。
cookie: 用于获取应用的Cookie 值。
表达式语言的自定义函数
表达式语言除了可以使用基本的运算符外,还可以使用自定义函数。通过使用自定
义函数,加强了表达式语言的功能。
自定义函数的用法非常类似于标签的用法,同样需要定义函数处理类和使用标签库。
下面介绍定义函数的开发过程。
(1)开发函数处理类:函数处理类就是普通类,这个普通类中包含若干个静态方法,
每个静态方法都可定义成一个函数。
public class Functions{
//对字符串进行反转
public static String reverse( String text ){
return new StringBuffer(text).reverse().toString();
}
//统计字符串的个数
public static int countChar( String text) {
return text.length();
}
}
(2) 使用标签库定义函数,定义函数方法与定义标签库方法相同。下面是定义函的配置文件:
<?xml version="l.O" encoding="UTF-8" ?>
<1 一标签库配置文件的根元素一〉
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/200l/XMLSchema-instance"
xsi:schemaLocation="http://j ava.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<jsp-version>2.0</jsp-version>
<tlib-version>l.O</tlib-version>
<1-- 定义第一个函数>
<function>
<!- 定义第一个函数:reverse-->
<name>reverse</name>
<!一定义函数的处理类>
<function-class>lee.Functction/function-class>
<!- 定义函数的对应的方法-->
<function-signature>java.lang.String reverse( java.lang.String )
</function-signature>
</function>
<function〉
<!-- 定义第二个函数: countChar-->
<name>countChar</name>
<!一定义函数的处理类->
<function-class>lee.Functions</function-class>
<1- 定义函数的对应的方法->
<function-signature>int countChar( java.lang.String )</function-signature>
</function>
</taglib>
作者:hoojo
出处:
blog:http://blog.csdn.net/IBM_hoojo
http://hoojo.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权所有,转载请注明出处 本文出自:
版权所有,欢迎转载,转载请注明出处,谢谢