原作者为 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 useBean、setProperty 和 getProperty 动作等之后学完 JavaBean 再来补充

JSP | JSP 动作详解的更多相关文章

  1. JSP 注释的详解及简单实例

    转自:https://www.jb51.net/article/124727.htm JSP 注释的详解及简单实例 一 三种格式 二 举例 ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  2. cocos2dx常见的46中+22中动作详解

    cocos2dx常见的46中+22中动作详解 分类: iOS2013-10-16 00:44 1429人阅读 评论(0) 收藏 举报 bool HelloWorld::init(){    ///// ...

  3. jsp pageEncoding属性详解

    Java pageEncoding原理详解 首先看下文章解释: 意思是jsp文件本身的编码 巨大的疑问:这里有一个很大的问题,既然你都已经从jsp中读到了这条属性,证明内容读取正确,那你还需要知道这条 ...

  4. JSP + Session Cookie详解

    篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...

  5. jsp中的@include与jsp:include区别详解

    1 前言 搞java开发的人也许都知道在jsp中引入项目中其他文件有如下两种方式 <%@include file="xxx.jsp"%> <jsp:include ...

  6. jsp&Sevelet基础详解

    1.用scriptlet标签在jsp中嵌入java代码: (1).<%!...%>可以在里面定义全局变量,方法,类,一般写在<head>内 (2).<%%>定义的是 ...

  7. JavaEE系列之(一)JSP基础知识详解

    一.JSP基础语法     1.JSP简介        JSP(Java Server Pages),其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.JSP是一种动态网页 ...

  8. JSP执行过程详解

    复习JSP的概念 JSP是Java Server Page的缩写,在传统的HTML页面中加入JSP标签和java的程序片段就构成了JSP. JSP的基本语法:两种注释类型.三个脚本元素.三个元素指令. ...

  9. jsp request 对象详解

    转自:http://www.cnblogs.com/qqnnhhbb/archive/2007/10/16/926234.html 1.request对象 客户端的请求信息被封装在request对象中 ...

  10. JSP page指令详解

    JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute="value" %> 指令可以 ...

随机推荐

  1. Java——面向对象(static关键字开始)

    一.static 可以修饰成员变量和成员方法 关键字特点: 随着类的加载而加载: 优先于对象存在: 被类的所有对象共享: 可以通过类名直接调用: 注意事项: 在静态方法中是没有this关键字的 静态的 ...

  2. 义无反顾马督工,Bert-vits2V210复刻马督工实践(Python3.10)

    Bert-vits2更新了版本V210,修正了日/英的bert对齐问题,效果进一步优化:对底模使用的数据进行优化和加量,减少finetune失败以及电音的可能性:日语bert更换了模型,完善了多语言推 ...

  3. 基于 TCP 协议写的 FTP 管理小工具

    这是一个FTP(文件传输协议)管理工具,能够支持文件上传下载以及操作服务端的文件. 该工具由客户端和服务端组成.客户端与服务端通过Socket连接实现通信,客户端发送命令,服务端解析并执行相应的操作. ...

  4. Netty源码学习8——从ThreadLocal到FastThreadLocal(如何让FastThreadLocal内存泄漏doge)

    系列文章目录和关于我 一丶引入 在前面的netty源码学习中经常看到FastThreadLocal的身影,这一篇我们将从ThreadLocal说起,来学习FastThreadLocal的设计(< ...

  5. 429 You are being rate limited

    记录贴 429 真的很让人伤心 清除浏览器数据 我用的 Edge : 设置 ⇒ 隐私.搜索和服务 ⇒ 清除浏览器数据 ⇒ 立即清除 然后就重新登陆可以了

  6. JWT简单使用

    创建一个Maven项目,并导入jar包 <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  7. 【UniApp】-uni-app-数据缓存

    前言 好,经过上个章节的介绍完毕之后,给大家补充了一下 uni-app-数据传递的内容 那么补充了 uni-app-数据传递的内容之后,这篇文章来给大家介绍一下 uni-app-数据缓存 搭建项目 首 ...

  8. python学习笔记:python的字符串拼接效率分析

    问题的起因是因为在做LeetCode5714题的时候,对于字符串拼接使用了 ans = ans+s[i] 提交后超时了,改成 ans+=s[i] 就可以通过了,而且用c++好像也有这个问题,在此记录一 ...

  9. ngnix学习-反向代理

    代理:可以理解为中间商,用来帮助事物A和事物B建立连接的桥梁. 什么是反向代理呢,其实就是反过来,反客为主大家都知道吧. 说明: 这里稍微罗嗦一下.做一个说明. 正常情况下,你是需要干什么,才去干什么 ...

  10. Python——第五章:模块(Module)、自定义模块、第3方开源模块、包(Package)

    什么是模块(Module)? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多代码按功能分组,分别放到不同的文件里,这 ...