2.5.3 useBean、 setProperty、 getPropelty指令

2.5.3 useBean、 setProperty、 getPropelty指令

这三个指令都是与JavaBean相关的指令,其中

  • useBean指令用于在JSP页面中初始化一个JAVA实例;
  • setProperty指令用于为JavaBean实例的属性设置值;
  • getProperty指令用于输出JavaBean实例的属性

如果多个JSP页面中需要重复使用某段代码,则可以把这段代码定义成Java类的方法,然后让多个JSP页面调用该方法即可,这样可以达到较好的代码复用。

useBean指令

useBean的语法格式如下:

1
<jsp:useBean id="beanInstanceName" class="className" scope="page | request | session | application" />

其中,

  • id属性是JavaBean的实例名,
  • class属性确定JavaBean的实现类。
  • scope属性用于指定JavaBean实例的作用范围,scope属性有以下4个值:
    • page:该Javabean实例仅在该页面有效
    • request:该Javabean实例在本次请求有效。
    • session:该JavaBean实例在本次session内有效。
    • application:该JavaBean实例在本应用内一直有效。

setProperty指令

setProperty指令的语法格式如下:

1
<jsp:setProperty name="beanName" property="propertyName" value="value"/>

其中,

  • name属性确定需要设定JavaBean的实例名;
  • property属性确定需要设置的属性名;
  • value属性则确定需要设置的属性值

getProperty指令

getProperty的语法格式如下:

1
<jsp:getProperty name="beanName" property="propertyName"/>

其中,

  • name属性确定需要输出的JavaBean的实例名;
  • property属性确定需要输出的属性名。

beanTest.jsp

下面的JSP页面示范了如何使用这三个动作指令来操作JavaBean.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> Java Bean测试 </title>
</head>
<body>
<!-- 创建lee.Person的实例,该实例的实例名为p1 -->
<jsp:useBean id="p1" class="lee.Person" scope="page"/>
<!-- 设置p1的name属性值 -->
<jsp:setProperty name="p1" property="name" value="Trump"/>
<!-- 设置p1的age属性值 -->
<jsp:setProperty name="p1" property="age" value="23"/>

<!-- 输出p1的name属性值 -->
<jsp:getProperty name="p1" property="name"/><br/>
<!-- 输出p1的age属性值 -->
<jsp:getProperty name="p1" property="age"/>
</body>
</html>

setProperty和getProperty指令通过调用JavaBean的setter和getter方法来操作javaBean属性

上页面中示范了使用useBeansetPropertygetProperty来操作JavaBean的方法。
对于上面的JSP页面中的setPropertygetProperty标签而言,它们都要求根据属性名来操作JavaBean的属性。
实际上setPropertygetProperty要求的属性名,与Java类中定义的属性有一定的差别,例如setPropertygetProperty需要使用name属性,但JavaBean中是否真正定义了name属性并不重要,重要的是在JavaBean中提供了setName()getName()方法即可。
事实上,当页面使用setPropertygetProperty标签时,系统底层就是调用setName()getName()方法来操作Person实例的属性的。

Person.java

下面是Person类的源代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package lee;

public class Person {
private String name;
private int age;

// 无参数的构造器
public Person() {
}

// 初始化全部成员变量的构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}

// name的setter和getter方法
public void setName(String name) {
this.name = name;
}

public String getName() {
return this.name;
}

// age的setter和getter方法
public void setAge(int age) {
this.age = age;
}

public int getAge() {
return this.age;
}
}

上面的Person.java只是源文件,此处将该文件放在Web应用的WEB-INF\src\路径下,实际上**Java源文件对Web应用不起作用**,所以此处会使用Ant来编译它,并将编译得到的二进制文件放入WEB-INF\classes\路径下。而且,为Web应用提供了新的class文件后,必须重启该Web应用,让它可以重新加载这些新的class文件。
该页面的执行效果如图2.15所示。

beanTest2.jsp

对于上面三个标签完全可以不使用,将beanTest.jsp修改成如下代码,其内部的执行是完全一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<%@ page import="lee.Person" %>
<!DOCTYPE html>
<html>
<head>
<title> Java Bean测试 </title>
</head>
<body>
<%
// 创建对象(javaBean)
Person p1=new Person();
// 设置属性
p1.setName("Trump");
p1.setAge(23);
// 讲bean放到当前页面
pageContext.setAttribute("p1", p1);
%>
<!-- 使用输出表达式输出 -->
<%=p1.getName()%><br>
<%=p1.getAge()%>
</body>
</html>

手动创建的javaBean需要手动指定要放入的scope

使用useBean标签时,除在页面脚本中创建了JavaBean实例之外,该标签还会将该JavaBean实例放入指定scope中.
所以在脚本中创建号javaBean后,通常还需要在脚本中将该JavaBean放入指定scope中,如下面的代码片段所示:

1
2
3
4
5
6
7
8
//将p1放入page的生存范围中
pageContext.setAttribute("p1", p1);
//将p1放入 request的生存范围中
request.setAttribute("p1", p1);
//将p1放入 session的生存范围中
session.setAttribute("p1", p1);
//将p1放入 application的生存范围中
application.setAttribute("p1", p1);

关于pagerequestsessionapplication四个生存范围请参看下一节介绍