Technorati 标签:  jsp 教程, javaee

    承接前面那一节 jsp 教程(三), 这一次将会继续讲解行为标签<jsp:useBean>。另外还会涉及到另外两个行为标签<jsp:setProperty>和<jsp:getProperty>,这两个标签分别用来设置和获取 bean 的属性。

一、<jsp:useBean>

    <jsp:useBean> 元素用来实例化一个java 类,即创建一个 javaBean的实例。它将一个javaBean 实例与某个 jsp 作用域中的一个名字相关联,并使之作为一个脚本变量可用(类似于内置对象)。此后,在此 jsp 作用域中,通过脚本变量来引用被实例化的 javaBean。被实例化的 bean 一定要无参构造函数。

    语法格式如下:

<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" } 
    > 
    other elements 
</jsp:useBean> 

    各属性的意义解释如下:

    id=“beanInstanceName” —— 用来标识对象的实例(大小写敏感)

    scope="page | request | session | application" —— 确定引入对象的作用域,默认为 page。

    class="package.class" —— 完整限定的类名

    type="package.class" —— 这个可选的属性用来指定类的类型,类型必须为是超类、接口或者是类本身。默认与 class 属性一样。

    beanName="{package.class | <%= expression %>}" type="package.class" —— 为Bean命名及其对应的类名。

示例:

    (1)<jsp:useBean id="book" class="com.entity.Book" />

        类似的可以java 代替:<% com.entity.Book book = new com.entity.Book(); %>

        如果不适用 class 属性,你可以选择使用 beanName 属性。不同的是 beanName 不仅可以指向一个类,也可以指向一个包含序列化 bean 的文件。属性 beanName的值会作为java.beans.Bean 中的 instantiate() 方法的一个参数。

    (2)<jsp:useBean id="thread" class="MyClass" type="Runnable" />

        这样的用法等同于在 _jspService()插入下面一段代码:Runnable thread = new MyClass();

二、<jsp:getProperty>

    <jsp:getProperty> 标签用来读取一个 bean 的属性,并以字符串类型(String)返回并显示在jsp 页面中。所谓 bean 的属性,主要是指 bean 中的成员变量(field),它们是在 java 类中定义的。如果被读取的对象是一个引用,则需要调用 toString()方法。注意:该 bean 必须先被<jsp:useBean> 定义。

    语法格式如下:

    <jsp:getProperty name="beanInstanceName" property="propertyName" />

    各属性的意义解释如下:

    name="beanInstanceName” —— 目标 bean 的实例名

    property="propertyName“ —— 要检索的属性名

示例:

    (1)<jsp:getProperty name="book" property="title" />

        类似可以java 代码代替:<%= book.getTitle() %>

三、<jsp:setProperty>

    <jsp:setProperty> 标签是利用 bean 的 setXxx() 方法来设置 bean 的属性。注意:该 bean 必须先被<jsp:useBean> 定义。

    语法格式如下:

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

示例:

    (1)<jsp:setProperty name="book" property="*" />

    (2)<jsp:setProperty name="book" property="title" />

    (3)<jsp:setProperty name="book" property="tltle" value="Think of Java" />

    解释如下:

    首先了解一点,使用<jsp:setProperty>来设置 bean 属性,有以下三种方式:

    (1)通过用户输入的所有值(被做为参数储存中request对象中)来匹配Bean中的属性

    (2)通过用户输入的指定的值来匹配Bean中指定的属性

    (3)在运行时使用一个表达式来匹配Bean的属性

    接着我们再来看一下各属性 的讲解:

    name="beanInstanceName" —— 目标 bean 的实例名

    property="*" —— 储存用户在Jsp输入的所有值,用于匹配Bean中的属性。在Bean中的属性的名字必须和request对象中的参数名一致.如果request对象的参数值中有空值,那么对应的Bean属性将不会设定任何值。同样的,如果Bean中有一个属性没有与之对应的Request参数值,那么这个属性同样也不会设定。附表列出了把字符串转化为其它类型的方法(bean中 property 类型)。

    property="propertyName" [ param="parameterName" ] —— 使用request中的一个参数值来指定Bean中的一个属性值。在这个语法中,property指定Bean的属性名,param指定request中的参数名。如果bean属性和request参数的名字不同,那么你就必须得指定property和param ,如果他们同名,那么你就只需要指明property就行了。如查参数值为空(或未初始化),对应的Bean属性不被设定。

    property="propertyName" value="{string | <%= expression %>}" —— 使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果这个字符串,那么它就会被转换成Bean属性的类型(查看上面的表).如果它是一个表达式,那么它类型就必须和它将要设定的属性值的类型一致。如果参数值为空,那么对应的属性值也不会被设定。另外,你不能在一个<jsp:setProperty>中同时使用 param 和 value。

    附:把字符串转化为其它类型的方法表

property类型(input 类型) 转换方法
boolean Boolean.valueOf(paramString).booleanValue()
Boolean Boolean.valueOf(paramString)
byte Byte.valueOf(paramString).byteValue()
Byte Byte.valueOf(paramString)
double Double.valueOf(paramString).doubleValue()
Double Double.valueOf(paramString)
int、Integer、char … 转换方法类似

    Demo1:一个简单的应用

    bean:User.java 代码如下;

package com.beans;
 
public class User {
    private String name;
 
    public User() {
        this.name = "tian ya";
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

    bean.jsp 如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    using javaBean with JSP
    <jsp:useBean id="user" class="com.beans.User"></jsp:useBean>
    <ol>
        <li>Initial value(getPropetry):<i><jsp:getProperty property="name" name="user"/></i></li>
        <li>Initial value(jsp expression):<i><%= user.getName() %></i></li>
        <li>
            <jsp:setProperty property="name" name="user" value="Tom"/>
            Value after setting property with setProperty:<i> <jsp:getProperty property="name" name="user"/></i>
        </li>
    </ol>
</body>
</html>

   输出如下:

image

   另外一些应用例子,不妨参考一下上面的讲义,自己编写一个。

四、共享 bean

    其实要让 bean 共享,其做法很简单,只要设置 bean 的作用域就行的了,bean 的默认作用域是 page,你可以将其设置为 session ,application等。

    Demo:统计访问的次数

    bean: AccessCountBean.java

package com.tools;
 
public class AccessCountBean {
    private String firstPage;
    private int accessCount;
 
    public AccessCountBean() {
        this.accessCount = 1;
    }
    
    public String getFirstPage() {
        return (firstPage);
    }
 
    public void setFirstPage(String firstPage) {
        this.firstPage = firstPage;
    }
 
    public int getAccessCount() {
        return (accessCount++);
    }
}

   shareBean.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    share Access counts : page 1
    <jsp:useBean id="counter" class="com.tools.AccessCountBean" scope="session"/>
    <jsp:setProperty property="firstPage" name="counter"
        value="shareBean.jsp" />
    Of shareBean.jsp (this page),
    <a href="shareBean2.jsp">shareBean2.jsp, and
    <a href="shareBean3.jsp">shareBean2.jsp,
    <jsp:getProperty name="counter" property="firstPage" />
    was the first page accessed.
 
    

Collectively, the three pages have been accessed

        <jsp:getProperty name="counter" property="accessCount" />
        times.

</body>
</html>

   shareBean2.jsp 与 shareBean3.jsp 的代码与 shareBean.jsp 代码类似:

    在点击8次连接之后,输出如下:

image