JSP 动作(action)

  • 动作

    在本章中,我们将讨论JSP中的Actions。这些动作使用XML语法中的构造来控制servlet引擎的行为。您可以动态插入文件,重用JavaBeans组件,将用户转发到另一个页面或为Java插件生成HTML。Action元素只有一种语法,因为它符合XML标准-
    
    <jsp:action_name attribute = "value" />
    
    动作元素基本上是预定义的功能。下表列出了可用的JSP操作-
    语法 目的
    jsp:include 在请求页面时包含一个文件。
    jsp:useBean 查找或实例化JavaBean。
    jsp:setProperty 设置JavaBean的属性。
    jsp:getProperty 将JavaBean的属性插入输出。
    jsp:forward 将请求者转发到新页面。
    jsp:plugin 生成特定于浏览器的代码,为Java插件创建OBJECT或EMBED标签。
    jsp:element 动态定义XML元素。
    jsp:attribute 定义动态定义的XML元素的属性。
    jsp:body 定义动态定义的XML元素的主体。
    jsp:text 用于在JSP页面和文档中编写模板文本。
  • 共同属性

    所有Action元素共有两个属性:id属性和scope属性。
    id 属性
    id属性唯一地标识Action元素,并允许在JSP页面内引用该操作。如果Action创建对象的实例,则可以使用ID值通过隐式对象PageContext引用它。
    scope 属性
    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指令不同,include指令在将JSP页面转换为servlet时插入文件,而该动作则在请求页面时插入文件。下表列出了与include动作相关联的属性-
    • page - 要包含的页面的相对URL。
    • 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。您将收到以下输出-
  • <jsp:useBean> 动作

    useBean动作是相当多的功能。它首先使用id和scope变量搜索现有对象。如果找不到对象,则它将尝试创建指定的对象。加载bean的最简单方法如下-
    
    <jsp:useBean id = "name" class = "package.class" />
    
    加载Bean类后,可以使用jsp:setPropertyjsp:getProperty操作来修改和检索Bean属性。下表列出了与useBean操作关联的属性-
    • class - 指定Bean的完整软件包名称。
    • type - 指定将引用该对象的变量的类型。
    • beanName - 给出由java.beans.Beans类的实例化方法指定的bean名称。
    现在,在给出与这些动作相关的有效示例之前,让我们讨论一下jsp:setPropertyjsp:getProperty动作。
  • <jsp:setProperty> 动作

    setProperty 动作设置一个bean的属性。在执行此操作之前,必须预先定义Bean。有两种使用setProperty操作的基本方法:您可以在jsp:useBean元素之后但在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操作关联的属性-
    • name - 指定将设置其属性的bean。 Bean必须已经预先定义。
    • property - 指示要设置的属性。 值“ *”表示名称与bean属性名称匹配的所有请求参数都将传递给适当的setter方法。
    • value - 要分配给给定属性的值。 参数的值为null,或者参数不存在,将忽略setProperty操作。
    • param - param属性是请求参数的名称,该属性的值将接收。 您不能同时使用value和param,但允许两者都不使用。
  • <jsp:getProperty> 动作

    getProperty 动作用于检索一个给定的属性,并将其转换的值的字符串,并最终将其插入到输出中。getProperty操作只有两个属性,这两个属性都是必需的。getProperty操作的语法如下:
    
    <jsp:useBean id = "myName" ... />
    ...
    <jsp:getProperty name = "myName" property = "someProperty" .../>>
    
    下表列出了与getProperty操作关联的必需属性-
    • name - 具有要检索的属性的Bean的名称。 Bean必须已经预先定义。
    • 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-9.0.37\webapps\WEB-INF\classes\action文件夹中,并且CLASSPATH变量也应为设置为此文件夹-
    现在在main.jsp文件中使用以下代码。这将加载bean并设置/获取一个简单的String参数-
    
    <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,它将显示以下结果-
  • <jsp:forward> 动作

    forward 动作终止当前页面的动作和将请求转发到其他资源,如静态页面,另一个JSP页面或Java Servlet中。以下是forward动作的语法-
    
    <jsp:forward page = "Relative URL" />
    
    下表列出了与forward操作相关的必需属性-
    • 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。这将显示如下结果。在这里,它丢弃了main页面上的内容,仅显示了转发页面上的内容。
  • <jsp:plugin> 动作

    plugin作用是用来Java组件插入到一个JSP页面。它确定浏览器的类型,并根据需要插入<object><embed>标记。如果所需的插件不存在,它将下载该插件,然后执行Java组件。Java组件可以是Applet或JavaBean。插件操作具有一些属性,这些属性与用于格式化Java组件的常见HTML标签相对应。所述<param>元素也可用于将参数发送到小程序或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>元素可用于指定在组件发生故障时要发送给用户的错误字符串。-
  • <jsp:element> <jsp:attribute> <jsp:body>动作

    <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> 动作

    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>操作。