学科分类
目录
Java Web

<jsp:setProperty>标签

了解到<jsp:useBean>标签可以创建JavaBean对象。但是,要想为JavaBean对象设置属性,还需要通过<jsp:setProperty>标签来实现。<jsp:setProperty>标签的语法格式如下:

<jsp:setProperty name="beanInstanceName" 
{ 
    property="propertyName" value="{string | <%= expression %>}" |
    property="propertyName"  param="parameterName"  | 
    property= " propertyName |*" 
}/>

从上面的语法格式中可以看出,<jsp:setProperty>标签中有4个属性,接下来就针对这4个属性进行讲解,具体如下:

● name:用于指定JavaBean实例对象的名称,其值应该和<jsp:useBean>标签的id属性值相同。

● property:用于指定JavaBean实例对象的属性名。

● param:用于指定请求消息中参数的名字。在设置JavaBean的属性时,如果请求参数的名字和JavaBean属性的名字不同,可以使用param属性,将其指定的参数的值设置给JavaBean的属性。如果当前请求消息中没有param属性所指定的请求参数,那么<jsp:setProperty>标签什么事情也不做,它不会将null值赋给JavaBean属性,所设置的JavaBean属性仍将等于其原来的初始值。

● value:用于指定为JavaBean实例对象的某个属性设置的值。其值可以是一个字符串,也可以是一个JSP表达式。如果value属性的设置值是字符串,那么它将被自动转换成所要设置的JavaBean属性的类型。例如,如果JavaBean的属性为int类型,而value属性的设置值为“123”,JSP容器会调用Integer.valueOf方法将字符串“123”转换成int类型的整数123,然后调用setter方法将123设置为JavaBean属性的值。如果value属性的设置值是一个表达式,那么该表达式的结果类型必须与所要设置的JavaBean属性的类型一致。需要注意的是,value属性和param属性不能同时使用。

在使用<jsp:setProperty>标签时,name属性和property属性必须指定,property属性可以单独使用,也可以和value属性或者param属性配合使用,下面我们就对property属性的三种使用方式进行讲解,具体如下所示:

1、property属性单独使用

在单独使用property属性时,property的属性值可以设置为JavaBean的一个属性名,也可以设置为一个星号(*)通配符。接下来就针对这两个情况进行介绍。

● proeprty的属性值为JavaBean 的属性

当property属性的值为JavaBean的一个属性名时,JSP容器会将请求消息中与property属性值同名的参数的值赋值给JavaBean对应的属性。为了更好的理解这种情况,接下来通过一个案例来进行演示。在chapter08工程下创建一个setProperty.jsp文件,文件中使用<jsp:useBean>标签和<jsp:setProperty>,其代码如例1所示。

例1 setProperty.jsp

 1    <%@ page language="java" pageEncoding="GBK"
 2        import="cn.itcast.chapter08.javabean.Manager"%>
 3    <html>
 4    <body>
 5            <jsp:useBean id="manager" class="cn.itcast.chapter08.javabean.Manager" />
 6            <jsp:setProperty name="manager" property="bonus" />
 7            <%
 8                manager = (Manager) pageContext.getAttribute("manager");
 9                out.write("bonus属性的值为:"+manager.getBonus());
 10            %>
 11    </body>
 12    </html> 

在例1中,第5行代码使用<jsp:useBean>标签创建了一个Manager对象,并以“manager”为名称存储在pageContext域中,第6行代码使用<jsp:setProperty>标签,设置property属性的值为Manager对象的属性bonus,第8~9行代码通过JSP脚本片段从pageContext域中取出Manager对象,然后向浏览器输出Manager对象的bonus属性值。

在浏览器地址栏中输入URL地址http://localhost:8080/chapter08/setProperty.jsp?bonus=800.0访问setProperty.jsp页面,可以看到浏览器显示的结果如图1所示。

图1 运行结果

从图1中可以看到,浏览器中显示的bonus属性的值为800.0,和URL地址中参数 bonus的值一致。这是因为在<jsp:setProperty>标签中,property属性的值为Manager对象的属性bonus,JSP容器会在请求参数中寻找bonus参数,如果找到则把bonus参数的值赋给Manager对象的bonus属性。如果没有bonus参数或者bonus参数的值为空字符串(""),那么JSP容器不会对Manager对象的bonus属性值进行修改。

下面将例1中的Manager类进行修改,在定义bonus属性时赋初始值为500.0,如例2所示。

例2 Manager.java

 1    package cn.itcast.chapter08.javabean;
 2    public class Manager extends Employee {
 3        private double bonus=500.0;
 4        public double getBonus() {
 5            return bonus;
 6        }
 7        public void setBonus(double bonus) {
 8            this.bonus = bonus;
 9        }
 10    }

在浏览器地址栏中输入“http://localhost:8080/chapter08/setProperty.jsp?bonus=”访问setProperty.jsp页面,浏览器显示的结果如图2所示。

img

图2 运行结果

​ 从图2中可以看到,当URL地址中bonus参数的值为空字符串时,JSP容器不会对Manager对象的bonus属性进行修改,其值还是初始值500.0。

● proeprty的属性值为星号(*)通配符

当property属性的值为星号()通配符时,JSP容器会在请求消息中查找所有的请求参数,如果有参数的名字和JavaBean对象的属性名相同,JSP容器会将参数的值设置为JavaBean对象对应属性的值。接下来通过一个案例对property属性的这种情况进行演示。修改setProperty.jsp文件,将<jsp:setProperty>标签中的property属性设置为星号(),并在JSP脚本片段中输出Manager对象的bonus和company属性的值,修改后的setProperty.jsp文件如例3所示。

例3 setProperty.jsp

 1    <%@ page language="java" pageEncoding="GBK"
 2        import="cn.itcast.chapter08.javabean.Manager"%>
 3    <html>
 4    <body>
 5            <jsp:useBean id="manager" class="cn.itcast.chapter08.javabean.Manager" />
 6            <jsp:setProperty name="manager" property="*" />
 7            <%
 8                manager = (Manager) pageContext.getAttribute("manager");
 9                out.write("bonus属性的值为:"+manager.getBonus()+"<br />");
 10                out.write("company属性的值为:"+manager.getCompany());
 11            %>
 12    </body>
 13    </html>

在浏览器地址栏中输入URL地址http://localhost:8080/chapter08/setProperty.jsp?bonus=800.0&#38;company

=itcast&address=beijing访问setProperty.jsp页面,可以看到浏览器的显示结果如图3所示。

图3 运行结果

​ 从图3中可以看到,浏览器中显示出了bonus属性和company属性的值。这是因为在访问setProperty.jsp的URL地址中指定了bonus、company和address三个参数,JSP容器将这三个参数进行遍历,发现参数bonus和company与Manager对象的属性匹配,所以将这两个参数的值赋值给Manager对象对应的属性。

2、property属性和param属性配合使用

在实际开发中,很多时候服务器需要使用表单传递的数据为JavaBean对象的属性赋值,但是如果表单中表单项name属性的值和JavaBean中属性名不能对应,该如何对JavaBean对象的属性赋值呢?要想实现上述功能,就需要在<jsp:setProperty>标签中使用param属性,JSP容器会将param属性指定的参数的值赋值给JavaBean的属性。

接下来,通过一个案例来演示这种情况。对setProperty.jsp文件进行修改,在其中增加一个表单,并在<jsp:setProperty>标签中使用property属性和param属性,修改后的setProperty.jsp文件如例4所示。

例4 setProperty.jsp

 1    <%@ page language="java" pageEncoding="GBK"
 2        import="cn.itcast.chapter08.javabean.Manager"%>
 3    <html>
 4    <body>
 5            <form action="">
 6                  公司<input  type="text" name="corp">    <br/>
 7                  奖金<input  type="text" name="reward"> <br/>  
 8                  <input type="submit" value="提交">     
 9            </form>
 10           <jsp:useBean id="manager" class="cn.itcast.chapter08.javabean.Manager" />
 11           <jsp:setProperty name="manager" property="company" param="corp" />
 12           <jsp:setProperty name="manager" property="bonus" param="reward" />
 13           <%
 14                manager = (Manager) pageContext.getAttribute("manager");
 15                out.write("bonus属性的值为:"+manager.getBonus()+"<br />");
 16                out.write("company属性的值为:"+manager.getCompany());
 17            %>
 18    </body>
 19    </html>

例4中,两个表单项的name属性值分别为corp和reward,当提交表单时,它们会作为参数“corp=value&reward=value”添加到URL地址后面。由于这两个参数的名字和Manager对象的属性名不同,因此需要在<jsp:setProperty>标签中使用param属性,指定将参数corp和reward的值分别赋值给Manager对象的company属性和bonus属性。

​ 在浏览器地址栏输入URL地址http://localhost:8080/chapter08/setProperty.jsp访问setProperty.jsp文件,可以看到结果如图4所示。

图4 运行结果

​ 从图4中可以看出,由于访问setProperty.jsp页面的URL地址没有带参数,因此Manager对象的bonus和company属性为默认值500.0和null。

​ 在表单的【公司】文本框和【奖金】文本框中分填入“itcast”和“1000.0”,点击【提交】按钮,可以看到JSP容器将表单传递的数据分别赋值给了Manager对象的company属性和bonus属性,如图5所示。

图5 运行结果

3、property属性和value属性配合使用

当property属性和value属性配合使用时,JSP容器会使用value属性的值为JavaBean的属性赋值,即使在访问的URL地址中传入了与JavaBean属性对应的参数,JSP容器也会将它们忽略。

接下来通过一个案例来演示上述情况。对setProperty.jsp页面进行修改,将页面中的表单删除,并在<jsp:setProperty>标签中使用value属性,修改后的setProperty.jsp文件如例5所示。

例5 setProperty.jsp

 1    <%@ page language="java" pageEncoding="GBK"
 2        import="cn.itcast.chapter08.javabean.Manager"%>
 3    <html>
 4    <body>
 5            <jsp:useBean id="manager" class="cn.itcast.chapter08.javabean.Manager" />
 6            <jsp:setProperty name="manager" property="company" value="itcast" />
 7            <jsp:setProperty name="manager" property="bonus" value="1000.0" />
 8            <%
 9                manager = (Manager) pageContext.getAttribute("manager");
 10                out.write("bonus属性的值为:"+manager.getBonus()+"<br />");
 11                out.write("company属性的值为:"+manager.getCompany()); 
 12            %>
 13    </body>
 14    </html>

在浏览器中输入URL地址http://localhost:8080/chapter08/setProperty.jsp?company=baidu&#38;bonus=750.0访问setProeprty.jsp文件,可以看到浏览器的显示结果如图6所示。

图6 运行结果

​ 从图6中可以看到,在访问setProperty.jsp文件时,URL地址中指定了company参数和bonus参数,但由于在<jsp:setProperty>标签中使用了value属性,JSP容器会使用value属性的值为JavaBean对象的属性进行赋值,而将URL地址中的参数忽略。

​ value属性的值还可以通过JSP动态元素来指定,如果要为JavaBean对象中引用类型成员变量赋值,例如为Manager类中Date类型的成员变量birthday赋值,就需要使用这种方式。

​ 接下来通过一个案例来演示上述情况。对例程5中的Manager类进行修改,为其增加一个可读写的属性birthday,其代码如例6所示。

例6 Manager.java

 1    package cn.itcast.chapter08.javabean;
 2    import java.util.Date;
 3    public class Manager extends Employee {
 4        private double bonus = 500.0;
 5        private Date birthday;
 6    
 7        public Date getBirthday() {
 8            return birthday;
 9        }
 10        public void setBirthday(Date birthday) {
 11            this.birthday = birthday;
 12        }
 13        public double getBonus() {
 14            return bonus;
 15        }
 16        public void setBonus(double bonus) {
 17            this.bonus = bonus;
 18        }
 19    }

对setProperty.jsp文件进行修改,将value属性的值设置为一个Date对象,使用该值为Manager对象的birthday属性赋值。修改后的setProperty.jsp文件如例7所示。

例7 setProperty.jsp

 1    <%@ page language="java" pageEncoding="GBK"
 2        import="cn.itcast.chapter08.javabean.Manager" import="java.util.Date" 
 3        import="java.text.SimpleDateFormat"%>
 4    <html>
 5    <body>
 6        <% 
 7            Date date = new Date();
 8            pageContext.setAttribute("date", date);
 9        %>    
 10        <jsp:useBean id="manager" class="cn.itcast.chapter08.javabean.Manager" />
 11        <jsp:setProperty name="manager" property="birthday" value="${date }" />
 12        <%
 13            manager = (Manager) pageContext.getAttribute("manager");
 14            String formatDate = 
 15                    new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").
 16                    format(manager.getBirthday());
 17            out.write("birthday属性的值为:"+formatDate);
 18        %>
 19    </body>
 20    </html>

在浏览器地址栏中输入URL地址http://localhost:8080/chapter08/setProperty.jsp访问setProperty.jsp页面,可以看到${date}获取pageContext对象设置的值,并将这个值通过<jsp:setProperty>的value属性赋值给Manager对象birthday属性,所以浏览器中显示出birthday属性的值为一个字符串形式的Date日期,如图7所示。

图7 运行结果

点击此处
隐藏目录