JavaBean概述及设计原则


概述

   JavaBean是java的软件组件模型,有点类似于Microsoft的COM组件概念。使用JavaBean的好处是提高代码重复利用性,使功能明确区分,保持代码整洁性,提高代码维护性。在JSP程序中常用语封装事务逻辑和数据库操作等等,可以很好的实现业务逻辑和前端程序的分离,使得系统更具健壮性和灵活性。

设计原则

JavaBean需要满足如下设计原则:

  • 为公有类
  • 提供一个无参公有构造方法
  • 属性私有
  • 提供属性的getter和setter方法

如下为一个典型的JavaBean类

//  公开的类
public class Book {
//  书籍的相关属性,这里需要设置为私有权限
    private String isbn;
    private String name;
    private String author;

//  共有无参构造函数
    public Book(){      
    }

//  所有属性的getter和setter
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}

JavaBean在JSP中的运用


直接作为普通类使用

<%
    Book book = new Book();
    book.setIsbn("9787115326560");
    book.setName("黑客与画家");
    book.setAuthor("Paul Graham");
%>

使用JSP动作元素

  在JSP中有对JavaBean进行操作的动作,利用这些动作指令,可以提高代码的简洁性和代码复用率。对JavaBean操作的动作指令有如下3个:

  • <jsp:useBean>: 寻找或者实例化一个JavaBean
  • <jsp:setProperty>:设置JavaBean的属性
  • <jsp:getProperty>:输出JavaBean实例的属性

< jsp:useBean/>

作用

在jsp页面中实例化或者在指定范围内使用JavaBean。

形式

<jsp:useBean id="JavaBean实例名" class="JavaBean实现类" scope="JavaBean实例的作用范围">

这里的“JavaBean实例的作用范围”有4个值:page、request、session和application。详细的说明看文章最后一个部分。

< jsp:setProperty/>

作用

给已经实例化的JavaBean对象的属性赋值。

形式

该动作一共有四种形式,这里继续用我们上面Book类进行说明。

<!-- 与表单关联 -->
<jsp:setProperty name="JavaBean实例名" property="*" />
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" />
<!-- 手动赋值 -->
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" value="属性值" />
<!-- 与request参数关联 -->
<jsp:setProperty name="JavaBean实例名" property="属性名" param="request对象中的参数名" />

第一种:会将提交到该页面的表单的所有参数名字和JavaBean的所有属性进行一一匹配赋值。
第二种:会将提交到该页面的表单的参数名字和JavaBean的指定属性进行匹配赋值。
第三种:直接手动将value的值赋予指定的JavaBean的指定属性。
第四种:将request中的参数值赋予指定JavaBean的指定参数。request中的参数值并非来自表单参数,而可以来自url链接,如:index.jsp?page=2。这个param名字便是page,其值为2。

< jsp:getProperty/>

<jsp:getProperty name="JavaBean实例名" property="属性名" />

该指令可以直接获取指定JavaBean实例对象的指定属性值。

JavaBean的四个作用域:page、request、session和application

page: 仅对该页面有效

局部变量,在当前页面有效,即当前jsp文件里有效,所以设置scope为page的JavaBean无法从index.jsp传输到single.jsp。可以理解为其与“直接作为普通类使用“的使用方式具有很大的相似性。

request:本次请求有效

局部变量,在一次请求的全过程(浏览器请求 -> 服务器处理 -> 返回响应)有效。这里需要明确的一点是服务器内部转发均属于服务器处理,并不会完成请求(可以看到转发发生时,浏览器的地址栏地址不会发生变化),所以该request范围的变量在一次请求的所有转发中都有效。JSP中的转发有:

<!-- forward动作 -->
<jsp:forward page="single.jsp" />
<!-- Request操作 -->
<%
Request.getRequestDispatch("single.jsp").forward(Request,Response);
%>

此外,重定向是在服务器返回结果之后浏览器再进行一次请求(可以看到转发发生时,浏览器的地址栏地址发生了变化,表示请求了另一个资源),因此,重定向之后为另一次请求了,request范围的变量在重定向之后无效。常用的重定向为:

<!-- 使用sendRedirect -->
response.sendRedirect("single.jsp");

<!-- 修改HTTP header的Location属性来重定向 -->
String site = "" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);

session:本次会话有效

用户全局变量,你可以理解为其有效性与session的有效性一致。每当用户访问网站时就会创建一个会话(session),只有在用户关闭浏览器时该会话才会结束。此外,session也会由于超过有效期或者手动删除而失效,对应变量也会因此失效。这里的全局只针对该会话的用户的所有页面,对其他用户无效。这一点区别于下面的application。

application:本应用内全局有效

应用全局变量,对每个用户每个页面都有效,与application对象的作用范围相同。当应用启动便开始生效,只有应用结束或手动删除该变量,该变量才会失效。

将JavaBean实例放入指定scope中

使用useBean标签时,除了实例化对象,还将该对象放入了相应的生存范围中。如果使用直接实例化JavaBean对象的方法时,则需要在脚本中将该对象放入指定scope中。

<%
/***** 可以通过相应的set方法将JavaBean实例放入指定scope *****/
    // 创建JavaBean对象实例
    Book book = new Book();
    // 放入page的生存范围中
    pageContext.setAttribute("book",book);
    // 放入request的生存范围中
    request.setAttribute("book",book);
    // 放入session的生存范围中
    session.setAttribute("book",book);
    // 放入application的生存范围中
    application.setAttribute("book",book);

/******* 可以通过相应的get方法获得放入的JavaBean实例 *******/
    // 从page的生存范围中取出
    Book book2 = (Book)pageContext.setAttribute("book",book);
    // 从request的生存范围中取出
    Book book2 = (Book)request.setAttribute("book",book);
    // 从session的生存范围中取出
    Book book2 = (Book)session.setAttribute("book",book);
    // 从application的生存范围中取出
    Book book2 = (Book)application.setAttribute("book",book);
%>

【参考】
回看JSP——jsp:useBean的用法:
jsp 的四个作用域 :page、request、session和application的区别: