jsp:useBean格式使用详解

<jsp:useBean>标签用来在jsp页面中创建一个Bean实例,它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。

语法

<jsp:useBean id="beanInstanceName" scope="page | request | session | application" 
{ 
    class="package.class" | 
    type="package.class" | 
    class="package.class" type="package.class" | 
    beanName="{package.class | <%= expression %>}"
    type="package.class" 
} 
/>

id: 命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。  

class: 指定Bean的完整包名。  

scope: 指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。 
1. 默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。 
2. request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。 
3. session表示该Bean对当前HttpSession内的所有页面都有效。 
4. application则表示该Bean对所有具有相同ServletContext的页面都有效。 

type: 指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。  

beanName: 指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。

执行步骤

元素用来定位或初始化一个JavaBeans组件。首先会尝试定位Bean实例,如果其不存在,则会依据class名称(class属性指定)或序列化模板(beanName属性指定)进行实例化。进行定位或初始化Bean对象时,<jsp:useBean>按照以下步骤执行。

1: 尝试在scope属性指定的作用域使用你指定的名称(id属性值)定位Bean对象;

2: 使用你指定的名称(id属性值)定义一个引用类型变量;

3: 假如找到Bean对象,将其引用给步骤2定义的变量。假如你指定类型(type属性),赋予该Bean对象该类型;

4: 假如没找到,则实例化一个新的Bean对象,并将其引用给步骤2定义的变量。假如该类名(由beanName属性指定的类名)代表的是一个序列化模板(serialized template),该Bean对象由java.beans.Beans.instantiate初始化;

5: 假如<jsp:useBean>此次是实例化Bean对象而不是定位Bean对象,且它有体标记(body tags)或元素(位于<jsp:useBean>和</jsp:useBean>之间的内容,则执行该体标记。

<jsp:useBean>和</jsp:useBean>之间经常包含<jsp:setProperty>,用来设置该Bean的属性值。

设置<jsp:useBean>属性并输出

jsp:setProperty用来设置已经实例化的Bean对象的属性

1. 你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,如下所示:

<jsp:useBean id="myName" ... />
<jsp:setProperty name="myName" property="someProperty" .../>

2. 把jsp:setProperty放入jsp:useBean元素的内部,如下所示:

<jsp:useBean id="myName" ... >
   <jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>

name:必需的。它表示要设置属性的是哪个Bean。

property:必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。

value:可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如"true")通过 Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。   value和param不能同时使用,但可以使用其中任意一个。

param:可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。

jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。

<jsp:useBean id="myName" ... />
<jsp:getProperty name="myName" property="someProperty" .../>

name:要检索的Bean属性名称。Bean必须已定义。

property:表示要提取Bean属性的值。

例子

//TestBean.java
public class TestBean {
    private String userName;
    private String password;
    private int age;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
//register.html
<html>
  <body>
    <form action="register.jsp" method="post">
        <table>
            <tr>
                <td>
                    姓名:<input type="text" name="userName">
                </td>
            </tr>
            <tr>
                <td>
                    密码:<input type="text" name="password">
                </td>
            </tr>
            <tr>
                <td>
                    年龄:<input type="text" name="age">
                </td>
            </tr>
            <tr>
                <td>
                    <input type="submit">
                </td>
            </tr>
        </table>
    </form>
  </body>
</html>
//register.jsp
<%@ page language="java"  pageEncoding="gb2312"%>
<jsp:useBean id="user" scope="page" class="com.jsp.ch3.TestBean"/>
<jsp:setProperty name="user" property="*"/>
或者用以下,param可以不填写,其中param对应的是提交页面的表单name
<jsp:setProperty property="userName" name="user" param="userName"/>
<jsp:setProperty property="password" name="user" param="password"/>
<jsp:setProperty property="age" name="user" param="age"/>
<html>
  <body> 
      注册成功:<br>
      <hr>
      使用Bean的属性方法<br>
      用户名: <%=user.getUserName()%><br>
      密码: <%=user.getPassword()%><br>
      年龄: <%=user.getAge()%><br>
      <hr>
      使用getProperty<br>
      用户名:<jsp:getProperty name="user" property="userName"/><br>
      密码:  <jsp:getProperty name="user" property="password"/><br>
      年龄:  <jsp:getProperty name="user" property="age"/>
      客户端名称:<%=request.getRemoteAddr() %>
  </body>
</html>

总结

1. scope在属性当中非常重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。 

2. class或beanName不能同时存在;它们用来指定实例化的类名称或序列化模板;如果确信JavaBean对象已存在,class和beanName属性均可无须指定, 可只须指定type属性。

3. class可以省去type独自存在,beanName必须和type一起使用;class指定的是类名,beanName指定的是类名或序列化模板的名称;class指定的类名必须包含public、无参的构造方法;在对象已实例化时,beanName指定的名称可以为其接口、父类;

4. class或beanName指定的类名必须包括包名称,type可以省去包名,通过<%@page import=""%>指定所属包亦可。

5. 如果JavaBean对象已存在,<jsp:useBean>只是用来定位JavaBean,则只需使用type属性即可,class和beanName这时舍去不影响使用。

6. class通过new创建JavaBean对象;beanName通过java.beans.Beans.instantiate初始化JavaBean对象。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。