- JSP 基础教程
- JSP - 首页
- JSP - 概述
- JSP - 环境搭建
- JSP - 架构
- JSP - 生命周期
- JSP - 语法
- JSP - 指令
- JSP - 动作
- JSP - 隐式对象
- JSP - 客户端请求
- JSP - 服务器响应
- JSP - HTTP 状态码
- JSP - 表单处理
- JSP - 编写过滤器
- JSP - 处理 Cookie
- JSP - 会话跟踪
- JSP - 文件上传
- JSP - 处理日期
- JSP - 页面重定向
- JSP - 访问计数器
- JSP - 自动刷新
- JSP - 发送邮件
- 高级 JSP 教程
- JSP - 标准标签库
- JSP - 数据库访问
- JSP - XML 数据
- JSP - JavaBean
- JSP - 自定义标签
- JSP - 表达式语言
- JSP - 异常处理
- JSP - 调试
- JSP - 安全性
- JSP - 国际化
- JSP 有用资源
- JSP - 问题与解答
- JSP - 快速指南
- JSP - 有用资源
- JSP - 讨论
JSP - 动作
在本章中,我们将讨论 JSP 中的动作。这些动作使用 XML 语法中的构造来控制 servlet 引擎的行为。您可以动态插入文件、重用 JavaBean 组件、将用户转发到另一个页面或为 Java 插件生成 HTML。
Action 元素只有一种语法,因为它符合 XML 标准 -
<jsp:action_name attribute = "value" />
Action 元素基本上是预定义的函数。下表列出了可用的 JSP 动作 -
序号 | 语法 & 目的 |
---|---|
1 | jsp:include 在请求页面时包含一个文件。 |
2 | jsp:useBean 查找或实例化一个 JavaBean。 |
3 | jsp:setProperty 设置 JavaBean 的属性。 |
4 | jsp:getProperty 将 JavaBean 的属性插入输出。 |
5 | jsp:forward 将请求者转发到新页面。 |
6 | jsp:plugin 生成浏览器特定的代码,为 Java 插件创建 OBJECT 或 EMBED 标签。 |
7 | jsp:element 动态定义 XML 元素。 |
8 | jsp:attribute 定义动态定义的 XML 元素的属性。 |
9 | jsp:body 定义动态定义的 XML 元素的主体。 |
10 | jsp:text 用于在 JSP 页面和文档中编写模板文本。 |
常用属性
所有 Action 元素都有两个共同的属性:id 属性和 scope 属性。
Id 属性
id 属性唯一标识 Action 元素,并允许在 JSP 页面内引用该动作。如果 Action 创建了一个对象的实例,则可以使用 id 值通过隐式对象 PageContext 来引用它。
Scope 属性
此属性标识 Action 元素的生命周期。id 属性和 scope 属性直接相关,因为 scope 属性决定了与 id 关联的对象的生命周期。scope 属性有四个可能的值:(a) page,(b) request,(c) session 和 (d) application。
<jsp:include> 动作
此动作允许您将文件插入正在生成的页面中。语法如下 -
<jsp:include page = "relative URL" flush = "true" />
与include指令不同,该指令在 JSP 页面转换为 servlet 时插入文件,此动作在请求页面时插入文件。
下表列出了与 include 动作关联的属性 -
序号 | 属性 & 描述 |
---|---|
1 | page 要包含的页面的相对 URL。 |
2 | flush 布尔属性确定在包含之前是否刷新包含资源的缓冲区。 |
示例
让我们定义以下两个文件 (a) date.jsp 和 (b) main.jsp 如下 -
以下是 date.jsp 文件的内容 -
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
以下是 main.jsp 文件的内容 -
<html> <head> <title>The include Action Example</title> </head> <body> <center> <h2>The include action Example</h2> <jsp:include page = "date.jsp" flush = "true" /> </center> </body> </html>
现在让我们将所有这些文件保存在根目录中,并尝试访问 main.jsp。您将收到以下输出 -
The include action Example
Today's date: 12-Sep-2010 14:54:22
<jsp:useBean> 动作
useBean动作非常通用。它首先使用 id 和 scope 变量搜索现有的对象。如果未找到对象,则尝试创建指定的对象。
加载 bean 的最简单方法如下 -
<jsp:useBean id = "name" class = "package.class" />
加载 bean 类后,可以使用jsp:setProperty和jsp:getProperty动作修改和检索 bean 属性。
下表列出了与 useBean 动作关联的属性 -
序号 | 属性 & 描述 |
---|---|
1 | class 指定 bean 的完整包名。 |
2 | type 指定将引用该对象的变量的类型。 |
3 | beanName 给出由 java.beans.Beans 类的 instantiate() 方法指定的 bean 的名称。 |
现在让我们在提供与这些动作相关的有效示例之前讨论jsp:setProperty和jsp:getProperty动作。
<jsp:setProperty> 动作
setProperty动作设置 Bean 的属性。在执行此操作之前,必须先定义 Bean。有两种基本方法可以使用 setProperty 动作 -
您可以在jsp:useBean元素之后但外部使用jsp:setProperty,如下所示 -
<jsp:useBean id = "myName" ... /> ... <jsp:setProperty name = "myName" property = "someProperty" .../>
在这种情况下,无论是否实例化了新的 bean 或找到了现有的 bean,都会执行jsp:setProperty。
jsp:setProperty可以出现的第二个上下文是在jsp:useBean元素的主体内部,如下所示 -
<jsp:useBean id = "myName" ... > ... <jsp:setProperty name = "myName" property = "someProperty" .../> </jsp:useBean>
在这里,只有在实例化了新对象时才会执行 jsp:setProperty,而不是在找到现有对象时执行。
下表列出了与setProperty动作关联的属性 -
序号 | 属性 & 描述 |
---|---|
1 | name 指定将设置其属性的 bean。必须事先定义 Bean。 |
2 | property 指示要设置的属性。值为“*”表示所有名称与 bean 属性名称匹配的请求参数都将传递到相应的 setter 方法。 |
3 | value 要分配给给定属性的值。如果参数的值为 null 或参数不存在,则忽略 setProperty 动作。 |
4 | param param 属性是请求参数的名称,该参数的值将由属性接收。您不能同时使用 value 和 param,但可以都不使用。 |
<jsp:getProperty> 动作
getProperty动作用于检索给定属性的值并将其转换为字符串,最后将其插入输出。
getProperty 动作只有两个属性,这两个属性都是必需的。getProperty 动作的语法如下 -
<jsp:useBean id = "myName" ... /> ... <jsp:getProperty name = "myName" property = "someProperty" .../>
下表列出了与getProperty动作关联的必需属性 -
序号 | 属性 & 描述 |
---|---|
1 | name 要检索其属性的 Bean 的名称。必须事先定义 Bean。 |
2 | property property 属性是要检索的 Bean 属性的名称。 |
示例
让我们定义一个测试 bean,它将在我们的示例中进一步使用 -
/* File: TestBean.java */ package action; public class TestBean { private String message = "No message specified"; public String getMessage() { return(message); } public void setMessage(String message) { this.message = message; } }
将上述代码编译到生成的TestBean.class文件中,并确保您将 TestBean.class 复制到C:\apache-tomcat-7.0.2\webapps\WEB-INF\classes\action文件夹中,并且CLASSPATH变量也应该设置为此文件夹 -
现在在main.jsp文件中使用以下代码。这将加载 bean 并设置/获取一个简单的字符串参数 -
<html> <head> <title>Using JavaBeans in JSP</title> </head> <body> <center> <h2>Using JavaBeans in JSP</h2> <jsp:useBean id = "test" class = "action.TestBean" /> <jsp:setProperty name = "test" property = "message" value = "Hello JSP..." /> <p>Got message....</p> <jsp:getProperty name = "test" property = "message" /> </center> </body> </html>
现在让我们尝试访问main.jsp,它将显示以下结果 -
Using JavaBeans in JSP
Got message.... Hello JSP...
<jsp:forward> 动作
forward动作终止当前页面的操作并将请求转发到另一个资源,例如静态页面、另一个 JSP 页面或 Java Servlet。
以下是forward动作的语法 -
<jsp:forward page = "Relative URL" />
下表列出了与 forward 动作关联的必需属性 -
序号 | 属性 & 描述 |
---|---|
1 | page 应包含另一个资源的相对 URL,例如静态页面、另一个 JSP 页面或 Java Servlet。 |
示例
让我们重用以下两个文件 (a) date.jsp 和 (b) main.jsp 如下 -
以下是 date.jsp 文件的内容 -
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
以下是 main.jsp 文件的内容 -
<html> <head> <title>The include Action Example</title> </head> <body> <center> <h2>The include action Example</h2> <jsp:forward page = "date.jsp" /> </center> </body> </html>
现在让我们将所有这些文件保存在根目录中,并尝试访问 main.jsp。这将显示类似如下所示的结果。
在这里,它丢弃了来自主页面内容,并且仅显示来自已转发页面的内容。
Today's date: 12-Sep-2010 14:54:22
<jsp:plugin> 动作
plugin动作用于将 Java 组件插入 JSP 页面。它确定浏览器的类型并根据需要插入<object>或<embed>标签。
如果所需的插件不存在,它将下载插件,然后执行 Java 组件。Java 组件可以是 Applet 或 JavaBean。
plugin 动作具有几个属性,这些属性对应于用于格式化 Java 组件的常用 HTML 标签。<param>元素也可用于向 Applet 或 Bean 发送参数。
以下是使用 plugin 动作的典型语法 -
<jsp:plugin type = "applet" codebase = "dirname" code = "MyApplet.class" width = "60" height = "80"> <jsp:param name = "fontcolor" value = "red" /> <jsp:param name = "background" value = "black" /> <jsp:fallback> Unable to initialize Java Plugin </jsp:fallback> </jsp:plugin>
如果您有兴趣,可以使用一些 applet 来尝试此操作。一个新的元素,<fallback>元素,可用于指定在组件失败时发送给用户的错误字符串。
The <jsp:element> Action
The <jsp:attribute> Action
The <jsp:body> Action
<jsp:element>、<jsp:attribute>和<jsp:body>动作用于动态定义 XML 元素。动态一词很重要,因为它意味着 XML 元素可以在请求时生成,而不是在编译时静态生成。
以下是如何动态定义 XML 元素的简单示例 -
<%@page language = "java" contentType = "text/html"%> <html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page"> <head><title>Generate XML Element</title></head> <body> <jsp:element name = "xmlElement"> <jsp:attribute name = "xmlElementAttr"> Value for the attribute </jsp:attribute> <jsp:body> Body for XML element </jsp:body> </jsp:element> </body> </html>
这将在运行时生成以下 HTML 代码 -
<html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page"> <head><title>Generate XML Element</title></head> <body> <xmlElement xmlElementAttr = "Value for the attribute"> Body for XML element </xmlElement> </body> </html>
<jsp:text> 动作
<jsp:text>动作可用于在 JSP 页面和文档中编写模板文本。以下是此操作的简单语法 -
<jsp:text>Template data</jsp:text>
模板的主体不能包含其他元素;它只能包含文本和 EL 表达式(注意 - EL 表达式将在后续章节中解释)。请注意,在 XML 文件中,您不能使用诸如${whatever > 0}之类的表达式,因为大于号是非法的。相反,使用gt形式,例如${whatever gt 0}或者另一种方法是将值嵌入到CDATA部分。
<jsp:text><![CDATA[<br>]]></jsp:text>
例如,如果您需要包含DOCTYPE声明(例如用于XHTML),则还必须使用<jsp:text>元素,如下所示 -
<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">]]></jsp:text> <head><title>jsp:text action</title></head> <body> <books><book><jsp:text> Welcome to JSP Programming </jsp:text></book></books> </body> </html>
尝试使用和不使用<jsp:text>动作的上述示例。