|
可以使用<jsp:setProperty>動作元素來設定JavaBean的屬性,您可以使用幾個方式來進行設定: <jsp:setProperty name="someBean"
property="someProperty" value="somevalue" /> 下面的設定方式,可以將request中的某個請求參數指定至JavaBean的屬性,例如將request的requestParam參數設定給 SomeProperty,如下: <jsp:setProperty name="someBean"
param="requestParam" property="someProperty" /> 您也可以不指定request的請求參數名稱,而由JSP的自省(introspection)機制來判斷是否有相同的請求參數名稱,如果有的話就自動設定給JavaBean: <jsp:setProperty name="someBean" property="someProperty" />
上面的設定會查找request中是否有SomeProperty名稱的請求參數,並自動設定給JavaBean的SomeProperty屬性。 <jsp:setProperty>有個最有彈性的寫法,就是將request的請求參數名稱與JavaBean的屬性名稱交給自省機制來自動匹配,例如: <jsp:setProperty name="someBean" property="*" />
要注意的是,value設定的值必須是符合JavaBean中setXXX()對應之型態,例如若JavaBean的age屬性接收的參數是int,則下面這行是不可行的: <jsp:setProperty name="someBean"
property="age" value="<%= request.getParameter("userAge") %>"/> getParameter()所取得的一定是String型態,而age所接收的型態是int,這麼撰寫的話,自省機制並不會進行,如果執行上面的這行, 則會發生argument type mismatch錯誤訊息,您必須先作好型態轉換,再設定給JavaBean,例如: <%
int age = Integer.parseInt(request.getParameter("userAge")); %> <jsp:setProperty name="someBean" property="age" value="<%= age %>" /> 當然這樣混用程式與標籤於同一個網頁中是不被鼓勵的,所以建議是在JavaBean的值設定時,可以接收String型態,在於JavaBean中進行字串轉數值,或者是封裝為其它物件的工作。 在使用自省機制時,有一點要注意的是,如果有些屬性找不到對應的參數,則不會設定任何的值,例如屬性接收的是String型態,如果請求參數沒有對應至屬 性,則屬性會設定為null,而不是空字。 同樣的,不要預期屬性的值在自省之後沒有設定時,會有自動初始化為您所想像的值,基本上,連上次您設定給 JavaBean的值也會被清空,所以最保險的作法,是假設所有的屬性值都有被設定為null值的可能。 您也可以在使用<jsp:useBean>時一併設定屬性值,例如: <jsp:useBean id="someBean" class="onlyfun.caterpillar.SomeBean">
<jsp:setProperty name="someBean"property="someProperty" value="somevalue" /> </jsp:useBean> 如此一來,如果找不到someBean時,則會新建一個Bean物件並設定其屬性值;如果可以找Bean物件的話,則直接設定該Bean物件的屬性值。 如果您打算直接使用某個請求參數的值設定給JavaBean,例如: <jsp:setProperty name="someBean"
property="name" value="<%= request.getParameter("userName") %>"/> 事實上您可以使用param屬性來完成這件事: <jsp:setProperty name="someBean"
property="age" param="userName"/> |