JavaBean

JavaBean 学习笔记

目录

JavaBean简介

将Java代码直接写入到Jsp页面中,虽然能将功能实现,但是页面却显得比较凌乱,给修改和维护带来很多的麻烦。纯Jsp开发方式流程如1所示。
图1 纯Jsp开发模式

如果使HTML代码与Java代码相分离,将Java代码单独封装成为一个处理某种业务逻辑的类,然后在JSP页面中调用此类,则可以降低HTML代码与Java代码之间的耦合度,简化JSP页面,提高Java程序代码的重用性及灵活性。这种与HTML代码相分离,而使用Java代码封装的类,就是一个JavaBean组件,在Java Web开发中,可以使用JavaBean组件来完成业务逻辑的处理,应用JavaBean与JSP整合的开发模式如下图2所示。

图2 JavaBean与Jsp设计模式
从图2可以看出,JavaBean的应用简化了JSP页面,在JSP页面中只包含了HTML代码、CSS代码等,但JSP页面可以引用JavaBean组件来完成某一业务逻辑,如字符串处理、数据库操作等。
通过上面的分析,可以看出,JavaBean实质是通过Java代码封装的Java类,它在服务器应用过程中,充当一个可重用的Java软件组件模型,JSP页面可以引用一个或多个JavaBean组件对象,同样,一个JavaBean对象也可以被多个JSP页面所引用,达到了代码重用的效果,从而提高程序的灵活性。

javaBean 规范

JavaBean是一个可重用的Java软件组件模型,在编写时,需要遵循一定的Java一些编码约定,一个标准的JavaBean应该具备以下规范。

公共的无参的构造方法

一个JavaBean对象必须拥有一个公共类型、默认的无参构造方法,从而可以通过new关键字直接对其进行实例化。

类的声明是非final类型的

当一个类声明为final类型时,它是不可以更改的,所以,JavaBean对象的声明应该是非final类型的。

实现可序列接口

JavaBean应该直接或间接实现java.io.Serializable接口,以支持序列化机制。

为属性声明访问器

JavaBean中的属性应该设置为私有(private)类型,为了防止外部直接访问,但它需要对外提供公共(public)的访问方法,也就是说需要为属性提供getter/setter方法。
说明:
上面介绍的JavaBean规范,只是JavaBean应遵循的基本原则,更多的规范约定,请参照Sun公司对JavaBean规所发布pdf文档

下图是用editPlus 编写的带有个4个属性的JavaBean.

javabean 在jsp中的应用

jsp:useBean标签

标签用于jsp页面中创建一个JavaBean 实例,并通过属性的设置将此实例存放到JSP指定的范围内,其语法格式如下:

      <jsp:useBean 
           id="变量名" 
           scope="page|request|session|application"
           {
             class="完整类名"|
             type="数据类型"|
             class="完整类名" type="数据类型"|
             beanName="完整类名" type="数据类型"
           }/>

语法中的“完整类名”包含一个类的包名称,如com.lyq.user。参数说明如表1所示。

语法设置值描述

id属性

用于定义一个变量名(可以理解为JavaBean的一个代号),程序中通过此变量名对
JavaBean进行引用

scope属性

设置JavaBean的作用域。它有4种范围,即page、request、session、
application,默认情况下为page

class属性

指定JavaBean的完整类名(包名与类名结合的方式)如
class=“com.lyq.User”。此属性与BeanName属性不能同时存在

type属性

指定id属性所定义的变量类型
beanName属性指定JavaBean的完整类名,此属性不能与class属性同时存在

案列1

(1)首先创建一个名为Bean的类(它是一个JavaBean),此类中有一个名为name的属性及相应的getXXX()与setXXX()方法。代码如下:

(2)创建了JavaBean之后,在index.jsp页面中通过标签实例化此对象,并调用此对象的方法。代码如下:

jsp:setProperty标签

标签用于对JavaBean中的属性赋值,但JavaBean的属性要提供相应的setXXX()方法。通常情况下该标签与标签配合使用。其语法格式如下:

    <jsp:setProperty
      name="实例名"
      {
    property="*" |
    property="属性名" |
    property="属性名" param="参数名" |
    property="属性名" value="值"
    }/>

语法

设置值描述

name属性

指定JavaBean的引用名称

property属性

指定JavaBean中的属性名,此属性是必需的,其取值有两种,分别为“*”、“JavaBean的属性名称”

param属性

指定JSP请求中的参数名,通过该参数可以将JSP请求参数的值赋给Java的属性

value属性

指定一个属性的值

技巧:

表单信息中的属性名称最好设置成为JavaBean中的属性名称,这样就可以通过“”的形式来接收所有参数,此种方式可以减少程序中的代码量。如:将用户年龄文本框的name属性设置为“age”,它对应Person类中的age。

(2)创建一个form表单,将其放置在index.jsp页面中。其关键代码如下:

(3)创建student.jsp页面,用于实例化Student对象,并输出相应的属性值。其关键代码如下:

jsp:getProperty


标签用于获取JavaBean中的属性值,但要求JavaBean的属性必须具有相对应的getXXX()方法。其语法格式如下:

name属性,指定存在某一范围的JavaBean实例的引用。property属性,指定JavaBean的属性名称。

案列

利用标签输出JavaBean中的属性。

首先创建一个名为Book的JavaBean对象,此类用于封装图书信息。其关键代码如下:


    package com.cdd;

    public class Book {
       private String bookName; //图书名称
       private String author;  //作者
       private String category; //类别
       private double price;  //价格 
    public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getCategory() {
        return category;
    }
    public void setCategory(String category) {
        this.category = category;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }

    }
注意

要通过标签输出JavaBean中的属性值,要求在JavaBean中必须包含getXXX()方法,标签将通过此方法获取JavaBean的属性值。

  <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <link rel="stylesheet" type="text/css" href="CSS/style.css">
      </head>  
      <body>
       <body>
        <!-- 实例化Book对象 -->
        <jsp:useBean id="book" class="com.lyq.Book"></jsp:useBean>
        <!-- 对Book对象赋值 -->
        <jsp:setProperty name="book" property="bookName"  value="《JAVA程序设计标准教程》"/>
        <jsp:setProperty name="book" property="author"  value="奕楊科技"/>
        <jsp:setProperty name="book" property="category"  value="Java图书"/>
        <jsp:setProperty name="book" property="price"  value="59.00"/>
        <table align="center" border="1" cellpadding="1" width="350" height="100" bordercolor="green">
            <tr> 
                <td align="right">图书名称:</td>
                <td><jsp:getProperty name="book" property="bookName"/> </td>
            </tr>
            <tr> 
                <td align="right">作 者:</td>
                <td><jsp:getProperty name="book" property="author"/> </td>
            </tr>
            <tr> 
                <td align="right">所属类别:</td>
                <td><jsp:getProperty name="book" property="category"/> </td>
            </tr>
            <tr> 
                <td align="right">价 格:</td>
                <td><jsp:getProperty name="book" property="price"/> </td>
            </tr>
        </table>
    </body>

      </body>
    </html>

在此页面中,首先通过标签实例化Book对象,再使用标签对Book对象中的属性赋值,最后通过标签输出Book对象的属性值,

JavaBean 的作用域

JavaBean的生命周期存在于4种范围之中,分别为page、request、session、application,它们通过标签的scope属性进行设置。这4种范围虽然存在很大的区别,但它们与JSP页面中的page、request、session、application范围相对应。

page范围

与当前页面相对应,JavaBean的生命周期存在于一个页面之中,当页面关闭时JavaBean被销毁。

request范围

与JSP的request生命周期相对应,JavaBean的生命周期存在于request对象之中,当request对象销毁时JavaBean也被销毁。
l session范围:与JSP的session生命周期相对应,JavaBean的生命周期存在于session会话之中,当session超时或会话结束时JavaBean被销毁。

application范围

与JSP的application生命周期相对应,在各个用户与服务器之间共享,只有当服务器关闭时JavaBean才被销毁。

这4种作用范围与JavaBean的生命周期是息息相关的,当JavaBean被创建后,通过标签与标签调用时,将会按照page、request、session和application的顺序来查找这个JavaBean实例,直至找到一个实例对象为止,如果在这4个范围内都找不到JavaBean实例,则抛出异常。

JavaBean在session范围与application范围的比较
  <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
      </head>

      <body>
       <%
    session.setMaxInactiveInterval(10);
       %>
        <!-- 创建一个session范围的Counter对象 -->
        <jsp:useBean id="counter_session" class="com.lyq.Counter" scope="session"/>
        <!-- 创建一个application范围的Counter对象 -->
        <jsp:useBean id="counter_application" class="com.lyq.Counter" scope="application"/>
        <table align="center" width="350" border="1">
            <tr>
                <td colspan="2" align="center"><br><h1>JavaBean的作用域</h1></td>
            </tr>
            <tr>
                <td align="right" width="30%">session</td>
                <td><jsp:getProperty name="counter_session" property="count" /></td>
            </tr>
            <tr>
                <td align="right">application</td>
                <td><jsp:getProperty name="counter_application" property="count" /></td>
            </tr>
        </table>
    </body>


    </html>

此页面分别输出了session范围与application范围的计数器的数值,刷新页面后其数值不断自增,说明Counter对象实例存在于此次会话之中。

当开启一个新的浏览器窗口时,session的生命周期结束,与之对应的Counter对象也将被销毁,但application范围中的Counter对象依然存在.

练习

  1. 定义获取当前年份的方法

JavaBean是用Java语言所写成的可重用组件,它可以是一个实体类对象,也可以一个业务逻辑的处理,但编写JavaBean要遵循JavaBean规范,下面通过实例在JSP页面中调用获取当前时间的JavaBean。

 import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    public class DateBean {
      private String dateTime;                                                 // 日期及时间
      private String week;                                                       // 星期
      private Calendar calendar = Calendar.getInstance();                   // Calendar对象
      public String getDateTime() {
            Date currDate = Calendar.getInstance().getTime();              // 获取当前时间
            // 实例化SimpleDateFormat
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒");
            dateTime = sdf.format(currDate);                                      // 格式化日期时间
            return dateTime;                                              // 返回日期及时间的字符串
      }    
      public String getWeek() {
            String[] weeks = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };        // 定义数组
            int index = calendar.get(Calendar.DAY_OF_WEEK);   // 获取一星期的某天
            week = weeks[index - 1];                                           // 获取星期几
            return week;                                                    // 返回星期字符串
      }
      }

DateBean类主要封装了日期时间(dateTime属性)、星期(week属性),并针对这两个属性提供了相应的getXXX()方法,其中getDateTime()方法用于获取当前的日期及时间,此方法通过SimpleDateFormat对象的format()方法返回对当前时间进行格式化,并返回格式化后的字符串。getWeek()方法用于获取星期几,此方法主要通过Calendar对象获取获取一星期的某天索引,及创建字符串数组来实现。

说明

由于DateBean类主要用于获取当前时间,并不涉及到对DateBean类中的属性赋值,所以实例中并没有提供ateTime属性、week属性的setXXX()方法。除这两个属性外还包含了一个calendar属性,此属性是一个Calendar对象,是获取日期时间及星期的辅助类,所以没有必要对此属性提供相应的setXXX()方法与getXXX()方法。

(2)创建名称为index.jsp的页面,它是程序中的主页。在index.jsp页面实例化DateBean对象,并获取当前日期时间及星期实现实现电子时钟效果,其关键代码如下:

技巧

因为获取当前日期时间的JavaBean对象DateBean并不涉及到更多的业务逻辑,所以实例中将它的作用域设置为application,这样做的好处是,在JSP页面的第一次调用此对象的时候它会实例化一个DateBean对象,以后再次调用的时候就不需要再次实例化DateBean,因为它在application范围内已经存在。

  1. 新建Web项目,在新建项目中新建名为StringUtil的JavaBean类,用于判断字符串是否以指定的子字符串开头,关键代码如下:

(2)在该项目的index.jsp页面中,设置页面表单布局,关键代码如下:

(3)在该项目的check.jsp页面中,处理index.jsp页面的请求,并就判断用户是否在index.jsp页面中输入了指定开头的字符串,关键代码如下:

JavaBean 练习3

在开发程序时,经常需要将数据库中的信息显示在网页中,以供用户浏览和选择,学习了JavaBean技术后,就可以将操作数据库的代码写入到JavaBean中.

(1)新建Web项目,在新建项目中创建JavaBean类DB,在该类中定义查询数据方法,具体代码如下:

public class DB {
    private Connection con;                                           //定义数据库连接对象
    private Statement stm;                                                    //定义Statement对象
    private ResultSet rs;                                                 //定义查询结果集ResultSet对象
    private String classname="com.mysql.jdbc.Driver";                  //加载数据库驱动代码
    private String url="jdbc:mysql://localhost:3306/db_database07";  //连接数据库URL
    public DB(){}
    public Connection getCon(){                                             //定义获取数据库连接方法
         try{
               Class.forName(classname);
         }
         catch(ClassNotFoundException e){
               e.printStackTrace();
         }
         try{
             con=DriverManager.getConnection(url,"root","111");
         }
         catch(Exception e){
             e.printStackTrace(System.err);
               con=null;
         }
         return con;
    }

     public Statement getStmed(){                                           //实例化Statement方法
       try{   
          con=getCon();                                                 //调用获取数据库连接方法
          stm=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
       }catch(Exception e){e.printStackTrace(System.err);}
       return stm;
    }
     public ResultSet getAllRs(){                                      //定义获取查询结果集方法  
          String sql="select * from tb_use";                               //定义查询语句
            try{
                  stm=getStmed();
                  rs=stm.executeQuery(sql);                                          //执行查询语句
            }
            catch(SQLException e){e.printStackTrace();rs=null;}
            return rs;
      }   
}

(2)在新建项目的index.jsp页面中,实现定义显示查询结果的表格,提供了“查询全部数据”按钮,当用户单击该按钮时,

<%
   ResultSet rs=(ResultSet)session.getAttribute("resultset");  
   if(rs==null){
 %>
 <tr align="center" valign="middle"><td colspan="4">没有记录显示!</td>
 </tr>
 <%
   }
   else{
    while(rs.next()){
 %>
 <tr align="center" valign="middle" height="22">
   <td><%=rs.getString("name") %></td>           
   <td><%=rs.getString("sex") %></td>
   <td><%=rs.getInt("age") %></td>
   <td><%=rs.getString("job") %></td>                        
 </tr>
 <%
    } }

(3)建立接收Form表单的页面dosearchall.jsp,在该页面中进行数据查询操作。其关键代码如下:

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.sql.*" %>
<jsp:useBean id="db" class="com.jb.db.DB" scope="page"/>
<%
  ResultSet rs=db.getAllRs();                     //获得查询的结果集
  session.setAttribute("resultset",rs);               //将得到的结果集存储在session会话中
  response.sendRedirect("index.jsp");               //返回到index.jsp页面显示数据信息
%>
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值