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的区别: