第五章 JSP与JavaBean

JSP与JavaBean

  • JavaBean是一个可重复使用的软件组件。
  • JSP页面可以将数据的处理过程指派给一个或几个bean来完成,即JSP页面调用这些bean完成数据的处理,并将有关处理结果存放到bean中,然后JSP页面负责显示bean中的数据。

编写和使用JavaBean

编写JavaBean

  • 编写Javabean就是编写一个Java的类,所以只要会写类就能编写一个Javabean。这个类创建的一个对象称为一个Javabean,简称bean,分配给bean的变量(成员变量),也称bean的属性。为了能让使用bean的应用程序构建工具(比如Tomcat服务器)使用JSP动作标记知道bean的属性和方法,只须在类的方法命名上遵守以下规则:
    • 如果类的成员变量,也称bean的属性的名字是xxx,那么为了获取或更改bean的属性的值,类中必须提供两个方法:
      ※ getXxx(),用来获取属性xxx。
      ※ setXxx(),用来修改属性xxx.。
      也就是方法的名字用get或set为前缀,后缀是将属性(成员变量)名字的首字母大写的字符序列。
    • 类中定义的方法的访问权限都必须是public的。
    • 类中定义的构造方法必须是public、无参数的。

保存bean的字节码

  • ch5 \WEB-INF\classes目录下,根据包名对应的路径,在classes下再建立相应的子目录。比如,包名tom.jiafei对应的路径是tom\jiafei,那么在classes下建立子目录结构:tom\jiafei。
  • 将创建bean的字节码文件,比如Circle.class,复制到\WEB-INF\classes\tom\jiafei
  • 为了调试程序方便,可以直接按照bean的包名将bean的源文件,比如Circle.java,保存在\WEB-INF\classes\tom\jiafei目录中,然后用命令行进入tom\jiafei的父目录classes(不要进入tom或jiafei目录)编译Circle.java:
    1
    classes>javac tom\jiafei\Circle.java

创建与使用bean

  1. 使用bean
  • 使用JSP动作标记useBean加载使用bean,语法格式是:
    1
    <jsp:useBean id="bean的名字" class="创建bean的类" scope="bean有效范围"/>
    或者
    1
    2
    <jsp:useBean id="bean的名字" class="创建bean的类" scope= "bean有效范围">
    </jsp:useBean>
    例如:
    1
    <jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
  • 需要特别注意的是,其中的“创建bean的类”要带有包名,比如:
    class=”tom.jiafei.Circle”
  1. bean的加载原理
  • Tomcat服务器首先在Tomcat服务器管理的pageContent内置对象中查找是否含有这样的bean。如果这样的bean存在,Tomcat服务器就分配这样的bean给用户,如果在pageContent中没有查找到JSP动作标记要求的bean,就根据class指定的类创建一个bean,并将所创建的bean添加到pageContent中。通过Tomcat服务器创建bean的过程可以看出,首次创建一个新的bean需要用相应类的字节码文件创建对象,当某些JSP页面再需要同样的bean时,Tomcat服务器直接将pageContent中已经有的bean分配给JSP页面,提高了JSP使用bean的效率。
  • 如果修改了字节码文件,必须重新启动Tomcat服务器才能使用新的字节码文件。
  1. bean的有效范围和生命周期
    ※ page bean
  • scope取值为page的bean称为page bean.
    1
    <jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
  • page bean的有效范围是用户访问的当前页面,存活时间直到当前页面执行完毕。
  • 不同用户(浏览器)的page bean是互不相同的。也就是说,当两个用户同时访问一个JSP页面时,一个用户对自己page bean的属性的改变,不会影响到另一个用户。
    ※ session bean
    1
    <jsp:useBean id="circle" class="tom.jiafei.Circle" scope="session" />
  • session bean的有效范围是用户访问的Web服务目录下的各个页面,存活时间是用户的会话期(session)间。
  • 如果用户访问Web服务目录多个页面,那么每个页面id相同的session bean是同一个bean。
  • 不同用户(浏览器)的session bean是互不相同的.
    ※ request bean
    1
    <jsp:useBean id="circle" class="tom.jiafei.Circle" scope="request" />
  • bean的有效范围是用户请求的当前页面,存活时间是从用户的请求到请求结束。request bean存活时间略长于page bean的存活时间,原因是Tomcat服务器认为页面执行完毕后,响应才算结束。
  • 不同用户的request bean的也是互不相同的。也就是说,当两个用户同时请求一个JSP页面时,一个用户对自己request bean的属性的改变,不会影响到另一个用户。
    ※ application bean
    1
    <jsp:useBean id="circle" class="tom.jiafei.Circle" scope="application" />
  • application bean的有效范围是当前Web服务目录下的各个页面,存活时间直到Tomcat服务器关闭。
  • Tomcat服务器为访问Web服务目录的所有用户分配一个共享的bean,即不同用户的application bean也都是相同的一个。也就是说,任何一个用户对自己application bean的属性的改变,都会影响到其他的用户(不同Web服务目录的application bean互不相同)。

获取和修改bean的属性

getProperty动作标记

  • 使用getProperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。
    1
    <jsp:getProperty  name="bean的id " property="bean的属性" />
    1
    2
    <jsp:getProperty  name="bean的id "  property="bean的属性">
    </jsp:getProperty>
  • 其中,name取值是bean的id,用来指定要获取哪个bean的属性的值,property取值是该bean的一个属性的名字。
  • 当JSP页面使用getProperty标记获取属性xxx的值时,必须保证bean有相应的getXxx方法,即对方法的名字的命名有特殊的要求。
  • 让request调用setCharacterEncoding方法设置编码为utf-8,以避免显示bean的属性值出现乱码现象

setProperty动作标记

  1. 将bean属性的值设置为一个表达式的值或字符序列。
    1
    2
    <jsp:setProperty name="bean的id " property="bean的属性" value= "<%=expression%>"/>
    <jsp:setProperty name="bean的id " property="bean的属性" value= "字符序列" />
  • value给出的值的类型要和bean的属性的类型一致。
  1. 通过HTTP表单的参数的值来设置bean的相应属性的值。
  • 用form表单的所有参数的值设置bean相对应的属性值的使用格式如下:
    1
    <jsp:setProperty  name= "bean的id的名字"  property="*" />
  • 在setProperty标记的上述用法中不具体指定bean属性的值将对应form表单中哪个参数指定的值,系统会自动根据名字进行匹配对应,但要求bean属性的名字必须在form表单中有名称相同的参数名字相对应,Tomcat服务器会自动将参数的字符串值转换为bean相对应的属性的值
  • 用form表单的某个参数的值设置bean的某个属性值的使用格式如下:
    1
    <jsp:setProperty  name= "bean的名字"  property="属性名"  param= "参数名" />
  • setProperty标记的上述用法具体指定了bean属性的值将对应表单中哪个参数名(param)指定的值,这种设置bean的属性值的方法,不要求property给出的bean属性的名字和param给出的参数名一致,即不要求bean属性的名字必须和表单中某个参数。
  • 用form表单设置bean的属性值时,只有提交了表单,对应的setProperty标记才会被执行。

第五章 JSP与JavaBean
https://lzyjx.github.io.git/2023/05/27/JSP与JavaBean/
作者
六只羊
发布于
2023年5月27日
许可协议