JSP | JSP 动作详解

原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处。

本篇学习自:C语言中文网,部分内容转载仅供学习使用。


\[QAQ \]


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> 动作包含静态文件。

  1. 创建静态文件 Hello.txt,输入以下代码:注意编码格式使用(ANSI 或 UTF-8)防止乱码
<font color="blue" size="3">
    <br>这是静态文件 Hello.txt 的内容
</font>
  1. 创建主页面文件 index.jsp,具体代码如下:
<%@ page contentType="text/html;iso-8859-1" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<body>
    使用 &lt;jsp:include&gt; 动作标记将静态文件包含到JSP文件中!
    </hr>
    <jsp:include page="Hello.txt"/>
</body>
</html>
  1. 运行 index.jsp,运行结果如图 1 所示。

运行结果示意图


要注意,<jsp:indude> 动作与前面讲解的 include 指令作用类似,现将它们之间的差异总结如下。

  1. 属性不同

    include 指令通过 file 属性来指定被包含的页面,该属性不支持任何表达式。如果在 file 属性值中应用了 JSP 表达式,会拋出异常。例如下面的代码:

<% String fpath="fir.jsp";%>
<%@ include file="<%=fpath%>" %>

该用法将会拋出如下异常:

File "/<%=fpath%>" not fount

<jsp:include> 动作是通过 page 属性来指定被包含页面的,该属性支持 JSP 表达式。

  1. 处理方式不同

    使用 include 指令包含文件时,被包含文件的内容会原封不动地插入到包含页中使用该指令的位置,然后 JSP 编译器再对这个合成的文件进行翻译,所以最终编译后的文件只有一个。

    而使用 <jsp:include> 动作包含文件时,只有当该标记被执行时,程序才会将请求转发到(注意是转发,而不是请求重定向)被包含的页面,再将其执行结果输出到浏览器中,然后重新返回到包含页来继续执行后面的代码。因为服务器执行的是两个文件,所以 JSP 编器将对这两个文件分别进行编译。

  2. 包含方式不同

    include 指令的包含过程为静态包含,因为在使用 include 指令包含文件时,服务器最终执行的是将两个文件合成后由 JSP 编译器编译成的一个 Class 文件,所以被包含文件的内容应是固定不变的,若改变了被包含的文件,则主文件的代码就发生了改变,因此服务器会重新编译主文件。

    <jsp:include> 动作的包含过程为动态包含,通常用来包含那些经常需要改动的文件。

  3. 对被包含文件的约定不同

    使用 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> 动作标记向被包含文件传递参数。

  1. 创建主页面 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>
使用&lt;jsp:include&gt;包含用于对三个数进行排序的页面order.jsp,<br>
并利用&lt;jsp:param&gt;把等排序的三个数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>
  1. 创建用于对三个数进行排序的页面 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>
  1. 运行 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 %>" />

说明如下:

  1. page 属性用于指定要跳转到的目标文件的相对路径,也可以通过执行一个表达式来获得。如果该值以“/”开头,表示在当前应用的根目录下查找目标文件,否则,就在当前路径下查找目标文件。请求被转向到的目标文件必须是内部的资源,即当前应用中的资源。如果想通过 forward 动作转发到外部的文件中,将出现资源不存在的错误信息。
  2. forward 动作执行后,当前页面将不再被执行,而是去执行指定的目标页面。
  3. 转向到的文件可以是 HTML 文件、JSP 文件、程序段,或者其他能够处理 request 对象的文件。
  4. forward 动作实现的是请求的转发操作,而不是请求重定向。它们之间的一个区别就是:进行请求转发时,存储在 request 对象中的信息会被保留并被带到目标页面中;而请求重定向是重新生成一个 request 请求,然后将该请求重定向到指定的 URL,所以,事先储存在 request 对象中的信息都不存在了。

【例1】使用 <jsp:forward> 动作标记实现网页跳转。

  1. 创建主页面 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/>
    密&nbsp;&nbsp;码: <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>
  1. 创建所转向的目标文件 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>
  1. 运行即可,在输入用户名和密码之后会自动跳转显示结果

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>

参数说明如下:

  1. type 属性的作用是定义插入对象的类型,对象类型有两个值,分别是 bean 或者 applet。(必须定义的属性)
  2. code 属性定义插入对象的类名,该类必须保存在 codebase 属性指定的目录内。(必须定义的属性)
  3. codebase 属性定义对象的保存目录。(必须定义的属性)
  4. name 属性定义 bean 或 Applet 的名字。
  5. archive 属性定义 Applet 运行时需要的类包文件。
  6. align 属性定义 Applet 的显示方式。
  7. height 属性定义 Applet 的高度。
  8. width 属性定义 Applet 的长度。
  9. hspace 属性定义 Applet 的水平空间。
  10. vspace 属性定义 Applet 的垂直空间。
  11. jreversion 属性定义 Applet 运行时所需要的 JRE 版本,缺省值是 1.1。
  12. nspluginurl 属性定义 Netscape Navigator 用户在没有定义 JRE 运行环境时下载 JRE 的地址。
  13. iepluginurl 属性定义 IE 用户在没有定义 JRE 运行环境时下载 JRE 的地址。
  14. jsp:params 标识的作用是定义 Applet 的传入参数。
  15. jsp:fallback 标识的作用是当对象不能正确显示时传给用户的信息。

【例1】使用 <jsp:plugin> 动作标记在 JSP 中加载 Java Applet 小程序。

  1. 创建 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>
  1. 其中插件所执行的类 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:plugin标记在JSP中加载Java Applet小程序

关于 JSP useBean、setProperty 和 getProperty 动作等之后学完 JavaBean 再来补充

posted @ 2021-10-08 21:09  RioTian  阅读(422)  评论(0编辑  收藏  举报