<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所示。
图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&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&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 运行结果