使用BeanUtils的原因
因為setProperty是JSP中的標簽,因此使用model 2模式JSP+Servlet+JavaBean的時候,JSP將form提交給Servlet程序,而Servlet程序無法像JSP一樣使用setProperty對數據進行封裝,
但是可以通過內省技術進行數據的封裝,但是每一次寫內省程序是一件很麻煩的事情,雅思報名費並且內省匹配也會有問題(例如一側是String,一側是int,還需要進行數據轉化),因此,內省(基於反射,方便操作javabean的API)封裝form數據到javabean的代碼,一般不自己編寫,使用已經編寫好的工具開發包BeanUtils開發包。
注意:如果想自動封裝數據,表單form中元素的name需要與JavaBean中的屬性一致。
什么是BeanUtils
BeanUtils一套開發包,Apache公司提供 ,專門進行javabean操作,在web層各種框架中被使用,例如:struts 使用BeanUtils操作JavaBean 。
實例
1、下載BeanUtils的jar :commons-beanutils 、commons-logging,需要同時下載兩個jar包。(BeanUtils依賴Logging的jar包 )
2、將beanutils和logging的 jar包復制 工程/WebContent/WEB-INF/lib
JavaBean
JSP頁面
通過action將form表單提交給servlet程序,對數據進行封裝,封裝到Person對象中
Servlet程序(映射中的url為/megustas/demo):
注意:
- 引BeanUtils包時要引org.apache.commons.beanutils
BeanUtils原理
常用方法:
(注:因為需要為Map類型,因此需要通過request.getParameterMap()方法將form表單中的數據變為Map類型)
實際上是通過JavaBean中的setName等方法,將form表單中的屬性的值封裝到person對象中去。男士英文名對於類型轉換,我們可以看下如下的這個例子,我們在JavaBean中添加一個屬性Date(對應set/get方法也需要添加):
JSP頁面中增加:
Servlet程序中增加一個輸出
則將會報錯,因為服務器端為Date類型,從輸入的form表單的數據無法轉換過去,即如果在Person類添加特殊類型Date類型,對於特殊類型如何封裝 ?因此,需要了解一下BeanUtils的封裝原理
即任何的類型轉換都是通過轉換器來實現的。例如我們之前的例子,String類型的提交數據是通過IntegerConverter轉換器轉換為person對象中的int類型的。可以總結為如下:
1、如果form參數是String類型,javabean屬性String類型 —- 調用BeanUtils.populate 將form數據封裝 javabean
2、如果JavaBean屬性類型不是String —- 將form數據封裝javabean 需要轉換器 —– 在BeanUtils API 提供很多默認轉換器(完成常見轉換)
3、如果需要轉換類型非常特殊,可以通過自定義轉換器完成 定義類實現Converter接口,實現convert方法 ,在populate調用之前通過ConvertUtils.register注冊轉換器
因此,如果出現上種情況,即需要將String類型轉換為java.util.Date類型,我們可以自定義轉換器。
自定義轉換器(或者在已有轉換器,但是不知道如何使用的情況也可以通過自定義轉換器來進行類型轉換):
1.需要實現Converter接口
因為在轉換器中定義了“yyyy年MM月dd日”的格式,酒店英語口語因此在jsp頁面的form表單需要輸入信息為“1998年2月12日”這類的格式的字符串,才可以通過我們自定義的轉換器進行轉換,轉換為Date類型並之后進行存儲。
2.注冊轉換器
修改之后的Servlet程序:
BeanUtils結論
- 方法進行數據封裝
- 一般其實不需要自定義轉換器,只有在特殊情況下才會自定義轉換器
1、如果form參數是String類型,javabean屬性String類型 —- 調用BeanUtils.populate 將form數據封裝 javabean
2、如果JavaBean屬性類型不是String —- 將form數據封裝javabean 需要轉換器 —– 在BeanUtils API 提供很多默認轉換器(完成常見轉換)
3、如果需要轉換類型非常特殊,可以通過自定義轉換器完成 定義類實現Converter接口,實現convert方法 ,在populate調用之前通過ConvertUtils.register注冊轉換器
最通俗的說法,JavaBean就是一個存數據的地方,要么
(1)通過JSP頁面中的標簽去存儲form表單中的數據(action跳轉到JSP頁面,之后“useBean”,“setProperty”進行數據存儲),再在JSP界面中通過“getProperty”顯示數據。
(2)在JSP頁面中通過action跳轉到Servlet程序的url,在Servlet程序中通過BeanUtils工具類的相關方法對JSP頁面中的表單信息進行存儲。
JSP+Servlet+JavaBean模式示意圖: