Web基础知识(10)- JSP (二)


JSP 指令、JSP 动作

1. JSP 指令

    JSP 指令(directive)用来告诉 Web 服务器如何处理 JSP 页面的请求和响应。

    服务器会根据 JSP 指令来编译 JSP,生成 Java 文件。JSP 指令不产生任何可见输出,在生成的 Java 文件中,不存在 JSP 指令。

    JSP 指令语法如下:

        <%@ directive attribute = "value" [attribute2 = "value2" ...] %>

    注意:[] 中的内容是可选的,@ 符号和指令名称之间,以及最后一个属性和结束 %> 之间的空格是可选的。

    指令分为以下 3 种类型。

指令 说明
<%@ page ... %> 定义与页面相关的属性,例如脚本语言、错误页面和缓冲要求
<%@ include ... %> 引入其它 JSP 文件
<%@ taglib ... %> 声明并导入标签库

    1) page 指令

        JSP page 指令用来定义当前页面的相关属性。page 指令可以在 JSP 页面的任意位置编写,通常放在 JSP 页面的顶部。

        page 指令的语法如下:

            <%@ page attribute = "value" %>

        page 指令相关的属性:

属性 说明
buffer 指定输出流是否有缓冲区,取值:none、缓冲区大小(默认值为 8kb)
autoFlush 指定缓冲区是否自动清除,默认值 true
contentType 指定 MIME 类型和字符编码 <%@ page contentType="text/html;charset=UTF-8" %>
errorpage 指定当前 JSP 页面发生异常时,需要重定向的错误页面,<%@ page errorpage="errpage.jsp" %>,errpage.jsp 的 isErrorpage 值必须为 true
isErrorpage 指定当前页面为错误页面,默认值 false
extends 指定当前页面继承的父类,一般很少使用
import 导入类、接口、包,类似于 Java 的 import 关键字
info JSP 页面的描述信息,可以使用 getServletInfo() 方法获取
isThreadSafe 是否允许多线程使用,默认值 true
language 指定页面中使用的脚本语言,例如:<%@ page language= "java" %>
session 指定页面是否使用 session,默认值 true
isELIgnored 指定页面是否忽略 JSP 中的 EL,默认值 true

    2) include 指令

        include 指令用于在 JSP 页面引入其它内容,可以是 JSP 文件、html 文件和文本文件等,相当于把文件的内容复制到 JSP 页面。引入的文件和 JSP 页面同时编译运行。

        使用 include 指令有以下优点:

            (1) 增加代码的可重用性
            (2) 使 JSP 页面的代码结构清晰易懂
            (3) 维护简单

        include 的语法如下:

            <%@ include file="URL" %>  

        其中,file 指定需要引入文件的相对路径,可以在页面的任何位置编写 include 指令。

        示例

            header.jsp 代码如下:

               

Header Section



            index.jsp 代码如下:

1                 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
2                 
3                 
4                 
5                     <%@ include file="header.jsp" %>
6                 
7                 

    3) taglib 指令

        在 JSP 中,我们可以使用 taglib 指令声明并引入标签库。Java API 允许在页面中自定义标签,标签库就是自定义标签的集合。

        taglib 指令的语法如下:

            <%@ taglib uri="tagliburl" prefix="tagPre" %>

        其中,uri 指定自定义标签库的存放位置;prefix 指定标签库的前缀。为了区分不同的标签库,在页面中使用标签库以对应的 prefix 开头。

        示例:

 1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 2             <%@taglib uri="http://www.springframework.org/tags/form" prefix="springForm"%>
 3             
 4             
 5             
 6                 "POST" action="">
 7                  8 910111213141516172021
"username">Username: "username" />
"password">Password: "password" />
"2"> 18 "submit" value="Submit"/> 19
22 23 24

2. JSP 动作

    JSP 动作使用 XML 语法格式的标签来控制服务器的行为。利用 JSP 动作可以动态地插入文件、重用 JavaBean 组件、把用户重定向到另一个页面、为 Java 插件生成 HTML 代码等。

    JSP 动作与 JSP 指令的不同之处如下:

        (1) JSP 指令在翻译阶段执行,从而设置整个 JSP 页面的属性。JSP 页面被执行时首先进入翻译阶段,程序会先查找页面中的 JSP 指令,并将它们转换成 Servlet。所以,JSP 指令是在页面转换时期被编译执行的,且编译一次。
        (2) JSP 动作在请求处理阶段执行,它们只有执行时才实现自己的功能。通常用户每请求一次,动作标识就会执行一次。

    JSP 动作语法如下:

       

    或

       

    action_name 表示 JSP 动作名称,attribute 表示相应 JSP 动作的属性名称。常用的 JSP 动作如下表所示:

动作 说明
jsp:include 页面被请求时引入一个文件
jsp:forward 将请求转发到另一个页面
jsp:param 用来传递参数信息,经常和其它动作一起使用
jsp:userBean 实例化 JavaBean
jsp:setProperty 设置 JavaBean 的属性
jsp:getProperty 获取 JavaBean 的属性
jsp:plugin 根据浏览器类型替换成 或者 标签
jsp:element 定义动态 XML 元素
jsp:attribute 设置动态 XML 元素的属性
jsp:body 设置动态 XML 元素的内容
jsp:text 允许在JSP页面和文档中使用写入文本的模板

    1) JSP include 动作

        动作用来在页面中引入文件,文件可以是 HTML、JSP 页面和文本文件等。通过 include 动作,我们可以多次使用同一个页面,增加了代码可重用性。例如,在页面中使用 include 动作引入头部和底部页面。

        的语法如下:
            
             

        page 指定引入页面的路径,flush 表示在引入文件前是否刷新缓冲区,默认为 false。

        注意:“jsp” 和 “:” 以及 “include” 三者之间没有空格。

        示例:

1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
2             
3             
4             
5                 "header.jsp" />
6             
7             

    2) JSP forward 动作

        动作用来将请求转发到另一个页面中,请求的参数数据会被一起转发到目标页面。

        的语法如下:

           

        其中,page 指定需要转发文件的相对路径,且指定的文件只能是该 Web 应用中的文件。

        示例:

1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
2             
3             
4             
5                 "next.jsp" />
6             
7             

    3) JSP param 动作

        动作用来传递参数信息,经常和其它动作一起使用,例如

        的语法如下:
        
           

        name 指定参数名称,value 指定参数值。

        示例:

            home.jsp 代码如下

 1                 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 2                 
 3                 
 4                 
 5                     "next.jsp">
 6                         "name" value="WebBasic" />
 7                         "url" value="http://www.test.com" />
 8                     
 9                 
10                 


            next.jsp 代码如下

1                 <%@ page language="java" contentType="text/html;charset=utf-8"%>
2                 
3                 
4                     

name: <%=request.getParameter("name")%>

5

url: <%=request.getParameter("url")%>

6 7

    4) JSP useBean 动作

        用于获取 Bean 对象。 首先会在指定范围内查找 Bean 对象,如果 Bean 对象不存在,则创建 Bean 对象。

        的语法如下:

           

        说明:

            (1) id 表示 Bean 实例化对象的变量名,可以在指定范围内使用该变量名;
            (2) class 表示需要实例化 Bean 的类路径,指定的类必须包含 public 且无参数的构造方法;
            (3) scope 指定 Bean 的作用域,取值为:
                a) page 只能在当前页面使用该 Bean 对象;
                b) request 只能在一次请求范围内使用该 Bean 对象;
                c) session 只能在一次会话范围内使用该 Bean 对象;
                d) application 可以在整个应用范围内使用该 Bean 对象。

        示例:

            创建一个简单的 Test 类,代码如下

1                 package com.example;
2 
3                 public class Test {
4                     public String concatStr(String str) {
5                         return str.concat("http://www.test.com");
6                     }
7                 }


            bean.jsp 代码如下

 1                 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 2                 
 3                 
 4                 
 5                     "test" class="com.example.Test" />
 6                     <%
 7                         String str = "Visit ";
 8                         out.print(test.concatStr(str));
 9                     %>
10                 
11                 

    5) JSP setProperty 和 getProperty 动作

        动作用于获取 Bean 的属性值, 动作用于设置 Bean 的属性值。
        
        (1)
        
            的语法如下:

               
            
            其中,name 指定需要修改属性的 Bean 的名称;property 指定 Bean 的属性,即 Bean 类中的属性;value 是要设定的属性值。

            通常和 一起使用,分为两种情况。

                a) 在 标签外使用 ,例如:

                   
                    ...
                   
                    
                    以上情况,无论 是否实例化了 User 对象, 都会执行。

                b) 在 标签里使用 ,例如:

                   
                        ...
                       
                   

                    
                以上情况,只有 实例化了 User 对象, 才会执行。

        (2)

            的语法如下:

               
            
            其中,name 指定需要获取属性的 Bean 的名称;property 指定 Bean 的属性,即 Bean 类中的属性。

        注意: 动作都会按照 page、request、session 和 application 的顺序依次查找指定 Bean 的实例对象,直到第一个实例被找到。如果任何范围内都不存在这个 Bean 实例,则会拋出异常。

        示例

            创建 Test 类,代码如下:

 1                 package com.example;
 2 
 3                 public class Test {
 4                     private String name;
 5                     private String url;
 6                     public String getName() {
 7                         return name;
 8                     }
 9                     public void setName(String name) {
10                         this.name = name;
11                     }
12                     public String getUrl() {
13                         return url;
14                     }
15                     public void setUrl(String url) {
16                         this.url = url;
17                     }
18                 }


            bean.jsp 代码如下:

 1                 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 2                 
 3                 
 4                 
 5                     
"next.jsp" method="post"> 6

Name: "text" name="name" />

7

Url: "text" name="url" />

8

"submit" value="Submit" />

9
10 11


            next.jsp 代码如下

 1                 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 2                 
 3                 
 4                 
 5                     <%
 6                         request.setCharacterEncoding("UTF-8");
 7                     %>
 8                     "test" class="com.example.Test" />
 9                     "*" name="test" />
10                     "name" name="test" />
11                     "url" name="test" />
12                 
13                 


            注意:当 property 的取值为 * 时,要求 Bean 属性的名称与类型要与 request 请求中参数的名称及类型一致,以便用 Bean 中的属性来接收客户输入的数据,系统会根据名称来自动匹配。

    6) JSP plugin 动作

        动作用来根据浏览器的类型,插入通过 Java 插件,运行 Java Applet 所必需的 OBJECT 或 EMBED 元素。

        如果需要的插件不存在,它会下载插件,然后执行 Java 组件。Java 组件可以是一个 applet 或一个 JavaBean。

        plugin 动作有多个对应 HTML 元素的属性用于格式化 Java 组件。param 动作可用于向 Applet 或 Bean 传递参数。

        以下是使用 plugin 动作的典型实例:

1             "applet" codebase="dirname" code="MyApplet.class"  width="60" height="80">
2                 "fontcolor" value="red" />
3                 "background" value="black" />
4                 
5                 
6                     Unable to initialize Java Plugin
7                 
8             
9             


        如果你有兴趣可以尝试使用 applet 来测试 动作, 元素是一个新元素,在组件出现故障的错误是发送给用户错误信息。

    7) JSP element、attribute、body 动作

        动作元素动态定义XML元素。动态是非常重要的,这就意味着 XML 元素在编译时是动态生成的而非静态。

        以下实例动态定义了 XML 元素:

 1             <%@page language="java" contentType="text/html"%>
 2             "http://www.w3c.org/1999/xhtml"
 3                 xmlns:jsp="http://java.sun.com/JSP/Page">
 4             
 5                 "xmlElement">
 6                     "xmlElementAttr">
 7                         Value for the attribute
 8                     
 9                     
10                         Body for XML element
11                     
12                 
13             
14             

        执行时生成 HTML 代码如下:

1             "http://www.w3c.org/1999/xhtml"
2                 xmlns:jsp="http://java.sun.com/JSP/Page">
3             
4             
5                 "Value for the attribute">
6                     Body for XML element
7                 
8             
9             

    8) JSP text 动作 

        动作元素允许在 JSP 页面和文档中使用写入文本的模板,语法格式如下:

            Template data

        以上文本模板不能包含其他元素,只能只能包含文本和EL表达式。
        
        请注意,在XML文件中,您不能使用表达式如 ${whatever > 0},因为>符号是非法的。 你可以使用 ${whatever gt 0} 表达式或者嵌入在一个CDATA部分的值。

            ]]>

        如果你需要在 XHTML 中声明 DOCTYPE,必须使用到 动作元素,实例如下:

 1             
 2             "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">]]>
 3             
 4             
 5             
 6                 
 7                     
 8                           
 9                             Welcome to JSP Programming
10                         
11                     
12                 
13             
14             

        你可以对以上实例尝试使用 及不使用该动作元素执行结果的区别。