javaBean

来源:互联网 发布:盟军敢死队2 for mac 编辑:程序博客网 时间:2024/06/08 04:52

JavaBean是什么

javaBean是描述java的软件组件模型,实质是一个java类,必须设置成员变量的set()和get()方法的类,必须public,必须有一个默认无参数的构造方法(<jsp:useBean>要实例化它,它当然需要满足这些要求)。


javaBean是*.java,但不是servlet,而是被servlet(比如JSP,当然*,java的servlet也可以)调用的。

servlet类必然继承了HttpServlet。

浏览器通过URL可以直接访问servlet对象(Web容器生成的实例),但不能直接访问javabean。

servlet类(*.java)必须先在Web.xml中配置了<Servlet-map>映射,才能被浏览器通过URL直接访问(第一次被访问时,Web容器生成Servlet实例)。


(题外话:组件也是类)

MVC框架中,jsp属于view,javaBean属于MC(将javaBean的数据和(非set\get)方法拆分,分布构造Model和Control。对吧??不对,javabean是M,servlet是C?)

javaBean一般被分为两类:可视化Bean和不可视化Bean,我更喜欢成为数据bean和业务bean。前者可以表示为GUI组件(Model?),后者在后台完成业务逻辑处理功能(这是书上说的,对吧?)。


JavaBean作用域范围

准确的说,<jsp:useBean>实例化得到的JavaBean对象作用范围,由<jsp:useBean>的scope属性决定,包括page、request、session、application。


<jsp:useBean>的scope属性决page、request、session时,servlet是单实例多线程,<jsp:useBean>将JavaBean,实例化,绑定到servlet中,应该是将JavaBean对象作为该servlet的局部变量,这样多线程不共享,线程安全。至于JavaBean对象的作用范围,说明JavaBean对象可以跳出该servlet(page)【比如作为返回值,或者加入全局容器】,那么说明JavaBean对象的名称应该是绑定session ID或者直接保存到request、session这类具有session ID标示的容器(姑且称作容器)中,这样才不会混淆,另外限定使用范围。(对吗?)


至于作用域为application,那么只要<jsp:useBean>将JavaBean实例化为单例模式即可。(对吗?)



JavaBean的动作标记

<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>

<jsp:useBean> ,实例化javaBean,id是实例名,class是类名,scope是实例有效范围。

1、例如实例有效范围page

则每次刷新页面,old Bean销毁,new Bean生成。这里的Bean是指<jsp:useBean>生成的实例。

2、例如实例有效范围request

则每次刷新页面,old Bean销毁,new Bean生成。---因为request对象重新生成

而<jsp:forward>和<jsp:include>转向、导入其他JSP页面时,第一个页面会把request对象传递到下一个Jsp页面,而属于这个request对象的JavaBean类也将伴随送出,被第二个JSP页面接收。如果其他JSP页面也有一个<jsp:useBean>,且id、class、scope等和old相同,则新页面不会再实例化javaBean,而是接收传过来的old Bean。

3、例如实例有效范围session

刷新页面、跳转具有相同<jsp:useBean>的新页面,都不会新页面不会再实例化javaBean,而是接收传过来的old Bean。

若打开一个浏览器窗口,在新窗口中请求新页面,则可能再实例化javaBean,这取决于该浏览器窗口访问,使用的session ID和old浏览器窗口是不是相同(相同,则属于一个会话,不会再实例化javaBean,而是接收传过来的old Bean;不同,则不属于一个会话)。

4、例如实例有效范围application

服务器该应用只有一个Bean,所有页面,所有用户都是访问同一个(第一次生成的)Bean。

application是针对于整个服务器应用程序而言的。应用程序没有关闭,则Bean是全局的。只有重启Web服务器(这里是tomcat),才会重新生成一个Bean,不过又是全局的,哈哈。


<jsp:setProperty>,可以通过表达式、字符串直接获得,可以通过http表单参数获得(本质还是访问request对象,对吧?),以及通过request对象获得。

<jsp:getProperty>,很少用(??),通过<%%>中调用Bean.fun()即可获得需要的实例属性。Bean是<jsp:useBean>中id,即实例对象名。



request如何获取客户端的请求信息

request是<jsp:setProperty>的核心。

Get Post类型请求,都是在(JSP转成的)servlet(继承HttpServlet)中调用相应的doGet和doPost方法将客户端请求信息写入了request对象,再调用request对象处理。