概念:用純java代碼編寫的pojo程序,mvc設計模式的model層
種類:
數據bean:表單bean;結果bean;
表單bean:完成對錶單數據的封裝
語法要求:屬性的名字、個數、類型與表單裏參數的名字、個數、類型一致;
結果bean:在hibernate中又叫實體類,封裝外部信息,主要封裝數據庫對應的記錄;
語法要求:屬性的名字、個數、類型與記錄中字段的名字、個數、類型一致;
邏輯bean:業務bean,持久bean
業務bean:封裝對業務的操作,完成對請求的操作
持久bean:封裝對外部數據(數據庫,文件)的操作
優點:
1 易於開發維護
框架自動收集表單結果數據
實現邏輯的封裝,事物處理和顯示互不干擾
2 提高代碼的可複用性
對於通用的事務處理邏輯,數據庫操作等都可以封裝在JavaBean中,
通過調用JavaBean的屬性和方法可快速進行程序設計
3 支持分佈式操作
支持同樣的代碼在不同的程序上
同樣的程序,不同的代碼分佈在不同的服務器上
效率特別高,可以災難救援
表單bean(收集表單數據)
語法:
1 包聲明
2 表單bean主類名和文件名相同(不能出現主方法)
3 屬性(私有的)的名字個數和類型要和表單裏的參數名字個數和類型一致
4 對外提供public 的get()set()方法
5 顯示提供無參的構造方法(標籤和框架需要調用無參構造方法來生成bean對象)
部署
² 默認路徑在WEB-INF/classes/以包對應的目錄結構下(classes需要自己手動創建);
² 存放方式:
® 手動創建文件夾,太麻煩,不推薦;
® 打包編譯 javac -d . SimpleBean.java;
命名規範
包命名:全部字母小寫:cn.mldn.lxh
類命名:每個單詞的首字母大寫:SimpleBean
屬性名稱:第一個單詞的首字母小寫,之後每個單詞的首字母大寫:studentName ;
方法命名:與屬性命名相同:public void sayHello() ;
常量命名:final類型的常量一般都要大寫,接口裏的變量都是常量,但卻沒有大寫;
表單Bean的優化
用標籤來代替原生Java程序
標籤就相當與一行或多行java程序;
實例
<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="zs" scope="page" class="cn.mldn.lxh.SimpleBean"/>
<%
zs.setName("tom") ;
zs.setPassword("123456") ;
%>
<h1>姓名:<%=zs.getName()%></h1>
<h1>密碼:<%=zs.getPassword()%></h1>
標籤創建對象,導包
<jsp:useBean id="zs" scope="page" class="cn.mldn.lxh.SimpleBean"/>
含義:
先看當前頁面的page內置對象裏是否有屬性名爲zs的屬性值,沒有就創建一個SimpleBean對象:
先找到class屬性,從WEB-INF下通過路徑的全稱找到SimpleBean的字節碼文件;
然後會tomcat會自動調用無參的構造方法創建出SimpleBean對象;
把SimpleBean對象以屬性名爲zs的形式,設到page內置對象裏;
再從page內置對象裏取出屬性名爲zs的屬性值,賦給變量名爲zs的變量;
屬性名:
id:既是page內置對象存放SimpleBean對象的屬性名,又是存放SimpleBean對象地址的變量名;
scope:存放SimpleBean的內置對象,如果省略默認是page內置對象;
class:指定SimpleBean類的位置;
等價的java代碼:
if(page.getAttrribute("zs")==null){
page.setAttribute("zs",new SimpleBean());
}
SimpleBean zs = (SimpleBean)page.getAttribute("zs");
標籤收集數據
<jsp:setProperty name="zs" property="*"/>
含義
把表單裏的所有參數收集到表單Bean(前提是表單裏的名字、個數、類型要和表單Bean裏屬性的名字、個數、類型一致)
到page裏取得屬性名爲zs的屬性值,SimpleBean對象;
給SimpleBean對象所有的屬性設值,數據來源表單中的同名參數;
property="*":給zs所指Simplebean對象的所有屬性設置,這些值來自表單當中的同名參數;
屬性設置可以一次解決,屬性的獲取必須一個個取;
el表達式輸出:不能設值只能輸出;
${zs.name};
到scope裏找到屬性zs的屬性值SimpleBean對象,調用他的getName方法;
setProperty有自動轉換的功能,但表單裏參數的類型,必須和表單Bean裏的對應屬性的類型一致才能轉換,否則就會出現NumberFormatException;
若表單裏的參數比表單bean裏的屬性少,就只給表單bean裏有確定參數值的屬性設值,沒有參數值的屬性保持原值;
屬性設值
<jsp:setProperty>用來設置已經實例化的Bean對象的屬性
方式一
<jsp:setProperty name="zs" property="*"/>
先到scope裏找到屬性名爲zs的屬性值--SimpleBean對象,並給SimpleBean對象的所有屬性設值;
方式二
<jsp:setProperty name="zs" property="name"/>
只給zs所指的SimpleBean對象的name屬性設值,屬性的值來自表單當中的同名參數;
其他沒有設值的屬性保持原值;
方式三
<jsp:setProperty name="zs" property="name" param="password"/>
從表單裏取出屬性名爲password的屬性值賦給屬性name;
方式四
<jsp:setProperty name="zs" property="name" value="password"/>
直接把"password"賦給zs所指對象的屬性name;
但value的值必須爲String類型;
表單Bean的傳遞
page內置對象
不能傳遞,表單bean只會保存在當前頁面,頁面結束,表單bean對象就被銷燬,不會傳遞到另一個組件裏;
request內置對象
服務端跳轉的request內置對象不會被銷燬,表單bean可以通過request內置對象傳遞給下一個組件;
但客戶端跳轉不能通過request內置對象傳遞,因爲客戶端跳轉是客戶端重新發送請求,request內置對象會被銷燬,不能傳遞表單bean
session內置對象
只要用戶不下線,就可以一直傳遞表單bean;
application內置對象
<jsp:getProperty name="cb" property="coun"/>
查找順序:page--request--session--application,只要在前面的內置對象裏找到表單bean,就不會再去後面的內置對象裏查找;