第五章 JSP 与 Java bean


前言

JavaBean是一种JAVA语言写成的可重用组件。JavaBean可以用于封装数据、处理事务、提供用户界面等功能。本章我们将介绍JavaBean,以及一些JSP与JavaBean结合的简单例子。

5.1 编写JavaBean和使用JavaBean

5.1.1 编写JavaBean

要编写一个JavaBean,需要遵循以下规则:

  • JavaBean必须是一个具体的和公共的类,不能是抽象类或接口。
  • JavaBean必须提供一个无参的构造方法,以便其他程序可以实例化它。
  • JavaBean的属性必须是私有的,不能直接被外部访问。
  • JavaBean必须提供符合一致性设计模式的公共方法,来暴露其属性给外部。这些方法通常称为属性访问器(getter)和属性修改器(setter)。属性访问器以get或is开头,后跟属性名的首字母大写;属性修改器以set开头,后跟属性名的首字母大写。

例如,下面是一个简单的JavaBean类,它封装了一个人的姓名、年龄和性别:

package com.example.bean;

public class Person {
    //私有属性
    private String name;
    private int age;
    private String gender;

    //无参构造方法
    public Person() {

    }

    //属性访问器和修改器
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

5.1.2 保存bean的字节码

编写好JavaBean类后,需要将其编译成字节码文件,并保存在WEB-INF/classes目录下。如果JavaBean类属于某个包,则需要在WEB-INF/classes目录下创建相应的包结构,并将字节码文件放在对应的包目录下。

例如,上面编写的Person类属于com.example.bean包,则需要在WEB-INF/classes目录下创建com/example/bean目录,并将Person.class文件放在该目录下。

5.1.3 创建与使用bean

在JSP页面中,可以使用jsp:useBean标签来创建或查找一个JavaBean实例²。该标签有以下常用属性²:

  • id:指定JavaBean实例的引用名称和存储名称。
  • class:指定JavaBean类的完整类名(包括包名)。
  • scope:指定JavaBean实例存储的域范围,可以是page、request、session或application中的一个,默认是page。

该标签的作用是,在指定的域范围内查找指定id名称的JavaBean实例,如果存在则返回该实例的引用;如果不存在则根据指定的class创建一个新的实例,并将其存储在指定的域范围内,并返回该实例的引用²。

例如,在JSP页面中使用以下代码:

<jsp:useBean id="person" class="com.example.bean.Person" scope="page"/>

则表示,在page域范围内查找id为person的JavaBean实例,如果存在则返回该实例的引用;如果不存在则根据com.example.bean.Person类创建一个新的实例,并将其存储在page域范围内,并返回该实例的引用。

创建或查找到JavaBean实例后,可以使用jsp:setProperty标签和jsp:getProperty标签来设置或获取其属性值²。这两个标签都有以下常用属性:

  • name:指定要操作的JavaBean实例的id名称。
  • property:指定要操作的JavaBean属性名称。
  • value:指定要设置给JavaBean属性的值(仅对jsp:setProperty标签有效)。

例如,在JSP页面中使用以下代码:

<jsp:setProperty name="person" property="name" value="Tom"/>
<jsp:setProperty name="person" property="age" value="18"/>
<jsp:setProperty name="person" property="gender" value="male"/>

则表示,将person实例的name属性设置为Tom,age属性设置为18,gender属性设置为male。

<jsp:getProperty name="person" property="name"/>
<jsp:getProperty name="person" property="age"/>
<jsp:getProperty name="person" property="gender"/>

则表示,输出person实例的name、age和gender属性值。

5.2 获取和修改bean的属性

5.2.1 getProperty动作标记

getProperty动作标记用于获取一个bean对象中某个属性值,并将其输出到当前位置。getProperty动作标记有以下常用属性:

  • name:指定要操作的bean对象id名称。
  • property:指定要操作bean对象中某个具体属性名称。

例如,在JSP页面中使用以下代码:

<jsp:useBean id="person" class="com.example.bean.Person" scope="page"/>
<jsp:setProperty name="person" property="name" value="Tom"/>
<p>姓名:<jsp:getProperty name="person" property="name"/></p>

则表示,在page域范围内创建或查找id为person

5.2.2 setProperty动作标记

setProperty动作标记用于设置一个bean对象中某个属性的值。setProperty动作标记有以下常用属性³:

  • name:指定要操作的bean对象id名称。
  • property:指定要操作bean对象中某个具体属性名称。
  • value:指定要设置给bean属性的值。

例如,在JSP页面中使用以下代码:

<jsp:useBean id="person" class="com.example.bean.Person" scope="page"/>
<jsp:setProperty name="person" property="name" value="Tom"/>
<p>姓名:<jsp:getProperty name="person" property="name"/></p>

则表示,将person对象的name属性设置为Tom,并输出其值。

setProperty动作标记还可以使用param属性来指定一个请求参数的名称,该参数的值将被设置给bean属性³。例如,在JSP页面中使用以下代码:

<jsp:useBean id="person" class="com.example.bean.Person" scope="page"/>
<jsp:setProperty name="person" property="name" param="username"/>
<p>姓名:<jsp:getProperty name="person" property="name"/></p>

则表示,将person对象的name属性设置为请求参数username的值,并输出其值。

如果property属性的值为*,则表示将所有与bean属性同名的请求参数的值设置给bean属性。例如,在JSP页面中使用以下代码:

<jsp:useBean id="person" class="com.example.bean.Person" scope="page"/>
<jsp:setProperty name="person" property="*"/>
<p>姓名:<jsp:getProperty name="person" property="name"/></p>
<p>年龄:<jsp:getProperty name="person" property="age"/></p>
<p>性别:<jsp:getProperty name="person" property="gender"/></p>

则表示,将所有与person对象属性同名的请求参数的值设置给person对象属性,并输出其值。

5.3 bean的辅助类

bean的辅助类包括IntrospectorPropertyDescriptorBeanInfo等。其中,Introspector类主要用于获取bean的属性描述符,PropertyDescriptor类描述bean的属性类型,BeanInfo类写bean的信息。

5.4 JSP与bean结合的简单例子

下面基于5.4节的Javabean例子,介绍一下Javabean在JSP中的使用方法。

5.4.1 三角形bean

public class TriangleBean {
    private double width;   //宽
    private double height;  //高
    private double area;    //面积
    public TriangleBean() {} //空构造方法
    //计算三角形面积
    public void calculateTriangleArea(){
        area = width * height / 2;
    }
    //获取三角形面积
    public double getArea() {  
        return area;
    }
    //设置宽
    public void setWidth(double width) {
        this.width = width;
    }
    //设置高
    public void setHeight(double height) {
        this.height = height;
    }
}

在JSP页面中通过<jsp:useBean>标记创建一个三角形对象,并设置它的宽和高,并且在页面中使用<jsp:setProperty>标记给宽高属性赋值,最后计算面积并显示。

<jsp:useBean id="triangle" class="com.test.TriangleBean"/>
<jsp:setProperty name="triangle" property="width" value="10"/>
<jsp:setProperty name="triangle" property="height" value="5"/>
<jsp:scriptlet>
    triangle.calculateTriangleArea();
</jsp:scriptlet>
三角形面积: <%= triangle.getArea() %>

5.4.2 四则运算bean

public class ArithmeticBean {
    private int a;
    private int b;
    private int result;
    public ArithmeticBean() {}   //空构造方法
    //计算加法
    public void add() {
        result = a + b;
    }
    //计算减法
    public void subtract() {
        result = a - b;
    }
    //计算乘法
    public void multiply() {
        result = a * b;
    }
    //计算除法
    public void divide() {
        result = a / b;
    }
    //获取结果
    public int getResult() {  
        return result;
    }
    //设置参数a
    public void setA(int a) {
        this.a = a;
    }
    //设置参数b
    public void setB(int b) {
        this.b = b;
    }
}

在JSP页面中通过<jsp:useBean>标记创建一个四则运算对象,并且在页面中使用<jsp:setProperty>标记给参数ab赋值,然后使用<jsp:scriptlet>中的表达式计算并显示结果。

<jsp:useBean id="arithmetic" class="com.test.ArithmeticBean"/>
<jsp:setProperty name="arithmetic" property="a" value="10"/>
<jsp:setProperty name="arithmetic" property="b" value="5"/>
<jsp:scriptlet>
    arithmetic.add();
</jsp:scriptlet>
加法: <%= arithmetic.getResult() %><br/>
<jsp:scriptlet>
    arithmetic.subtract();
</jsp:scriptlet>
减法: <%= arithmetic.getResult() %><br/>
<jsp:scriptlet>
    arithmetic.multiply();
</jsp:scriptlet>
乘法: <%= arithmetic.getResult() %><br/>
<jsp:scriptlet>
    arithmetic.divide();
</jsp:scriptlet>
除法: <%= arithmetic.getResult() %><br/>

5.4.3 浏览图像bean

public class ImageBean {
    private String src; //图片文件路径
    private String alt; //图片说明
    public ImageBean() {}
    //获取图片文件路径
    public String getSrc() {  
        return src;
    }
    //设置图片文件路径
    public void setSrc(String src) {
        this.src = src;
    }
    //获取图片说明
    public String getAlt() {  
        return alt;
    }
    //设置图片说明
    public void setAlt(String alt) {
        this.alt = alt;
    }
}

在JSP页面中通过<jsp:useBean>标记创建一个图像对象,并且设置图片文件路径和图片说明,最后使用<img>标签显示图片。

<jsp:useBean id="imgBean" class="com.test.ImageBean"/>
<jsp:setProperty name="imgBean" property="src" value="images/test.jpg"/>
<jsp:setProperty name="imgBean" property="alt" value="测试图片"/>
<img src="<%= imgBean.getSrc() %>" alt="<%= imgBean.getAlt() %>"/>

5.4.4 日历bean

public class CalendarBean {
    private Calendar calendar = Calendar.getInstance();
    public CalendarBean() {}   //空构造方法
    //获取年份
    public int getYear() {
        return calendar.get(Calendar.YEAR);
    }
    //获取月份
    public int getMonth() {
        return calendar.get(Calendar.MONTH) + 1;
    }
    //获取日期
    public int getDate() {
        return calendar.get(Calendar.DATE);
    }
    //获取星期
    public int getWeek() {
        return calendar.get(Calendar.DAY_OF_WEEK) - 1;
    }
    //下一个月
    public void nextMonth() {
        calendar.add(Calendar.MONTH, 1);
    }
    //上一个月
    public void prevMonth() {
        calendar.add(Calendar.MONTH, -1);
    }
}

在JSP页面中通过<jsp:useBean>标记创建一个日历对象,并且使用脚本语言JavaScript调用nextMonthprevMonth方法改变月份,最后在页面中使用表格显示当月的日历。

<jsp:useBean id="calendar" class="com.test.CalendarBean"/>
<table border="1">
  <thead>
    <tr>
      <th colspan="7">
        <a href="javascript: void(0);" οnclick="<%= "calendar.prevMonth();" %>">&lt;</a>
        <%= calendar.getYear() %>年<%= calendar.getMonth() %>月
        <a href="javascript: void(0);" οnclick="<%= "calendar.nextMonth();" %>">&gt;</a>
      </th>
    </tr>
    <tr>
      <th>日</th>
      <th>一</th>
      <th>二</th>
      <th>三</th>
      <th>四</th>
      <th>五</th>
      <th>六</th>
    </tr>
  </thead>
  <tbody>
    <%  
      int week = calendar.getWeek();
      int date = calendar.getDate();
      int daysOfMonth = calendar.calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
      for (int i=0; i<6; i++) {
    %>
      <tr>
        <% for (int j=0; j<7; j++) { %>
          <td>
            <% if (i == 0 && j < week || date > daysOfMonth) { %>
              &nbsp;
            <% } else { %>
              <%= date %>
              <% date++; %>
            <% } %>
          </td>
        <% } %>
      </tr>
    <% } %>
  </tbody>
</table>

5.4.5 计数器bean

public class CounterBean {
    private int count;  //计数器
    public CounterBean() {}   //空构造方法
    //增加计数器的值
    public void increment() {
        count++;
    }
    //获取计数器的值
    public int getCount() {  
        return count;
    }
}

在JSP页面中通过<jsp:useBean>标记创建一个计数器对象,并且使用脚本语言JavaScript调用increment方法增加计数器的值,最后在页面中显示计数器的值。

<jsp:useBean id="counter" class="com.test.CounterBean"/>
当前计数器的值:<%= counter.getCount() %>
<a href="#" οnclick="<%= "counter.increment();" %>">增加</a>

总结

本篇博客主要介绍了Javabean的编写和使用方法,以及如何在JSP中使用Javabean。我们还讨论了如何获取和修改bean的属性,以及Javabean的辅助类。最后,通过五个简单的例子展示了Javabean在WEB应用程序中的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值