JSP | JSP 动作详解
原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处。
本篇学习自:C语言中文网,部分内容转载仅供学习使用。
JSP 动作利用 XML 语法格式的标记来控制服务器的行为,完成各种通用的 JSP 页面功能,也可以实现一些处理复杂业务逻辑的专用功能。如利用 JSP 动作可以动态地插入文件、重用 JavaBean
组件、把用户重定向到另外的页面、为 Java 插件生成 HTML 代码。
JSP 动作与 JSP 指令的不同之处是,JSP 页面被执行时首先进入翻译阶段,程序会先查找页面中的 JSP 指令标识;并将它们转换成 Servlet
,所以,这些指令标识会首先被执行,从而设置了整个 JSP 页面,所以,JSP 指令是在页面转换时期被编译执行的,且编译一次;而 JSP 动作是在客户端请求时按照在页面中出现的顺序被执行的,它们只有被执行的时候才会去实现自己所具有的功能,且基本上是客户每请求一次,动作标识就会执行一次。
JSP 动作的通用格式如下:
<jsp:动作名 属性1="属性值1"...属性n="属性值n" />
或者
<jsp:动作名; 属性1="属性值1"...属性n="属性值n">相关内容</jsp:动作名>
JSP 中常用的动作包括 <jsp:include>、<jsp:param>、<jsp:forward>、<jsp:plugin>、<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>。在后文中,将依次介绍这几个动作。
JSP include动作
include
动作用于把另外一个文件的输出内容插入当前 JSP 页面的输出内容中,这种在 JSP 页面执行时引入的方式称为动态引入,这样,主页面程序与被包含文件是彼此独立的,互不影响。被包含的文件可以是一个动态文件(JSP 文件),也可以是一个静态文件(如文本文件)。
其语法格式如下:
<jsp:include page="ralativeURL | <%=expressicry%>" />
说明:page 属性指定了被包含文件的路径,其值可以是一个代表相对路径的表达式。当路径以“/”开头时,将在当前应用程序的根目录下查找文件;如果是以文件名或文件夹名开头,将在当前页面的目录下查找文件。书写此动作标记时,“jsp
”和“:”以及“include
”三者之间不要有空格,否则会出错。
include
动作对包含的动态文件和静态文件的处理方式是不同的。
- 如果包含的是一个静态文件,被包含文件的内容将直接嵌入 JSP 文件中存放 <jsp:include> 动作的位置,而且当静态文件改变时,必须将 JSP 文件重新保存(重新转译),然后才能访问变化了的文件。
- 如果包含的是一个动态文件,则由 Web 服务器负责执行,把执行后的结果传回包含它的 JSP 页面中,若动态文件被修改,则重新运行 JSP 文件时就会同步发生变化。
【例 1】在 JSP 文件中使用 <jsp:include> 动作包含静态文件。
- 创建静态文件 Hello.txt,输入以下代码:注意编码格式使用(ANSI 或 UTF-8)防止乱码
<font color="blue" size="3">
<br>这是静态文件 Hello.txt 的内容
</font>
- 创建主页面文件 index.jsp,具体代码如下:
<%@ page contentType="text/html;iso-8859-1" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<body>
使用 <jsp:include> 动作标记将静态文件包含到JSP文件中!
</hr>
<jsp:include page="Hello.txt"/>
</body>
</html>
- 运行 index.jsp,运行结果如图 1 所示。
要注意,<jsp:indude> 动作与前面讲解的 include 指令作用类似,现将它们之间的差异总结如下。
-
属性不同
include 指令通过 file 属性来指定被包含的页面,该属性不支持任何表达式。如果在 file 属性值中应用了 JSP 表达式,会拋出异常。例如下面的代码:
<% String fpath="fir.jsp";%>
<%@ include file="<%=fpath%>" %>
该用法将会拋出如下异常:
File "/<%=fpath%>" not fount
<jsp:include> 动作是通过 page 属性来指定被包含页面的,该属性支持 JSP 表达式。
-
处理方式不同
使用 include 指令包含文件时,被包含文件的内容会原封不动地插入到包含页中使用该指令的位置,然后 JSP 编译器再对这个合成的文件进行翻译,所以最终编译后的文件只有一个。
而使用 <jsp:include> 动作包含文件时,只有当该标记被执行时,程序才会将请求转发到(注意是转发,而不是请求重定向)被包含的页面,再将其执行结果输出到浏览器中,然后重新返回到包含页来继续执行后面的代码。因为服务器执行的是两个文件,所以 JSP 编器将对这两个文件分别进行编译。
-
包含方式不同
include 指令的包含过程为静态包含,因为在使用 include 指令包含文件时,服务器最终执行的是将两个文件合成后由 JSP 编译器编译成的一个 Class 文件,所以被包含文件的内容应是固定不变的,若改变了被包含的文件,则主文件的代码就发生了改变,因此服务器会重新编译主文件。
<jsp:include> 动作的包含过程为动态包含,通常用来包含那些经常需要改动的文件。
-
对被包含文件的约定不同
使用 include 指令包含文件时,因为 JSP 编译器是对主文件和被包含文件进行合成后再翻译,所以对被包含文件有约定。例如,被包含的文件中不能使用 <html></html>、<body></body> 标记;被包含文件要避免变量和方法在命名上与主文件冲突的问题。
提示:
如果在 JSP 页面中需要显示大量的文本文字,可以将文字写入静态文件中(如记事本),然后通过 include
指令或动作标记包含进来,以提高代码的可读性。
JSP param动作
当使用 <jsp:include> 动作标记引入的是一个能动态执行的程序时,如 Servlet 或 JSP 页面,可以通过使用 <jsp:param> 动作标记向这个程序传递参数信息。
其语法格式如下:
<jsp:include page="relativeURL | <%=expression%>" />
<jsp:param name="pName1" value="pValue1 | <%=expreesion1%>“ />
<jsp:param name="pName2" value="pValue2 | <%=expreesion2%>” />
...
</jsp:include>
说明:<jsp:param> 动作的 name 属性用于指定参数名,value 属性用于指定参数值。在 <jsp:include> 动作标记中,可以使用多个 <jsp:param> 传递参数。另外,<jsp:forward> 和 <jsp:plugin> 动作标记中都可以利用 <jsp:param> 传递参数。
【例1】使用 <jsp:param> 动作标记向被包含文件传递参数。
- 创建主页面 index.jsp,用 <jsp:include> 包含用于对三个数进行排序的页面 order.jsp,并且使用 <jsp:param> 向其传递 3 个参数。具体代码如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title> JSP - param 动作标记实例 </title>
</head>
<body>
使用<jsp:include>包含用于对三个数进行排序的页面order.jsp,<br>
并利用<jsp:param>把等排序的三个数8,3,5传给order,jsp后,<br>
并得结果如下:
<hr/>
<jsp:include page="order.jsp">
<jsp:param name="num1" value="8"/>
<jsp:param name="num2" value="3"/>
<jsp:param name="num3" value="5"/>
</jsp:include>
</body>
</html>
- 创建用于对三个数进行排序的页面 order.jsp,具体代码如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<%
String str1=request.getParameter("num1");
int m1 = Integer.parseInt(str1);
String str2=request.getParameter("num2");
int m2 = Integer.parseInt(str2);
String str3=request.getParameter("num3");
int m3 = Integer.parseInt(str3);
int tmp;
if(m1 > m2) {
tmp = m1;
m1 = m2;
m2 = tmp;
}
if(m2 > m3){
tmp = m2;
m2 = m3;
m3 = tmp;
}
if(m1 > m3){
tmp = m1;
m1 = m3;
m3 = tmp;
}
%>
<font color="blue" size="4">
这三个数从小到大的顺序为:<%=m1%>、<%=m2%>、<%=m3%>
</font>
</body>
</html>
- 运行 index.jsp,运行结果如图所示。
JSP forward动作
在大多数的网络应用程序中,都有这样的情况:在用户成功登录后转向欢迎页面,此处的“转向”,就是跳转。<jsp:forward> 动作标记就可以实现页面的跳转,用来将请求转到另外一个 JSP、HTML 或相关的资源文件中。
当 <jsp:forward> 动作标记被执行后,当前的页面将不再被执行,而是去执行该标记指定的目标页面,但是,用户此时在地址栏中看到的仍然是当前网页的地址,而内容却已经是转向的目标页面了。(超链接的概念)
其语法格式如下:
<jsp:forward page="relativeURL" | "<%=expression %>" />
如果转向的目标是一个动态文件,还可以向该文件传递参数,使用格式如下:
<jsp:forward page="relativeURL" | "<%=expression %>" />
<jsp:param name="pName1" value="pValue1 | <%=expression1 %>" />
<jsp:param name="pName2" value="pValue2 | <%=expression2 %>" />
说明如下:
- page 属性用于指定要跳转到的目标文件的相对路径,也可以通过执行一个表达式来获得。如果该值以“/”开头,表示在当前应用的根目录下查找目标文件,否则,就在当前路径下查找目标文件。请求被转向到的目标文件必须是内部的资源,即当前应用中的资源。如果想通过 forward 动作转发到外部的文件中,将出现资源不存在的错误信息。
- forward 动作执行后,当前页面将不再被执行,而是去执行指定的目标页面。
- 转向到的文件可以是 HTML 文件、JSP 文件、程序段,或者其他能够处理 request 对象的文件。
- forward 动作实现的是请求的转发操作,而不是请求重定向。它们之间的一个区别就是:进行请求转发时,存储在 request 对象中的信息会被保留并被带到目标页面中;而请求重定向是重新生成一个 request 请求,然后将该请求重定向到指定的 URL,所以,事先储存在 request 对象中的信息都不存在了。
【例1】使用 <jsp:forward> 动作标记实现网页跳转。
- 创建主页面 index.jsp,通过表单输入用户名和密码,单击“登录”按钮,利用 <jsp:forward> 动作标记跳转到页面 target.jsp。具体代码如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<form action=" " method="post" name="Form"> <!--提交给本页处理-->
用户名: <input name="UserName" type="text" /> <br/>
密 码: <input name="UserPwd" type="password" /> <br/>
<input type="submit" value="登录" />
</form>
<%
//当单击“登录”按钮时,调用Form1.submit()方法提交表单至本文件,
//用户名和密码均不为空时,跳转到targe.jsp,并且把用户名和密码以参数形式传递
String s1 = null,s2 = null;
s1 = request.getParameter("UserName");
s2 = request.getParameter("UserPwd");
if(s1 != null && s2 != null){
%>
<jsp:forward page="target.jsp">
<jsp:param name="Name" value="<%=s1%>" />
<jsp:param name="Pwd" value="<%=s2%>" />
</jsp:forward>
<%
}
%>
</body>
</html>
- 创建所转向的目标文件 target.jsp,具体代码如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<%
String strName =request.getParameter("UserName"),strPwd=request.getParameter("UserPwd");
out.println(strName + "您好,您的密码是: " + strPwd);
%>
</body>
</html>
- 运行即可,在输入用户名和密码之后会自动跳转显示结果
JSP plugin动作
<jsp:plugin> 动作可以在页面中插入 Java Applet 小程序或 JavaBean,它们能够在客户端运行,但此时,需要在 IE 浏览器中安装 Java 插件。当 JSP 文件被编译并送往浏览器时,<jsp:plugin> 动作将会根据浏览器的版本,替换成 <object> 或者 <embed> 页面 HTML 兀素。
注意,<object> 用于 HTML 4.0,<embed> 用于 HTML 3.2。
通常,<jsp:plugin> 元素会指定对象是 Applet 还是 Bean,同样也会指定 class 的名字以及位置。另外,还会指定将从哪里下载 Java 插件。该动作的语法格式如下:
<jsp:plugin
type="bean|applet" code="ClassFi1eName"
codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVersionNumber|1.1"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"] >
[<jsp:params>
<jsp:param name="parameterName"
value="{parameterValue|<%=expression %>" />
</jsp:params>]
[<jsp:fallback>text message for user</jsp:fallback>]
</jsp:plugin>
参数说明如下:
- type 属性的作用是定义插入对象的类型,对象类型有两个值,分别是 bean 或者 applet。(必须定义的属性)
- code 属性定义插入对象的类名,该类必须保存在 codebase 属性指定的目录内。(必须定义的属性)
- codebase 属性定义对象的保存目录。(必须定义的属性)
- name 属性定义 bean 或 Applet 的名字。
- archive 属性定义 Applet 运行时需要的类包文件。
- align 属性定义 Applet 的显示方式。
- height 属性定义 Applet 的高度。
- width 属性定义 Applet 的长度。
- hspace 属性定义 Applet 的水平空间。
- vspace 属性定义 Applet 的垂直空间。
- jreversion 属性定义 Applet 运行时所需要的 JRE 版本,缺省值是 1.1。
- nspluginurl 属性定义 Netscape Navigator 用户在没有定义 JRE 运行环境时下载 JRE 的地址。
- iepluginurl 属性定义 IE 用户在没有定义 JRE 运行环境时下载 JRE 的地址。
- jsp:params 标识的作用是定义 Applet 的传入参数。
- jsp:fallback 标识的作用是当对象不能正确显示时传给用户的信息。
【例1】使用 <jsp:plugin> 动作标记在 JSP 中加载 Java Applet 小程序。
- 创建 index.jsp 页面,使用 <jsp:plugin> 动作标记加载:
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<body>
加载MyApplet.class文件的结果如下: <hr/>
<jsp:plugin type="applet" code="MyApplet.class" codebase="."
jreversion="1.2" width="400" heigh="80">
<jsp:fallback>
加载Java Applet小程序失败!
</jsp:fallback>
</jsp:plugin>
</body>
</html>
- 其中插件所执行的类 MyApplet.class 的源文件为 MyApplet.java,代码如下:
import java.applet.*;
import java.awt.*;
public class MyApplet extends Applet
{
public void paint(Graphics g)
{
g.setColor(Color.red);
g.drawString("您好!我就是 Applet 小程序!",5,10);
g.setColor(Color.green);
g.drawString("我是通过应用<jsp:plugin>动作标记",5,30);
g.setColor(Color.blue);
g.drawString("将 Applet 小程序嵌入到 JSP 文件中",5,50);
}
}
将 index.jsp 及 MyApplet.java 文件经过 Java 编译器编译成功后,生成的 MyApplet.class 字节文件都存放在同目录下。
重新启动 Tomcat 后,在浏览器的地址栏中输入 http://localhost:8080/demo_war_exploded/index.jsp,按 Enter 键后,若客户机上没有安装 JYM(Java 虚拟机),将会访问 Sun 公司的网站,并且弹出下载 Java plugin 的界面。
下载完毕后,将会出现 Java plugin 插件的安装界面,可以按照向导提示,逐步完成安装过程。然后,就可以使用 JVM 而不是 IE 浏览器自带的 JVM 来加载执行 MyApplet.class 字节码文件了,最终得到的运行结果如图所示。
关于 JSP useBean、setProperty 和 getProperty 动作等之后学完 JavaBean 再来补充