JSTL学习记录

原文链接:http://www.blogjava.net/maverick1003/articles/236575.html


JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。JSTL标签库可分为5类:

q        核心标签库

q        I18N格式化标签库

q        SQL标签库

q        XML标签库

q        函数标签库

本章将对这些内容一一讲述。

9.1 核心标签库

JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。

1)表达式控制标签:out标签、set标签、remove标签、catch标签。

2)流程控制标签:if标签、choose标签、when标签、otherwise标签。

3)循环标签:forEach标签、forTokens标签。

4URL操作标签:import标签、url标签、redirect标签。

JSP页面引入核心标签库的代码为:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

下面将按照功能分类,分别讲解每个标签的功能和使用方式。

9.2.1 表达式控制标签

表达式控制分类中包括4个标签,现在分别介绍它们的功能和语法。

1标签

【功能】:用来显示数据对象(字符串、表达式)的内容或结果。

在使用Java脚本输出时常使用的方式为:

<% out.println(“字符串”)%>

<%=表达式%>

web开发中,为了避免暴露逻辑代码会尽量减少页面中的Java脚本,使用标签就可以实现以上功能。

字符串”>

表达式”>

提示:JSTL的使用是和EL表达式分不开的,EL表达式虽然可以直接将结果返回给页面,但有时得到的结果为空,有特定的结果处理功能,EL的单独使用会降低程序的易读性,建议把EL的结果输入放入标签中。

标签的使用有两种语法格式。

【语法1】:

要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]>

【语法2】:

要显示的数据对象” [escapeXml=”true|false”]>默认值

这两种方式没有本质的区别,只是格式上的差别。标签的属性介绍如下。

q        value:指定要输出的变量或表达式。

q        escapeXml:设定是否转换特殊字符(如<>等一些转义字符),在默认值为true的情况下直接在输出<的,如果改为false将会进行转义输出“<”等。

q        default:为默认输出结果。如果使用表达式得到的结果为null(注意与空区别),将会输出默认结果。

【示例代码】:代码9.1演示了的使用,以及在不同属性值状态下的结果。

代码9.1 标签使用示例:coredemo01.jsp

1     <%@ page pageEncoding="gbk" %>

2     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3    

4    

5              out<span style="font-family:黑体">标签的使用</span>

6    

7    

8             

  • 1北京源智天下科技有限公司">
  • 9             

  • 2未使用字符转义>" />
  • 10             

  • 3使用字符转义>" escapeXml="false">
  • 11             

  • 4使用了默认值
  • 12             

  • 5
  • 13    

    14    

    【代码解析】:

    1)第8行为value属性赋值为字符串。

    2)第9行和第10行对比,在改变escapeXml属性后页面输出的转义字符。

    3)第11value得到null,如果方法体内有值,将输出方法体中的字符串,否则不输出,第12行没有输出结果。

    程序运行结果如图9.1所示。

    9.1 coredemo01.jsp运行结果

    【代码解析】:

    1)直接输出了一个字符串。

    2)字符串中有转义字符,但在默认情况下没有转换。

    3)使用了转义字符<>分别转换成<>符号。

    4)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。

    5)未设定默认值,输出结果为空。

    2标签

    功能:主要用于将变量存取于JSP范围中或JavaBean属性中。

    标签的编写共有4种语法格式。

    语法1:存值,把一个值放在指定(pagesession等)的map中。

    值1” var=”name1” [scope=”page|request|session|application”]>

    含义:把一个变量名为name1值为“值1”的变量存储在指定的scope范围内。

    语法2

    2

    含义:把一个变量名为name2,值为值2的变量存储在指定的scope范围内。

    语法3

    值3” target=”JavaBean对象” property=”属性名”/>

    含义:把一个值为“值3”赋值给指定的JavaBean的属性名。相当与setter()方法。

    语法4

    对象” property=”属性名”>

    4

    含义:把一个值4赋值给指定的JavaBean的属性名。

    提示:从共能上分语法1和语法2、语法3和语法4的效果是一样的只是把value值放置的位置不同至于使用那个根据个人的喜爱,语法1和语法2是向scope范围内存储一个值,语法3和语法4是给指定的JavaBean赋值。

    【示例代码】:代码给出了给指定scope范围赋值的示例。使用标签把值放入sessionapplication对象中。同时使用EL表达式得到存入的值。

    代码9.2 使用存取值:coredemo02.jsp

    1     <%@ page language="java" pageEncoding="gbk"%>

    2     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3    

    4    

    5     set<span style="font-family:黑体">标签的使用</span>

    6    

    7    

    8    

  • 把一个值放入session中。

    9    

  • session中得到值:${sessionScope.name1 }

    10    

  • 把另一个值放入application中。olive

    11             

  •  使用out标签和EL表达式嵌套得到值:

    12              未得到name的值

  • 13    

  • 未指定scope的范围,会从不同的范围内查找得到相应的值:${name1 }${name2 }

    14    

    15    

    【代码解析】:

    1)第8行通过标签将值name1的值放入session范围中。

    2)第9行使用EL表达式得到name1的值。

    3)第10行把name2放入application范围中。

    4)第11行使用EL表达式从application范围中取值,用标签输出使得页面规范化。

    5)第13行不指定范围使用EL自动查找得到值。

    程序运行的结果如图9.2所示。

    图9.2 coredemo02.jsp

    在代码中未使用任何Java脚本使用程序的功能。为了对比期间,代码9.3给出了使用Java脚本实现以上功能的例子。

    代码9.3 Java脚本实现值的存取:getvalue.jsp

    1     <%@page language="java" pageEncoding="gbk"%>

    2    

    3    

    4     set<span style="font-family:黑体">标签的使用</span>

    5    

    6    

    7    

  • 把一个值放入session中。<%session.setAttribute("name1","coo"); %>
  • 8    

  • session中得到值:<% out.println(session.getAttribute("name1"));   %>
  • 9    

  • 把另一个值放入application中。<% application.setAttribute("name2","olive"); %>
  • 10    

  •  application中得到值:<% out.println(application.getAttribute("name2")); %>
  • 11    

    12    

    【代码解析】:使用JSP内置对象的方法实现存值和取值的功能。

    程序运行结果如图9.3所示:

    9.3 getvalue.jsp运行结果

    提示:本章示例为了方便期间都是从一个页面中存取,在开发中值的存取是为了不同的JSP页面之间共享数据

    从两个程序对比来看,JSTL实习了使用标签完成取值赋值的功能,减少代码的编写量同时避免了逻辑代码暴露的危险。

    【程序示例】:代码9.4和代码9.5演示使用标签>操纵JavaBean

    1)创建一个JavaBean对象。

    代码9.4 JavaBeanvo数据传输对象):Person.java

    1     package org.olive;

    2     public class Person {

    3              private String name;                                      //定义私有变量姓名字符串

    4              private int age;                                                //定义私用变量年龄整型

    5              private char sex;                                             //定义私用变量性别字符性

    6              private String home;                                      //定义私用变量家乡字符串

    7              public String getName() {                             //namegetter方法

    8                        return name;

    9              }

    10              public void setName(String name) {          //namesetter方法。

    11                        this.name = name;

    12              }

    13              public int getAge() {                                        //agegetter方法

    14                        return age;

    15              }

    16              public void setAge(int age) {                        //agesetter方法

    17                        this.age = age;

    18              }

    19              public char getSex() {                                    //sexgetter方法

    20                        return sex;

    21              }

    22              public void setSex(char sex) {                      //sexsetter方法

    23                        this.sex = sex;

    24              }

    25              public String getHome() {                             //homegetter方法

    26                        return home;

    27     }

    28              public void setHome(String home) {                   //homesetter方法

    29                       this.home = home;

    30              }

    31     }

    【代码解析】:一个只有gettersetter方法的JavaBean或者说一个pojo类,作为一个vo(数据传输对象)。定义了四个变量agenamesexhome

    2)创建JSP页面,实现对值的操作。

    代码9.5 操作JavaBeancoredemo03.jsp

    1     <%@ page language="java" pageEncoding="gbk"%>

    2    

    3     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    4    

    5    

    6     set<span style="font-family:黑体">标签的使用</span>

    7    

    8    

    9              maverick

    10              25

    11             

    12              china

    13             

  • 使用的目标对象为:${person }

    14             

  • Bean中获得的name值为:

    15             

  • Bean中获得的age值为:

    16             

  • Bean中获得的sex值为:

    17             

  • Bean中获得的home值为:

    18             

    19    

    【代码解析】:

    1)第1行设置页面格式和字符编码集。

    2)第2行使用JSP的指令元素指定要使用的JavaBean

    3)第3行引入JSTL核心标签库。

    4)第9~12行设置JavaBean的属性值,等同与setter方法。

    5)使用EL表达式得到JavaBean的属性值,并用out标签输出。

    【关键代码】:

    负责实例化Beanid指定实例化后的对象名,可以通过${person}得到person在内存中的值(或者使用person.toString()方法)。

    maverick

    Target指向实例化后的对象,property指向要插入值的参数名。

    注意:使用target时一定要指向实例化后的JavaBean对象,也就是要跟配套使用,也可以java脚本实例化,但这就失去了是用标签的本质意义。

    使用Java脚本实例化:

    <%@page import=”org.olive.Person”%

    <% Person person=new Person(); %>

    程序运行结果如图9.4所示。

    9.4 coredemo03.jsp运行结果

    3标签

    标签主要用来从指定的JSP范围内移除指定的变量。

    【语法】:

    变量名” [scope=”page|request|session|application”]/>

    其中var属性是必须的,scope可以以省略。

    【示例程序】:代码9.6使用set标签在session中插入2个值,然后用remove标签移除。

    代码9.6 标签示例:coredemo04.jsp

    1       <%@ page language="java" pageEncoding="gbk"%>

    2       <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3      

    4      

    5       remove<span style="font-family:黑体">标签的使用</span>

    6      

    7        

    8               

  • olive

    9               

  • 25

    10             

  • 11             

  • 12             

  • 13             

  • 14             

  • 15             

  • 16             

  • 17             

  • 18             

    19   

    【代码解析】:

    1)第8~9行使用set标签向session中插入三个值:name值为oliveage值为25sex值为男。

    2)第11~13行使用outEL表达式输出nameagesex的值。

    3)第14行使用remove标签移除age的值,然后使用步骤第11~13行中的三个输出作为比较。

    4标签

    用来处理JSP页面中产生的异常,并将异常信息存储。

    【语法】:

    容易产生异常的代码

    【参数说明】:

    var表示由用户定义存取异常信息的变量的名称。省略后也可以实现异常的捕获,当就不能显示的输出异常信息。

    【示例代码】:代码9.7使用标签,并设计一个异常并输出异常信息。

    代码9.7 标签使用示例:coredemo05.jsp

    1       <%@ page language="java" pageEncoding="gbk"%>

    2       <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3      

    4      

    5       JSTL: -- catch<span style="font-family:黑体">标签实例</span>

    6      

    7      

    8      

    catch标签实例

    9      


    10             

    11     <       c:set target="Dank" property="hao">

    12             

    13    

    14    

    15    

    【代码解析】:

    1)第10~12把容易产生异常的代码放在中,自定义一个变量error用于存储异常信息。

    2)第11行实现了一段异常代码,向一个不存在的JavaBean中插入一个值。

    3)第13行用EL表达式得到error的值,并使用标签输出。

    程序结果如图所示。

    9.5 coredemo05.jsp

    图中异常信息的提示为:在标签中用不正确的参数“hao”。如果不捕获程序中的异常,也就是不使用捕获容易产生异常的代码,将会出现如图9.6所示,这是在开发中不允许的。

    图9.6 程序异常

    提示:本示例没有使用捕获Java脚本的样式,如果使用标签再使用Java脚本的意义不大,由此可以看出主要用于页面标签产生的异常。

    9.2.2 流程控制标签

    流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:标签、标签、标签和标签。下面将介绍这些标签的功能和使用方式。

    1标签

    同程序中的if作用相同,用来实现条件控制。

    【语法1】:

    条件1” var=”name” [scope=”page|request|session|application”]>

    【语法2】:

    条件2” var=”name”[scope=”page|request|session|application”]>

    【参数说明】:

    1test属性用于存放判断的条件,一般使用EL表达式来编写。

    2var指定名称用来存放判断的结果类型为truefalse

    3scope用来存放var属性存放的范围。

    【使用场景】:在开发中经常会出现不同用户的权限,首先对用户名进行判断(包括进行数据库验证,该功能可以由JavaBean实现,使用EL表达式得到一个布尔型的结果),把判断的结果存放在不同的JSP范围内(比如常用的session内),这样在每个页面都可以得到该用户的权限信息,根据不同权限的用户显示不同的结果。

    【示例代码】:代码9.8实现了用户输入用户名提交到自身页面,页面判断用户是否为admin,如果是将出现欢迎界面,如果不是显示不同结果。

    代码9.8 标签使用示例:coredemo06.jsp

    1     <%@ page language="java" pageEncoding="gbk"%>

    2     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3    

    4    

    5     JSTL: -- if<span style="font-family:黑体">标签示例</span>

    6    

    7    

    8             

    if标签示例

    9             


    10             

    11             

    12              登录">

    13             

    14             

    15              管理员欢迎您!">

    16             

    17             

    18              ${adminchock}

    19

    20

    【代码解析】:

    1)第10~13行创建一个表单,表单中的元素为一个text文本输入框,一个提交按钮,并把信息提交给本页。

    2)第14行使用if标签进行判断,如果输入的为admin将显示出定义的字符串,并把检验后的结果赋给adminchock,存储在默认的page范围中。

    3)第18行使用EL表达式得到adminchock的值,如果输入的用户名为admin将显示true

    程序运行效果如图9.7所示。

    9.7 coredemo06.jsp运行结果

    提示:可以把adminchock的属性范围设置为session,可以在其他的页面中得到adminchock的值,使用判断,实现不同的权限。

    2标签

    3个标签通常情况下是一起使用的,标签作为标签的父标签来使用。

    【语法1】:

            

    …..//业务逻辑1

            

    …..//业务逻辑2

            

    ….//业务逻辑3

    【语法2】:

    条件”>

    表达式

    【语法3】:

    表达式

    【参数说明】:

    1)语法13个标签的嵌套使用方式,标签只能和标签共同使用。

    2)语法2标签的使用方式,该标签都条件进行判断,一般情况下和共同使用。

    3不含有参数,只能跟共同使用,并且在嵌套中只允许出现一次。

    【示例代码】:代码9.9设定一个score变量的值为85,使用嵌套标签进行判断,根据判断返回结果。

    代码9.9 循环控制标签:coredemo07.jsp

    1     <%@ page language="java" pageEncoding="gbk"%>

    2     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3    

    4    

    5              JSTL: -- choose<span style="font-family:黑体">及其嵌套标签标签示例</span>

    6    

    7    

    8             

    choose及其嵌套标签示例

    9    


    10              85

    11             

    12              c:when test="${score>=90}">

    13              你的成绩为优秀!

    14             

    15             

    16              您的成绩为良好!

    17             

    18             

    19              您的成绩为及格

    20             

    21             

    22              对不起,您没有通过考试!

    23             

    24             

    25             

    26    

    【代码解析】:

    1)第10行通过set标签设定score的值为85

    2)第12~22行使用进行条件判断。如果大于等于90,输出“您的成绩为优秀”;

    如果大于等于70小于90,输出“您的成绩为良好”;大于等于60小于70,输出“您的成绩为及格”;其他(otherwise)输出“对不起,您没能通过考试”。

    程序运行结果如图9.8所示。

    9.8 coredemo07.jsp运行结果

    9.2.3 循环标签

    循环标签主要实现迭代操作。主要包含两个标签:标签,接下来将详细介绍这两个标签的用法。

    1标签

    该标签根据循环条件遍历集合(Collection)中的元素。

    【语法】:

    本体内容

    【参数解析】:

    1var设定变量名用于存储从集合中取出元素。

    2items指定要遍历的集合。

    3varStatus设定变量名,该变量用于存放集合中元素的信息。    

    4beginend用于指定遍历的起始位置和终止位置(可选)。

    5step指定循环的步长。

    参数类型和相关说明见表9-1

    9-1 循环标签属性说明

    名称

    EL

    类型

    是否必须

    默认值

    var

    N

    String

    items

    Y

    Arrays

    Collection

    Iterator

    Enumeration

    Map

    String []args

    begin

    Y

    int

    0

    end

    Y

    int

    集合中最后一个元素

    step

    Y

    int

    1

    varStatus

    N

    String

    其中varStatus4个状态属性(见表9-2)。

    9-2 varStatus4个状态

    属性名

    类型

    说明

    index

    int

    当前循环的索引值

    count

    int

    循环的次数

    frist

    boolean

    是否为第一个位置

    last

    boolean

    是否为第二个位置

    【示例代码】:代码9.10实现了遍历的两种方式:设定起始位置、不设定起始位置。同时实现了获得原属的状态信息。

    代码9.10 标签使用示例:coredemo08.jsp

    1     <%@ page contentType="text/html;charset=GBK" %>

    2     <%@page import="java.util.List"%>

    3     <%@page import="java.util.ArrayList"%>

    4     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    5    

    6    

    7              JSTL: -- forEach<span style="font-family:黑体">标签实例</span>

    8    

    9    

    10    

    实例"/>

    11    


    12              <%

    13                       List a=new ArrayList();

    14                       a.add("贝贝");

    15                       a.add("晶晶");

    16                       a.add("欢欢");

    17                       a.add("莹莹");

    18                        a.add("妮妮");

    19              request.setAttribute("a",a);

    20              %>

    21              不指定beginend的迭代:" />

    22            

    23              

    24             

    25              指定beginend的迭代:" />

    26             

    27               

    28             

    29              输出整个迭代的信息:" />

    30             

    31               的四种属性:

    32                所在位置,即索引:

    33                总共已迭代的次数:

    34                是否为第一个位置:

    35                是否为最后一个位置:

    36             

    37    

    38    

    【代码解析】:

    1)第13~18行通过Java脚本创建了一个集合对象a,并添加元素。

    2)第19行使用setAttribute()方法把集合存入request范围内。

    3)第22~24行未指定beginend属性,直接从集合开始遍历到集合结束为止。

    4)第26~28行指定从集合的第二个(index值为1)元素开始,到第四个(index值为3)元素截止(index的值从0开始)。并指定step2即每隔两个遍历一次。

    5)第30~35指定varStatus的属性名为s,并取出存储的状态信息。

    程序运行结果如图9.9所示。

    9.9 coredemo08.jsp运行结果

    【总结】:

    1)从图中可以看到不使用beginend的迭代,从集合的第一个元素开始,遍历到最后一个元素。

    2)指定begin的值为1end的值为3step的值为2,从第二个开始首先得到晶晶,每两个遍历一次,则下一个显示的结果为莹莹,end3则遍历结束。

    3)从指定的beginend的值来看遍历第四个和第五个,因得到莹莹和妮妮。相关状态信息如图所示。

    提示:本例使用的list是在JSP页面中使用Java脚本创建的,是因为JSTL缺少创建集合的功能,在开发中一般不会如此,可通过访问数据库得到数据集合,和通过设定JavaBean的值得到数据集合

    2

    该标签用于浏览字符串,并根据指定的字符将字符串截取。

    语法:

    【参数说明】

    1items指定被迭代的字符串。

    2delims指定使用的分隔符。

    3var指定用来存放遍历到的成员。

    4begin指定遍历的开始位置(int型从取值0开始)。

    5end指定遍历结束的位置(int型,默认集合中最后一个元素)。

    6step遍历的步长(大于0的整型)。

    7varStatus存放遍历到的成员的状态信息。

    【示例代码】:代码9.11实现了遍历一个有符号的字符串,把指定的符号移除。指定beginend值,并获得遍历到的元素的状态信息。

    代码9.11 标签的示例:coredemo09.jsp

    1     <%@ page contentType="text/html;charset=GBK" %>

    2     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3    

    4    

    5              JSTL: -- forTokens<span style="font-family:黑体">标签实例</span>

    6    

    7    

    8    

    实例"/>

    9    


    10              北、京、欢、迎、您" delims="" var="c1">

    11             

    12             

    13             

    14             

    15            

    16   

    17               的四种属性:

    18                所在位置,即索引:

    19                总共已迭代的次数:

    20                是否为第一个位置:

    21                是否为最后一个位置:

    22    

    23   

    24    

    【代码解析】:

    1)本示例共实现了3循环,10~12行第一个循环实现了遍历给定字符串“北、京、欢、迎、您”,并除去循环中遇到的“、”号。

    213~15行第2个循环遍历一串带有分隔符的电话号码,不读取分隔符号,将显示一个字符串。

    316~22行第3个循环遍历一个带“*”号的字符串,根据指定的起始位置把元素取出,并显示每个元素的状态信息。

    提示:分隔符的作用是根据标识,截取字符串。如果未设定分隔符或在字符串中没有找到分隔付,将把整个元素作为一个元素截取。在实际应用中用于在除去某些符号在页面中显示。

    程序运行结果如图9.10所示。

    9.10 coredemo08.jsp

    的属性varStatus的使用同的使用方法相同,在此就再不表述。

    9.2.4 URL操作标签

    JSTL包含3个与URL操作有关的标签,分别为:标签。它们的作用为:显示其他文件的内容、网页导向、产生URL。下面将详细介绍这3个标签的使用方法。

    1标签

    该标签可以把其他静态或动态文件包含到本JSP页面。同的区别为:只能包含同一个web应用中的文件。而可以包含其他web应用中的文件,甚至是网络上的资源。

    语法1

    [scope=”page|request|session|application”] [charEncoding=”encoding”]>

    语法2

    主要参数见表9-3

    9-3 标签参数说明

    名称

    说明

    EL

    类型

    必须

    默认值

    url

    被导入资源的URL路径

    Y

    String

    context

    相同服务器下其他的web工程,必须以“"”开头

    Y

    String

    var

    String类型存入被包含文件的内容。

    N

    String

    Scope

    var变量的JSP范围

    N

    String

    page

    charEncoding

    被导入文件的编码格式

    Y

    String

    varReader

    Reader类型存储被包含文件内容

    N

    String

    【参数说明】:

    1URL为资源的路径,当应用的资源不存在时系统会抛出异常,因此该语句应该放在语句块中捕获。应用资源有两种方式:绝对路径和相对路径。使用绝对路径示例如下:

    使用相对路径的实例如下:

    aa.txt放在同一文件目录。

    如果以“/”开头表示应用的根目录下。例如:tomcat应用程序的根目录文件夹为webapps。导入webapps下的文件bb.txt的编写方式为:

    如果访问webapps管理文件夹中其他web应用就要用context属性。

    2context属性用于在访问其他web应用的文件时,指定根目录。例如,访问root下的index.jsp的实现代码为:

    等同于webapps/root/index.jsp

    3varscopecharEncodingvarReader是可选属性。具体使用方式见示例代码。

    【示例代码】:代码9.12实现了从绝对路径导入文件和从相对路径导入,同时使用var对象指定用变量来存储文件,并输出存入的文件内容。

    代码9.12 标签示例:coredemo10.jsp

    1     <%@ page contentType="text/html;charset=GBK" %>

    2     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3    

    4    

    5              JSTL: -- import<span style="font-family:黑体">标签实例</span>

    6    

    7    

    8    

    实例"/>

    9    


    10    

    绝对路径引用的实例" />

    11    

    12    

    13   

    14   

    15   


    16    

    17     相对路径引用的实例,引用本应用中的文件" />

    18    

    19    

    20    

    21    


    22    

    使用字符串输出、相对路径引用的实例,并保存在session范围内" />

    23    

    24    

    25    

    26    

    27    

    28    

    29    

    30    

    【代码解析】:

    1)第12行使用绝对路径导入百度首页,导入时使用1112行)捕获异常。

    2)使用相对路径导入同一文件夹下的a1.txt文件,接收的字符编码格式使用charEncoding设置为gbk

    3)同样导入a1.txt,不同的时使用var定义的变量接收要导入的文件,并存储在session中,如果在其他页面同样也要导入该文件,只须使用输出a1.txt的值即可。

    程序结果如图9.11所示。

    9.11 coredemo10.jsp运行结果

    【说明】:

    1)在使用绝对路径导入时,因为电脑没有联网所以抛出异常。

    2)使用相对路径输出时,同样是引入的a1.txt文件显示的结果却不相同,这可以说明直接使用导入,不设定var参数是直接在页面中显示的文本信息。而使用var参数输出时输出的实现存入的字符串。

    提示:读者在练习时可以使用Tomcat的首页来导入url=”http://127.0.0.1:8080”来显示效果。

    2标签

    该标签用来实现了请求的重定向。同时可以在url中加入指定的参数。例如:对用户输入的用户名和密码进行验证,如果验证不成功重定向到登录页面;或者实现web应用不同模块之间的衔接。

    【语法1】:

    【语法2】:

    【参数说明】:

    1url指定重定向页面的地址,可以是一个string类型的绝对地址或相对地址。

    2)用于导入其他web应用中的页面。

    【示例代码】:代码9.13实现了当请求页面时重定向到tomcat首页。

    代码9.13 标签示例:coredemo11.jsp

    <%@ page contentType="text/html;charset=GBK" %>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    olive

    01234

    【代码解析】

    1)使用重定向与载入页面不同,载入页面时在本页面中插入其他页面,而重定向是请求转发,等于在页面中重新输入了一次url。当重定向到某个页面时浏览器中的地址会发生变化。

    2)使用重定向时不用使用语句,当输入页面访问不到时,浏览器会报错,跟程序运行无关。如果使用重定向时页面定义的内容将不会得到显示。

    3)在重定向时为URL添加了两个参数和参数值:uname=olivepassword=01234

    程序运行结果如图9.12所示。

    9.12 coredemo11.jsp运行结果

    提示:注意图中的URL地址已经发生转变,同时可以看到传入的参数以参数值。

    3标签

    该标签用于动态生成一个String类型的URL,可以同标签共同使用,也可以使用html标签实现超链接。

    【语法1】:指定一个url不做修改,可以选择把该url存储在JSP不同的范围中。

    [context=”context”]/>

    【语法2】:给url加上指定参数及参数值,可以选择以name存储该url

    [context=”context”]>

    参数名” value=””>

    【示例代码】:代码9.14实现了使用动态生成url实现了网页的超链接。

    代码9.14 标签示例:coredemo12.jsp

    <%@ page contentType="text/html;charset=GBK" %>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    标签使用">

    使用url标签生成一个动态的url,并把值存入session.


    Tomcat首页

    程序运行结果如图9.13所示。

    9.13 coredemo12.jsp运行结果

    单击图中超链接可以直接访问到Tomcat首页。

    9.3 I18N格式标签库

    JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和日期的方法。实现这些功能需要I18N格式标签库(I18N-capable formation tags liberary)。引入该标签库的方法为:

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

    I18N格式标签库提供了11个标签,这些 标签从功能上可以划分为3类如下:

    1)数字日期格式化。formatNumber标签、formatData标签、parseNumber标签、parseDate标签、timeZone标签、setTimeZone标签。

    2)读取消息资源。bundle标签、message标签、setBundle标签。

    3)国际化。setlocale标签、requestEncoding标签。

    接下将详细介绍这些标签的功能和使用方式。

    9.3.1 数字日期格式化

    数字日期格式化标签共有6个,用来将数字或日期转换成设定的格式。

    1标签

    该标签依据特定的区域将数字改变为不同的格式来显示。

    【语法1】:

    被格式化的数据”[type=”number|currency|percent”]

                                                   [pattern=”pattern”]

                                                   [currencyCode=”code”]

                                                   [currencySymbol=”symbol”]

                                                   [groupingUsed=”true|false”]

                                                   [maxIntergerDigits=”maxDigits”]

                                                   [minIntergerDigits=”minDigits”]

                                                   [maxFractionDigits=”maxDigits”]

                                                   [minFractionDigits=”minDigits”]

                                                   [var=”name”]

                                                   [scope=page|request|session|application]

    />

    【语法2】:

                                                   [pattern=”pattern”]

                                                   [currencyCode=”code”]

                                                   [currencySymbol=”symbol”]

                                                   [groupingUsed=”true|false”]

                                                   [maxIntergerDigits=”maxDigits”]

                                                   [minIntergerDigits=”minDigits”]

                                                   [maxFractionDigits=”maxDigits”]

                                                   [minFractionDigits=”minDigits”]

                                                   [var=”name”]

                                                   [scope=page|request|session|application]

    被格式化的数据

    属性说明如表9-4所示。

    9-4 标签参数说明

    名称

    说明

    EL

    类型

    必须

    默认值

    value

    要格式化的数据

    String

    type

    指定类型(单位、货币、百分比等)见表

    String

    number

    pattern

    格式化的数据样式

    String

    currencyCode

    货币单位代码

    String

    cuttencySymbol

    货币符号($、¥)

    String

    groupingUsed

    是否对整数部分进行分组如(9999

    boolean

    true

    maxIntergerDigits

    整数部分最对显示多少位数

    int

    minIntergerDigits

    整数部分最少显示多少位

    int

    maxFractionDigits

    小数部分最多显示多少位

    int

    minFractionDigits

    小数部分最少显示多少位

    int

    var

    存储格式化后的数据

    String

    scope

    varJSP范围

    String

    page

    Type属性的类型应用见表9-5.

    9-5 Type的属性类型

    类型

    说明

    示例

    number

    数字格式

    0.8

    currency

    当地货币

    0.80

    percent

    百分比格式

    80%

    【示例代码】:代码9.14实现了对数字的格式化、货币的格式、货币的格式化。使用的各种属性的设定。

    代码9.14 标签示例:fmtdemo01.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

          

        I18N<span style="font-family:黑体">标签库</span>

     

     

     

    标签的使用">

     


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    类型  使用数据 结果 说明
    数字格式化108.75 108.75 使用pattern可以定义显示的样式。本例设定为###.#小数部分将使用四舍五入法。
    数字格式化9557 9557 使用科学计数法。
    数字格式化9557 9557 使用默认分组。
    数字格式化9557 9557 不使用分组。
    数字格式化9557 9557 使用位数限定,根据指定的位数显示,其他数字忽略。例如:9不被显示。
    百分比格式化0.98 0.98 用百分比形式显示一个数据。
    货币格式化188.88 188.8 将一个数据转化为货币形式输出。
    存储数据188.88 188.8

     

     

    存储的money的值为${money}

     

    【代码说明】:

    1)从应用角度可以把属性分为三类:数字格式化、货币格式化、百分比格式化。使用type指定类型。

    2)应用于数字格式化的属性有:partten属性、maxIntegerDigits属性、minIntegerDigits属性、maxFractionDigits属性和minFactionDigits属性。其中partten属性在设定格式化样式时会比较准确如:四舍五入、科学计数法的使用。而使用maIntegerDirgits等属性时,只把设定位数以外的数字舍去。

    3)货币格式化可以使用数字格式化的所有属性。如果有必要建议使用partten属性。currencyCode属性和currencySymbol只用于货币格式化。

    4)百分比格式化使用到的属性为type属性、partten属性,设定type属性的类型为percent即可。

    5)使用var属性时,会将格式化后的值存在JSP的某个范围内(一个String类型的字符串包括符号等)。将不再输出格式化后的值可以使用EL表达式输出。

    6)通用属性:type属性、partten属性、var属性和scope属性。

    程序运行结果如图9.14所示。

    9.14 fmtdemo01.jsp运行结果

    提示:如果给定的数据类型有错误将或产生异常。例如:给定的数据为aa进行类型转化,将使应用程序无法显示。因此在实际应用中显示的格式化应该放入语句中。

    2标签

    将格式化后的数字、货币、百分比都转化为数字类型。

    【语法1】:

                                                            [pattern=”pattern”]

                                                            [parseLocale=”locale”]                       

                                                            [intergerOnly=”true|false”]

                                                            [scope=”page|request|session|application”]

    />

    【语法2】:

                                                            [pattern=”pattern”]

                                                            [parseLocale=”locale”]

                                                            [intergerOnly=”true|false”]

                                                            [scope=”page|request|session|application”]

    Number

    属性说明见表9-6

    9-6 标签参数说明

    名称

    说明

    EL

    类型

    是否必须

    默认值

    value

    被解析的字符串

    String

    type

    指定单位(数字、货币、百分比)

    String

    number

    pattern

    格式样式

    String

    parseLocale

    用来替代默认区域的设定

    String

    Java.util.

    Locale

    默认本地样式

    var

    存储已经格式化的数据

    String

    scope

    var变量的作用域

    String

    page

    可以看作是的逆运算。相应的参数和类型的配置和使用格式化时相同。

    【示例代码】:代码9.15实现了从字符串中提取数据,并用合适的数据类型进行存储(浮点性、整型等)。可以对转换后的数据进行加法运算。

    代码9.15 标签示例:fmtdemo02.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

     

     I18N<span style="font-family:黑体">标签库</span>

     

     

     

    标签的使用">

     


     

     188.8

     

  • 格式化前的数据为:

     ${money}

     

  • 格式化后的数据为:

     

  • 可以对格式化的后的数据进行运算: 

     

     

  • 对百分比进行格式化98%为:

     98%

    【代码解析】:

    1)首先使用188.8转换为字符串¥188.8并在page范围内存储一个String类型的变量,变量名为money

    2)使用将¥188.8转化为浮点型的数据188.8并赋值为变量money

    则变量money转变为一个浮点型的值188.8,对188.8进行加运算。

    3)直接对一个百分比数98%进行转化。

    程序运行结果如图9.15所示。

    9.15 fmtdemo02.jsp运行结果

    提示:属性参数的配置和使用同标签使用的方式一样。同时,在进行类型转换时如果给出的类型不正确将会出现异常。例如在进行百分比转化时如果没有给type类型或者给出type类型但提供的数据中没有%都会产生异常。因此在实际应用中用捕获异常。

    3标签

    该标签主要用来格式化日期和时间。

    【语法】:

                                         [pattern=”pattern”]

                                         [dateStyle=”default|short|medium|long|full”]

                                         [timeStyle=”default|short|medium|long|full”]

                                         [timeZone=”timeZone”]

                                         [var=”name”]

                                         [scope=”page|request|session|application”]

    />

    参数说明见表9-7

    9-7 标签属性说明

    属性名

    说明

    EL

    类型

    必须

    默认值

    value

    将要格式化的日期对象。

    Java.util.Date

    type

    显示的部分(日期、时间或者两者)。

    String

    date

    partten

    格式化的样式。

    String

    dateStyle

    设定日期的显示方式。

    String

    default

    timeStyle

    设定时间的显示方式。

    String

    default

    timeZone

    设定使用的时区。

    String

    当地所用时区

    var

    存储已格式化的日期或时间。

    String

    scope

    指定var存储的JSP范围。

    String

    其中type属性参数说明见表9-8

    9-8 type属性参数说明

    参数名

    说明

    time

    只显示时间

    date

    只显示时期

    both

    显示日期和时间

    【示例程序】:代码9.16实现了对日期的格式化,使用了typedateStyletimeStyle等属性。

    代码9.16 标签示例:fmtdemo03.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

       

        I18N<span style="font-family:黑体">标签库</span>

     

     



     timeStyle="default">

      

     timeStyle="short">

      

     timeStyle="long">

      

    timeStyle="full">

      

    timeStyle="full">

      

    【代码解析】:

    1)首先通过配置JavaBean在页面上实例化java.util.Date对象。实现代码如下:

    2)对日期对象进行格式化时${date}是一个日期对象,如果给value设的值为String时程序会报错。

    3)设置typeboth时,将显示日期和时间,同时示例中依次改变dateStyletimeStyle的值作为比较。

    程序结果如图9.16所示。

    9.16 fmtdemo03.jsp

    使用IE的语言标签可以设置语言种类如图9.17所示。

    9.17 改变使用默认语言

    语言设为英文是程序效果如图9.18所示。

    9.18 语言为英文状态下的显示

    4标签

    标签主要将字符串类型的时间或日期转化为时间或日期对象。

    【语法1】:

                                                            [pattern=”pattern”]

                                                            [parseLocale=”locale”]

                                                            [dateStyle=”default|short|medium|long|full”]

                                                            [timeStyle=”default|short|medium|long|full”]

                                                            [timeZone=”timezone”]

                                                            [var=”name”]

                                                            [scope=”page|request|session|application”]

    />

    【语法2】:

                                                            [pattern=”pattern”]

                                                            [parseLocale=”locale”]

                                                            [dateStyle=”default|short|medium|long|full”]

                                                            [timeStyle=”default|short|medium|long|full”]

                                                            [timeZone=”timezone”]

                                                            [var=”name”]

                                                            [scope=”page|request|session|application”]

    Date

    【参数说明】参数说明见表9-9.

    9-9 标签属性说明

    属性名

    说明

    EL

    类型

    必须

    默认值

    value

    将要格式化的日期时间

    String

    type

    字符串的类型(日期、时间或全部)

    EL

    String

    date

    pattern

    字符串使用的时间样式

    String

    parseLocale

    取代默认地区设定

    String

    默认地区

    dateStyle

    字符串使用的日期显示方式

    String

    default

    timeStyle

    字符串使用的时间显示格式

    String

    default

    timeZone

    使用的时区

    String

    当地区时

    var

    使用var定义的名字保存对象

    String

    scope

    varJSP范围

    String

    page

    【示例代码】:代码9.16实现了以下功能:首先,使用了把一个日期对象格式化成一个日期的字符串,并把该字符串以参数名为a存储page范围内。其次,使用方法把a的值(字符串)格式化成一个Date并以参数名为b存储在page范围内。最后,使用Java脚本证明生成的b为对象。

    代码9.16标签示例:fmtdemo04.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

       

        I18N<span style="font-family:黑体">标签库</span>

     

     

      

    标签的使用">

      


    dateStyle="full" timeStyle="full">

    ${a}

       <%

       out.println(pageContext.getAttribute("b").toString());

       out.println("
    ");

       out.println(pageContext.getAttribute("b").hashCode());

       %>

      

    【代码解析】:

    1)使用把日期对象格式化成字符串。

    2)使用把字符串对象转化为日期对象,注意同(1)中的参数对比,可以发现两者是一个互逆的过程。

    3)使用Java脚本进行测试Date对象的toString()方法可以输出时间字符串。hashCode()可以得到一个对象的hashCode。该方法只能应用于对象,因此可以证明得到的是一个日期对象。

    程序运行结果如图9.19所示。

    9.19 fmtdemo04.jsp

    提示:是相反的运算过程,可以对照学习。本例中的Java脚本的作用是为了证明生成的的确是一个对象。

    5标签

    该标签用于设定默认时区或者将时区存储在指定的JSP范围内。

    【语法】:

    【参数说明】:见表9-10

    9-10 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    value

    使用的时区

    String

    Java.util.TimeZone

    var

    使用var定义的参数名保存值

    String

    scope

    存储varJSP范围

    String

    page

    value用来设定使用的时区,例如中国使用的时区为CST,其他的还有ESTPST等。可以把时区存储在指定的JSP范围内,例如存储在session中,用户访问的所有页面都可以显示使用的设定的时区下对应的时间。

    【示例代码】

    提示:有关TimeZone的说明见JDK帮助文档的java.util.TimeZone类。

    6标签

    该标签主要用于设置标签体内使用的时区。

    【语法】:

    …..

    使用只会应用到标签体内使用的时区,对标签外部将不产生影响。

    9.3.2 读取消息资源

    读取消息资源用到的标签主要有4个:标签、标签、标签和标签。主要用于从资源文件中读取信息。

    1标签

    该标签主要用于将资源文件绑定于它的标签体中的显示。

    【语法】:

    ….标签主题

    【参数说明】:见表9-11

    9-11 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    basename

    指定使用的资源文件的名称

    String

    prefix

    前置关键字

    String

    2标签

    该标签主要用于绑定资源文件或者把资源文件保存在指定的JSP范围内。

    【语法】:

                                         [scope=”page|request|session|application”]

    【参数说明】:见表9-12

    9-12 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    basename

    指定使用的资源文件的名称

    String

    var

    指定将资源文件保存的名称

    String

    scope

    设定将资源文件保存的JSP范围

    String

    page

    3标签

    该标签主要负责读取本地资源文件,从指定的消息文本资源文件中读取键值,并且可以将键值保存在指定的JSP范围内。

    【语法1】:

                                         [scope=”page|request|session|application”]

    />

    【语法2】:

                                         [scope=”page|request|session|application”]

    【语法3】:

                                                            [scope=”page|request|session|application”]

    key

    【参数说明】:见表9-13

    9-13 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    key

    指定键值的名称(索引)

    String

    bundle

    指定消息文本的来源

    LocalizationContext

    var

    指定存储键值的变量名

    String

    scope

    指定var的作用域

    String

    page

    提示:建议此处的bundle使用EL表达式,因为属性bundle的类型为LocalizationContext,而不是一个String类型的URL

    【示例代码】:代码9.17实现从指定的资源文件中读取对应key的值。

    首先编写一个资源文件内容下

    name=olive

    password=01234

    使用标签从资源文件中读取相应的值。

    代码9.17 标签示例:fmtdemo05.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

       

        I18N<span style="font-family:黑体">标签库</span>

     

     

      

    资源文件读取示例">

      


      

       从message资源文件中得到的keyname的值为:">

      

      

      


      

      

        ${m}

      

    【代码解析】:

    1)使用标签指定从message.properties文件中读取值。

    2)使用标签读取资源文件中keyname的值。标签放在标签体内使用。

    3)使用标签在page范围绑定一个配置文件,以m为参数名存储。

    4)使用标签得到keypassword的值,此处指定资源文件的方式为使用标签的bundle属性来设定。

    5)输出参数m的值,加深对bundle的理解。

    程序运行结果如图所示。

    9.20 fmtdemo05.jsp运行效果

    标签中有一个prefix属性,该标签用来指明前缀。例如配置文件内容如下:

    org.person.name=olive

    org.personpassword=01234

    如果不使用prefix标签,在取值是要指明前缀。例如:

    使用prefix属性可以简化取值时的代码。

    4标签

    该标签主要用于当中资源文件中获得键值时,动态的为资源文件中的变量赋值。

    【语法1】:

    【语法2】:

    标签主体

    【示例代码】:

    1)创建资源文件。在message.properties文件中增加一个keyvalue

    news={0} welcome to out website!
    today is :{1,date}

    表达的含义是键news对应的是一个字符串,字符串中还有动态变量{0}表示第一个动态变量,{1,date}表示第二个动态变量并且该变量是一个日期类型的对象。

    2)通过标签从资源文件中取出键值,并给动态变量赋值显示在页面。

    代码9.18 标签示例:fmtdemo06.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

       

        I18N<span style="font-family:黑体">标签库</span>

     

     

      

    标签的使用">

      


      

      

      

      

      

      

      

    【代码解析】:

    1)使用标签把资源文件绑定在标签体内。

    2)在标签体内使用得到键值。

    3)使用为资源文件中的动态变量赋值。

    程序运行结果如图9.21所示。

    9.21 fmtdemo06.jsp运行结果

    提示:资源文件经过修改后,应用程序需要重载才能生效。

    9.3.3 国际化

    国际化这个分类中共包含两个标签:用于设定语言地区和用于设定请求的字符编码的标签。

    1标签

    标签用来设定用户语言区域。

    【语法】:

                                [scope=”page|request|session|application”]>

    【参数说明】:见表9-14

    9-14 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    value

    指定区域代码

    String

    java.util.Locale

    variant

    操作系统的类型

    String

    scope

    设定时区的作用范围

    String

    page

    value属性用来指定使用的语言代码,可以从浏览器的【工具】---Internet选项】---【语言】---【添加】中查看浏览器支持的语言种类及语言代码。例如:中文(zh_cn)、台湾(zh_tw)、香港(zh_mo)等。

    【示例代码】:代码9.19实现了设定不同的区域代码,根据不同的区域代码浏览将显示不同格式的日期。

    代码9.19 标签示例:fmtdemo07.jsp

    <%@ page language="java" pageEncoding="gbk"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

       

        I18N<span style="font-family:黑体">标签库</span>

     

     

      

    标签的使用">

      


      

      

      


      

      

      


      

      

      

    【代码解析】:

    1)浏览器默认跟您使用的操作系统的语言相同,因此默认值zh_cn。使用标签设置使用的语言为en_us(英语)。使用格式化输出的时间字符串,该标签会根据不同的语言输出不同的日期格式。

    2)使用的语言修改为zh_cn,再次用格式化输出。

    3)使用语言修改为zh_TW,输出格式化后的时间。

    程序运行结果如图所示。

    图9.22 fmtdemo07.jsp运行结果

    2标签

    该标签用于设定请求的编码格式。功能同servletRequest.setCharacterEncoding()方法相同。

    【语法】:

    【参数说明】:

    value属性用来指定使用的编码集例如:gbkgb2312等。当没有给出value的值时将会自动搜索取寻找合适的编码方式,因此能够很好的解决中文乱码问题。

    9.4 SQL标签库

    JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,在开发小型网站是可以很方便的实现数据的读取和操作。本章将详细介绍这些标签的功能和使用方法。

    SQL标签库从功能上可以划分为两类:设置数据源标签、SQL指令标签。

    引入SQL标签库的指令代码为:

    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

    9.4.1 设置数据源

    使用标签可以实现对数据源的配置。

    【语法1】:直接使用已经存在的数据源。

                                [scope=”page|request|session|application”]/>

    【语法2】:使用JDBC方式建立数据库连接。

                                                   user=”username”

                                                   password=”pwd”                

                                                   [var=”name”]

                                                   [scope=”page|request|session|application”]/>

    【参数说明】:见表9-15

    9-15 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    dataSource

    数据源

    String

    Javax.sql.DataSource

    driver

    使用的JDBC驱动

    String

    url

    连接数据库的路径

    String

    user

    连接数据库的用户名

    String

    password

    连接数据库的密码

    String

    var

    指定存储数据源的变量名

    String

    scope

    指定数据源存储的JSP范围

    String

    page

    提示:是否必须是相对的,比如说如果使用数据源则,driverurl等就不再被使用。如果使用JDBC则要用到driverurluserpassword属性。

    例如连接SQL Server需要进行如下配置:

    Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

    url=” jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"

    user=”sa”

    password=””

    使用配置的代码如下:

                       url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs”

                       user=”sa”

                       password=””>

    如果连接其他数据库,只须把相对应的项修改即可。

    提示:可以把数据连接的配置存入session中,如果再用到数据库连接只须配置使用DataSource属性。

    9.4.2 SQL操作标签

    JSTL提供了5个标签,通过使用SQL语言操作数据库,实现增加、删除、修改等操作。下面将介绍这5个标签的功能和使用方式。

    1标签

    标签用来查询数据。

    【语法1】:

                       [dataSource=”dateSource”]

                       [maxRow=”maxRow”]

                       [startRow=”starRow”]/>

    【语法2】:

                       [dataSource=”dateSource”]

                       [maxRow=”maxRow”]

                       [startRow=”starRow”]

    sqlQuery

    【属性说明】:见表9-16

    9-16 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    sql

    查询数据的SQL语句

    String

    dataSource

    数据源对象

    String

    Javax.sql.DataSoutce

    maxRow

    设定最多可以暂存数据的行数

    String

    startRow

    设定从那一行数据开始

    String

    var

    指定存储查询结果的变量名

    String

    scope

    指定结果的作用域

    String

    page

    使用必须指定数据源,dataSource是可选的,如果未给定该属性标签会在page范围内查找是否设置过数据源,如果没有找到将抛出异常。

    一般情况下使用标签设置一个数据源存储在session范围中,当需要数据库连接时使用dataSource属性并实现数据库的操作。

    var属性是必须的用来存放结果集,如果没有指定scope范围则默认为page,即在当前页面我们可以随时输出查询结果。结果集有一系列的属性如表9-17所示。

    maxRowsstartRow属性用来操作结果集,使用SQL语句首先吧数据放入内存中,检查是否设置了startRow属性,如果设置了就从starRow指定的那一行开始取maxRows个值,如果没有设定则从第一行开始取。

    9-17 结果集参数说明

    属性名

    类型

    说明

    rowCount

    int

    结果集中的记录总数

    Rows

    Java.util.Map

    以字段为索引查询的结果

    rowsByIndex

    Object[]

    以数字为作索引的查询结果

    columnNames

    String[]

    字段名称数组

    limitedByMaxRows

    boolean

    是否设置了maxRows属性来限制查询记录的数量

    提示:limitedByMaxRows用来判断程序是否收到maxRows属性的限制。并不是说设定了maxRows属性,得到结果集的limitedByMaxRows的属性都为true,当取出的结果集小于maxRows时,则maxRows没有对结果集起到作用此时也为false。例如可以使用startRow属性限制结果集的数据量。

    结果集的作用就是定义了数据在页面中的显示方式。下面给出了结果集每个属性的作用。

    q        rowCount属性。该属性统计结果集中有效记录的量,可以使用于大批量数据分页显示。

    q        Rows属性。等到每个字段对应的值。返回的结果为:字段名={字段值···}

    q        rowsByIndex属性。常用得到数据库中数据的方式,从有效行的第一个元素开始遍历,到最后一个有效行的最后一个元素。

    q        columnNames属性。用于得到数据库中的字段名。

    q        limitedByMaxRows属性。用于判断是否受到了maxRows的限制。

    【示例代码】:代码9.20给出了配置数据库连接,和使用查询数据以及结果集属性的使用。

    代码9.20 数据库示查询示例:sqldemo01.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

    <%@ page contentType="text/html;charset=GBK"%>

     JSTL: SQL<span style="font-family:黑体">标签</span>

    SQL标签库


             url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

             user="sa" password="" />

    结果集的实质是:${result}

    得到的行数为:${result.rowCount}

    是否收到了maxRows的限制:${result.limitedByMaxRows}


    【代码解析】:

    1)配置数据源。使用标签配置数据源,因为只共本页使用因此存储在默认的page范围中。

    2)使用标签进行数据库查询,并定义了maxRowsstartRow属性。并把结果集存储于作用于page范围的result变量。使用${result}输出可以发现结果集就是一个ResultImpl类。

    提示:在进行数据源配置时程序不会检查数据库连接是否配置正确,直接根据设定的数据库及连接访问,如果没有找到则抛出操作的表异常,因此要放如同时在编写程序时一定要注意数据源是否配置正确。

    3)使用结果集的rowCount属性得到记录的总量。代码为:

    ${result.rowCount}

    4)使用结果集的limitedMaxRows属性判断是否收到maxRows设定的影响。代码为:

    ${result.limitedMaxRows}

    5)从结果集中得到数据库中定义的所有的字段。${result.columnnames}得到的结果是一个字符串数组,因此需要使用循环输出。代码如下:

    6)从结果集中得到所有的值。首先要遍历每一行,然后遍历每一行中的元素,因此需要循环嵌套。代码如下:

    提示:在代码解析中省略了html元素表格等标签的元素,本示例适用于任何数据库表,只要把数据库的URL、使用的JDBC进行相应的配置和操作的数据表名进行相应的修改即可看到结果。

    程序运行结果如图9.23所示。

    9.23 查询操作结果图

    2标签

    用来实现操作数据库如:使用createupdatedeleteinsertSQL语句,并返回影响记录的条数。

    【语法1】:SQL语句放在标签属性中。

    语句” [var=”name”] [scope=”page|request|session|application”]

                                                            [dateSource=”dateSource”]/>

    【语法2】:SQL语句放在标签体内。

                                                            [dateSource=”dateSource”]

    SQL语句

    【参数说明】:见表9-18

    9-18 标签属性说明

    参数名

    说明

    EL

    类型

    必须

    默认值

    sql

    查询数据的SQL语句

    String

    dataSource

    数据源对象

    String

    Javax.sql.DataSoutce

    var

    指定存储查询结果的变量名

    String

    scope

    指定结果的作用域

    String

    page

    提示:标签的属性同标签的属性相比只减少了maxRowsstartRow2个属性。其他参数用法一样。

    使用可以实现数据表的创建、插入数据、更行数据、删除数据。使用时只须在标签中放入正确的SQL语句即可,同时要捕获可能产生的异常。本节只对一个简单的插入操作进行说明。

    【示例代码】:代码9.21实现了创建一个表、实现数据的插入。

    代码9.21 数据库创建、数据插入示例:sqldemo02.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

    <%@ page contentType="text/html;charset=GBK"%>

     JSTL: SQL<span style="font-family:黑体">标签</span>

    SQL标签库


             url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

             user="sa" password="" />

    实现数据库表的创建

    create table c_user (

              id int primary key ,

         name varchar(80),

         sex varchar(80),

    )

    insert c_user values(05,'Linda','')

    insert c_user values(01,'Rom','' )

    影响的记录数为:



    【代码解析】:

    1)配置数据源。

    2)使用标签创建一个新表。

    3)向表中插入两行数据。

    提示:本示例也没有针对固定的表进行操作,在使用时直接运行即可,如果使用的是其他数据库,需要更改数据源配置和SQL语句部分修改。

    程序运行结果如图9.24所示。

    9.24 sqldemo02.jsp运行效果

    从图9.24中可以发现,使用var属性记录结果是不准确的,尤其是在一个标签中使用多条sql语句只能记录下第一条。在数据库中创建的c_user表如图9.25所示。

    9.25 SQL表的内容

    3标签

    标签用于动态的为SQL语句设定参数,同标签共同使用。可以防止SQL注入作用类似于java.sql.PreparedStatement

    【语法1】:

    【语法2】:

    Value

    【参数说明】:

    value的作用为SQL中的参数赋值。

    【使用示例】:

    select * from person where 序号=

    4标签

    标签主要用于为SQL标签填充日期类型的参数值。

    【语法】:

    【参数说明】:

    q        value属性:java.util.Date类型的参数。

    q        type属性:指定填充日期的类型timestamp(全部日期和时间)、time(填充的参数为时间)、date(填充的参数为日期)。

    5标签

    标签提供了数据操作的一种安全机制(即事务回滚),当操作数据库的某条SQL语句发生异常时,取消标签体中的所有操作,恢复原来的状态,重新对数据库进行操作。

    【语法】:

    [isolation=”read_committed|read_uncommitted|repeatable|serializable”]

    9.5 XML标签库

    JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用DomSAX标签库的繁琐,能轻松的读取xml文件的内容。

    9.5.1 XML核心标签库

    1标签

    标签用来解析指定的xml文件。

    【语法1】:

    {var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]}

    systemId=”systemId”

    filter=”filter”

    />

    【语法2】:

    {var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]}

    systemId=”systemId”

    filter=”filter”

    xmlDocument

    【参数说明】:见表9-20

    9-20 标签属性说明

    属性名

    说明

    EL

    类型

    必须

    默认值

    doc

    指定解析的xml文件

    String/Reader

    var

    存储解析后的xml文件

    String

    scope

    指定varJSP范围

    String

    page

    varDom

    以(org.w3c.dom.Doucemet)的形式存储解析的xml文件

    String

    scopeDom

    指定varDomJSP范围

    String

    page

    systemId

    xml文件的url

    String

    filter

    解析xml文件的过滤器

    Org.xml.sax.Filter

    提示:doc指定解析的xml文件并不是指定xml文件的路径,而是同共同使用,由加载并存储,然后使用解析。

    例如:如果解析person.xml文件需要通过如下代码实现对xml文件的解析。

    语句用来导入或存储文件到JSP。如果不使用var来存储,xml文件将显式的出现在JSP文件中。

    标签只用来解析xml文件,并不显示xml文件中的内容,如果想得到xml的节点元素或值需要使用元素来实现。

    2标签

    标签主要用来输出xml的信息。

    【语法】:

    【参数说明】:见表9-21

    9-21 标签属性说明

    属性名

    说明

    EL

    类型

    必须

    默认值

    select

    指定使用的XPath语句

    String

    escapeXml

    是否转换特殊字符。如<

    boolean

    true

    提示:使用XPath语句需要用到xalan.jar支持包,可以从示例程序的lib中获取,获得直接从myEclipse中可以找到。

    【示例代码】:

    3标签

    标签用于将从xml文件节点解析的内容存储到JSP属性范围中。

    【语法】:

    【参数说明】:

    1select通过指定的XPath表达式语句获取节点的值。

    2var指定用于存储值的变量名。

    3)指定varJSP属性范围。

    9.5.2 XML流程控制

    使用xml标签库的流程控制标签可以迭代处理xml文件的内容,流程控制可以分为以下两个方面的内容:

    1)条件判断。

    2)循环功能。

    1

    主要用于条件判断。

    【语法1】:未含有本体内容。

    【语法2】:含有本体内容。

    本体内容

    语法1只把根据条件表达式得到的结果的存储在JSP范围中,语法2根据标签根据条件表达式的结果决定是否执行本体内的代码。

    【参数说明】:

    1select用来指定使用的XpathExperssion表达式。

    2var设定标量名用来存储表达式的结果。

    3scope指定var存储的JSP属性范围。

    2标签

    同核心标签库的标签作用相似,只是使用的条件表达式不同。

    是主标签,放在标签体内共同使用。

    【语法】:

    其中只有有属性。

    【语法】:

    3标签

    标签实现了对xml文档的遍历。

    【语法】:

    [begin=”begin”][end=”end”][step=”step”]

    //标签主体

    【参数说明】:见表9-22

    9-22 标签属性说明

    属性名

    说明

    EL

    类型

    必须

    默认值

    select

    指定使用的XPath语句

    String

    var

    用于存储表达式的结果

    String

    varStatus

    用来存放循环到的变量的相关信息

    String

    begin

    循环的起始位置

    int

    end

    循环的终止位置

    int

    9.5.3 xml的文件转换

    能轻易使用XSLT样式包装xml文件,成为另一种显示方式。

    1标签

    使用该标签可以轻松的实现xmlXSLT的转化。

    【语法1】:

    [result=”result”]

    [var=”name”]

    [scope=”scopeName”]

    [xsltSystemId=”xsltsystemid”]/>

    【语法2】:

    [result=”result”]

    [var=”name”]

    [scope=”scopeName”]

    [xsltSystemId=”xsltsystemid”]

    【语法3】:

    [result=”result”]

    [var=”name”]

    [scope=”scopeName”]

    [xsltSystemId=”xsltsystemid”]

    Xml文件内容

    【参数说明】:见表9-23

    9-23 标签属性说明

    属性名

    说明

    EL

    类型

    必须

    默认值

    doc

    指定xml文件来源

    String

    xslt

    转化xml的样式模板

    String

    docSystemId

    xml文件的URI

    String

    xsltSystemId

    xslt文件的URI

    String

    result

    用来存储转换后的结果对象

    java.xml.transform

    var

    org.w3c.dom.Documet类型存储转换后的结果

    String

    scope

    var的属性范围

    String

    2标签

    该标签用来为标签转换参数。

    【语法1】:

    【语法2】:

    Value

    【参数说明】:

    1name指定参数的名称。

    2value指定参数值。


  • 你可能感兴趣的:(@JAVA学习)